cookutils annotate lighttpd/index.cgi @ rev 1078

cook: allow multi-set & no-src receipts (sources may be downloaded inside compile_rules() individually for each set), allow change SHORT_DESC & WEB_SITE in genpkg_rules() (for differents sets);
lighttpd/cooker.css: add style for log line "Switching to the set...";
lighttpd/index.cgi: remove false-positive coloring with word "fatal", mark line "Switching to the set...", don't hide "Logs" button (fresh log initially empty and it may lasts for many seconds due to buffered "lazy write";
modules/compressor: better remove unwanted Perl files;
modules/mk_pkg_receipt: follow changed SHORT_DESC & WEB_SITE, improve condition speed (from 10 sec to 0.01 sec) when SPLIT is relatively long - looks like ${A/ $B /} is slow.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Thu Jun 21 12:57:52 2018 +0300 (2018-06-21)
parents aa5729cf385c
children 64c16be1dda4
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&amp;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|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|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/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/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@1078 574 -e 's|^Switching to the set.*|<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|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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 &amp; 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|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|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