cookutils annotate lighttpd/index.cgi @ rev 1079
Improve work with sets:
- keep natural order of the sets described in $SPLIT,
- provide new mode (COOKOPTS="instant-pack"): compile the set and then immediately pack all it's packages, so they will be available for the next set.
Allow to change $CATEGORY.
- keep natural order of the sets described in $SPLIT,
- provide new mode (COOKOPTS="instant-pack"): compile the set and then immediately pack all it's packages, so they will be available for the next set.
Allow to change $CATEGORY.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Tue Jul 10 10:25:36 2018 +0300 (2018-07-10) |
parents | 1463d32f6f90 |
children | 9583c9709f51 |
rev | line source |
---|---|
al@898 | 1 #!/bin/sh |
al@898 | 2 # |
al@898 | 3 # SliTaz Cooker CGI + Lighttpd web interface. |
al@898 | 4 # |
al@898 | 5 |
al@898 | 6 # Make request URI relative to the script name |
al@898 | 7 base="$(dirname "$SCRIPT_NAME")"; [ "$base" == '/' ] && base='' |
al@898 | 8 REQUEST_URI=$(echo "$REQUEST_URI" | sed "s|^$base/*|/|; s|\?.*||") |
al@898 | 9 |
al@898 | 10 # Split the URI request to /pkg/cmd/arg |
al@898 | 11 export pkg=$(echo "$REQUEST_URI" | cut -d/ -f2) |
al@898 | 12 export cmd=$(echo "$REQUEST_URI" | cut -d/ -f3) |
al@898 | 13 export arg=$(echo "$REQUEST_URI" | sed 's|^/[^/]*/[^/]*/||') |
al@898 | 14 |
al@898 | 15 |
al@898 | 16 . /usr/lib/slitaz/httphelper.sh |
al@898 | 17 |
al@1076 | 18 case $QUERY_STRING in |
al@1076 | 19 *debug*) |
al@1076 | 20 debug='yes' |
al@1076 | 21 QUERY_STRING="$(echo "$QUERY_STRING" | sed 's|debug||; s|^&||; s|&&|\&|; s|&$||')" |
al@1076 | 22 ;; |
al@1076 | 23 esac |
al@1076 | 24 |
al@898 | 25 [ -f "/etc/slitaz/cook.conf" ] && . /etc/slitaz/cook.conf |
al@898 | 26 [ -f "./cook.conf" ] && . ./cook.conf |
al@898 | 27 wok="$WOK" |
al@898 | 28 title=${title:-SliTaz Cooker} |
al@898 | 29 # Cooker DB files. |
al@898 | 30 activity="$CACHE/activity" |
al@898 | 31 commits="$CACHE/commits" |
al@898 | 32 cooklist="$CACHE/cooklist" |
al@898 | 33 cookorder="$CACHE/cookorder" |
al@898 | 34 command="$CACHE/command"; touch $command |
al@898 | 35 blocked="$CACHE/blocked" |
al@898 | 36 broken="$CACHE/broken" |
al@898 | 37 cooknotes="$CACHE/cooknotes" |
al@898 | 38 cooktime="$CACHE/cooktime" |
al@898 | 39 wokrev="$CACHE/wokrev" |
al@933 | 40 webstat="$CACHE/webstat" |
al@940 | 41 splitdb="$CACHE/split.db" |
al@898 | 42 |
al@898 | 43 # Path to markdown to html convertor |
al@898 | 44 cmark_opts='--smart -e table -e strikethrough -e autolink -e tagfilter' |
al@898 | 45 if [ -n "$(which cmark 2>/dev/null)" ]; then |
al@898 | 46 md2html="$(which cmark) $cmark_opts" |
al@898 | 47 elif [ -x "./cmark" ]; then |
al@898 | 48 md2html="./cmark $cmark_opts" |
al@898 | 49 elif [ -n "$(which sundown 2>/dev/null)" ]; then |
al@898 | 50 md2html=$(which sundown) |
al@898 | 51 elif [ -x "./sundown" ]; then |
al@898 | 52 md2html="./sundown" |
al@898 | 53 fi |
al@898 | 54 |
al@898 | 55 |
al@898 | 56 |
al@898 | 57 |
al@898 | 58 # Search form redirection |
al@898 | 59 if [ -n "$(GET search)" ]; then |
al@898 | 60 echo -e "HTTP/1.1 301 Moved Permanently\nLocation: $base/$(GET q)\n\n" |
al@898 | 61 exit 0 |
al@898 | 62 fi |
al@898 | 63 |
al@898 | 64 |
al@898 | 65 # Show the running command and it's progression |
al@898 | 66 |
al@898 | 67 running_command() { |
al@898 | 68 state="$(cat $command)" |
al@923 | 69 local pct='' |
al@898 | 70 if [ -n "$state" ];then |
al@898 | 71 echo -n "$state</td></tr><tr><td>Completion</td>" |
al@898 | 72 set -- $(grep "^$state" $cooktime) |
al@898 | 73 [ -n "$1" -a $2 -ne 0 ] && pct=$((($(date +%s)-$3)*100/$2)) |
al@898 | 74 [ -n "$pct" ] && max="max='100'" |
al@898 | 75 echo -n "<td><progress id='gauge' $max value='$pct' title='Click to stop updating' onclick='stopUpdating()'>" |
al@898 | 76 echo -n "</progress> <span id='pct'>${pct:-?}%</span>" |
al@898 | 77 [ "$2" -gt 60 ] && |
al@898 | 78 echo -n "</td></tr><tr><td>Estimated end time</td><td>$(date +%H:%M -ud @$(($2+$3)))" |
al@898 | 79 else |
al@898 | 80 echo 'not running' |
al@898 | 81 fi |
al@898 | 82 } |
al@898 | 83 |
al@898 | 84 |
al@898 | 85 # HTML page header |
al@898 | 86 |
al@898 | 87 page_header() { |
al@1029 | 88 local theme t='' css pretitle='' command |
al@898 | 89 theme=$(COOKIE theme) |
al@898 | 90 [ "$theme" == 'default' ] && theme='' |
al@898 | 91 [ -n "$theme" ] && theme="-$theme" |
al@898 | 92 css="cooker$theme.css" |
al@898 | 93 |
al@1012 | 94 if [ -n "$pkg" ]; then |
al@1029 | 95 case "$pkg" in |
al@1029 | 96 ~) pretitle="Tag \"$cmd\" - ";; |
al@1029 | 97 *) pretitle="$pkg - ";; |
al@1029 | 98 esac |
al@1012 | 99 else |
al@1029 | 100 command="$(cat $command)" |
al@1029 | 101 [ -n "$command" ] && pretitle="$command - " |
al@1012 | 102 fi |
al@1043 | 103 [ -z "$favicon" ] && favicon='/slitaz-cooker.png' |
al@1012 | 104 |
al@898 | 105 echo -e 'Content-Type: text/html; charset=UTF-8\n' |
al@898 | 106 |
al@898 | 107 cat <<EOT |
al@898 | 108 <!DOCTYPE html> |
al@898 | 109 <html lang="en"> |
al@898 | 110 <head> |
al@1012 | 111 <title>$pretitle$title</title> |
al@898 | 112 <link rel="stylesheet" href="/$css"> |
al@1043 | 113 <link rel="icon" type="image/png" href="$favicon"> |
al@903 | 114 <link rel="search" href="$base/os.xml" title="$title" type="application/opensearchdescription+xml"> |
al@898 | 115 <!-- mobile --> |
al@898 | 116 <meta name="viewport" content="width=device-width, initial-scale=1.0"> |
al@898 | 117 <meta name="theme-color" content="#222"> |
al@898 | 118 <!-- rss --> |
al@898 | 119 <link rel="alternate" type="application/rss+xml" title="$title Feed" href="?rss"> |
al@1063 | 120 <script> |
al@1063 | 121 // Get part of the main page |
al@1063 | 122 function getPart(part) { |
al@1063 | 123 var partRequest = new XMLHttpRequest(); |
al@1063 | 124 partRequest.onreadystatechange = function() { |
al@1063 | 125 if (this.readyState == 4 && this.status == 200) { |
al@1063 | 126 response = this.responseText; |
al@1063 | 127 var partElement = document.getElementById(part); |
al@1063 | 128 if (response !== null) partElement.innerHTML = response; |
al@1063 | 129 } |
al@1063 | 130 }; |
al@1063 | 131 partRequest.open('GET', '?part=' + part, true); |
al@1063 | 132 partRequest.responseType = ''; |
al@1063 | 133 partRequest.send(); |
al@1063 | 134 } |
al@1063 | 135 </script> |
al@898 | 136 </head> |
al@898 | 137 <body> |
al@898 | 138 <div id="container"> |
al@898 | 139 <header> |
al@898 | 140 <h1><a href="$base/">$title</a></h1> |
al@898 | 141 <div class="network"> |
al@898 | 142 <a href="http://www.slitaz.org/">Home</a> |
al@898 | 143 <a href="http://bugs.slitaz.org/">Bugs</a> |
al@898 | 144 <a href="http://hg.slitaz.org/wok-next/">Hg</a> |
al@898 | 145 <a href="http://roadmap.slitaz.org/">Roadmap</a> |
al@898 | 146 <a href="http://pizza.slitaz.me/">Pizza</a> |
al@898 | 147 <a href="http://tank.slitaz.org/">Tank</a> |
al@898 | 148 | |
al@947 | 149 <a href="/cross/">Cross</a> |
al@947 | 150 <a href="/i486.cgi">i486</a> |
al@898 | 151 <a href="$base/cookiso.cgi">ISO</a> |
al@898 | 152 <select onChange="window.location.href=this.value" style="display: none"> |
al@898 | 153 <option value=".">Go to…</option> |
al@898 | 154 <option value="http://www.slitaz.org/">Home</option> |
al@898 | 155 <option value="http://bugs.slitaz.org/">Bug tracker</option> |
al@898 | 156 <option value="http://hg.slitaz.org/wok/">Hg wok</option> |
al@898 | 157 <option value="http://roadmap.slitaz.org/">Roadmap</option> |
al@898 | 158 <option value="http://pizza.slitaz.me/">Pizza</option> |
al@898 | 159 <option value="http://tank.slitaz.org/">Tank</option> |
al@898 | 160 <option disabled>---------</option> |
al@898 | 161 <option value="cross/">Cross</option> |
al@898 | 162 <option value="i486.cgi">i486</option> |
al@898 | 163 <option value="cookiso.cgi">ISO</option> |
al@898 | 164 </select> |
al@898 | 165 </div> |
al@898 | 166 </header> |
al@898 | 167 |
al@898 | 168 <main> |
al@898 | 169 EOT |
al@898 | 170 |
al@1076 | 171 [ -n "$debug" ] && echo "<pre><code class='language-ini'>$(env | sort)</code></pre>" |
al@898 | 172 } |
al@898 | 173 |
al@898 | 174 |
al@898 | 175 # HTML page footer |
al@898 | 176 |
al@898 | 177 page_footer() { |
al@898 | 178 date_now=$(date +%s) |
al@898 | 179 sec_now=$(date +%S); sec_now=${sec_now#0} # remove one leading zero |
al@898 | 180 wait_sec=$(( 60 - $sec_now )) |
al@898 | 181 cat <<EOT |
al@898 | 182 </main> |
al@898 | 183 |
al@898 | 184 <footer> |
al@898 | 185 <a href="http://www.slitaz.org/">SliTaz Website</a> |
al@1077 | 186 <a href="http://tank.slitaz.org/graphs.php">Server status</a> |
al@898 | 187 <a href="$base/doc/cookutils/cookutils.html">Documentation</a> |
al@898 | 188 <a href="$base/?theme">Theme</a> |
al@898 | 189 </footer> |
al@898 | 190 </div> |
al@898 | 191 <script src="/cooker.js"></script> |
al@898 | 192 <script>refreshDate(${wait_sec}000, ${date_now}000)</script> |
al@898 | 193 </body> |
al@898 | 194 </html> |
al@898 | 195 EOT |
al@898 | 196 } |
al@898 | 197 |
al@898 | 198 |
al@898 | 199 show_note() { |
al@898 | 200 echo "<div class='bigicon-$1'>$2</div>" |
al@898 | 201 } |
al@898 | 202 |
al@898 | 203 |
al@898 | 204 not_found() { |
al@898 | 205 local file="${1#$PKGS/}"; file="${file#$LOGS/}"; file="${file#$WOK/}" |
al@898 | 206 echo "HTTP/1.1 404 Not Found" |
al@898 | 207 page_header |
al@898 | 208 echo "<h2>Not Found</h2>" |
al@898 | 209 case $2 in |
al@898 | 210 pkg) |
al@898 | 211 show_note e "The requested package “$(basename "$(dirname "$file")")” was not found." ;; |
al@898 | 212 *) |
al@898 | 213 show_note e "The requested file “$file” was not found." ;; |
al@898 | 214 esac |
al@898 | 215 page_footer |
al@898 | 216 } |
al@898 | 217 |
al@898 | 218 |
al@898 | 219 manage_modified() { |
al@898 | 220 local file="$1" option="$2" nul day mon year time hh mm ss date_s |
al@898 | 221 if [ ! -f "$file" ]; then |
al@898 | 222 if [ "$option" == 'silently-absent' ]; then |
al@898 | 223 echo "HTTP/1.1 404 Not Found" |
al@898 | 224 return |
al@898 | 225 else |
al@898 | 226 not_found "$file" "$2" |
al@898 | 227 exit |
al@898 | 228 fi |
al@898 | 229 fi |
al@898 | 230 [ "$option" == 'no-last-modified' ] && return |
al@898 | 231 if [ -n "$HTTP_IF_MODIFIED_SINCE" ]; then |
al@898 | 232 echo "$HTTP_IF_MODIFIED_SINCE" | \ |
al@898 | 233 while read nul day mon year time nul; do |
al@898 | 234 case $mon in |
al@898 | 235 Jan) mon='01';; Feb) mon='02';; Mar) mon='03';; Apr) mon='04';; |
al@898 | 236 May) mon='05';; Jun) mon='06';; Jul) mon='07';; Aug) mon='08';; |
al@898 | 237 Sep) mon='09';; Oct) mon='10';; Nov) mon='11';; Dec) mon='12';; |
al@898 | 238 esac |
al@898 | 239 hh=$(echo $time | cut -d: -f1) |
al@898 | 240 mm=$(echo $time | cut -d: -f2) |
al@898 | 241 ss=$(echo $time | cut -d: -f3) |
al@898 | 242 date_s=$(date -ud "$year$mon$day$hh$mm.$ss" +%s) |
al@898 | 243 # if [ "$date_s" -ge "$(date -ur "$file" +%s)" ]; then |
al@898 | 244 # echo -e 'HTTP/1.1 304 Not Modified\n' |
al@898 | 245 # exit |
al@898 | 246 # fi |
al@898 | 247 # TODO: improve caching control |
al@898 | 248 done |
al@898 | 249 fi |
al@898 | 250 echo "Last-Modified: $(date -Rur "$file" | sed 's|UTC|GMT|')" |
al@898 | 251 echo "Cache-Control: public, max-age=3600" |
al@898 | 252 } |
al@898 | 253 |
al@898 | 254 |
al@898 | 255 # Query '?pct=<package>': update percentage |
al@898 | 256 |
al@898 | 257 if [ -n "$(GET pct)" ]; then |
al@898 | 258 pkg="$(GET pct)" |
al@898 | 259 state="$(cat $command)" |
al@898 | 260 if [ "$state" == "cook:$pkg" ]; then |
al@898 | 261 set -- $(grep "^$state" $cooktime) |
al@898 | 262 [ -n "$1" ] && pct=$(( ($(date +%s) - $3) * 100 / $2 )) |
al@898 | 263 echo "${pct:-?}" |
al@898 | 264 else |
al@898 | 265 echo 'reload' |
al@898 | 266 fi |
al@898 | 267 exit 0 |
al@898 | 268 fi |
al@898 | 269 |
al@898 | 270 |
al@898 | 271 # Query '?poke': poke cooker |
al@898 | 272 |
al@898 | 273 if [ -n "$(GET poke)" ]; then |
al@898 | 274 touch $CACHE/cooker-request |
al@898 | 275 echo -e "Location: ${HTTP_REFERER:-${REQUEST_URI%\?*}}\n" |
al@898 | 276 exit |
al@898 | 277 fi |
al@898 | 278 |
al@898 | 279 |
al@898 | 280 # Query '?recook=<package>': query to recook package |
al@898 | 281 |
al@898 | 282 if [ -n "$(GET recook)" ]; then |
al@898 | 283 pkg="$(GET recook)" |
al@898 | 284 case "$HTTP_USER_AGENT" in |
al@898 | 285 *SliTaz*) |
al@898 | 286 grep -qs "^$pkg$" $CACHE/recook-packages || |
al@898 | 287 echo "$pkg" >> $CACHE/recook-packages |
al@898 | 288 esac |
al@898 | 289 echo -e "Location: ${HTTP_REFERER:-${REQUEST_URI%\?*}}\n" |
al@898 | 290 exit |
al@898 | 291 fi |
al@898 | 292 |
al@898 | 293 |
al@898 | 294 # Query '/i/<log>/<pkg>': show indicator icon |
al@898 | 295 # Can't use ?query - not able to change '+' to '%2B' in the sed rules (see log handler) |
al@898 | 296 |
al@898 | 297 if [ "$pkg" == 'i' ]; then |
al@898 | 298 echo -en "Content-Type: image/svg+xml\n\n<svg xmlns='http://www.w3.org/2000/svg' height='12' width='8'><path d='" |
al@898 | 299 if [ $LOGS/$cmd -nt $PKGS/$arg.tazpkg ]; then |
al@898 | 300 echo "m1 2-1 1v8l1 1h6l1-1v-8l-1-1z' fill='#090'/></svg>" |
al@898 | 301 else |
al@898 | 302 echo "m0 3v8l1 1h6l1-1v-8l-1-1h-6zm3 0h2v5h-2zm0 6h2v2h-2z' fill='#d00'/></svg>" |
al@898 | 303 fi |
al@898 | 304 exit |
al@898 | 305 fi |
al@898 | 306 |
al@898 | 307 |
al@982 | 308 # Query '/s/<pkg>': show status indicator icon |
al@982 | 309 # Can't use ?query - not able to change '+' to '%2B' in the sed rules (see log handler) |
al@982 | 310 |
al@982 | 311 if [ "$pkg" == 's' ]; then |
al@982 | 312 # argument <pkg> is in $cmd variable |
al@982 | 313 echo -en "Content-Type: image/svg+xml\n\n<svg xmlns='http://www.w3.org/2000/svg' height='12' width='8'><path d='" |
al@1005 | 314 # packages.info updates with each new package, so we'll find actual info here |
al@1005 | 315 if grep -q "^$cmd"$'\t' $PKGS/packages.info; then |
al@982 | 316 echo "m1 2-1 1v8l1 1h6l1-1v-8l-1-1z' fill='#090'/></svg>" |
al@982 | 317 else |
al@982 | 318 echo "m0 3v8l1 1h6l1-1v-8l-1-1h-6zm3 0h2v5h-2zm0 6h2v2h-2z' fill='#d00'/></svg>" |
al@982 | 319 fi |
al@982 | 320 exit |
al@982 | 321 fi |
al@982 | 322 |
al@982 | 323 |
al@898 | 324 # Query '?theme[=<theme>]': change UI theme |
al@898 | 325 |
al@898 | 326 if [ -n "$(GET theme)" ]; then |
al@898 | 327 theme="$(GET theme)" |
al@924 | 328 ref="$(echo "$HTTP_REFERER" | sed 's|:|%3A|g; s|/|%2F|g; s|\?|%3F|g; s|\+|%2B|g;')" |
al@898 | 329 case $theme in |
al@898 | 330 theme) |
al@898 | 331 current=$(COOKIE theme) |
al@898 | 332 page_header |
al@898 | 333 cat <<EOT |
al@898 | 334 <section> |
al@898 | 335 <h2>Change theme</h2> |
al@898 | 336 <p>Current theme: “${current:-default}”. Select other:</p> |
al@898 | 337 <ul> |
al@898 | 338 $( |
al@903 | 339 for i in default emerald sky goldenrod midnight like2016 terminal; do |
al@924 | 340 [ "$i" == "${current:-default}" ] || echo "<li><a href=\"$base/?theme=$i&ref=$ref\">$i</a></li>" |
al@898 | 341 done |
al@898 | 342 ) |
al@898 | 343 </ul> |
al@898 | 344 </section> |
al@898 | 345 EOT |
al@898 | 346 page_footer |
al@898 | 347 exit 0 |
al@898 | 348 ;; |
al@903 | 349 default|emerald|sky|goldenrod|midnight|like2016|terminal) |
al@924 | 350 ref="$(GET ref)" |
al@924 | 351 [ -n "$ref" ] || ref="$base/" |
al@898 | 352 # Expires in a year |
al@898 | 353 expires=$(date -uRd @$(($(date +%s)+31536000)) | sed 's|UTC|GMT|') |
al@924 | 354 echo -e "HTTP/1.1 302 Found\nLocation: $ref\nCache-Control: no-cache\nSet-Cookie: theme=$theme; expires=$expires\n\n" |
al@898 | 355 exit 0 |
al@898 | 356 ;; |
al@898 | 357 esac |
al@898 | 358 fi |
al@898 | 359 |
al@898 | 360 |
al@898 | 361 #case "$QUERY_STRING" in |
al@898 | 362 # stuff*) |
al@898 | 363 # file="$wok/$(GET stuff)" |
al@898 | 364 # manage_modified "$file" |
al@898 | 365 # ;; |
al@898 | 366 # |
al@898 | 367 # pkg=*|receipt=*|description=*|files=*|log=*|man=*|doc=*|info=*) |
al@898 | 368 # type=${QUERY_STRING%%=*} |
al@898 | 369 # pkg=$(GET $type) |
al@898 | 370 # case "$type" in |
al@898 | 371 # description) |
al@898 | 372 # manage_modified "$wok/$pkg/receipt" 'no-last-modified' |
al@898 | 373 # manage_modified "$wok/$pkg/description.txt" 'silently-absent' |
al@898 | 374 # ;; |
al@898 | 375 # log) |
al@898 | 376 # manage_modified "$wok/${pkg%%.log*}/receipt" 'no-last-modified' |
al@898 | 377 # manage_modified "$LOGS/$pkg" |
al@898 | 378 # ;; |
al@898 | 379 # *) |
al@898 | 380 # manage_modified "$wok/$pkg/receipt" pkg |
al@898 | 381 # ;; |
al@898 | 382 # esac |
al@898 | 383 # ;; |
al@898 | 384 #esac |
al@898 | 385 |
al@898 | 386 |
al@898 | 387 # RSS feed generator |
al@898 | 388 # URI: ?rss[&limit={1..100}] |
al@898 | 389 |
al@898 | 390 if [ -n "$(GET rss)" ]; then |
al@898 | 391 limit=$(GET limit); limit="${limit:-12}"; [ "$limit" -gt 100 ] && limit='100' |
al@898 | 392 pubdate=$(date -Rur$(ls -t $FEEDS/*.xml | head -n1) | sed 's|UTC|GMT|') |
al@898 | 393 cooker_url="http://$HTTP_HOST$base/" |
al@898 | 394 cat <<EOT |
al@898 | 395 Content-Type: application/rss+xml |
al@898 | 396 |
al@898 | 397 <?xml version="1.0" encoding="utf-8" ?> |
al@898 | 398 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> |
al@898 | 399 <channel> |
al@898 | 400 <title>$title</title> |
al@898 | 401 <description>The SliTaz packages cooker feed</description> |
al@898 | 402 <link>$cooker_url</link> |
al@898 | 403 <lastBuildDate>$pubdate</lastBuildDate> |
al@898 | 404 <pubDate>$pubdate</pubDate> |
al@898 | 405 <atom:link href="$cooker_url?rss" rel="self" type="application/rss+xml" /> |
al@898 | 406 EOT |
al@898 | 407 for rss in $(ls -t $FEEDS/*.xml | head -n$limit); do |
al@898 | 408 sed "s|http[^=]*=|$cooker_url|; s|<guid|& isPermaLink=\"false\"|g; s|</pubDate| GMT&|g" $rss |
al@898 | 409 done |
al@898 | 410 cat <<EOT |
al@898 | 411 </channel> |
al@898 | 412 </rss> |
al@898 | 413 EOT |
al@898 | 414 exit 0 |
al@898 | 415 fi |
al@898 | 416 |
al@898 | 417 |
al@903 | 418 ### OpenSearch ### |
al@903 | 419 |
al@903 | 420 # Query '/os.xml': get OpenSearch Description |
al@903 | 421 |
al@903 | 422 if [ "$pkg" == 'os.xml' ]; then |
al@903 | 423 cat <<EOT |
al@903 | 424 Content-Type: application/xml; charset=UTF-8 |
al@903 | 425 |
al@903 | 426 <?xml version="1.0" encoding="UTF-8"?> |
al@903 | 427 <OpenSearchDescription xmlns="http://a9.com/-/spec/opensearch/1.1/"> |
al@903 | 428 <ShortName>$title</ShortName> |
al@903 | 429 <Description>SliTaz packages search</Description> |
al@903 | 430 <Image width="16" height="16" type="image/png">http://$HTTP_HOST/images/logo.png</Image> |
al@903 | 431 <Url type="text/html" method="GET" template="http://$HTTP_HOST$base/{searchTerms}"/> |
al@903 | 432 <Url type="application/x-suggestions+json" method="GET" template="http://$HTTP_HOST$base/"> |
al@903 | 433 <Param name="oss" value="{searchTerms}"/> |
al@903 | 434 </Url> |
al@903 | 435 <SearchForm>http://$HTTP_HOST$base/</SearchForm> |
al@903 | 436 <InputEncoding>UTF-8</InputEncoding> |
al@903 | 437 </OpenSearchDescription> |
al@903 | 438 EOT |
al@903 | 439 exit 0 |
al@903 | 440 fi |
al@903 | 441 |
al@903 | 442 # Query '?oss[=<term>]': OpenSearch suggestions |
al@903 | 443 |
al@903 | 444 if [ -n "$(GET oss)" ]; then |
al@903 | 445 term="$(GET oss | tr -cd '[:alnum:]+-')" |
al@903 | 446 echo -e 'Content-Type: application/x-suggestions+json; charset=UTF-8\n' |
al@903 | 447 cd $wok |
al@903 | 448 ls | fgrep "$term" | head -n10 | awk -vterm="$term" ' |
al@903 | 449 BEGIN{printf("[\"%s\",[", term)} |
al@903 | 450 {printf("%s\"%s\"", NR != 1 ? "," : "", $0)} |
al@903 | 451 END {printf("]]")} |
al@903 | 452 ' |
al@903 | 453 exit 0 |
al@903 | 454 fi |
al@903 | 455 |
al@903 | 456 |
al@898 | 457 |
al@898 | 458 |
al@898 | 459 # |
al@898 | 460 # Functions |
al@898 | 461 # |
al@898 | 462 |
al@898 | 463 |
al@898 | 464 # Unpack to stdout |
al@898 | 465 |
al@898 | 466 docat() { |
al@898 | 467 case "$1" in |
al@898 | 468 *gz) zcat ;; |
al@898 | 469 *bz2) bzcat ;; |
al@898 | 470 *xz) xzcat ;; |
al@898 | 471 *) cat |
al@898 | 472 esac < $1 |
al@898 | 473 } |
al@898 | 474 |
al@898 | 475 |
al@898 | 476 # Tiny texinfo converter |
al@898 | 477 |
al@898 | 478 info2html() { |
al@898 | 479 sed \ |
al@898 | 480 -e 's|&|\&|g; s|<|\<|g; s|>|\>|g' \ |
al@898 | 481 -e 's|^\* \(.*\)::|* <a href="#\1">\1</a> |' \ |
al@898 | 482 -e 's|\*note \(.*\)::|<a href="#\1">\1</a>|' \ |
al@898 | 483 -e '/^File: / s|(dir)|Top|g' \ |
al@898 | 484 -e '/^File: / s|Next: \([^,]*\)|<a class="button" href="#\1">Next: \1</a>|' \ |
al@898 | 485 -e '/^File: / s|Prev: \([^,]*\)|<a class="button" href="#\1">Prev: \1</a>|' \ |
al@898 | 486 -e '/^File: / s|Up: \([^,]*\)|<a class="button" href="#\1">Up: \1</a>|' \ |
al@898 | 487 -e '/^File: / s|^.* Node: \([^,]*\), *\(.*\)$|<pre id="\1">\2|' \ |
al@898 | 488 -e '/^<pre id=/ s|^\([^>]*>\)\(<a[^>]*>Next: [^,]*\), *\(<a[^>]*>Prev: [^,]*\), *\(<a[^>]*>Up: .*\)|\1 \3 \4 \2|' \ |
al@898 | 489 -e '/^Tag Table:$/,/^End Tag Table$/d' \ |
al@898 | 490 -e '/INFO-DIR/,/^END-INFO-DIR/d' \ |
al@898 | 491 -e "s|https*://[^>),'\"\`’ ]*|<a href=\"&\">&</a>|g" \ |
al@898 | 492 -e "s|ftp://[^>),\"\` ]*|<a href=\"&\">&</a>|g" \ |
al@898 | 493 -e 's|^\* Menu:|<b>Menu:</b>|' \ |
al@898 | 494 -e "s|^|</pre>|" |
al@898 | 495 } |
al@898 | 496 |
al@898 | 497 |
al@898 | 498 # Put some colors into log and DB files. |
al@898 | 499 |
al@898 | 500 syntax_highlighter() { |
al@898 | 501 case $1 in |
al@898 | 502 log) |
al@898 | 503 # If variables not defined - define them with some rare values |
al@898 | 504 : ${_src=#_#_#} |
al@898 | 505 : ${_install=#_#_#} |
al@898 | 506 : ${_fs=#_#_#} |
al@898 | 507 : ${_stuff=#_#_#} |
al@898 | 508 # Use one-letter html tags to save some bytes :) |
al@998 | 509 # <b>is error (red)</b> <u>is warning (orange)</u> <i>is informative (green)</i> |
al@1002 | 510 sed \ |
al@1002 | 511 -e 's/&/\&/g; s/</\</g; s/>/\>/g' \ |
al@898 | 512 -e 's#OK$#<i>OK</i>#' \ |
al@898 | 513 -e 's#\([Dd]one\)$#<i>\1</i>#' \ |
al@898 | 514 -e 's#Success$#<i>Success</i>#' \ |
al@898 | 515 -e 's#\([^a-z]\)ok$#\1<i>ok</i>#' \ |
al@898 | 516 -e 's#\([^a-z]\)yes$#\1<i>yes</i>#' \ |
al@1059 | 517 -e 's#: \(YES.*\)#: <i>\1</i>#' \ |
al@912 | 518 -e 's#\([^a-z]\)ON$#\1<i>ON</i>#' \ |
al@1062 | 519 -e 's#\(enabled\)$#<i>\1</i>#' \ |
al@898 | 520 -e 's#\([^a-z]\)no$#\1<u>no</u>#' \ |
al@1059 | 521 -e 's#: \(NO.*\)#: <u>\1</u>#' \ |
al@898 | 522 -e 's#\([^a-z]\)none$#\1<u>none</u>#' \ |
al@898 | 523 -e 's#\([^a-z]\)false$#\1<u>false</u>#' \ |
al@912 | 524 -e 's#\([^a-z]\)OFF$#\1<u>OFF</u>#' \ |
al@1062 | 525 -e 's#\(disabled\)$#<u>\1</u>#' \ |
al@898 | 526 -e 's#\(^checking .*\.\.\. \)\(.*\)$#\1<i>\2</i>#' \ |
al@898 | 527 \ |
al@898 | 528 -e 's#\( \[Y[nm/]\?\] n\)$# <u>\1</u>#' \ |
al@898 | 529 -e 's#\( \[N[ym/]\?\] y\)$# <i>\1</i>#' \ |
al@898 | 530 -e 's# y$# <i>y</i>#' \ |
al@898 | 531 -e 's# n$# <u>n</u>#' \ |
al@898 | 532 -e 's#(NEW) *$#<b>(NEW)</b>#' \ |
al@898 | 533 \ |
al@898 | 534 -e 's#.*(pkg/local).*#<i>\0</i>#' \ |
al@898 | 535 -e 's#.*(web/cache).*#<u>\0</u>#' \ |
al@898 | 536 \ |
al@898 | 537 -e 's#\([^a-zA-Z]\)\([Ee]rror\)$#\1<b>\2</b>#' \ |
al@898 | 538 -e 's#ERROR:#<b>ERROR:</b>#g' \ |
al@898 | 539 \ |
al@1063 | 540 -e 's#^.*multiple definition of.*#<b>\0</b>#' \ |
al@909 | 541 -e 's#^.*[Ff][Aa][Ii][Ll][Ee][Dd].*#<b>\0</b>#' \ |
al@1078 | 542 -e 's#^.*[^A-Za-z:/-][Ff]atal.*#<b>\0</b>#' \ |
al@989 | 543 -e '/non-fatal/ s|</*b>||g' \ |
al@898 | 544 -e 's#^.*[Nn]ot found.*#<b>\0</b>#' \ |
al@898 | 545 -e 's#^.*[Nn]o such file.*#<b>\0</b>#' \ |
al@898 | 546 -e 's#^.*No package .* found.*#<b>\0</b>#' \ |
al@898 | 547 -e 's#^.*Unable to find.*#<b>\0</b>#' \ |
al@938 | 548 -e 's#[^a-zA-Z-][Ii]nvalid.*#<b>\0</b>#' \ |
al@1064 | 549 -e 's#Segmentation fault#<b>\1</b>#' \ |
al@914 | 550 -e 's#\([Nn][Oo][Tt] found\.*\)$#<b>\1</b>#' \ |
al@914 | 551 -e 's#\(found\.*\)$#<i>\1</i>#' \ |
al@898 | 552 \ |
al@898 | 553 -e 's#^.*WARNING:.*#<u>\0</u>#' \ |
al@898 | 554 -e 's#^.*warning:.*#<u>\0</u>#' \ |
al@898 | 555 -e 's#^.* [Ee]rror:* .*#<b>\0</b>#' \ |
al@898 | 556 -e 's#^.*terminated.*#<b>\0</b>#' \ |
al@898 | 557 -e 's#\(missing\)#<b>\1</b>#g' \ |
al@898 | 558 -e 's#^.*[Cc]annot find.*#<b>\0</b>#' \ |
al@1064 | 559 -e 's#^.*unrecognized option.*#<u>\0</u>#' \ |
al@898 | 560 -e 's#^.*does not.*#<u>\0</u>#' \ |
al@898 | 561 -e 's#^.*[Ii]gnoring.*#<u>\0</u>#' \ |
al@898 | 562 -e 's#^.*note:.*#<u>\0</u>#' \ |
al@898 | 563 \ |
al@898 | 564 -e 's#^.* will not .*#<u>\0</u>#' \ |
al@898 | 565 -e 's!^Hunk .* succeeded at .*!<u>\0</u>!' \ |
al@898 | 566 -e 's#^.* Warning: .*#<u>\0</u>#' \ |
al@898 | 567 \ |
al@898 | 568 -e "s#^Executing:\([^']*\).#<em>\0</em>#" \ |
al@898 | 569 -e "s#^Making.*#<em>\0</em>#" \ |
al@898 | 570 -e "s#^Scanning dependencies of target .*#<em>\0</em>#" \ |
al@898 | 571 -e "s#^====\([^']*\).#<span class='span-line'>\0</span>#g" \ |
al@898 | 572 -e "s#^[a-zA-Z0-9]\([^']*\) :: #<span class='span-sky'>\0</span>#g" \ |
al@898 | 573 -e "s#[fh]tt*ps*://[^ '\"]*#<a href='\0'>\0</a>#g" \ |
al@1079 | 574 -e 's|^Switching to the .*|<span class="switch">‣‣‣ \0</span>|' \ |
al@898 | 575 \ |
al@941 | 576 -e 's|^<u>\(.*libtool: warning: relinking.*\)</u>|\1|' \ |
al@941 | 577 -e 's|^<u>\(.*libtool: warning: .* has not been installed in .*\)</u>|\1|' \ |
al@941 | 578 -e 's|^<u>\(.*checking for a sed.*\)</u>|\1|' \ |
al@1048 | 579 -e 's|^<u><b>\(.*inlining failed.*\)</b></u>|<u>\1</u>|' \ |
al@941 | 580 \ |
al@941 | 581 -e "s|$_src|<var>\${src}</var>|g; |
al@941 | 582 s|$_install|<var>\${install}</var>|g; |
al@941 | 583 s|$_fs|<var>\${fs}</var>|g; |
al@941 | 584 s|$_stuff|<var>\${stuff}</var>|g" \ |
al@1002 | 585 \ |
al@1017 | 586 -e "s|\[\([01]\)m\[3\([1-7]\)m|<span class='c\2\1'>|g; |
al@1017 | 587 s|\[\([01]\);3\([1-7]\)m|<span class='c\2\1'>|g; |
al@1022 | 588 s|\[3\([1-7]\)m|<span class='c\10'>|g; |
al@1002 | 589 s|\[\([01]\);0m|<span class='c0\1'>|g; |
al@1016 | 590 s|\[0m|</span>|g; |
al@1017 | 591 s|\[m|</span>|g; |
al@1022 | 592 s|\[0;10m|</span>|g; |
al@1022 | 593 s|\[K||g;" \ |
al@1002 | 594 \ |
al@913 | 595 -e "s|\[9\([1-6]\)m|<span class='c\10'>|; |
al@942 | 596 s|\[39m|</span>|; |
al@1022 | 597 #s|\[1m|<span class='c01'>|g; |
al@1022 | 598 s|\[1m|<span style='font-weight:bold'>|g; s|(B|</span>|g; |
al@1022 | 599 s|\[m||g; |
al@1022 | 600 " \ |
al@1002 | 601 -e "s!^|\(+.*\)!|<span class='c20'>\1</span>!; |
al@1002 | 602 s!^|\(-.*\)!|<span class='c10'>\1</span>!; |
al@1002 | 603 s!^|\(@@.*@@\)\$!|<span class='c30'>\1</span>!;" |
al@1002 | 604 \ |
al@1002 | 605 |
al@898 | 606 ;; |
al@898 | 607 |
al@898 | 608 files) |
al@898 | 609 # Highlight the Busybox's `ls` output |
al@898 | 610 awk '{ |
al@898 | 611 part1 = substr($0, 0, 16); |
al@898 | 612 part2 = substr($0, 17, 9); |
al@898 | 613 part3 = substr($0, 26, 9); |
al@898 | 614 part4 = substr($0, 35); |
al@898 | 615 if (part2 != "root ") part2 = "<span class=\"c11\">" part2 "</span>"; |
al@898 | 616 if (part3 != "root ") part3 = "<span class=\"c11\">" part3 "</span>"; |
al@898 | 617 print part1 part2 part3 part4; |
al@898 | 618 }' | \ |
al@924 | 619 sed "s|\[0m/|/\[0m|g; |
al@924 | 620 s|\[\([01]\);3\([1-7]\)m|<a class='c\2\1'>|g; |
al@898 | 621 s|\[\([01]\);0m|<a class='c0\1'>|g; |
al@898 | 622 s|\[0m|</a>|g; |
al@898 | 623 s|^\(lrwxrwxrwx\)|<span class='c61'>\1</span>|; |
al@898 | 624 s|^\(-rwxr-xr-x\)|<span class='c21'>\1</span>|; |
al@898 | 625 s|^\(-rw-r--r--\)|<span class='c31'>\1</span>|; |
al@924 | 626 s|^\(drwxr-xr-x\)|<span class='c41'>\1</span>|; |
al@1077 | 627 s|^\(-rwsr-xr-x\)|<span class='c51'>\1</span>|; |
al@1010 | 628 s|^\([lrwxs-][lrwxs-]*\)|<span class='c11'>\1</span>|; |
al@898 | 629 " |
al@898 | 630 ;; |
al@898 | 631 esac |
al@898 | 632 } |
al@898 | 633 |
al@898 | 634 |
al@898 | 635 show_code() { |
al@898 | 636 echo -n "<pre><code class=\"language-$1\">" |
al@898 | 637 sed 's|&|\&|g; s|<|\<|g; s|>|\>|g' |
al@898 | 638 echo '</code></pre>' |
al@898 | 639 } |
al@898 | 640 |
al@898 | 641 |
al@898 | 642 datalist() { |
al@940 | 643 cut -d$'\t' -f2 $splitdb | tr ' ' '\n' | sort -u | awk ' |
al@898 | 644 BEGIN{printf("<datalist id=\"packages\">")} |
al@940 | 645 {printf("<option>%s",$1)} |
al@898 | 646 END {printf("</datalist>")} |
al@898 | 647 ' |
al@898 | 648 } |
al@898 | 649 |
al@898 | 650 |
al@898 | 651 mklog() { |
al@898 | 652 awk ' |
al@898 | 653 BEGIN { printf("<pre class=\"log dog\">\n") } |
al@898 | 654 { print } |
al@898 | 655 END { print "</pre>" }' |
al@898 | 656 } |
al@898 | 657 |
al@898 | 658 |
al@898 | 659 summary() { |
al@898 | 660 log="$1" |
al@898 | 661 pkg="$(basename ${log%%.log*})" |
al@898 | 662 |
al@898 | 663 if [ -f "$log" ]; then |
al@898 | 664 if grep -q "cook:$pkg$" $command; then |
al@898 | 665 show_note i "The Cooker is currently building $pkg" |
al@898 | 666 elif fgrep -q "Summary for:" $log; then |
al@904 | 667 sed '/^Summary for:/,$!d' $log | awk ' |
al@898 | 668 BEGIN { print "<section>" } |
al@904 | 669 function row(line) { |
al@904 | 670 split(line, s, " : "); |
al@904 | 671 printf("\t<tr><td>%s</td><td>%s</td></tr>\n", s[1], s[2]); |
al@904 | 672 } |
al@904 | 673 function row2(line, rowNum) { |
al@904 | 674 split(line, s, " : "); |
al@938 | 675 if (rowNum == 1) { |
al@938 | 676 print "<thead>"; |
al@904 | 677 printf("\t<tr><th>%s</th><th>%s</th><th>%s</th><th>%s</th><th>%s</th></tr>\n", s[1], s[2], s[3], s[4], s[5]); |
al@938 | 678 print "</thead><tbody>"; |
al@938 | 679 } |
al@904 | 680 else |
al@904 | 681 printf("\t<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n", s[1], s[2], s[3], s[4], s[5]); |
al@904 | 682 } |
al@898 | 683 { |
al@904 | 684 if (NR==1) { printf("<h3>%s</h3>\n<table>\n", $0); next } |
al@904 | 685 if ($0 ~ "===") { seen++; if (seen == 1) next; else exit; } |
al@904 | 686 if ($0 ~ "---") { |
al@904 | 687 seen2++; |
al@938 | 688 if (seen2 == 1) print "</table>\n\n<table class=\"pkgslist\">" |
al@904 | 689 next |
al@898 | 690 } |
al@904 | 691 if (seen2) row2($0, seen2); else row($0); |
al@898 | 692 } |
al@938 | 693 END { print "</tbody></table></section>" } |
al@898 | 694 ' |
al@898 | 695 elif fgrep -q "Debug information" $log; then |
al@898 | 696 echo -e '<section>\n<h3>Debug information</h3>' |
al@898 | 697 sed -e '/^Debug information/,$!d; /^===/d; /^$/d' $log | sed -n '1!p' | \ |
al@898 | 698 if [ -n "$2" ]; then |
al@979 | 699 syntax_highlighter log | sed 's|\([^0-9 ]\)\([0-9][0-9]*\):|\1<a href="#l\2">\2</a>:|' |
al@898 | 700 else |
al@898 | 701 sed 's|^[0-9][0-9]*:||' | syntax_highlighter log |
al@898 | 702 fi | mklog |
al@898 | 703 echo '</section>' |
al@898 | 704 fi |
al@898 | 705 else |
al@898 | 706 [ -n "$pkg" -a -d "$wok/$pkg" ] && show_note e "No log for $pkg" |
al@898 | 707 fi |
al@898 | 708 } |
al@898 | 709 |
al@898 | 710 |
al@898 | 711 active() { |
al@898 | 712 [ "$cmd" == "$1" -o "$cmd" == "${2:-$1}" ] && echo -n ' active' |
al@898 | 713 } |
al@898 | 714 |
al@898 | 715 |
al@898 | 716 pkg_info() { |
al@998 | 717 local log active bpkg short_desc='' |
al@898 | 718 log="$LOGS/$pkg.log" |
al@898 | 719 |
al@1074 | 720 echo -n "<div id=\"hdr\"><a href=\"$base/${requested_pkg:-$pkg}\">" |
al@1076 | 721 if [ -e $wok/$pkg/.icon.png ]; then |
al@1076 | 722 echo -n "<img src=\"$base/$pkg/browse/.icon.png\"/>" |
al@1074 | 723 else |
al@1074 | 724 echo -n "<img src=\"/tazpkg.png\"/>" |
al@1074 | 725 fi |
al@1074 | 726 echo -n "</a>" |
al@996 | 727 echo -n "<h2><a href=\"$base/${requested_pkg:-$pkg}\">${requested_pkg:-$pkg}</a>" |
al@998 | 728 # Get short description for existing packages |
al@998 | 729 [ -f $PKGS/packages.info ] && |
al@998 | 730 short_desc="$(awk -F$'\t' -vp="${requested_pkg:-$pkg}" '{if ($1 == p) { printf("%s", $4); exit; }}' $PKGS/packages.info)" |
paul@1006 | 731 # If package does not exist (not created yet or broken), get short description |
al@998 | 732 # (but only for "main" package) from receipt |
al@998 | 733 [ -n "$short_desc" ] || short_desc="$(. $wok/$pkg/receipt; echo "$SHORT_DESC")" |
al@1074 | 734 echo "<br/>$short_desc</h2></div>" |
al@898 | 735 echo '<div id="info">' |
al@898 | 736 echo "<a class='button icon receipt$(active receipt stuff)' href='$base/$pkg/receipt'>receipt & stuff</a>" |
al@898 | 737 |
al@1003 | 738 # In the receipts $EXTRAVERSION is defined using $kvers, get it here [copy from 'cook' set_paths()] |
al@1003 | 739 if [ -f "$wok/linux/receipt" ]; then |
al@1003 | 740 kvers=$(. $wok/linux/receipt; echo $VERSION) |
al@1003 | 741 kbasevers=$(echo $kvers | cut -d. -f1,2) |
al@1003 | 742 elif [ -f "$INSTALLED/linux-api-headers/receipt" ]; then |
al@1003 | 743 kvers=$(. $INSTALLED/linux-api-headers/receipt; echo $VERSION) |
al@1003 | 744 kbasevers=$(echo $kvers | cut -d. -f1,2) |
al@1003 | 745 fi |
al@1003 | 746 |
al@898 | 747 unset WEB_SITE WANTED |
al@898 | 748 . $wok/$pkg/receipt |
al@898 | 749 |
al@898 | 750 [ -n "$WEB_SITE" ] && |
al@898 | 751 echo "<a class='button icon website' href='$WEB_SITE' target='_blank' rel='noopener noreferrer'>web site</a>" |
al@898 | 752 |
al@1003 | 753 [ -f "$wok/$pkg/taz/$PACKAGE-$VERSION$EXTRAVERSION/receipt" ] && |
al@898 | 754 echo "<a class='button icon files$(active files)' href='$base/$pkg/files'>files</a>" |
al@898 | 755 |
al@925 | 756 [ -n "$(ls $wok/$pkg/description*.txt)" ] && |
al@925 | 757 echo "<a class='button icon desc$(active description)' href='$base/$pkg/description'>description</a>" |
al@898 | 758 |
al@925 | 759 [ -n "$TARBALL" -a -s "$SRC/$TARBALL" -o -d "$wok/$pkg/taz" ] && |
al@925 | 760 echo "<a class='button icon download' href='$base/$pkg/download'>download</a>" |
al@898 | 761 |
al@898 | 762 echo "<a class='button icon browse' href='$base/$pkg/browse/'>browse</a>" |
al@898 | 763 |
al@1002 | 764 [ -x ./man2html.bin -a -d "$wok/$pkg/install/usr/share/man" ] && |
al@898 | 765 echo "<a class='button icon doc$(active man)' href='$base/$pkg/man/'>man</a>" |
al@898 | 766 |
al@898 | 767 [ -d "$wok/$pkg/install/usr/share/doc" -o -d "$wok/$pkg/install/usr/share/gtk-doc" ] && |
al@898 | 768 echo "<a class='button icon doc$(active doc)' href='$base/$pkg/doc/'>doc</a>" |
al@898 | 769 |
al@898 | 770 [ -d "$wok/$pkg/install/usr/share/info" ] && |
al@898 | 771 echo "<a class='button icon doc$(active info)' href='$base/$pkg/info/#Top'>info</a>" |
al@898 | 772 |
al@989 | 773 if [ -n "$LFS" ]; then |
al@989 | 774 printf "<a class='button icon doc' href='%s' target='_blank' rel='noopener noreferrer'>" "$LFS" |
al@989 | 775 [ "${LFS/blfs/}" != "$LFS" ] && printf "B" |
al@989 | 776 printf "LFS</a>\n" |
al@989 | 777 fi |
al@981 | 778 |
al@1078 | 779 ls $log* >/dev/null 2>&1 && |
al@898 | 780 echo "<a class='button icon log$(active log)' href='$base/$pkg/log/'>logs</a>" |
al@898 | 781 |
al@898 | 782 echo '</div>' |
al@898 | 783 } |
al@898 | 784 |
al@898 | 785 |
al@898 | 786 mktable() { |
al@898 | 787 sed 's# : #|#' | awk -vc="$1" ' |
al@898 | 788 BEGIN { printf("<table class=\"%s\">\n", c); FS="|" } |
al@898 | 789 { printf("<tr><td>%s</td>", $1); |
al@898 | 790 if (NF == 2) printf("<td>%s</td>", $2); |
al@898 | 791 printf("</tr>\n", $2) } |
al@898 | 792 END { print "</table>" }' |
al@898 | 793 } |
al@898 | 794 |
al@898 | 795 |
al@898 | 796 section() { |
al@898 | 797 local i=$(basename "$1") |
al@898 | 798 echo -e '\n\n<section>' |
al@898 | 799 [ $(wc -l < $1) -gt $2 ] && echo "<a class='button icon more r' href='?$i'>${3#*|}</a>" |
al@898 | 800 echo "<h2>${3%|*}</h2>" |
al@898 | 801 mktable "$i" |
al@898 | 802 echo '</section>' |
al@898 | 803 } |
al@898 | 804 |
al@898 | 805 |
al@908 | 806 show_desc() { |
al@908 | 807 echo "<section><h3>Description of “$1”</h3>" |
al@908 | 808 if [ -n "$md2html" ]; then |
al@908 | 809 $md2html $2 |
al@908 | 810 else |
al@908 | 811 show_code markdown < $2 |
al@908 | 812 fi |
al@908 | 813 echo "</section>" |
al@908 | 814 } |
al@908 | 815 |
al@908 | 816 |
al@924 | 817 # Return all the names of packages bundled in this receipt |
al@924 | 818 |
al@924 | 819 all_names() { |
al@1022 | 820 # Get package names from $SPLIT variable |
al@1022 | 821 local split=$(echo $SPLIT \ |
al@1022 | 822 | awk ' |
al@1022 | 823 BEGIN { RS = " "; FS = ":"; } |
al@1022 | 824 { print $1; }' \ |
al@1022 | 825 | tr '\n' ' ') |
al@1022 | 826 local split_space=" $split " |
al@1022 | 827 if ! head -n1 $WOK/$pkg/receipt | fgrep -q 'v2'; then |
al@1022 | 828 # For receipts v1: $SPLIT may present in the $WANTED package, |
al@1022 | 829 # but split packages have their own receipts |
al@1022 | 830 echo $PACKAGE |
al@1022 | 831 elif [ "${split_space/ $PACKAGE /}" != "$split_space" ]; then |
al@924 | 832 # $PACKAGE included somewhere in $SPLIT (probably in the end). |
al@924 | 833 # We should build packages in the order defined in the $SPLIT. |
al@1022 | 834 echo $split |
al@924 | 835 else |
al@924 | 836 # We'll build the $PACKAGE, then all defined in the $SPLIT. |
al@1022 | 837 echo $PACKAGE $split |
al@924 | 838 fi |
al@924 | 839 } |
al@924 | 840 |
al@924 | 841 |
al@924 | 842 toolchain_version() { |
al@1007 | 843 echo "<tr><td><a href='$base/$1'>$1</a></td>" |
al@1007 | 844 awk -F$'\t' -vpkg="$1" ' |
al@1007 | 845 BEGIN { version = description = "---"; } |
al@1007 | 846 { |
al@1007 | 847 if ($1 == pkg) { version = $2; description = $4; } |
al@1007 | 848 } |
al@1007 | 849 END { printf("<td>%s</td><td>%s</td></tr>", version, description); } |
al@1007 | 850 ' $PKGS/packages.info |
al@924 | 851 } |
al@924 | 852 |
al@924 | 853 |
al@924 | 854 files_header() { |
al@924 | 855 echo '<section><h3>Available downloads:</h3>' |
al@924 | 856 echo '<table><thead><tr><th>File</th><th>Size</th><th>Description</th></tr></thead><tbody>' |
al@924 | 857 } |
al@924 | 858 |
al@924 | 859 |
al@933 | 860 # Update statistics used in web interface. |
al@933 | 861 # There is no need to recalculate the statistics every time the page is displayed. |
al@940 | 862 # Note, $webstat file must be owned by www, otherwise this function will not be able to do the job. |
al@933 | 863 |
al@933 | 864 update_webstat() { |
al@933 | 865 # for receipts: |
al@933 | 866 rtotal=$(ls $WOK/*/arch.$ARCH | wc -l) |
al@933 | 867 rcooked=$(ls -d $WOK/*/taz | wc -l) |
al@933 | 868 runbuilt=$(($rtotal - $rcooked)) |
al@933 | 869 rblocked=$(wc -l < $blocked) |
al@933 | 870 rbroken=$(wc -l < $broken) |
al@933 | 871 |
al@933 | 872 # for packages: |
al@936 | 873 ptotal=$(cut -d$'\t' -f2 $CACHE/split.db | tr ' ' '\n' | sort -u | wc -l) |
al@933 | 874 pcooked=$(ls $PKGS/*.tazpkg | wc -l) |
al@933 | 875 punbuilt=$(($ptotal - $pcooked)) |
al@933 | 876 pblocked=$( |
al@933 | 877 while read i; do |
al@933 | 878 sed "/^$i\t/!d" $CACHE/split.db |
al@933 | 879 done < $blocked | cut -d$'\t' -f2 | tr ' ' '\n' | wc -l) |
al@933 | 880 pbroken=$( |
al@933 | 881 while read i; do |
al@933 | 882 sed "/^$i\t/!d" $CACHE/split.db |
al@933 | 883 done < $broken | cut -d$'\t' -f2 | tr ' ' '\n' | wc -l) |
al@933 | 884 |
al@933 | 885 cat > $webstat <<EOT |
al@933 | 886 rtotal="$rtotal"; rcooked="$rcooked"; runbuilt="$runbuilt"; rblocked="$rblocked"; rbroken="$rbroken" |
al@933 | 887 ptotal="$ptotal"; pcooked="$pcooked"; punbuilt="$punbuilt"; pblocked="$pblocked"; pbroken="$pbroken" |
al@933 | 888 EOT |
al@933 | 889 } |
al@933 | 890 |
al@933 | 891 |
al@1063 | 892 # Generate part of the main page |
al@1063 | 893 |
al@1063 | 894 part() { |
al@1071 | 895 echo -n "<div id='$1'>" |
al@1063 | 896 |
al@1063 | 897 case $1 in |
al@1063 | 898 summary) |
al@1063 | 899 echo '<h2>Summary</h2>' |
al@1063 | 900 |
al@1063 | 901 mktable <<EOT |
al@1063 | 902 Cooker state : $(running_command) |
al@1063 | 903 Wok revision : <a href='$WOK_URL' target='_blank' rel='noopener noreferrer'>$(cat $wokrev)</a> |
al@1063 | 904 Commits to cook : $(wc -l < $commits) |
al@1063 | 905 Current cooklist : $(wc -l < $cooklist) |
al@1063 | 906 Architecture : $ARCH, <a href="$toolchain">toolchain</a> |
al@1063 | 907 Server date : <span id='date'>$(date -u '+%F %R %Z')</span> |
al@1063 | 908 EOT |
al@1063 | 909 |
al@1063 | 910 # If command is "cook:*", update gauge and percentage periodically. |
al@1063 | 911 # If different package is cooking, reload the page (with new settings) |
al@1063 | 912 cmd="$(cat $command)" |
al@1063 | 913 case "$cmd" in |
al@1063 | 914 cook:*) |
al@1063 | 915 pkg=${cmd#*:} |
al@1063 | 916 echo "<script>updatePkg = '${pkg//+/%2B}';</script>" |
al@1063 | 917 ;; |
al@1063 | 918 esac |
al@1063 | 919 ;; |
al@1063 | 920 webstat) |
al@1063 | 921 # Do we need to update the statistics? |
al@1071 | 922 if [ -n "$nojs" -a "$activity" -nt "$webstat" ]; then update_webstat; fi |
al@1063 | 923 . $webstat |
al@1063 | 924 |
al@1063 | 925 pct=0; [ "$rtotal" -gt 0 ] && pct=$(( ($rcooked * 100) / $rtotal )) |
al@1063 | 926 |
al@1063 | 927 cat <<EOT |
al@1063 | 928 <div class="meter"><progress max="100" value="$pct">${pct}%</progress><span>${pct}%</span></div> |
al@1063 | 929 |
al@1063 | 930 <table class="webstat"><thead> |
al@1063 | 931 <tr><th> </th><th>Total </th><th>Cooked </th><th>Unbuilt </th><th>Blocked </th><th>Broken </th></tr> |
al@1063 | 932 </thead><tbody> |
al@1063 | 933 <tr><td>Receipts</td><td>$rtotal</td><td>$rcooked</td><td>$runbuilt</td><td>$rblocked</td><td>$rbroken</td></tr> |
al@1063 | 934 <tr><td>Packages</td><td>$ptotal</td><td>$pcooked</td><td>$punbuilt</td><td>$pblocked</td><td>$pbroken</td></tr> |
al@1063 | 935 </tbody></table> |
al@1063 | 936 EOT |
al@1071 | 937 if [ -z "$nojs" ]; then echo "<script>getPart('$1')</script>"; fi |
al@1063 | 938 ;; |
al@1063 | 939 activity) |
al@1063 | 940 tac $activity | head -n12 | sed 's|cooker.cgi?pkg=||; |
al@1063 | 941 s|\[ Done|<span class="r c20">Done|; |
al@1063 | 942 s|\[ Failed|<span class="r c10">Failed|; |
al@1063 | 943 s|\[ -Failed|<span class="r c10"><del>Failed</del>|; |
al@1063 | 944 s| \]|</span>|; |
al@1063 | 945 s|%2B|\+|g' | \ |
al@1063 | 946 section $activity 12 "Activity|More activity" |
al@1063 | 947 ;; |
al@1063 | 948 cooknotes) |
al@1063 | 949 [ -s "$cooknotes" ] && tac $cooknotes | head -n12 | \ |
al@1063 | 950 section $cooknotes 12 "Cooknotes|More notes" |
al@1063 | 951 ;; |
al@1063 | 952 commits) |
al@1063 | 953 [ -s "$commits" ] && head -n20 $commits | \ |
al@1063 | 954 section $commits 20 "Commits|More commits" |
al@1063 | 955 ;; |
al@1063 | 956 cooklist) |
al@1063 | 957 [ -s "$cooklist" ] && head -n 20 $cooklist | \ |
al@1063 | 958 section $cooklist 20 "Cooklist|Full cooklist" |
al@1063 | 959 ;; |
al@1063 | 960 broken) |
al@1063 | 961 [ -s "$broken" ] && head -n20 $broken | sed "s|^[^']*|<a href='\0'>\0</a>|g" | \ |
al@1063 | 962 section $broken 20 "Broken|All broken packages" |
al@1063 | 963 ;; |
al@1063 | 964 blocked) |
al@1063 | 965 [ -s "$blocked" ] && sed "s|^[^']*|<a href='\0'>\0</a>|g" $blocked | \ |
al@1063 | 966 section $blocked 12 "Blocked|All blocked packages" |
al@1063 | 967 ;; |
al@1063 | 968 pkgs) |
al@1063 | 969 cd $PKGS |
al@1063 | 970 # About BusyBox's `ls` |
al@1063 | 971 # On the Tank server: BusyBox v1.18.4 (2012-03-14 03:32:25 CET) multi-call binary. |
al@1063 | 972 # It supported the option `-e`, output with `-let` options like this: |
al@1063 | 973 # -rw-r--r-- 1 user group 100000 Fri Nov 3 10:00:00 2017 filename |
al@1063 | 974 # 1 2 3 4 5 6 7 8 9 10 11 |
al@1063 | 975 # Newer BusyBox v1.27.2 doesn't support option `-e` and has no configs to |
al@1063 | 976 # configure it or return the option back. It supported the long option |
al@1063 | 977 # `--full-time` instead, but output is different: |
al@1063 | 978 # -rw-r--r-- 1 user group 100000 2017-11-03 10:00:00 +0200 filename |
al@1063 | 979 # 1 2 3 4 5 6 7 8 9 |
al@1063 | 980 if ls -let >/dev/null 2>&1; then |
al@1063 | 981 ls -let *.tazpkg \ |
al@1063 | 982 | awk ' |
al@1063 | 983 (NR<=20){ |
al@1063 | 984 sub(/:[0-9][0-9]$/, "", $9); |
al@1063 | 985 mon = index(" JanFebMarAprMayJunJulAugSepOctNovDec", $7) / 3; |
al@1063 | 986 printf("%d-%02d-%02d %s : <a href=\"get/%s\">%s</a>\n", $10, mon, $8, $9, $11, $11); |
al@1063 | 987 }' \ |
al@1063 | 988 | section $activity 1000 "Latest cook" |
al@1063 | 989 else |
al@1063 | 990 ls -lt --full-time *.tazpkg \ |
al@1063 | 991 | awk ' |
al@1063 | 992 (NR<=20){ |
al@1063 | 993 sub(/:[0-9][0-9]$/, "", $7); |
al@1063 | 994 printf("%s %s : <a href=\"get/%s\">%s</a>\n", $6, $7, $9, $9); |
al@1063 | 995 }' \ |
al@1063 | 996 | section $activity 1000 "Latest cook" |
al@1063 | 997 fi |
al@1063 | 998 ;; |
al@1063 | 999 esac |
al@1071 | 1000 echo "</div>" |
al@1063 | 1001 } |
al@1063 | 1002 |
al@1063 | 1003 |
al@1063 | 1004 # Query '?part=<part>': get part of the main page |
al@1063 | 1005 |
al@1063 | 1006 if [ -n "$(GET part)" ]; then |
al@1063 | 1007 part="$(GET part)" |
al@1063 | 1008 case $part in |
al@1063 | 1009 summary|webstat|activity|cooknotes|commits|cooklist|broken|blocked|pkgs) |
al@1063 | 1010 nojs='yes' |
al@1063 | 1011 part $part |
al@1063 | 1012 ;; |
al@1063 | 1013 esac |
al@1063 | 1014 exit 0 |
al@1063 | 1015 fi |
al@1063 | 1016 |
al@1063 | 1017 |
al@898 | 1018 |
al@898 | 1019 |
al@898 | 1020 # |
al@898 | 1021 # Load requested page |
al@898 | 1022 # |
al@898 | 1023 |
al@898 | 1024 if [ -z "$pkg" ]; then |
al@898 | 1025 |
al@898 | 1026 page_header |
al@1076 | 1027 if [ -n "$QUERY_STRING" ]; then |
al@898 | 1028 |
al@1076 | 1029 [ "$QUERY_STRING" != 'commits.log' ] && |
al@1073 | 1030 for list in activity cooknotes cooklist commits; do |
al@898 | 1031 [ -n "$(GET $list)" ] || continue |
al@1073 | 1032 case $list in |
al@1073 | 1033 cooklist) nb="- Packages: $(wc -l < $cooklist)";; |
al@1073 | 1034 commits) nb="- Packages: $(wc -l < $commits)";; |
al@1073 | 1035 esac |
al@898 | 1036 echo '<section id="content2">' |
al@898 | 1037 echo "<h2>DB: $list $nb</h2>" |
al@905 | 1038 tac $CACHE/$list | sed 's|cooker.cgi?pkg=||; s|%2B|+|g; |
al@898 | 1039 s|\[ Done|<span class="r c20">Done|; |
al@898 | 1040 s|\[ Failed|<span class="r c10">Failed|; |
al@1027 | 1041 s|\[ -Failed|<span class="r c10"><del>Failed</del>|; |
al@898 | 1042 s| \]|</span>|' | mktable $list |
al@898 | 1043 echo '</section>' |
al@898 | 1044 done |
al@898 | 1045 |
al@898 | 1046 if [ -n "$(GET broken)" ]; then |
al@938 | 1047 echo '<section id="content2">' |
al@898 | 1048 echo "<h2>DB: broken - Packages: $(wc -l < $broken)</h2>" |
al@898 | 1049 sort $CACHE/broken | sed "s|^[^']*|<a href='$base/\0'>\0</a>|g" | mktable |
al@938 | 1050 echo '</section>' |
al@898 | 1051 fi |
al@898 | 1052 |
al@898 | 1053 case "$QUERY_STRING" in |
al@898 | 1054 *.log) |
al@898 | 1055 log=$LOGS/$QUERY_STRING |
al@898 | 1056 name=$(basename $log) |
al@898 | 1057 if [ -f "$log" ]; then |
al@898 | 1058 echo "<h2>Log for: ${name%.log}</h2>" |
al@898 | 1059 if fgrep -q "Summary" $log; then |
al@898 | 1060 echo '<pre class="log">' |
al@942 | 1061 grep -A 20 'Summary' $log | syntax_highlighter log |
al@898 | 1062 echo '</pre>' |
al@898 | 1063 fi |
al@898 | 1064 echo '<pre class="log">' |
al@898 | 1065 syntax_highlighter log < $log |
al@898 | 1066 echo '</pre>' |
al@986 | 1067 if [ "$QUERY_STRING" == 'pkgdb.log' ]; then |
al@985 | 1068 # Display button only for SliTaz web browser |
al@985 | 1069 case "$HTTP_USER_AGENT" in |
al@985 | 1070 *SliTaz*) |
al@985 | 1071 if [ -f $CACHE/cooker-request -a -n "$HTTP_REFERER" ]; then |
al@985 | 1072 if grep -qs '^pkgdb$' $CACHE/recook-packages; then |
al@985 | 1073 show_note i "The package database has been requested for re-creation" |
al@985 | 1074 else |
al@985 | 1075 echo "<a class='button' href='$base/?recook=pkgdb'>Re-create the DB</a>" |
al@985 | 1076 fi |
al@985 | 1077 fi |
al@985 | 1078 ;; |
al@985 | 1079 esac |
al@985 | 1080 fi |
al@898 | 1081 else |
al@898 | 1082 show_note e "No log file: $log" |
al@898 | 1083 fi |
al@898 | 1084 ;; |
al@924 | 1085 toolchain) |
al@924 | 1086 cat <<EOT |
al@924 | 1087 <div id="content2"> |
al@924 | 1088 <section> |
al@924 | 1089 <h2>SliTaz GNU/Linux toolchain</h2> |
al@924 | 1090 |
al@924 | 1091 <table> |
al@924 | 1092 <tr><td>Build date</td> <td colspan="2">$(sed -n '/^Cook date/s|[^:]*: \(.*\)|\1|p' $LOGS/slitaz-toolchain.log)</td></tr> |
al@924 | 1093 <tr><td>Build duration</td> <td colspan="2">$(sed -n '/^Cook time/s|[^:]*: \(.*\)|\1|p' $LOGS/slitaz-toolchain.log)</td></tr> |
al@924 | 1094 <tr><td>Architecture</td> <td colspan="2">$ARCH</td></tr> |
al@1024 | 1095 <tr><td>Host system</td> <td colspan="2">$BUILD_SYSTEM</td></tr> |
al@1024 | 1096 <tr><td>Target system</td> <td colspan="2">$HOST_SYSTEM</td></tr> |
al@924 | 1097 <tr><th>Package</th><th>Version</th><th>Description</th></tr> |
al@924 | 1098 $(toolchain_version slitaz-toolchain) |
al@924 | 1099 $(toolchain_version binutils) |
al@924 | 1100 $(toolchain_version linux-api-headers) |
al@924 | 1101 $(toolchain_version gcc) |
al@924 | 1102 $(toolchain_version glibc) |
al@924 | 1103 </table> |
al@924 | 1104 |
al@924 | 1105 <p>Toolchain documentation: <a target="_blank" rel="noopener noreferrer" |
al@924 | 1106 href="http://doc.slitaz.org/en:cookbook:toolchain">http://doc.slitaz.org/en:cookbook:toolchain</a> |
al@924 | 1107 </p> |
al@924 | 1108 |
al@924 | 1109 </section> |
al@924 | 1110 </div> |
al@924 | 1111 EOT |
al@924 | 1112 ;; |
al@898 | 1113 esac |
al@898 | 1114 page_footer |
al@898 | 1115 exit 0 |
al@898 | 1116 fi |
al@898 | 1117 |
al@898 | 1118 |
al@898 | 1119 # We may have a toolchain.cgi script for cross cooker's |
al@898 | 1120 if [ -f "toolchain.cgi" ]; then |
al@898 | 1121 toolchain="toolchain.cgi" |
al@898 | 1122 else |
al@924 | 1123 toolchain="?toolchain" |
al@898 | 1124 fi |
al@933 | 1125 |
paul@900 | 1126 # Main page with summary. Count only packages included in ARCH, |
al@898 | 1127 # use 'cooker arch-db' to manually create arch.$ARCH files. |
al@933 | 1128 |
al@898 | 1129 cat <<EOT |
al@898 | 1130 <div id="content2"> |
al@898 | 1131 |
al@898 | 1132 <section> |
al@898 | 1133 <form method="get" action="" class="search r"> |
al@898 | 1134 <input type="hidden" name="search" value="pkg"/> |
al@898 | 1135 <button type="submit" title="Search">Search</button> |
al@898 | 1136 <input type="search" name="q" placeholder="Package" list="packages" autocorrect="off" autocapitalize="off"/> |
al@898 | 1137 </form> |
al@898 | 1138 EOT |
al@898 | 1139 |
al@1071 | 1140 unset nojs |
al@1063 | 1141 part summary |
al@1063 | 1142 part webstat |
al@933 | 1143 |
al@898 | 1144 if [ -e "$CACHE/cooker-request" -a ! -s $command ]; then |
al@898 | 1145 if [ "$activity" -nt "$CACHE/cooker-request" ]; then |
al@898 | 1146 echo '<a class="button icon bell r" href="?poke">Wake up</a>' |
al@898 | 1147 else |
al@898 | 1148 show_note i 'Cooker will be launched in the next 5 minutes.' |
al@898 | 1149 fi |
al@898 | 1150 fi |
al@898 | 1151 |
al@898 | 1152 cat <<EOT |
al@898 | 1153 <p> |
al@898 | 1154 Service logs: |
al@898 | 1155 <a href="?cookorder.log">cookorder</a> · |
al@898 | 1156 <a href="?commits.log">commits</a> · |
al@898 | 1157 <a href="?pkgdb.log">pkgdb</a> |
al@898 | 1158 </p> |
al@898 | 1159 </section> |
al@898 | 1160 EOT |
al@898 | 1161 |
al@1063 | 1162 part activity |
al@1063 | 1163 part cooknotes |
al@1063 | 1164 part commits |
al@1063 | 1165 part cooklist |
al@1063 | 1166 part broken |
al@1063 | 1167 part blocked |
al@1063 | 1168 part pkgs |
al@898 | 1169 |
al@898 | 1170 echo '</div>' |
al@898 | 1171 datalist |
al@898 | 1172 page_footer |
al@898 | 1173 exit 0 |
al@898 | 1174 fi |
al@898 | 1175 |
al@898 | 1176 |
al@1007 | 1177 # show tag |
al@1007 | 1178 |
al@1007 | 1179 if [ "$pkg" == '~' -a -n "$cmd" ]; then |
al@1007 | 1180 tag="$cmd" |
al@1007 | 1181 page_header |
al@1007 | 1182 cat <<EOT |
al@1007 | 1183 <div id="content2"> |
al@1007 | 1184 <section> |
al@1007 | 1185 <h2>Tag “$tag”</h2> |
al@1007 | 1186 |
al@1007 | 1187 <table> |
al@1007 | 1188 <thead> |
al@1007 | 1189 <tr><th>Name</th><th>Description</th><th>Category</th></tr> |
al@1007 | 1190 </thead> |
al@1007 | 1191 <tbody> |
al@1007 | 1192 EOT |
al@1029 | 1193 sort $PKGS/packages.info \ |
al@1029 | 1194 | awk -F$'\t' -vtag=" $tag " -vbase="$base" '{ |
al@1007 | 1195 if (index(" " $6 " ", tag)) { |
al@1007 | 1196 url = base "/" $1 "/"; |
al@1007 | 1197 gsub("+", "%2B", url); |
al@1029 | 1198 printf("<tr><td><img src=\"%s/s/%s\"> ", base, $1); |
al@1029 | 1199 printf("<a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", url, $1, $4, $3); |
al@1007 | 1200 } |
al@1029 | 1201 }' |
al@1029 | 1202 echo '</tbody></table></section></div>' |
al@1007 | 1203 page_footer |
al@1007 | 1204 exit 0 |
al@1007 | 1205 fi |
al@1007 | 1206 |
al@1007 | 1207 |
al@898 | 1208 case "$cmd" in |
al@898 | 1209 '') |
al@898 | 1210 page_header |
al@898 | 1211 |
al@989 | 1212 requested_pkg="$pkg" |
al@898 | 1213 # Package info. |
al@940 | 1214 if [ ! -f "$wok/$pkg/receipt" ]; then |
al@940 | 1215 # Let's look at the cases when the package was not found |
al@940 | 1216 |
al@940 | 1217 # Maybe query is the exact name of split package? -> proceed to main package |
al@940 | 1218 mainpkg=$(awk -F$'\t' -vpkg=" $pkg " '{ |
al@940 | 1219 if (index(" " $2 " ", pkg)) {print $1; exit} |
al@940 | 1220 }' $splitdb) |
al@940 | 1221 |
al@940 | 1222 # No, so let's find any matches among packages names (both main and split) |
al@940 | 1223 if [ -z "$mainpkg" ]; then |
al@940 | 1224 pkgs=$(cut -d$'\t' -f2 $splitdb | tr ' ' '\n' | fgrep "$pkg") |
al@940 | 1225 # Nothing matched |
al@940 | 1226 if [ -z "$pkgs" ]; then |
al@940 | 1227 echo "<h2>Not Found</h2>" |
al@940 | 1228 show_note e "The requested package <b>$pkg</b> was not found on this server." |
al@940 | 1229 page_footer; exit 0 |
al@940 | 1230 fi |
al@940 | 1231 # Search results page |
al@898 | 1232 echo "<section><h2>Package names matching “$pkg”</h2>" |
al@898 | 1233 echo "<table><thead><tr><th>Name</th><th>Description</th><th>Category</th></tr></thead><tbody>" |
al@940 | 1234 query="$pkg" |
al@940 | 1235 for pkg in $pkgs; do |
al@940 | 1236 # Find main package |
al@940 | 1237 mainpkg=$(awk -F$'\t' -vpkg=" $pkg " '{ |
al@940 | 1238 if (index(" " $2 " ", pkg)) {print $1; exit} |
al@940 | 1239 }' $splitdb) |
al@940 | 1240 unset SHORT_DESC CATEGORY; . $wok/$mainpkg/receipt |
al@940 | 1241 |
al@898 | 1242 unset SHORT_DESC CATEGORY |
al@940 | 1243 [ -e "$wok/$mainpkg/taz/$PACKAGE-$VERSION/receipt" ] && |
al@940 | 1244 . $wok/$mainpkg/taz/$PACKAGE-$VERSION/receipt |
al@940 | 1245 |
al@940 | 1246 echo -n "<tr><td><a href="$base/$pkg">${pkg//$query/<mark>$query</mark>}</a>" |
al@940 | 1247 [ "$pkg" == "$mainpkg" ] || echo -n " (${mainpkg//$query/<mark>$query</mark>})" |
al@940 | 1248 echo -n "</td><td>$SHORT_DESC</td><td>$CATEGORY</td></tr>" |
al@898 | 1249 done |
al@898 | 1250 echo '</tbody></table></section>' |
al@940 | 1251 page_footer; exit 0 |
al@898 | 1252 fi |
al@940 | 1253 pkg="$mainpkg" |
al@898 | 1254 fi |
al@898 | 1255 |
al@940 | 1256 log=$LOGS/$pkg.log |
al@940 | 1257 pkg_info |
al@940 | 1258 |
al@898 | 1259 # Check for a log file and display summary if it exists. |
al@898 | 1260 summary "$log" |
al@898 | 1261 |
al@994 | 1262 |
al@1007 | 1263 # Show tag list |
al@1007 | 1264 taglist=$( |
al@1007 | 1265 for i in $pkg $(awk -F$'\t' -vp="$pkg" '{if ($1 == p) print $2}' $splitdb); do |
al@1007 | 1266 [ -s "$PKGS/packages.info" ] && |
al@1007 | 1267 awk -F$'\t' -vpkg="$i" '{ |
al@1007 | 1268 if ($1 == pkg) { print $6; exit; } |
al@1007 | 1269 }' "$PKGS/packages.info" |
al@1007 | 1270 done \ |
al@1007 | 1271 | tr ' ' '\n' \ |
al@1007 | 1272 | sort -u |
al@1007 | 1273 ) |
al@1007 | 1274 if [ -n "$taglist" ]; then |
al@1007 | 1275 echo -n '<section><h3>Tags</h3><p>' |
al@1007 | 1276 lasttag=$(echo "$taglist" | tail -n1) |
al@1007 | 1277 for tag in $taglist; do |
al@1007 | 1278 echo -n "<a href=\"$base/~/${tag//+/%2B}\">$tag</a>" |
al@1007 | 1279 [ "$tag" != "$lasttag" ] && echo -n " · " |
al@1007 | 1280 done |
al@1007 | 1281 echo '</p></section>' |
al@1007 | 1282 fi |
al@994 | 1283 |
al@994 | 1284 |
al@1007 | 1285 # Informational table with dependencies |
al@989 | 1286 pkg="$requested_pkg" |
al@994 | 1287 inf="$(mktemp -d)" |
al@994 | 1288 |
al@995 | 1289 # 1/3: Build dependencies (from receipt and pkgdb) |
al@997 | 1290 for i in $WANTED $BUILD_DEPENDS $(awk -F$'\t' -vp=" $pkg " '{if (index(" " $2 " ", p) && (" " $1 " " != p)) print $1}' $splitdb); do |
al@994 | 1291 echo "$i" >> $inf/a |
al@994 | 1292 done |
al@994 | 1293 |
al@994 | 1294 # 2/3: Runtime dependencies (from pkgdb) |
al@994 | 1295 { |
al@994 | 1296 [ -s "$PKGS/packages.info" ] && |
al@994 | 1297 awk -F$'\t' -vp="$pkg" '{ |
al@994 | 1298 if ($1 == p) print $8 |
al@994 | 1299 }' "$PKGS/packages.info" |
al@994 | 1300 } | tr ' ' '\n' | sort -u > $inf/b |
al@994 | 1301 |
al@994 | 1302 # 3/3: Required by (from pkgdb) |
al@994 | 1303 { |
al@995 | 1304 for i in $pkg $(awk -F$'\t' -vp="$pkg" '{if ($1 == p) print $2}' $splitdb); do |
al@994 | 1305 [ -s "$PKGS/packages.info" ] && |
al@994 | 1306 awk -F$'\t' -vp=" $i " '{ |
al@994 | 1307 if (index(" " $8 " ", p)) print $1 |
al@994 | 1308 }' "$PKGS/packages.info" |
al@994 | 1309 |
al@994 | 1310 [ -s "$PKGS/bdeps.txt" ] && |
al@994 | 1311 awk -F$'\t' -vp=" $i " '{ |
al@994 | 1312 if (index(" " $2 " ", p)) print $1 |
al@994 | 1313 }' $PKGS/bdeps.txt |
al@994 | 1314 done |
al@994 | 1315 } | sort -u > $inf/c |
al@994 | 1316 |
al@982 | 1317 cat <<EOT |
al@982 | 1318 <section> |
al@989 | 1319 <h3>Related packages</h3> |
al@989 | 1320 <table class="third"> |
al@982 | 1321 <thead> |
al@982 | 1322 <tr> |
al@982 | 1323 <th>Build dependencies</th> |
al@989 | 1324 <th>Runtime dependencies</th> |
al@982 | 1325 <th>Required by</th> |
al@982 | 1326 </tr> |
al@982 | 1327 </thead> |
al@982 | 1328 <tbody> |
al@989 | 1329 EOT |
al@989 | 1330 |
al@994 | 1331 awk -vinf="$inf" -vbase="$base" ' |
al@994 | 1332 function linki(i) { |
al@994 | 1333 if (i) return sprintf("<img src=\"%s/s/%s\"> <a href=\"%s/%s\">%s</a>", base, i, base, i, i); |
al@994 | 1334 } |
al@994 | 1335 BEGIN{ |
al@994 | 1336 do { |
al@994 | 1337 a = b = c = ""; |
al@994 | 1338 getline a < inf "/a"; |
al@994 | 1339 getline b < inf "/b"; |
al@994 | 1340 getline c < inf "/c"; |
al@994 | 1341 printf("<tr><td>%s </td><td>%s </td><td>%s </td></tr>", linki(a), linki(b), linki(c)); |
al@994 | 1342 } while ( a b c ) |
al@994 | 1343 }' |
al@982 | 1344 cat <<EOT |
al@982 | 1345 </tbody> |
al@982 | 1346 </table> |
al@982 | 1347 </section> |
al@982 | 1348 EOT |
al@994 | 1349 # Clean |
al@994 | 1350 rm -r $inf |
al@994 | 1351 |
al@994 | 1352 |
al@994 | 1353 |
al@982 | 1354 |
al@898 | 1355 # Display <Recook> button only for SliTaz web browser |
al@971 | 1356 case "$HTTP_USER_AGENT" in |
al@971 | 1357 *SliTaz*) |
al@971 | 1358 if [ -f $CACHE/cooker-request -a -n "$HTTP_REFERER" ]; then |
al@971 | 1359 if grep -qs "^$pkg$" $CACHE/recook-packages; then |
al@971 | 1360 show_note i "The package “$pkg” has been requested for recook" |
al@971 | 1361 else |
al@971 | 1362 echo "<a class='button' href='$base/?recook=${pkg//+/%2B}'>Recook $pkg</a>" |
al@898 | 1363 fi |
al@971 | 1364 fi |
al@971 | 1365 ;; |
al@971 | 1366 esac |
al@898 | 1367 ;; |
al@898 | 1368 |
al@898 | 1369 receipt) |
al@898 | 1370 page_header |
al@898 | 1371 pkg_info |
al@898 | 1372 echo "<a class='button receipt' href='$base/$pkg/receipt'>receipt</a>" |
al@898 | 1373 ( cd $wok/$pkg; find stuff -type f 2>/dev/null ) | sort | \ |
al@898 | 1374 awk -vb="$base/$pkg" '{printf("<a class=\"button\" href=\"%s/%s\">%s</a>\n", b, $0, $0)}' |
al@898 | 1375 |
al@898 | 1376 show_code bash < $wok/$pkg/receipt |
al@898 | 1377 ;; |
al@898 | 1378 |
al@898 | 1379 stuff) |
al@898 | 1380 page_header |
al@898 | 1381 pkg_info |
al@898 | 1382 file="$pkg/stuff/$arg" |
al@898 | 1383 echo "<a class='button' href='$base/$pkg/receipt'>receipt</a>" |
al@898 | 1384 ( cd $wok/$pkg; find stuff -type f 2>/dev/null ) | sort | \ |
al@898 | 1385 awk -vb="$base/$pkg" -va="stuff/$arg" '{ |
al@898 | 1386 printf("<a class=\"button%s\" href=\"%s/%s\">%s</a>\n", a==$0 ? " receipt" : "", b, $0, $0) |
al@898 | 1387 }' |
al@898 | 1388 |
al@898 | 1389 if [ -f "$wok/$file" ]; then |
al@898 | 1390 case $file in |
al@898 | 1391 *.desktop|*.theme) class="ini" ;; |
al@898 | 1392 *.patch|*.diff|*.u) class="diff" ;; |
al@898 | 1393 *.sh) class="bash" ;; |
al@898 | 1394 *.conf*|*.ini) |
al@898 | 1395 class="bash" |
al@898 | 1396 [ -n "$(cut -c1 < $wok/$file | fgrep '[')" ] && class="ini" |
al@898 | 1397 ;; |
al@898 | 1398 *.pl) class="perl" ;; |
al@898 | 1399 *.c|*.h|*.awk) class="clike" ;; |
al@898 | 1400 *.svg) class="svg" ;; |
al@898 | 1401 *Makefile*) class="makefile" ;; |
al@898 | 1402 *.po|*.pot) class="bash" ;; |
al@898 | 1403 *.css) class="css" ;; |
al@898 | 1404 *.htm|*.html) class="html" ;; |
al@898 | 1405 *.js) class="js" ;; |
al@898 | 1406 *.txt) class="asciidoc" ;; |
al@898 | 1407 *) |
al@898 | 1408 case $(head -n1 $wok/$file) in |
al@898 | 1409 *!/bin/sh*|*!/bin/bash*) class="bash" ;; |
al@898 | 1410 esac |
al@898 | 1411 if [ -z "$class" -a "$(head -n1 $wok/$file | cut -b1)" == '#' ]; then |
al@898 | 1412 class="bash" |
al@898 | 1413 fi |
al@898 | 1414 if [ -z "$class" ]; then |
al@898 | 1415 # Follow Busybox restrictions. Search for non-printable chars |
al@898 | 1416 if [ $(tr -d '[:alnum:][:punct:][:blank:][:cntrl:]' < "$wok/$file" | wc -c) -gt 0 ]; then |
al@898 | 1417 raw="true" |
al@898 | 1418 fi |
al@898 | 1419 fi |
al@898 | 1420 ;; |
al@898 | 1421 esac |
al@898 | 1422 |
al@898 | 1423 # Display image |
al@898 | 1424 case $file in |
al@898 | 1425 *.png|*.svg|*.jpg|*.jpeg|*.ico) |
al@898 | 1426 echo "<img src='$base/$pkg/browse/stuff/$arg' style='display: block; max-width: 100%; margin: auto'/>" |
al@898 | 1427 ;; |
al@898 | 1428 esac |
al@898 | 1429 |
al@898 | 1430 # Display colored listing for all text-based documents (also for *.svg) |
al@898 | 1431 case $file in |
al@898 | 1432 *.png|*.jpg|*.jpeg|*.ico) ;; |
al@898 | 1433 *) |
al@898 | 1434 if [ -z "$raw" ]; then |
al@898 | 1435 cat $wok/$file | show_code $class |
al@898 | 1436 fi |
al@898 | 1437 ;; |
al@898 | 1438 esac |
al@898 | 1439 |
al@898 | 1440 # Display hex dump for binary files |
al@898 | 1441 if [ -n "$raw" ]; then |
al@898 | 1442 hexdump -C $wok/$file | show_code #| sed 's|^\([0-9a-f][0-9a-f]*\)|<span class="c2">\1</span>|' |
al@898 | 1443 fi |
al@898 | 1444 else |
al@898 | 1445 show_note e "File “$file” absent!" |
al@898 | 1446 fi |
al@898 | 1447 ;; |
al@898 | 1448 |
al@898 | 1449 files) |
al@898 | 1450 page_header |
al@898 | 1451 pkg_info |
al@898 | 1452 |
al@898 | 1453 # find main package |
al@898 | 1454 wanted=$(. $wok/$pkg/receipt; echo $WANTED) |
al@898 | 1455 main=${wanted:-$pkg} |
al@1010 | 1456 devpkg=''; [ -d "$wok/$main-dev" ] && devpkg="$main-dev" |
al@915 | 1457 |
al@1010 | 1458 splitsets=$(echo $SPLIT" " \ |
al@1010 | 1459 | awk ' |
al@1010 | 1460 BEGIN { RS = " "; FS = ":"; } |
al@1010 | 1461 { print $2; }' \ |
al@1010 | 1462 | sort -u \ |
al@1010 | 1463 | tr '\n' ' ' \ |
al@1010 | 1464 | sed 's|^ *||; s| *$||') |
al@915 | 1465 |
al@1010 | 1466 splitpkgs=$(echo $SPLIT" " \ |
al@1010 | 1467 | awk ' |
al@1010 | 1468 BEGIN { RS = " "; FS = ":"; } |
al@1010 | 1469 { print $1; }' \ |
al@1010 | 1470 | tr '\n' ' ' \ |
al@1010 | 1471 | sed 's|^ *||; s| *$||') |
al@1010 | 1472 |
al@1010 | 1473 # we need the version |
al@915 | 1474 if [ -f "$WOK/linux/receipt" ]; then |
al@915 | 1475 kvers=$(. $WOK/linux/receipt; echo $VERSION) |
al@915 | 1476 kbasevers=$(echo $kvers | cut -d. -f1,2) |
al@915 | 1477 elif [ -f "$INSTALLED/linux-api-headers/receipt" ]; then |
al@915 | 1478 kvers=$(. $INSTALLED/linux-api-headers/receipt; echo $VERSION) |
al@915 | 1479 kbasevers=$(echo $kvers | cut -d. -f1,2) |
al@915 | 1480 fi |
al@898 | 1481 ver=$(. $wok/$main/receipt; echo $VERSION$EXTRAVERSION) |
al@898 | 1482 |
al@1010 | 1483 echo "<section><h3>Quick jump:</h3>" |
al@924 | 1484 |
al@924 | 1485 |
al@1010 | 1486 for part in head body; do |
al@898 | 1487 |
al@1010 | 1488 for set in '' $splitsets; do |
al@1010 | 1489 pkgsofset=$(echo $SPLIT" " \ |
al@1010 | 1490 | awk -vset="$set" -vmain="$main" -vdev="$devpkg" ' |
al@1010 | 1491 BEGIN { |
al@1010 | 1492 RS = " "; FS = ":"; |
al@1010 | 1493 if (!set) print main; |
al@1010 | 1494 if (!set && dev) print dev; |
al@1010 | 1495 } |
al@1010 | 1496 { |
al@1010 | 1497 if ($2 == set) print $1; |
al@1010 | 1498 }' \ |
al@1010 | 1499 | sort -u) |
al@898 | 1500 |
al@1010 | 1501 set_description='' |
al@1010 | 1502 [ -n "$splitsets" ] && |
al@1010 | 1503 case "$set" in |
al@1010 | 1504 '') |
al@1010 | 1505 set_description=' (default set)' |
al@1010 | 1506 set_title='Default set' |
al@1010 | 1507 ;; |
al@1010 | 1508 *) |
al@1010 | 1509 set_description=" (set “$set”)" |
al@1010 | 1510 set_title="Set “$set”" |
al@1010 | 1511 ;; |
al@1010 | 1512 esac |
al@898 | 1513 |
al@1010 | 1514 install="$wok/$main/install" |
al@1010 | 1515 [ -n "$set" ] && install="$install-$set" |
al@898 | 1516 |
al@1010 | 1517 case $part in |
al@1010 | 1518 head) |
al@1010 | 1519 [ -n "$splitsets" ] && |
al@1010 | 1520 case "$set" in |
al@1010 | 1521 '') echo "<ul><li>Default set:";; |
al@1010 | 1522 *) echo "<li>Set “$set”:";; |
al@1010 | 1523 esac |
al@1010 | 1524 echo -e '\t<ul>' |
al@1010 | 1525 echo "$pkgsofset" | sed 'p' | xargs printf "\t\t<li><a href='#%s'>%s</a></li>\n" |
al@1010 | 1526 cat <<EOT |
al@1010 | 1527 <li id='li-repeats$set' style='display:none'> |
al@1010 | 1528 <a href='#repeats$set'>repeatedly packaged files</a></li> |
al@1010 | 1529 <li id='li-empty$set' style='display:none'> |
al@1010 | 1530 <a href='#empty$set'>unpackaged empty folders</a></li> |
al@1010 | 1531 <li id='li-outoftree$set' style='display:none'> |
al@1010 | 1532 <a href='#outoftree$set'>out-of-tree files</a></li> |
al@1010 | 1533 <li id='li-orphans$set' style='display:none'> |
al@1010 | 1534 <a href='#orphans$set'>unpackaged files</a> |
al@1010 | 1535 <span id='orphansTypes$set'></span></li> |
al@1010 | 1536 EOT |
al@1010 | 1537 echo -e '\t</ul>' |
al@1010 | 1538 [ -n "$splitsets" ] && echo "</li>" |
al@1010 | 1539 ;; |
al@1010 | 1540 body) |
al@1010 | 1541 all_files=$(mktemp) |
al@1010 | 1542 cd $install; find ! -type d | sed 's|\.||' > $all_files |
al@964 | 1543 |
al@1010 | 1544 # ------------------------------------------------------ |
al@1010 | 1545 # Packages content |
al@1010 | 1546 # ------------------------------------------------------ |
al@1010 | 1547 packaged=$(mktemp) |
al@1010 | 1548 for p in $pkgsofset; do |
al@1058 | 1549 namever="$(awk -F$'\t' -vp="$p" '{ |
al@1058 | 1550 if ($1==p) {printf("%s-%s\n", $1, $2); exit} |
al@1058 | 1551 }' $PKGS/packages.info)" |
al@1010 | 1552 if [ -d "$wok/$p/taz/$p-$ver" ]; then |
al@1010 | 1553 indir=$p |
al@1010 | 1554 elif [ -d "$wok/$main/taz/$p-$ver" ]; then |
al@1010 | 1555 indir=$main |
al@1010 | 1556 fi |
al@1010 | 1557 dir="$wok/$indir/taz/$p-$ver/fs" |
al@912 | 1558 |
al@1010 | 1559 size=$(du -hs $dir | awk '{ sub(/\.0/, ""); print $1 }') |
al@1010 | 1560 |
al@1010 | 1561 echo |
al@1010 | 1562 echo "<section id='$p'>" |
al@1010 | 1563 echo " <h3>Contents of package “$namever” (${size:-empty}):</h3>" |
al@1010 | 1564 echo ' <pre class="files">' |
al@1010 | 1565 if [ -s "$wok/$indir/taz/$p-$ver/files.list" ]; then |
al@1010 | 1566 echo -en '<span class="underline">permissions·lnk·user ·group · size·date & time ·name\n</span>' |
al@1010 | 1567 cd $dir |
al@1010 | 1568 find . -print0 \ |
al@1010 | 1569 | sort -z \ |
al@1010 | 1570 | xargs -0 ls -ldp --color=always \ |
al@1010 | 1571 | syntax_highlighter files \ |
al@1010 | 1572 | sed "s|\([^>]*\)>\.\([^<]*\)\(<.*\)$|\1 href='$base/$indir/browse/taz/$p-$ver/fs\2'>\2\3|;" \ |
al@1010 | 1573 | awk 'BEGIN { FS="\""; } |
al@1010 | 1574 { gsub("+", "%2B", $2); print; }' |
al@1010 | 1575 else |
al@1010 | 1576 echo 'No files' |
al@1010 | 1577 fi |
al@1010 | 1578 echo '</pre>' |
al@1010 | 1579 echo '</section>' |
al@1010 | 1580 |
al@1010 | 1581 cat $wok/$indir/taz/$p-$ver/files.list >> $packaged |
al@1010 | 1582 done |
al@1010 | 1583 # ------------------------------------------------------ |
al@1010 | 1584 # /Packages content |
al@1010 | 1585 # ------------------------------------------------------ |
al@1010 | 1586 |
al@1010 | 1587 # ------------------------------------------------------ |
al@1010 | 1588 # Repeatedly packaged files |
al@1010 | 1589 # ------------------------------------------------------ |
al@1010 | 1590 repeats=$(mktemp) |
al@1010 | 1591 sort $packaged | uniq -d > $repeats |
al@1010 | 1592 if [ -s "$repeats" ]; then |
al@1010 | 1593 echo |
al@1010 | 1594 echo "<script>document.getElementById('li-repeats$set').style.display = 'list-item'</script>" |
al@1010 | 1595 echo "<section id='repeats$set'>" |
al@1010 | 1596 echo " <h3>Repeatedly packaged files$set_description:</h3>" |
al@1010 | 1597 cd $install |
al@1010 | 1598 |
al@1010 | 1599 IFS=$'\n' |
al@1010 | 1600 echo -n ' <pre class="files">' |
al@1010 | 1601 echo -en '<span class="underline">permissions·lnk·user ·group · size·date & time ·name\n</span>' |
al@1010 | 1602 while read i; do |
al@1010 | 1603 find .$i -exec ls -ldp --color=always '{}' \; \ |
al@1010 | 1604 | syntax_highlighter files \ |
al@1010 | 1605 | sed 's|>\./|>/|' |
al@1010 | 1606 done < $repeats |
al@1010 | 1607 echo '</pre>' |
al@1010 | 1608 echo '</section>' |
al@1010 | 1609 unset IFS |
al@1010 | 1610 fi |
al@1010 | 1611 rm $repeats |
al@1010 | 1612 # ------------------------------------------------------ |
al@1010 | 1613 # /Repeatedly packaged files |
al@1010 | 1614 # ------------------------------------------------------ |
al@1010 | 1615 |
al@1010 | 1616 # ------------------------------------------------------ |
al@1010 | 1617 # Unpackaged empty folders |
al@1010 | 1618 # ------------------------------------------------------ |
al@1010 | 1619 emptydirs=$(mktemp) |
al@1010 | 1620 cd $install |
al@1010 | 1621 IFS=$'\n' |
al@1010 | 1622 find -type d \ |
al@1010 | 1623 | sed 's|\.||' \ |
al@1010 | 1624 | while read d; do |
al@1055 | 1625 [ -z "$(ls "$install$d")" ] || continue |
al@1055 | 1626 # empty dir determined by empty `ls` |
al@1010 | 1627 echo $d |
al@1010 | 1628 done \ |
al@1010 | 1629 | while read d; do |
al@1010 | 1630 notfound='yes' |
al@1010 | 1631 for p in $(cd $wok/$main/taz; ls); do |
al@1010 | 1632 if [ -d "$wok/$main/taz/$p/fs$d" ]; then |
al@1010 | 1633 notfound='' |
al@1010 | 1634 break |
al@1010 | 1635 fi |
al@1010 | 1636 done |
al@1010 | 1637 [ -n "$notfound" ] && |
al@1010 | 1638 ls -ldp --color=always .$d \ |
al@1010 | 1639 | syntax_highlighter files \ |
al@1010 | 1640 | sed 's|>\./|>/|' |
al@1010 | 1641 done > $emptydirs |
al@1010 | 1642 unset IFS |
al@1010 | 1643 if [ -s "$emptydirs" ]; then |
al@1010 | 1644 echo |
al@1010 | 1645 echo "<script>document.getElementById('li-empty$set').style.display = 'list-item'</script>" |
al@1010 | 1646 echo "<section id='empty$set'>" |
al@1010 | 1647 echo " <h3>Unpackaged empty folders$set_description:</h3>" |
al@1010 | 1648 echo -n ' <pre class="files">' |
al@1010 | 1649 echo -en '<span class="underline">permissions·lnk·user ·group · size·date & time ·name\n</span>' |
al@1010 | 1650 cat $emptydirs |
al@1010 | 1651 echo '</pre>' |
al@1010 | 1652 echo '</section>' |
al@1010 | 1653 fi |
al@1010 | 1654 rm $emptydirs |
al@1010 | 1655 # ------------------------------------------------------ |
al@1010 | 1656 # /Unpackaged empty folders |
al@1010 | 1657 # ------------------------------------------------------ |
al@1010 | 1658 |
al@1010 | 1659 # ------------------------------------------------------ |
al@1010 | 1660 # Out-of-tree files |
al@1010 | 1661 # ------------------------------------------------------ |
al@1010 | 1662 outoftree=$(mktemp) |
al@1010 | 1663 awk -F$'\n' -vall="$all_files" ' |
al@1010 | 1664 { |
al@1010 | 1665 if (FILENAME == all) files_all[$1] = "1"; |
al@1010 | 1666 else files_pkg[$1] = "1"; |
al@1010 | 1667 } |
al@1010 | 1668 END { |
al@1010 | 1669 for (i in files_pkg) { |
al@1010 | 1670 if (! files_all[i]) print i; |
al@1010 | 1671 } |
al@1010 | 1672 } |
al@1010 | 1673 ' "$all_files" "$packaged" > $outoftree |
al@1010 | 1674 |
al@1010 | 1675 if [ -d "$install" -a -s "$outoftree" ]; then |
al@1010 | 1676 echo |
al@1010 | 1677 echo "<script>document.getElementById('li-outoftree$set').style.display = 'list-item'</script>" |
al@1010 | 1678 echo "<section id='outoftree$set'>" |
al@1010 | 1679 echo " <h3>Out-of-tree files$set_description:</h3>" |
al@1010 | 1680 echo -n ' <pre class="files">' |
al@1010 | 1681 echo -en '<span class="underline">permissions·lnk·user ·group · size·date & time ·name\n</span>' |
al@1010 | 1682 IFS=$'\n' |
al@1010 | 1683 while read outoftree_line; do |
al@1010 | 1684 # Find the package out-of-tree file belongs to |
al@1010 | 1685 for i in $pkgsofset; do |
al@1010 | 1686 if grep -q "^$outoftree_line$" $wok/$main/taz/$i-$ver/files.list; then |
al@1010 | 1687 cd $wok/$main/taz/$i-$ver/fs |
al@1010 | 1688 ls -ldp --color=always ".$outoftree_line" \ |
al@1010 | 1689 | syntax_highlighter files \ |
al@1010 | 1690 | sed "s|\([^>]*\)>\.\([^<]*\)\(<.*\)$|\1 href='$base/$main/browse/taz/$i-$ver/fs\2'>\2\3|;" \ |
al@1010 | 1691 | awk 'BEGIN { FS="\""; } |
al@1010 | 1692 { gsub("+", "%2B", $2); print; }' |
al@1010 | 1693 fi |
al@1010 | 1694 done |
al@1010 | 1695 done < $outoftree |
al@1010 | 1696 unset IFS |
al@1010 | 1697 echo '</pre>' |
al@1010 | 1698 echo '</section>' |
al@1010 | 1699 fi |
al@1010 | 1700 rm $outoftree |
al@1010 | 1701 # ------------------------------------------------------ |
al@1010 | 1702 # /Out-of-tree files |
al@1010 | 1703 # ------------------------------------------------------ |
al@1010 | 1704 |
al@1010 | 1705 # ------------------------------------------------------ |
al@1010 | 1706 # Unpackaged files |
al@1010 | 1707 # ------------------------------------------------------ |
al@1010 | 1708 orphans=$(mktemp) |
al@1011 | 1709 awk -F$'\n' -vall="$all_files" ' |
al@1010 | 1710 { |
al@1010 | 1711 if (FILENAME == all) files_all[$1] = "1"; |
al@1010 | 1712 else files_pkg[$1] = "1"; |
al@1010 | 1713 } |
al@1010 | 1714 END { |
al@1010 | 1715 for (i in files_all) { |
al@1010 | 1716 if (! files_pkg[i]) print i; |
al@1010 | 1717 } |
al@1010 | 1718 } |
al@1019 | 1719 ' "$all_files" "$packaged" | sort > $orphans |
al@1010 | 1720 if [ -d "$install" -a -s "$orphans" ]; then |
al@1010 | 1721 echo |
al@1010 | 1722 echo "<script>document.getElementById('li-orphans$set').style.display = 'list-item'</script>" |
al@1010 | 1723 echo "<section id='orphans$set'>" |
al@1010 | 1724 echo " <h3>Unpackaged files$set_description:</h3>" |
al@1010 | 1725 table=$(mktemp) |
al@1010 | 1726 awk ' |
al@1010 | 1727 function tag(text, color) { |
al@1010 | 1728 printf("<span class=\"c%s1\">%s</span> ", color, text); |
al@1010 | 1729 printf("%s\n", $0); |
al@1010 | 1730 } |
al@1048 | 1731 /\/perllocal\.pod$/ || /\/\.packlist$/ || |
al@1048 | 1732 /\/share\/bash-completion\// || /\/etc\/bash_completion\.d\// || |
al@1048 | 1733 /\/lib\/systemd\// || /\.pyc$/ || /\.pyo$/ || |
al@1048 | 1734 /\/fonts\.scale$/ || /\/fonts\.dir$/ || /\.la$/ { |
al@1010 | 1735 tag("---", 0); next } |
al@1010 | 1736 /\.pod$/ { tag("pod", 5); next } |
al@1010 | 1737 /\/share\/man\// { tag("man", 5); next } |
al@1010 | 1738 /\/share\/doc\// || /\/share\/gtk-doc\// || /\/share\/info\// || |
al@1010 | 1739 /\/share\/devhelp\// { tag("doc", 5); next } |
al@1010 | 1740 /\/share\/icons\// { tag("ico", 2); next } |
al@1010 | 1741 /\/share\/locale\// { tag("loc", 4); next } |
al@1042 | 1742 /\.h$/ || /\.a$/ || /\.pc$/ || /\/bin\/.*-config$/ || |
al@1010 | 1743 /\/Makefile.*$/ { tag("dev", 3); next } |
al@1072 | 1744 /\/share\/help\// || /\/share\/appdata\// || |
al@1072 | 1745 /\/share\/metainfo\// { tag("gnm", 6); next } |
al@1010 | 1746 { tag("???", 1) } |
al@1010 | 1747 ' "$orphans" > $table |
al@1010 | 1748 |
al@1010 | 1749 # Summary table |
al@1010 | 1750 orphans_types='()' |
al@1010 | 1751 for i in head body; do |
al@1010 | 1752 case $i in |
al@1010 | 1753 head) echo -n '<table class="summary"><tr>';; |
al@1010 | 1754 body) echo -n '<th> </th></tr><tr>';; |
al@1010 | 1755 esac |
al@1010 | 1756 for j in '???1' dev3 loc4 ico2 doc5 man5 pod5 gnm6 '---0'; do |
al@1010 | 1757 tag=${j:0:3}; class="c${j:3:1}0"; [ "$class" == 'c00' ] && class='c01' |
al@1010 | 1758 case $i in |
al@1010 | 1759 head) echo -n "<th class='$class'>$tag</th>";; |
al@1010 | 1760 body) |
al@1010 | 1761 tagscount="$(grep ">$tag<" $table | wc -l)" |
al@1010 | 1762 printf '<td>%s</td>' "$tagscount" |
al@1010 | 1763 [ "$tagscount" -gt 0 ] && orphans_types="${orphans_types/)/ $tag)}" |
al@1010 | 1764 ;; |
al@1010 | 1765 esac |
al@1010 | 1766 done |
al@1010 | 1767 done |
al@1010 | 1768 echo '<td> </td></tr></table>' |
al@1010 | 1769 orphans_types="${orphans_types/( /(}" |
al@1010 | 1770 [ "$orphans_types" != '()' ] && |
al@1010 | 1771 echo "<script>document.getElementById('orphansTypes$set').innerText = '${orphans_types// /, }';</script>" |
al@1010 | 1772 |
al@1011 | 1773 suffix=''; [ -n "$set" ] && suffix="-$set" |
al@1010 | 1774 echo -n ' <pre class="files">' |
al@1010 | 1775 echo -en '<span class="underline">tag·permissions·lnk·user ·group · size·date & time ·name\n</span>' |
al@1010 | 1776 IFS=$'\n' |
al@1010 | 1777 while read orphan_line; do |
al@1010 | 1778 echo -n "${orphan_line/span> */span>} " |
al@1011 | 1779 cd $install |
al@1010 | 1780 ls -ldp --color=always ".${orphan_line#*</span> }" \ |
al@1010 | 1781 | syntax_highlighter files \ |
al@1010 | 1782 | sed "s|\([^>]*\)>\.\([^<]*\)\(<.*\)$|\1 href='$base/$main/browse/install$suffix\2'>\2\3|;" \ |
al@1010 | 1783 | awk 'BEGIN { FS="\""; } |
al@1010 | 1784 { gsub("+", "%2B", $2); print; }' |
al@1010 | 1785 done < $table |
al@1010 | 1786 unset IFS |
al@1010 | 1787 echo '</pre>' |
al@1010 | 1788 echo '</section>' |
al@1010 | 1789 rm $table |
al@1010 | 1790 fi |
al@1010 | 1791 rm $orphans |
al@1010 | 1792 # ------------------------------------------------------ |
al@1010 | 1793 # /Unpackaged files |
al@1010 | 1794 # ------------------------------------------------------ |
al@1010 | 1795 |
al@1010 | 1796 rm $all_files $packaged |
al@1010 | 1797 ;; |
al@912 | 1798 esac |
al@1010 | 1799 done # /set |
al@912 | 1800 |
al@1010 | 1801 case "$part" in |
al@1010 | 1802 head) |
al@1010 | 1803 [ -n "$splitsets" ] && echo "</ul>" |
al@1010 | 1804 echo "</section>" |
al@1010 | 1805 ;; |
al@1010 | 1806 esac |
al@1010 | 1807 done # /part |
al@1010 | 1808 |
al@898 | 1809 ;; |
al@898 | 1810 |
al@898 | 1811 description) |
al@898 | 1812 page_header |
al@898 | 1813 pkg_info |
al@908 | 1814 descs="$(ls $WOK/$pkg/description*.txt)" |
al@908 | 1815 if [ -n "$descs" ]; then |
al@898 | 1816 echo '<div id="content2">' |
al@908 | 1817 [ -f "$WOK/$pkg/description.txt" ] && show_desc "$pkg" "$WOK/$pkg/description.txt" |
al@908 | 1818 for i in $descs; do |
al@908 | 1819 case $i in |
al@908 | 1820 */description.txt) continue ;; |
al@908 | 1821 *) package=$(echo $i | cut -d. -f2) ;; |
al@908 | 1822 esac |
al@908 | 1823 show_desc "$package" "$i" |
al@908 | 1824 done |
al@898 | 1825 echo '</div>' |
al@898 | 1826 else |
al@898 | 1827 show_note w "No description of $pkg" |
al@898 | 1828 fi |
al@898 | 1829 ;; |
al@898 | 1830 |
al@898 | 1831 log) |
al@898 | 1832 page_header |
al@898 | 1833 pkg_info |
al@898 | 1834 [ -z "$arg" ] && arg=$(stat -c %Y $LOGS/$pkg.log) |
al@898 | 1835 |
al@898 | 1836 echo '<div class="btnList">' |
al@924 | 1837 acc='l' # access key for the latest log is 'L' |
al@898 | 1838 while read log; do |
al@924 | 1839 # for all $pkg.log, $pkg.log.0 .. $pkg.log.9, $pkg-pack.log (if any) |
al@898 | 1840 timestamp=$(stat -c %Y $log) |
al@898 | 1841 class='' |
al@898 | 1842 if [ "$arg" == "$timestamp" ]; then |
al@898 | 1843 class=' log' |
al@898 | 1844 logfile="$log" |
al@898 | 1845 fi |
al@924 | 1846 case $log in *-pack.log) acc='p';; esac # access key for the packing log is 'P' |
al@898 | 1847 echo -n "<a class='button$class' data-acc='$acc' accesskey='$acc' href='$base/$pkg/log/$timestamp'>" |
al@898 | 1848 echo "$(stat -c %y $log | cut -d: -f1,2)</a>" |
al@898 | 1849 case $acc in |
al@898 | 1850 l) acc=0;; |
al@898 | 1851 *) acc=$((acc+1));; |
al@898 | 1852 esac |
al@898 | 1853 done <<EOT |
al@898 | 1854 $(find $LOGS -name "$pkg.log*" | sort) |
al@924 | 1855 $(find $LOGS -name "$pkg-pack.log") |
al@898 | 1856 EOT |
al@898 | 1857 echo '</div>' |
al@898 | 1858 |
al@898 | 1859 if [ -z "$logfile" ]; then |
al@898 | 1860 show_note e "Requested log is absent" |
al@898 | 1861 page_footer |
al@898 | 1862 exit 0 |
al@898 | 1863 fi |
al@898 | 1864 |
al@898 | 1865 # Define cook variables for syntax highlighter |
al@898 | 1866 if [ -s "$WOK/$pkg/receipt" ]; then |
al@898 | 1867 . "$WOK/$pkg/receipt" |
al@898 | 1868 _wok='/home/slitaz/wok' |
al@898 | 1869 _src="$_wok/$pkg/source/$PACKAGE-$VERSION" |
al@898 | 1870 _install="$_wok/$pkg/install" |
al@898 | 1871 _fs="$_wok/$pkg/taz/$PACKAGE-$VERSION/fs" |
al@898 | 1872 _stuff="$_wok/$pkg/stuff" |
al@898 | 1873 fi |
al@898 | 1874 |
al@898 | 1875 # if [ ! -f "gzlog/$pkg.$arg" ]; then |
al@898 | 1876 # { |
al@898 | 1877 # summary "$logfile" links |
al@898 | 1878 # |
al@898 | 1879 # syntax_highlighter log < $logfile | awk ' |
al@898 | 1880 # BEGIN { print "<pre class=\"log\">"; } |
al@898 | 1881 # { printf("<a name=\"l%d\" href=\"#l%d\">%5d</a> %s\n", NR, NR, NR, $0); } |
al@898 | 1882 # END { print "</pre>"; } |
al@898 | 1883 # ' |
al@898 | 1884 # |
al@898 | 1885 # page_footer |
al@898 | 1886 # } | gzip > gzlog/$pkg.$arg |
al@898 | 1887 # fi |
al@898 | 1888 |
al@898 | 1889 blog=$(basename $logfile) |
al@898 | 1890 summary "$logfile" links |
al@898 | 1891 |
al@898 | 1892 # disable next `sed` for the 'like2016' theme |
al@898 | 1893 theme=$(COOKIE theme); theme=${theme:-default}; [ "$theme" != 'like2016' ] && theme='' |
al@898 | 1894 cat $logfile | syntax_highlighter log | \ |
al@898 | 1895 sed -e "/(pkg\/local$theme):/ s|: \([^<]*\)|<img src='$base/i/$blog/\1'> \1|" | \ |
al@898 | 1896 awk ' |
al@898 | 1897 BEGIN { print "<pre class=\"log\">"; } |
al@972 | 1898 { printf("<span id=\"l%d\">%s</span><a href=\"#l%d\"></a>\n", NR, $0, NR); } |
al@898 | 1899 END { print "</pre>"; } |
al@898 | 1900 ' |
al@898 | 1901 ;; |
al@898 | 1902 |
al@898 | 1903 |
al@898 | 1904 man|doc|info) |
al@898 | 1905 page_header |
al@898 | 1906 pkg_info |
al@898 | 1907 echo '<div style="max-height: 6.4em; overflow: auto; padding: 0 4px">' |
al@898 | 1908 |
al@898 | 1909 dir="wok/$pkg/install/usr/share/$cmd" |
al@898 | 1910 [ "$cmd" == 'doc' ] && dir="$dir wok/$pkg/install/usr/share/gtk-doc" |
al@898 | 1911 if [ "$cmd" == 'doc' -a -z "$arg" ]; then |
al@898 | 1912 try=$(for i in $dir; do find $i -name 'index.htm*'; done | sed q) |
al@898 | 1913 [ -n "$try" ] && arg="$try" |
al@898 | 1914 fi |
al@898 | 1915 while read i; do |
al@898 | 1916 [ -s "$i" ] || continue |
al@898 | 1917 case "$i" in |
al@898 | 1918 *.jp*g|*.png|*.gif|*.svg|*.css) continue |
al@898 | 1919 esac |
al@898 | 1920 i=${i#$dir/} |
al@898 | 1921 [ -n "$arg" ] || arg="$i" |
al@898 | 1922 class=''; [ "$arg" == "$i" ] && class=" doc" |
al@898 | 1923 case "$cmd" in |
al@898 | 1924 man) |
al@898 | 1925 case $i in |
al@898 | 1926 man*) lang='';; |
al@898 | 1927 *) lang="${i%%/*}: ";; |
al@898 | 1928 esac |
al@898 | 1929 man=$(basename $i .gz) |
al@898 | 1930 echo "<a class='button$class' href='$base/$pkg/man/$i'>$lang${man%.*} (${man##*.})</a>" |
al@898 | 1931 ;; |
al@898 | 1932 doc) |
al@898 | 1933 echo "<a class='button$class' href='$base/$pkg/doc/$i'>$(basename $i .gz)</a>" |
al@898 | 1934 ;; |
al@898 | 1935 info) |
al@898 | 1936 info=$(basename $i) |
al@898 | 1937 echo "<a class='button$class' href='$base/$pkg/info/$i#Top'>${info/.info/}</a>" |
al@898 | 1938 ;; |
al@898 | 1939 esac |
al@898 | 1940 done <<EOT |
al@898 | 1941 $(for i in $dir; do find $i -type f; done | sort) |
al@898 | 1942 EOT |
al@898 | 1943 echo '</div>' |
al@898 | 1944 |
al@898 | 1945 [ -f "$arg" ] || arg="$dir/$arg" |
al@898 | 1946 if [ -f "$arg" ]; then |
al@898 | 1947 tmp="$(mktemp)" |
al@898 | 1948 docat "$arg" > $tmp |
al@898 | 1949 [ -s "$tmp" ] && |
al@898 | 1950 case "$cmd" in |
al@898 | 1951 info) |
al@898 | 1952 echo '<div id="content2" class="texinfo"><pre class="first">' |
al@898 | 1953 info2html < "$tmp" |
al@898 | 1954 echo '</pre></div>' |
al@898 | 1955 ;; |
al@898 | 1956 doc) |
al@898 | 1957 case "$arg" in |
al@898 | 1958 *.sgml|*.devhelp2) class='xml';; |
al@898 | 1959 *.py) class='python';; # pycurl package |
al@898 | 1960 *.css) class='css';; |
al@976 | 1961 *.sh) class='bash';; |
al@976 | 1962 *) |
al@976 | 1963 first=$(head -n1 "$tmp") |
al@976 | 1964 if [ "${first:0:1}" == '#' ]; then |
al@976 | 1965 class='bash' # first line begins with '#' |
al@976 | 1966 else |
al@976 | 1967 class='asciidoc' |
al@976 | 1968 fi;; |
al@898 | 1969 esac |
al@898 | 1970 case "$arg" in |
al@898 | 1971 *.htm*) |
al@898 | 1972 case $arg in |
al@898 | 1973 wok/*) page="${arg#wok/}"; page="$base/$pkg/browse/${page#*/}";; |
al@898 | 1974 *) page="$base/$pkg/browse/install/usr/share/$cmd/$arg";; |
al@898 | 1975 esac |
paul@929 | 1976 # make the iframe height so long to contain its contents without scrollbar |
al@898 | 1977 echo "<iframe id='idoc' src='$page' width='100%' onload='resizeIframe(this)'></iframe>" |
al@898 | 1978 ;; |
al@898 | 1979 *.pdf) |
al@898 | 1980 case $arg in |
al@898 | 1981 wok/*) page="${arg#wok/}"; page="$base/$pkg/browse/${page#*/}";; |
al@898 | 1982 *) page="$base/$pkg/browse/install/usr/share/$cmd/$arg";; |
al@898 | 1983 esac |
al@898 | 1984 cat <<EOT |
al@898 | 1985 <object id="idoc" data="$page" width="100%" height="100%" type="application/pdf" style="min-height: 600px"> |
al@898 | 1986 $(show_note w "Missing PDF plugin.<br/>Get the file <a href="$page">$(basename "$page")</a>.") |
al@898 | 1987 </object> |
al@898 | 1988 EOT |
al@898 | 1989 ;; |
al@958 | 1990 *.md|*.markdown) |
al@958 | 1991 echo '<section>' |
al@958 | 1992 $md2html "$tmp" |
al@958 | 1993 echo '</section>' |
al@958 | 1994 ;; |
al@898 | 1995 *) |
al@898 | 1996 show_code $class < "$tmp" |
al@898 | 1997 ;; |
al@898 | 1998 esac |
al@898 | 1999 ;; |
al@898 | 2000 man) |
al@898 | 2001 #export TEXTDOMAIN='man2html' |
al@898 | 2002 echo "<div id='content2'>" |
al@898 | 2003 |
al@1002 | 2004 html=$(./man2html.bin "$tmp" | sed -e '1,/<header>/d' -e '/<footer>/,$d' \ |
al@898 | 2005 -e 's|<a href="file:///[^>]*>\([^<]*\)</a>|\1|g' \ |
al@898 | 2006 -e 's|<a href="?[1-9]\+[^>]*>\([^<]*\)</a>|\1|g') |
al@898 | 2007 |
al@898 | 2008 if [ -n "$(echo "$html" | fgrep 'The requested file /tmp/tmp.')" ]; then |
al@898 | 2009 # Process the pre-formatted man-cat page |
al@912 | 2010 # (for example see sudo package without groff in build dependencies) |
al@912 | 2011 sed -i ' |
al@898 | 2012 s|M-bM-^@M-^S|—|g; |
al@898 | 2013 s|M-bM-^@M-^\\|<b>|g; |
al@898 | 2014 s|M-bM-^@M-^]|</b>|g |
al@898 | 2015 s|M-bM-^@M-^X|<u>|g; |
al@898 | 2016 s|M-bM-^@M-^Y|</u>|g; |
al@898 | 2017 s|M-BM-||g; |
al@912 | 2018 s|++oo|•|g; |
al@912 | 2019 s|&|\&|g; s|<|\<|g; s|>|\>|g; |
al@898 | 2020 ' "$tmp" |
al@912 | 2021 for i in a b c d e f g h i j k l m n o p q r s t u v w x y z \ |
al@912 | 2022 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \ |
al@912 | 2023 0 1 2 3 4 5 6 7 8 9 _ - '\\+' '\.' /; do |
al@912 | 2024 sed -i "s|$i$i|<b>$i</b>|g; s|_$i|<u>$i</u>|g" "$tmp" |
al@912 | 2025 done |
al@912 | 2026 echo '<pre class="catman">' |
al@912 | 2027 sed 's|</b><b>||g; s|</u><u>||g; s|</u><b>_</b><u>|_|g; s|</b> <b>| |g;' "$tmp" |
al@898 | 2028 echo '</pre>' |
al@898 | 2029 else |
al@898 | 2030 echo "$html" |
al@898 | 2031 fi |
al@898 | 2032 echo "</div>" |
al@898 | 2033 ;; |
al@898 | 2034 esac |
al@898 | 2035 rm -f $tmp |
al@898 | 2036 else |
paul@1006 | 2037 show_note e "File “$arg” does not exist!" |
al@898 | 2038 fi |
al@898 | 2039 ;; |
al@898 | 2040 |
al@924 | 2041 download) |
al@924 | 2042 page_header |
al@924 | 2043 pkg_info |
al@924 | 2044 show=0 |
al@924 | 2045 |
al@924 | 2046 . $wok/$pkg/receipt |
al@924 | 2047 |
al@924 | 2048 if [ -n "$TARBALL" -a -s "$SRC/$TARBALL" ]; then |
al@924 | 2049 files_header |
al@924 | 2050 echo "<tr><td><a href='$base/src/$TARBALL'>$TARBALL</a></td>" |
al@924 | 2051 ls -lh "$SRC/$TARBALL" | awk '{printf("<td>%sB</td>", $5)}' |
al@924 | 2052 echo "<td>Sources for building the package “$pkg”</td></tr>" |
al@924 | 2053 show=1 |
al@924 | 2054 fi |
al@924 | 2055 |
al@924 | 2056 if [ -d "$wok/$pkg/taz" ]; then |
al@924 | 2057 [ "$show" -eq 1 ] || files_header |
al@924 | 2058 |
al@1057 | 2059 common_version=$VERSION |
al@924 | 2060 for i in $(all_names); do |
al@1057 | 2061 [ -e "$wok/$pkg/taz/$i-$common_version$EXTRAVERSION/receipt" ] || continue |
al@1057 | 2062 . $wok/$pkg/taz/$i-$common_version$EXTRAVERSION/receipt |
al@924 | 2063 |
al@924 | 2064 for filename in "$PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$PACKAGE-$VERSION$EXTRAVERSION-$ARCH.tazpkg"; do |
al@924 | 2065 [ -f "$PKGS/$filename" ] && |
al@924 | 2066 cat <<EOT |
al@924 | 2067 <tr> |
al@924 | 2068 <td><a href="$base/get/$filename">$filename</a></td> |
al@924 | 2069 <td>$(ls -lh ./packages/$filename | awk '{printf("%sB", $5)}')</td> |
al@924 | 2070 <td>$SHORT_DESC</td> |
al@924 | 2071 </tr> |
al@924 | 2072 EOT |
al@924 | 2073 done |
al@924 | 2074 done |
al@924 | 2075 show=1 |
al@924 | 2076 fi |
al@924 | 2077 |
al@924 | 2078 if [ "$show" -eq 1 ]; then |
al@924 | 2079 echo '</tbody></table></section>' |
al@924 | 2080 else |
al@924 | 2081 show_note w "Sorry, there's nothing to download…" |
al@924 | 2082 fi |
al@924 | 2083 ;; |
al@924 | 2084 |
al@898 | 2085 esac |
al@898 | 2086 |
al@898 | 2087 |
al@898 | 2088 page_footer |
al@898 | 2089 exit 0 |