cookutils annotate web/cooker.cgi @ rev 894

cook: fix copy() -> cook_copy_folders() for repeated copying; web/cooker.cgi: manage packages with '+' in the name; web/style.css: get styles from mirror1.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Mar 24 17:29:16 2017 +0200 (2017-03-24)
parents eff71eaaee4f
children fe29568da760
rev   line source
pankso@5 1 #!/bin/sh
pankso@5 2 #
pankso@5 3 # SliTaz Cooker CGI/web interface.
pankso@5 4 #
pankso@5 5
pascal@810 6 . /usr/lib/slitaz/httphelper.sh
pascal@810 7
pankso@5 8 [ -f "/etc/slitaz/cook.conf" ] && . /etc/slitaz/cook.conf
pankso@5 9 [ -f "cook.conf" ] && . ./cook.conf
pankso@5 10
pankso@5 11 # The same wok as cook.
pankso@5 12 wok="$WOK"
pankso@5 13
pankso@5 14 # Cooker DB files.
pankso@5 15 activity="$CACHE/activity"
pankso@5 16 commits="$CACHE/commits"
pankso@5 17 cooklist="$CACHE/cooklist"
pankso@5 18 cookorder="$CACHE/cookorder"
al@865 19 command="$CACHE/command"; touch $command
pankso@5 20 blocked="$CACHE/blocked"
pankso@5 21 broken="$CACHE/broken"
pankso@22 22 cooknotes="$CACHE/cooknotes"
pascal@753 23 cooktime="$CACHE/cooktime"
pankso@164 24 wokrev="$CACHE/wokrev"
pankso@5 25
al@893 26 # Path to markdown to html convertor
al@893 27 if [ -n "$(which cmark 2>/dev/null)" ]; then
al@894 28 md2html="$(which cmark) --smart -e table -e strikethrough -e autolink -e tagfilter"
al@893 29 elif [ -x "./cmark" ]; then
al@894 30 md2html="./cmark --smart -e table -e strikethrough -e autolink -e tagfilter"
al@893 31 elif [ -n "$(which sundown 2>/dev/null)" ]; then
al@893 32 md2html=$(which sundown)
al@891 33 elif [ -x "./sundown" ]; then
al@893 34 md2html="./sundown"
al@891 35 fi
al@891 36
paul@256 37 # We're not logged and want time zone to display correct server date.
pankso@249 38 export TZ=$(cat /etc/TZ)
pankso@249 39
al@893 40
al@893 41 # HTML page header. Pages can be customized with a separated header.html file
al@893 42
al@893 43 page_header() {
al@893 44 echo -e 'Content-Type: text/html; charset=UTF-8\n'
al@893 45 if [ -f "header.html" ]; then
al@893 46 cat header.html
al@893 47 else
al@893 48 cat <<EOT
al@893 49 <!DOCTYPE html>
al@893 50 <html lang="en">
al@893 51 <head>
al@893 52 <meta charset="UTF-8">
al@893 53 <meta name="viewport" content="width=device-width, initial-scale=1.0">
al@893 54 <title>SliTaz Cooker</title>
al@893 55 <link rel="shortcut icon" href="favicon.ico">
al@893 56 <link rel="stylesheet" href="style.css">
al@893 57 <script src="prism.js"></script>
al@893 58 <link rel="stylesheet" href="prism.css">
al@893 59 <link rel="alternate" type="application/rss+xml" title="Cooker Feed" href="?rss">
al@893 60 <meta name="robots" content="nofollow">
al@893 61 </head>
al@893 62 <body>
al@893 63
al@893 64 <div id="header">
al@893 65 <div id="logo"></div>
al@893 66 <h1><a href="cooker.cgi">SliTaz Cooker</a></h1>
al@893 67 </div>
al@893 68 EOT
al@893 69 fi
al@893 70 }
al@893 71
al@893 72
al@893 73 # HTML page footer. Pages can be customized with a separated footer.html file
al@893 74
al@893 75 page_footer() {
al@893 76 if [ -f "footer.html" ]; then
al@893 77 cat footer.html
al@893 78 else
al@893 79 cat <<EOT
al@893 80 </div>
al@893 81
al@893 82 <div id="footer">
al@893 83 <a href="http://www.slitaz.org/">SliTaz Website</a>
al@893 84 <a href="cooker.cgi">Cooker</a>
al@893 85 <a href="doc/cookutils/cookutils.html">Documentation</a>
al@893 86 </div>
al@893 87
al@893 88 </body>
al@893 89 </html>
al@893 90 EOT
al@893 91 fi
al@893 92 }
al@893 93
al@893 94
al@893 95 not_found() {
al@893 96 local file="${1#$PKGS/}"; file="${file#$LOGS/}"; file="${file#$WOK/}"
al@893 97 echo "HTTP/1.1 404 Not Found"
al@893 98 page_header
al@893 99 echo "<div id='content'><h2>Not Found</h2>"
al@893 100 case $2 in
al@893 101 pkg)
al@893 102 echo "<p>The requested package <b>$(basename "$(dirname "$file")")</b> was not found on this server.</p>" ;;
al@893 103 *)
al@893 104 echo "<p>The requested file <b>$file</b> was not found on this server.</p>" ;;
al@893 105 esac
al@893 106 page_footer
al@893 107 }
al@893 108
al@893 109
al@893 110 manage_modified() {
al@893 111 local file="$1" option="$2" nul day mon year time hh mm ss date_s
al@893 112 if [ ! -f "$file" ]; then
al@893 113 if [ "$option" == 'silently-absent' ]; then
al@893 114 echo "HTTP/1.1 404 Not Found"
al@893 115 return
al@893 116 else
al@893 117 not_found "$file" "$2"
al@893 118 exit
al@893 119 fi
al@893 120 fi
al@893 121 [ "$option" == 'no-last-modified' ] && return
al@893 122 if [ -n "$HTTP_IF_MODIFIED_SINCE" ]; then
al@893 123 echo "$HTTP_IF_MODIFIED_SINCE" | \
al@893 124 while read nul day mon year time nul; do
al@893 125 case $mon in
al@893 126 Jan) mon='01';; Feb) mon='02';; Mar) mon='03';; Apr) mon='04';;
al@893 127 May) mon='05';; Jun) mon='06';; Jul) mon='07';; Aug) mon='08';;
al@893 128 Sep) mon='09';; Oct) mon='10';; Nov) mon='11';; Dec) mon='12';;
al@893 129 esac
al@893 130 hh=$(echo $time | cut -d: -f1)
al@893 131 mm=$(echo $time | cut -d: -f2)
al@893 132 ss=$(echo $time | cut -d: -f3)
al@893 133 date_s=$(date -ud "$year$mon$day$hh$mm.$ss" +%s)
al@894 134 # if [ "$date_s" -ge "$(date -ur "$file" +%s)" ]; then
al@894 135 # echo -e 'HTTP/1.1 304 Not Modified\n'
al@894 136 # exit
al@894 137 # fi
al@894 138 # TODO: improve caching control
al@893 139 done
al@893 140 fi
al@893 141 echo "Last-Modified: $(date -Rur "$file" | sed 's|UTC|GMT|')"
al@894 142 echo "Cache-Control: public, max-age=3600"
al@893 143 }
al@893 144
al@893 145
pascal@778 146 case "$QUERY_STRING" in
al@891 147 recook=*)
al@891 148 case "$HTTP_USER_AGENT" in
al@891 149 *SliTaz*)
al@894 150 grep -qs "^$(GET recook)$" $CACHE/recook-packages ||
al@894 151 echo "$(GET recook)" >> $CACHE/recook-packages
al@891 152 esac
al@893 153 echo -e "Location: ${HTTP_REFERER:-${REQUEST_URI%\?*}}\n"
al@891 154 exit
al@891 155 ;;
al@891 156
al@891 157 poke)
al@891 158 touch $CACHE/cooker-request
al@893 159 echo -e "Location: ${HTTP_REFERER:-${REQUEST_URI%\?*}}\n"
al@891 160 exit
al@891 161 ;;
al@891 162
al@891 163 src*)
al@894 164 file=$(busybox httpd -d "$SRC/$(GET src)")
al@893 165 manage_modified "$file"
al@893 166 content_type='application/octet-stream'
al@893 167 case $file in
al@893 168 *.tar.gz) content_type='application/x-compressed-tar' ;;
al@893 169 *.tar.bz2) content_type='application/x-bzip-compressed-tar' ;;
al@893 170 *.tar.xz) content_type='application/x-xz-compressed-tar' ;;
al@893 171 *.tar.lzma) content_type='application/x-lzma-compressed-tar' ;;
al@893 172 *.zip) content_type='application/zip' ;;
al@893 173 esac
al@893 174 echo "Content-Type: $content_type"
al@893 175 echo "Content-Length: $(stat -c %s "$file")"
al@894 176 filename=$(basename "$file")
al@894 177 echo "Content-Disposition: attachment; filename=\"$filename\"" # Note, no conversion '+' -> '%2B' here
al@893 178 echo
pascal@822 179
al@891 180 cat "$file"
al@891 181 exit
al@891 182 ;;
pascal@354 183
al@891 184 download*)
al@894 185 file="$PKGS/$(GET download)"
al@893 186 manage_modified "$file"
al@891 187 content_type='application/octet-stream'
al@891 188 case $file in
al@891 189 *.txt|*.conf|*/README|*/receipt)
al@891 190 content_type='text/plain; charset=UTF-8' ;;
al@891 191 *.css) content_type='text/css; charset=UTF-8' ;;
al@891 192 *.htm|*.html) content_type='text/html; charset=UTF-8' ;;
al@891 193 *.js) content_type='application/javascript; charset=UTF-8' ;;
al@891 194 *.desktop) content_type='application/x-desktop; charset=UTF-8' ;;
al@891 195 *.png) content_type='image/png' ;;
al@893 196 *.gif) content_type='image/gif' ;;
al@891 197 *.svg) content_type='image/svg+xml' ;;
al@891 198 *.jpg|*.jpeg) content_type='image/jpeg' ;;
al@891 199 *.sh|*.cgi) content_type='application/x-shellscript' ;;
al@891 200 *.gz) content_type='application/gzip' ;;
al@891 201 *.ico) content_type='image/vnd.microsoft.icon' ;;
al@893 202 *.tazpkg) content_type='application/x-tazpkg' ;;
al@891 203 esac
al@893 204
al@891 205 echo "Content-Type: $content_type"
al@891 206 echo "Content-Length: $(stat -c %s "$file")"
al@894 207 filename=$(basename "$file")
al@894 208 echo "Content-Disposition: inline; filename=\"$filename\"" # Note, no conversion '+' -> '%2B' here
al@891 209 echo
pascal@778 210
al@891 211 cat "$file"
al@891 212 exit
al@891 213 ;;
al@891 214
al@891 215 rss)
al@891 216 echo -e 'Content-Type: application/rss+xml\n'
al@891 217 ;;
al@891 218
al@893 219 stuff*)
al@894 220 file="$wok/$(GET stuff)"
al@893 221 manage_modified "$file"
al@893 222 ;;
al@893 223
al@893 224 pkg=*|receipt=*|description=*|files=*|log=*|man=*|doc=*|info=*)
al@893 225 type=${QUERY_STRING%%=*}
al@893 226 pkg=$(GET $type)
al@893 227 case "$type" in
al@893 228 description)
al@893 229 manage_modified "$wok/$pkg/receipt" 'no-last-modified'
al@893 230 manage_modified "$wok/$pkg/description.txt" 'silently-absent'
al@893 231 ;;
al@893 232 log)
al@893 233 manage_modified "$wok/${pkg%%.log*}/receipt" 'no-last-modified'
al@893 234 manage_modified "$LOGS/$pkg"
al@893 235 ;;
al@893 236 *)
al@893 237 manage_modified "$wok/$pkg/receipt" pkg
al@893 238 ;;
al@893 239 esac
al@891 240 ;;
al@891 241
pascal@778 242 esac
pascal@778 243
pankso@5 244
pankso@310 245 # RSS feed generator
al@728 246 if [ "$QUERY_STRING" == 'rss' ]; then
al@695 247 pubdate=$(date -R)
al@728 248 cat <<EOT
pankso@310 249 <?xml version="1.0" encoding="utf-8" ?>
al@695 250 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
pankso@310 251 <channel>
pankso@310 252 <title>SliTaz Cooker</title>
pankso@310 253 <description>The SliTaz packages cooker feed</description>
pankso@310 254 <link>$COOKER_URL</link>
pascal@618 255 <lastBuildDate>$pubdate</lastBuildDate>
pascal@618 256 <pubDate>$pubdate</pubDate>
pascal@810 257 <atom:link href="http://cook.slitaz.org/?rss" rel="self" type="application/rss+xml" />
pankso@310 258 EOT
al@728 259 for rss in $(ls -lt $FEEDS/*.xml | head -n 12); do
al@695 260 cat $rss | sed 's|<guid|& isPermaLink="false"|g;s|</pubDate| GMT&|g'
pankso@310 261 done
al@728 262 cat <<EOT
pankso@310 263 </channel>
pankso@310 264 </rss>
pankso@310 265 EOT
pankso@310 266 exit 0
pankso@310 267 fi
pankso@310 268
al@728 269
pascal@354 270 #
pascal@354 271 # Functions
pascal@354 272 #
pascal@354 273
al@728 274
al@848 275 # Unpack to stdout
pascal@810 276
pascal@810 277 docat() {
pascal@810 278 case "$1" in
al@848 279 *gz) zcat ;;
al@848 280 *bz2) bzcat ;;
al@848 281 *xz) xzcat ;;
al@848 282 *) cat
pascal@810 283 esac < $1
pascal@810 284 }
pascal@810 285
pascal@810 286
pascal@815 287 # Tiny texinfo browser
pascal@815 288
pascal@815 289 info2html() {
pascal@816 290 sed \
al@894 291 -e 's|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g' \
pascal@816 292 -e 's|^\* \(.*\)::|* <a href="#\1">\1</a> |' \
pascal@816 293 -e 's|\*note \(.*\)::|<a href="#\1">\1</a>|' \
al@894 294 -e '/^File: / s|(dir)|Top|g' \
al@894 295 -e '/^File: / s|Next: \([^,]*\)|<a class="button" href="#\1">Next: \1</a>|' \
al@894 296 -e '/^File: / s|Prev: \([^,]*\)|<a class="button" href="#\1">Prev: \1</a>|' \
al@894 297 -e '/^File: / s|Up: \([^,]*\)|<a class="button" href="#\1">Up: \1</a>|' \
al@894 298 -e '/^File: / s|^.* Node: \([^,]*\), *\(.*\)$|<pre id="\1">\2|' \
al@894 299 -e '/^<pre id=/ s|^\([^>]*>\)\(<a[^>]*>Next: [^,]*\), *\(<a[^>]*>Prev: [^,]*\), *\(<a[^>]*>Up: .*\)|\1 \3 \4 \2|' \
pascal@816 300 -e '/^Tag Table:$/,/^End Tag Table$/d' \
pascal@816 301 -e '/INFO-DIR/,/^END-INFO-DIR/d' \
al@894 302 -e "s|https*://[^>),'\"\`’ ]*|<a href=\"&\">&</a>|g" \
al@867 303 -e "s|ftp://[^>),\"\` ]*|<a href=\"&\">&</a>|g" \
al@894 304 -e 's|^\* Menu:|<b>Menu:</b>|' \
al@894 305 -e "s|^|</pre>|"
pascal@815 306 }
pascal@815 307
pascal@815 308
pankso@5 309 # Put some colors in log and DB files.
al@728 310
pankso@5 311 syntax_highlighter() {
pankso@17 312 case $1 in
pankso@17 313 log)
al@804 314 # If variables not defined - define them with some rare values
al@804 315 : ${_src=#_#_#}
al@804 316 : ${_install=#_#_#}
al@804 317 : ${_fs=#_#_#}
al@804 318 : ${_stuff=#_#_#}
al@848 319 sed -e 's/&/\&amp;/g; s/</\&lt;/g; s/>/\&gt;/g' \
pascal@601 320 -e 's#OK$#<span class="span-ok">OK</span>#g' \
pascal@535 321 -e 's#Done$#<span class="span-ok">Done</span>#g' \
al@858 322 -e 's#done$#<span class="span-ok">done</span>#g' \
al@858 323 -e 's#\([^a-z]\)ok$#\1<span class="span-ok">ok</span>#g' \
al@858 324 -e 's#\([^a-z]\)yes$#\1<span class="span-ok">yes</span>#g' \
al@858 325 -e 's#\([^a-z]\)no$#\1<span class="span-no">no</span>#g' \
al@858 326 \
al@858 327 -e 's#\( \[Y[nm/]\?\] n\)$# <span class="span-no">\1</span>#g' \
al@858 328 -e 's#\( \[N[ym/]\?\] y\)$# <span class="span-ok">\1</span>#g' \
al@858 329 -e 's#(NEW) $#<span class="span-red">(NEW) </span>#g' \
al@858 330 \
al@867 331 -e 's#.*(pkg/local).*#<span class="span-ok">\0</span>#g' \
al@867 332 -e 's#.*(web/cache).*#<span class="span-no">\0</span>#g' \
al@867 333 \
pankso@129 334 -e 's#error$#<span class="span-red">error</span>#g' \
pankso@129 335 -e 's#ERROR:#<span class="span-red">ERROR:</span>#g' \
al@858 336 -e 's#Error#<span class="span-red">Error</span>#g' \
al@858 337 \
al@858 338 -e 's#^.*[Ff]ailed.*#<span class="span-red">\0</span>#g' \
al@858 339 -e 's#^.*[Ff]atal.*#<span class="span-red">\0</span>#g' \
al@858 340 -e 's#^.*[Nn]ot found.*#<span class="span-red">\0</span>#g' \
al@858 341 -e 's#^.*[Nn]o such file.*#<span class="span-red">\0</span>#g' \
al@858 342 \
pankso@129 343 -e 's#WARNING:#<span class="span-red">WARNING:</span>#g' \
al@858 344 -e 's#warning:#<span class="span-no">warning:</span>#g' \
al@858 345 -e 's#error:#<span class="span-no">error:</span>#g' \
al@858 346 -e 's#missing#<span class="span-no">missing</span>#g' \
al@858 347 \
al@858 348 -e 's#^.* will not .*#<span class="span-no">\0</span>#' \
al@858 349 -e 's!^Hunk .* succeeded at .*!<span class="span-no">\0</span>!' \
al@858 350 -e 's#^.* Warning: .*#<span class="span-no">\0</span>#' \
al@858 351 \
al@858 352 -e "s#^Executing:\([^']*\).#<span class='sh-val'>\0</span>#" \
al@858 353 -e "s#^Making.*#<span class='sh-val'>\0</span>#" \
al@848 354 -e "s#^====\([^']*\).#<span class='span-line'>\0</span>#g" \
al@848 355 -e "s#^[a-zA-Z0-9]\([^']*\) :: #<span class='span-sky'>\0</span>#g" \
al@848 356 -e "s#ftp://[^ '\"]*#<a href='\0'>\0</a>#g" \
al@848 357 -e "s#http://[^ '\"]*#<a href='\0'>\0</a>#g" \
al@848 358 -e "s|$_src|<span class='var'>\${src}</span>|g;
al@848 359 s|$_install|<span class='var'>\${install}</span>|g;
al@848 360 s|$_fs|<span class='var'>\${fs}</span>|g;
al@848 361 s|$_stuff|<span class='var'>\${stuff}</span>|g" \
al@848 362 -e "s|\[91m|<span style='color: #F00'>|;
al@848 363 s|\[92m|<span style='color: #080'>|;
al@848 364 s|\[93m|<span style='color: #FF0'>|;
al@848 365 s|\[94m|<span style='color: #00F'>|;
al@848 366 s|\[95m|<span style='color: #808'>|;
al@891 367 s|\[96m|<span style='color: #088'>|;
al@848 368 s|\[39m|</span>|;"
al@891 369 ;;
al@891 370
al@891 371 files)
al@891 372 sed \
al@891 373 -e "s|\[[01];31m|<span style='color: #F00'>|g;
al@891 374 s|\[[01];32m|<span style='color: #080'>|g;
al@891 375 s|\[[01];33m|<span style='color: #FF0'>|g;
al@891 376 s|\[[01];34m|<span style='color: #00F'>|g;
al@891 377 s|\[[01];35m|<span style='color: #808'>|g;
al@891 378 s|\[[01];36m|<span style='color: #088'>|g;
al@891 379 s|\[[01];0m|<span style='color: #333'>|g;
al@891 380 s|\[0m|</span>|g;"
al@891 381 ;;
al@728 382
pankso@129 383 activity)
al@891 384 sed s"#^\([^']* : \)#<span class='log-date'>\0</span>#"g
al@891 385 ;;
pankso@17 386 esac
pankso@5 387 }
pankso@5 388
al@728 389
al@893 390 show_code() {
al@893 391 echo "<pre><code class=\"language-$1\">"
al@893 392 sed 's|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g'
al@893 393 echo '</code></pre>'
al@893 394 }
al@893 395
al@893 396
pankso@5 397 # Latest build pkgs.
al@728 398
pankso@5 399 list_packages() {
pankso@5 400 cd $PKGS
al@862 401 ls -1t *.tazpkg | head -n 20 | \
al@728 402 while read file; do
al@891 403 echo -n $(TZ=UTC stat -c '%y' $PKGS/$file | cut -d. -f1 | sed s/:[0-9]*$//)
pankso@5 404 echo " : $file"
pankso@5 405 done
pankso@5 406 }
pankso@5 407
al@728 408
pascal@605 409 # Optional full list button
al@728 410
pascal@605 411 more_button() {
al@891 412 [ $(wc -l < ${3:-$CACHE/$1}) -gt ${4:-12} ] &&
al@891 413 echo "<a class='button r' href='?file=$1'>$2</a>"
pascal@605 414 }
pascal@605 415
al@728 416
pascal@751 417 # Show the running command and its progression
pascal@751 418
al@891 419 running_command() {
pascal@751 420 local state="Not running"
pascal@751 421 if [ -s "$command" ]; then
pascal@751 422 state="$(cat $command)"
pascal@824 423 set -- $(grep "^$state" $cooktime)
al@891 424 if [ -n "$1" ]; then
pascal@751 425 state="$state $((($(date +%s)-$3)*100/$2))%"
pascal@787 426 [ $2 -gt 300 ] && state="$state (should end $(date -u -d @$(($2+$3))))"
pascal@751 427 fi
pascal@751 428 fi
pascal@751 429 echo $state
pascal@751 430 }
pascal@751 431
pascal@751 432
al@891 433 datalist() {
al@891 434 (
al@891 435 cd $wok
al@891 436
al@891 437 ls | awk '
al@891 438 BEGIN{printf("<datalist id=\"packages\">")}
al@891 439 {printf("<option>%s</option>",$1)}
al@891 440 END {printf("</datalist>")}
al@891 441 '
al@891 442 )
al@891 443 }
al@891 444
al@891 445
al@891 446 summary() {
al@891 447 log="$1"
al@891 448 pkg="$(basename ${log%%.log*})"
al@891 449 if [ -f "$log" ]; then
al@891 450 if grep -q "cook:$pkg$" $command; then
al@891 451 echo "<pre>The Cooker is currently building: $pkg</pre>"
al@891 452 fi
al@891 453 if fgrep -q "Summary for:" $log; then
al@891 454 echo "<pre>"
al@891 455 sed '/^Summary for:/,$!d' $log | sed /^$/d | syntax_highlighter log
al@891 456 echo "</pre>"
al@891 457 fi
al@891 458
al@891 459 if fgrep -q "Debug information" $log; then
al@891 460 echo '<pre>'
al@891 461 sed '/^Debug information/,$!d' $log | sed /^$/d | \
al@891 462 if [ -n "$2" ]; then
al@891 463 syntax_highlighter log | \
al@892 464 sed 's|\([0-9][0-9]*\):|<a href="#l\1">\1</a>:|'
al@891 465 else
al@891 466 sed 's|^[0-9][0-9]*:||' | syntax_highlighter log
al@891 467 fi
al@891 468 echo '</pre>'
al@891 469 fi
al@891 470 else
al@891 471 [ -n "$pkg" -a -d "$wok/$pkg" ] && echo "<pre>No log for $pkg</pre>"
al@891 472 fi
al@891 473 }
al@891 474
al@891 475
al@891 476 pkg_info() {
al@891 477 local log cmd active bpkg
al@891 478 log=$LOGS/$pkg.log
al@891 479 cmd=${QUERY_STRING%%=*}
al@891 480 echo '<div id="info">'
al@891 481 active=''; [ "$cmd" == 'receipt' -o "$cmd" == 'stuff' ] && active=' active'
al@894 482 echo "<a class='button green$active' href='?receipt=${pkg//+/%2B}'>receipt &amp; stuff</a>"
al@891 483
al@891 484 unset WEB_SITE WANTED
al@891 485 bpkg=$pkg
al@891 486 . $wok/$pkg/receipt
al@891 487
al@891 488 [ -n "$WANTED" ] && bpkg="${WANTED%% *}" # see locale-* with multiple WANTED
al@891 489
al@891 490 [ -n "$WEB_SITE" ] &&
al@891 491 echo "<a class='button sky' href='$WEB_SITE'>web site</a>"
al@891 492
al@891 493 if [ -f "$wok/$pkg/taz/$PACKAGE-$VERSION/receipt" ]; then
al@891 494 active=''; [ "$cmd" == 'files' ] && active=' active'
al@894 495 echo "<a class='button khaki$active' href='?files=${pkg//+/%2B}'>files</a>"
al@891 496
al@891 497 unset EXTRAVERSION
al@891 498 . $wok/$pkg/taz/$PACKAGE-$VERSION/receipt
al@891 499
al@891 500 if [ -f $wok/$pkg/taz/$PACKAGE-$VERSION/description.txt ]; then
al@891 501 active=''; [ "$cmd" == 'description' ] && active=' active'
al@894 502 echo "<a class='button brown$active' href='?description=${pkg//+/%2B}'>description</a>"
al@891 503 fi
al@891 504
al@891 505 if [ -f $PKGS/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg ]; then
al@894 506 echo "<a class='button gold' href='?download=${PACKAGE//+/%2B}-${VERSION//+/%2B}${EXTRAVERSION//+/%2B}.tazpkg'>download</a>"
al@891 507 fi
al@891 508
al@891 509 if [ -f $PKGS/$PACKAGE-$VERSION$EXTRAVERSION-$ARCH.tazpkg ]; then
al@894 510 echo "<a class='button gold' href='?download=${PACKAGE//+/%2B}-${VERSION//+/%2B}${EXTRAVERSION//+/%2B}-${ARCH//+/%2B}.tazpkg'>download</a>"
al@891 511 fi
al@891 512 fi
al@891 513
al@891 514 [ -n "$TARBALL" ] && [ -s "$SRC/$TARBALL" ] &&
al@894 515 echo "<a class='button yellow' href='?src=${TARBALL//+/%2B}'>source</a>"
al@891 516
al@891 517 [ -x ./man2html ] &&
al@891 518 if [ -d $wok/$bpkg/install/usr/man ] ||
al@891 519 [ -d $wok/$bpkg/install/usr/share/man ] ||
al@891 520 [ -d $wok/$bpkg/taz/*/fs/usr/man ] ||
al@891 521 [ -d $wok/$bpkg/taz/*/fs/usr/share/man ]; then
al@891 522 active=''; [ "$cmd" == 'man' ] && active=' active'
al@894 523 echo "<a class='button plum$active' href='?man=${bpkg//+/%2B}'>man</a>"
al@891 524 fi
al@891 525
al@891 526 if [ -d $wok/$bpkg/install/usr/doc ] ||
al@891 527 [ -d $wok/$bpkg/install/usr/share/doc ] ||
al@891 528 [ -d $wok/$bpkg/taz/*/fs/usr/doc ] ||
al@891 529 [ -d $wok/$bpkg/taz/*/fs/usr/share/doc ]; then
al@891 530 active=''; [ "$cmd" == 'doc' ] && active=' active'
al@894 531 echo "<a class='button plum$active' href='?doc=${bpkg//+/%2B}'>doc</a>"
al@891 532 fi
al@891 533
al@891 534 if [ -d $wok/$bpkg/install/usr/info ] ||
al@891 535 [ -d $wok/$bpkg/install/usr/share/info ] ||
al@891 536 [ -d $wok/$bpkg/taz/*/fs/usr/info ] ||
al@891 537 [ -d $wok/$bpkg/taz/*/fs/usr/share/info ]; then
al@891 538 active=''; [ "$cmd" == 'info' ] && active=' active'
al@894 539 echo "<a class='button plum$active' href='?info=${bpkg//+/%2B}#Top'>info</a>"
al@891 540 fi
al@891 541
al@891 542 [ -n "$(echo $REQUEST_URI | sed 's|/[^/]*?pkg.*||')" ] ||
al@894 543 echo "<a class='button' href='ftp://${HTTP_HOST%:*}/${pkg//+/%2B}/'>browse</a>"
al@891 544
al@891 545 if [ -s "$log" ]; then
al@891 546 active=''; [ "$cmd" == 'log' ] && active=' active'
al@894 547 echo "<a class='button gray$active' href='?log=${pkg//+/%2B}.log'>logs</a>"
al@891 548 fi
al@891 549
al@891 550 echo '</div>'
al@891 551 }
al@891 552
al@891 553
al@891 554
al@728 555
pankso@5 556 #
pankso@5 557 # Load requested page
pankso@5 558 #
pankso@5 559
al@893 560 page_header
al@893 561
pankso@5 562 case "${QUERY_STRING}" in
pankso@16 563 pkg=*)
al@894 564 pkg=$(GET pkg)
pankso@16 565 log=$LOGS/$pkg.log
pankso@16 566
al@803 567 # Define cook variables for syntax highlighter
pascal@806 568 if [ -s "$WOK/$pkg/receipt" ]; then
pascal@806 569 . "$WOK/$pkg/receipt"
pascal@806 570 _wok='/home/slitaz/wok'
pascal@806 571 _src="$_wok/$pkg/source/$PACKAGE-$VERSION"
pascal@806 572 _install="$_wok/$pkg/install"
pascal@806 573 _fs="$_wok/$pkg/taz/$PACKAGE-$VERSION/fs"
pascal@806 574 _stuff="$_wok/$pkg/stuff"
pascal@806 575 fi
al@803 576
pankso@18 577 # Package info.
pankso@16 578 if [ -f "$wok/$pkg/receipt" ]; then
al@893 579 echo "<div id='content'>"
al@893 580 echo "<h2>Package: $pkg</h2>"
al@891 581 pkg_info
pankso@16 582 else
al@862 583 if [ $(ls $wok/*$pkg*/receipt 2>/dev/null | wc -l) -eq 0 ]; then
al@893 584 echo "<div id='content'><h2>Not Found</h2>"
al@893 585 echo "<p>The requested package <b>$pkg</b> was not found on this server.</p>"
pascal@703 586 else
al@893 587 echo "<div id='content'>"
pascal@703 588 ls $wok/$pkg/receipt >/dev/null 2>&1 || pkg="*$pkg*"
al@891 589 echo '<table class="zebra" style="width:100%">'
pascal@703 590 for i in $(cd $wok ; ls $pkg/receipt); do
pascal@703 591 pkg=$(dirname $i)
pascal@703 592 unset SHORT_DESC CATEGORY
pascal@703 593 . $wok/$pkg/receipt
pascal@703 594 cat <<EOT
pascal@703 595 <tr>
pascal@810 596 <td><a href="?pkg=$pkg">$pkg</a></td>
pascal@703 597 <td>$SHORT_DESC</td>
pascal@703 598 <td>$CATEGORY</td>
pascal@703 599 </tr>
pascal@704 600 EOT
pascal@703 601 done
pascal@703 602 echo '</table>'
pascal@703 603 unset pkg
pascal@703 604 fi
pankso@16 605 fi
pankso@16 606
paul@62 607 # Check for a log file and display summary if it exists.
al@891 608 summary "$log"
al@893 609
al@893 610 # Display <Recook> button only for SliTaz web browser
pankso@16 611 if [ -f "$log" ]; then
pascal@796 612 case "$HTTP_USER_AGENT" in
al@891 613 *SliTaz*)
al@891 614 [ -f $CACHE/cooker-request ] && [ -n "$HTTP_REFERER" ] &&
al@891 615 echo "<a class=\"button\" href=\"?recook=$pkg\">Recook $pkg</a>"
al@891 616 ;;
pascal@796 617 esac
al@891 618 fi
al@891 619 ;;
al@728 620
pascal@819 621 log=*)
al@894 622 log=$(GET log)
al@891 623 logfile=$LOGS/$log
al@891 624 pkg=${log%.log*}
al@891 625 if [ -s "$logfile" ]; then
al@891 626 echo "<div id='content'>"
al@891 627
al@891 628 echo "<h2>Cook log $(stat -c %y $logfile | sed 's/:..\..*//')</h2>"
al@891 629 pkg_info
al@891 630
al@891 631 case $log in
al@891 632 *.log) baselog=$logfile ;;
al@891 633 *) baselog=${logfile%.*} ;;
al@891 634 esac
al@891 635 for i in $(ls -t $baselog $baselog.* 2>/dev/null); do
al@891 636 class=''; [ $i == $logfile ] && class=' gray'
al@894 637 j=$(basename "$i")
al@894 638 echo -n "<a class='button$class' href=\"?log=${j//+/%2B}\">"
al@891 639 echo "$(stat -c %y $i | cut -d: -f1,2)</a>"
al@891 640 done
al@891 641
al@891 642 summary "$logfile" links
al@891 643
al@891 644 cat $logfile | syntax_highlighter log | awk '
al@891 645 BEGIN { print "<pre class=\"log\">"; }
al@891 646 { printf("<a name=\"l%d\" href=\"#l%d\">%5d</a> %s\n", NR, NR, NR, $0); }
al@891 647 END { print "</pre>"; }
al@891 648 '
pascal@819 649 fi
pascal@819 650 ;;
al@891 651
pankso@65 652 file=*)
al@891 653 echo "<div id='content'>"
al@728 654 # Don't allow all files on the system for security reasons.
al@894 655 file=$(GET file)
pankso@65 656 case "$file" in
pankso@90 657 activity|cooknotes|cooklist)
pankso@91 658 [ "$file" == "cooklist" ] && \
pankso@93 659 nb="- Packages: $(cat $cooklist | wc -l)"
al@891 660 echo '<div id="content2">'
pankso@91 661 echo "<h2>DB: $file $nb</h2>"
al@891 662 echo '<ul class="activity">'
al@891 663 tac $CACHE/$file | syntax_highlighter activity | \
al@891 664 sed 's|^|<li>|; s|$|</li>|'
al@891 665 echo '</ul></div>'
al@891 666 ;;
al@728 667
pankso@66 668 broken)
al@891 669 nb=$(wc -l < $broken)
al@891 670 echo '<div id="content2">'
pankso@93 671 echo "<h2>DB: broken - Packages: $nb</h2>"
al@891 672 echo '<ul class="activity">'
pankso@129 673 cat $CACHE/$file | sort | \
al@891 674 sed "s#^[^']*#<a href='?pkg=\0'>\0</a>#g" | \
al@891 675 sed 's|^|<li>|; s|$|</li>|'
al@891 676 echo '</ul></div>'
al@891 677 ;;
al@728 678
pankso@65 679 *.log)
pankso@71 680 log=$LOGS/$file
pankso@71 681 name=$(basename $log)
pankso@65 682 echo "<h2>Log for: ${name%.log}</h2>"
pankso@71 683 if [ -f "$log" ]; then
pankso@71 684 if fgrep -q "Summary" $log; then
pankso@65 685 echo '<pre>'
pankso@73 686 grep -A 20 "^Summary" $log | sed /^$/d | \
pankso@65 687 syntax_highlighter log
pankso@65 688 echo '</pre>'
pankso@65 689 fi
pankso@65 690 echo '<pre>'
pankso@71 691 cat $log | syntax_highlighter log
pankso@65 692 echo '</pre>'
pankso@65 693 else
pankso@71 694 echo "<pre>No log file: $log</pre>"
al@891 695 fi
al@891 696 ;;
al@891 697 esac
al@891 698 ;;
al@728 699
pascal@509 700 stuff=*)
al@891 701 echo "<div id='content'>"
al@894 702 file=$(GET stuff)
al@891 703 pkg=${file%%/*}
al@891 704 if [ -f "$wok/$file" ]; then
al@891 705 echo "<h2>$file</h2>"
al@891 706 pkg_info
al@894 707 echo "<a class='button' href='?receipt=${pkg//+/%2B}'>receipt</a>"
al@891 708
al@891 709 ( cd $wok/$pkg ; find stuff -type f 2> /dev/null ) | sort | \
al@891 710 while read i ; do
al@891 711 class=''; [ "$pkg/$i" == "$file" ] && class=" green"
al@894 712 echo "<a class='button$class' href='?stuff=${pkg//+/%2B}/${i//+/%2B}'>$i</a>"
al@891 713 done
al@891 714
al@891 715 case $file in
al@893 716 *.desktop|*.theme) class="ini" ;;
al@891 717 *.patch|*.diff|*.u) class="diff" ;;
al@893 718 *.sh) class="bash" ;;
al@891 719 *.conf*)
al@891 720 class="bash"
al@891 721 [ -n "$(cut -c1 < $wok/$file | fgrep '[')" ] && class="ini"
al@891 722 ;;
al@891 723 *.pl) class="perl" ;;
al@891 724 *.c|*.h|*.awk) class="clike" ;;
al@891 725 *.svg) class="svg" ;;
al@891 726 *Makefile*) class="makefile" ;;
al@891 727 *.po|*.pot) class="bash" ;;
al@891 728 *.css) class="css" ;;
al@891 729 *.htm|*.html) class="html" ;;
al@891 730 *.js) class="js" ;;
al@891 731 *.txt) class="asciidoc" ;;
al@891 732 *)
al@891 733 case $(head -n1 $wok/$file) in
al@891 734 *!/bin/sh*|*!/bin/bash*) class="bash" ;;
al@891 735 esac
al@891 736 if [ -z "$class" -a "$(head -n1 $wok/$file | cut -b1)" == '#' ]; then
al@891 737 class="bash"
al@891 738 fi
al@891 739 if [ -z "$class" ]; then
al@891 740 # Follow Busybox restrictions. Search for non-printable chars
al@891 741 if [ $(tr -d '[:alnum:][:punct:][:blank:][:cntrl:]' < "$wok/$file" | wc -c) -gt 0 ]; then
al@891 742 raw="true"
al@891 743 fi
al@891 744 fi
al@891 745 ;;
al@891 746 esac
al@891 747
al@891 748 # Display image
al@891 749 case $file in
al@891 750 *.png|*.svg|*.jpg|*.jpeg|*.ico)
al@894 751 echo "<img src='?download=../wok/${file//+/%2B}' style='display: block; max-width: 100%; margin: auto'/>"
al@891 752 ;;
al@891 753 esac
al@891 754
al@893 755 # Display colored listing for all text-based documents (also for *.svg)
al@891 756 case $file in
al@891 757 *.png|*.jpg|*.jpeg|*.ico) ;;
al@891 758 *)
al@891 759 if [ -z "$raw" ]; then
al@893 760 cat $wok/$file | show_code $class
al@891 761 fi
al@891 762 ;;
al@891 763 esac
al@891 764
al@891 765 # Display hex dump for binary files
al@891 766 if [ -n "$raw" ]; then
al@893 767 hexdump -C $wok/$file | show_code $class
al@891 768 fi
al@891 769 else
al@891 770 echo "<pre>File '$file' absent!</pre>"
al@891 771 fi
al@891 772 ;;
al@728 773
pankso@16 774 receipt=*)
al@891 775 echo "<div id='content'>"
al@894 776 pkg=$(GET receipt)
al@893 777 echo "<h2>Receipt for: $pkg</h2>"
al@893 778 pkg_info
al@894 779 echo "<a class='button green' href='?receipt=${pkg//+/%2B}'>receipt</a>"
al@893 780 . $wok/$pkg/receipt
pascal@822 781
al@893 782 ( cd $wok/$pkg; find stuff -type f 2> /dev/null ) | sort | \
al@893 783 while read file; do
al@894 784 echo "<a class='button' href='?stuff=${pkg//+/%2B}/${file//+/%2B}'>$file</a>"
al@893 785 done | sort
al@893 786 cat $wok/$pkg/receipt | show_code bash
al@891 787 ;;
al@891 788
al@891 789 files=*)
al@891 790 echo "<div id='content'>"
al@894 791 pkg=$(GET files)
al@891 792 dir=$(ls -d $WOK/$pkg/taz/$pkg-* 2>/dev/null)
al@893 793 size=$(du -hs $dir/fs | awk '{ print $1 }')
al@893 794 echo "<h2>Files installed by the package \"$pkg\" ($size)</h2>"
al@893 795 pkg_info
al@891 796
al@893 797 echo '<pre class="files">'
al@891 798
al@893 799 find $dir/fs -not -type d -print0 | sort -z | \
al@893 800 xargs -0 ls -ld --color=always | \
al@893 801 syntax_highlighter files | \
al@894 802 sed "s|\([^/]*\)/.*\(${dir#*wok}/fs\)\([^<]*\)\(<.*\)$|\1<a href=\"?download=../wok\2\3\">\3</a>\4|" |\
al@894 803 awk '
al@894 804 BEGIN { FS="\""; }
al@894 805 { gsub("+", "%2B", $2); print; }
al@894 806 '
al@891 807
al@893 808 echo '</pre>'
al@891 809 ;;
al@728 810
pascal@490 811 description=*)
al@891 812 echo "<div id='content'>"
al@894 813 pkg=$(GET description)
al@891 814 dir=$(ls -d $WOK/$pkg/taz/$pkg-* 2>/dev/null)
al@893 815 echo "<h2>Description of $pkg</h2>"
al@893 816 pkg_info
pascal@493 817 if [ -s "$dir/description.txt" ]; then
al@893 818 if [ -n "$md2html" ]; then
al@891 819 echo '<div id="content2">'
al@893 820 $md2html $dir/description.txt
al@891 821 echo '</div>'
al@891 822 else
al@893 823 cat $dir/description.txt | show_code markdown
al@891 824 fi
pascal@490 825 else
al@893 826 echo "<pre>No description of $pkg</pre>"
al@891 827 fi
al@891 828 ;;
al@728 829
pascal@815 830 man=*|doc=*|info=*)
al@891 831 echo '<div id="content">'
pascal@810 832 type=${QUERY_STRING%%=*}
pascal@810 833 pkg=$(GET $type)
al@893 834 dir=$WOK/$pkg/install/usr/share/$type
al@893 835 [ -d $dir ] || dir=$WOK/$pkg/install/usr/$type
al@893 836 [ -d $dir ] || dir=$(echo $WOK/$pkg/taz/*/fs/usr/share/$type)
al@893 837 [ -d $dir ] || dir=$(echo $WOK/$pkg/taz/*/fs/usr/$type)
al@893 838 page=$(GET file)
al@893 839 if [ -z "$page" ]; then
al@893 840 page=$(find $dir -type f | sed q)
al@893 841 page=${page#$dir/}
al@893 842 fi
al@891 843
al@893 844 echo "<h2>$(basename $page)</h2>"
al@891 845
al@893 846 pkg_info
al@893 847 echo '<div style="max-height: 5em; overflow: auto">'
al@893 848 find $dir -type f | sort | while read i ; do
al@893 849 [ -s $i ] || continue
al@893 850 case "$i" in
al@893 851 *.jp*g|*.png|*.gif|*.svg|*.css) continue
al@893 852 esac
al@893 853 i=${i#$dir/}
al@893 854 class=''; [ "$page" == "$i" ] && class=" plum"
al@893 855 case "$type" in
al@893 856 man)
al@893 857 man=$(basename $i .gz)
al@893 858 echo "<a class='button$class' href='?$type=$pkg&amp;file=$i'>${man%.*} (${man##*.})</a>"
al@893 859 ;;
al@893 860 info)
al@893 861 info=$(basename $i)
al@894 862 echo "<a class='button$class' href='?$type=$pkg&amp;file=$i#Top'>${info/.info/}</a>"
al@893 863 ;;
al@893 864 *)
al@893 865 echo "<a class='button$class' href='?$type=$pkg&amp;file=$i'>$(basename $i .gz)</a>"
al@893 866 ;;
al@893 867 esac
al@893 868 done
al@893 869 echo '</div>'
al@891 870
al@893 871 if [ -f "$dir/$page" ]; then
al@893 872 tmp="$(mktemp)"
al@893 873 docat "$dir/$page" > $tmp
al@893 874 [ -s "$tmp" ] &&
al@893 875 case "$type" in
al@893 876 info)
al@894 877 echo '<div id="content2" class="texinfo"><pre class="first">'
al@893 878 info2html < "$tmp"
al@893 879 echo '</pre></div>'
al@893 880 ;;
al@893 881 doc)
al@893 882 case "$page" in
al@893 883 *.sgml) class='xml';;
al@894 884 *.py) class='python';; # pycurl package
al@893 885 *) class='asciidoc';;
al@893 886 esac
al@893 887 case "$page" in
al@893 888 *.htm*)
al@893 889 echo '<div id="content2">'
al@893 890 cat
al@893 891 echo '</div>'
al@893 892 ;;
al@893 893 *)
al@893 894 show_code $class
al@893 895 ;;
al@893 896 esac < "$tmp"
al@893 897 ;;
al@893 898 man)
al@893 899 export TEXTDOMAIN='man2html'
al@893 900 echo "<div id='content2'>"
al@891 901
al@893 902 html=$(./man2html "$tmp" | sed -e '1,/<header>/d' \
al@893 903 -e 's|<a href="file:///[^>]*>\([^<]*\)</a>|\1|g' \
al@893 904 -e 's|<a href="?[1-9]\+[^>]*>\([^<]*\)</a>|\1|g')
al@891 905
al@893 906 if [ -n "$(echo "$html" | fgrep 'The requested file /tmp/tmp.')" ]; then
al@893 907 # Process the pre-formatted man-cat page
al@893 908 echo '<pre>'
al@893 909 sed '
al@893 910 s|M-bM-^@M-^S|—|g;
al@893 911 s|M-bM-^@M-^\\|<b>|g;
al@893 912 s|M-bM-^@M-^]|</b>|g
al@893 913 s|M-bM-^@M-^X|<u>|g;
al@893 914 s|M-bM-^@M-^Y|</u>|g;
al@893 915 s|M-BM-||g;
al@893 916 ' "$tmp"
al@893 917 echo '</pre>'
al@893 918 else
al@893 919 echo "$html"
al@893 920 fi
al@893 921 echo "</div>"
al@893 922 ;;
al@893 923 esac
al@893 924 rm -f $tmp
al@891 925 else
al@893 926 echo "<pre>File '$page' not exists!</pre>"
pascal@810 927 fi
pascal@810 928 ;;
al@891 929
pankso@5 930 *)
pankso@383 931 # We may have a toolchain.cgi script for cross cooker's
pankso@383 932 if [ -f "toolchain.cgi" ]; then
pankso@383 933 toolchain='toolchain.cgi'
pankso@383 934 else
pascal@810 935 toolchain='?pkg=slitaz-toolchain'
pankso@383 936 fi
pankso@383 937 # Main page with summary. Count only package include in ARCH,
pankso@679 938 # use 'cooker arch-db' to manually create arch.$ARCH files.
pankso@679 939 inwok=$(ls $WOK/*/arch.$ARCH | wc -l)
pankso@75 940 cooked=$(ls $PKGS/*.tazpkg | wc -l)
pankso@106 941 unbuilt=$(($inwok - $cooked))
pankso@245 942 pct=0
pankso@245 943 [ $inwok -gt 0 ] && pct=$(( ($cooked * 100) / $inwok ))
al@728 944 cat <<EOT
al@891 945 <div id="content2">
al@891 946
al@891 947 <form method="get" action="" class="r">
al@891 948 <input type="search" name="pkg" placeholder="Package" list="packages" autocorrect="off" autocapitalize="off"/>
al@891 949 </form>
pankso@5 950
pankso@5 951 <h2>Summary</h2>
pankso@75 952
al@891 953 <table>
al@891 954 <tr><td>Running command</td><td>: $(running_command)</td></tr>
al@891 955 <tr><td>Wok revision</td><td>: <a href="$WOK_URL">$(cat $wokrev)</a></td></tr>
al@891 956 <tr><td>Commits to cook</td><td>: $(wc -l < $commits)</td></tr>
al@891 957 <tr><td>Current cooklist</td><td>: $(wc -l < $cooklist)</td></tr>
al@891 958 <tr><td>Broken packages</td><td>: $(wc -l < $broken)</td></tr>
al@891 959 <tr><td>Blocked packages</td><td>: $(wc -l < $blocked)</td></tr>
al@891 960 <tr><td>Architecture</td><td>: $ARCH, <a href="$toolchain">toolchain</a></td></tr>
al@891 961 <tr><td>Server date</td><td>: $(date -u '+%F %R %Z')</td></tr>
al@891 962
al@891 963 </table>
pascal@805 964 EOT
al@891 965
pascal@805 966 [ -e $CACHE/cooker-request ] &&
al@891 967 [ $CACHE/activity -nt $CACHE/cooker-request ] &&
al@891 968 echo '<a class="button r" href="?poke">Poke cooker</a>'
al@891 969
pascal@805 970 cat <<EOT
al@891 971 <p class="info">Packages: $inwok in the wok · $cooked cooked · $unbuilt unbuilt</p>
al@891 972
pankso@75 973 <div class="pctbar">
pankso@75 974 <div class="pct" style="width: ${pct}%;">${pct}%</div>
pankso@14 975 </div>
pankso@14 976
pankso@75 977 <p>
al@891 978 Service logs:
al@891 979 <a href="?file=cookorder.log">cookorder</a> ·
al@891 980 <a href="?file=commits.log">commits</a> ·
al@891 981 <a href="?file=pkgdb.log">pkgdb</a><!-- ·
al@891 982 <a href="?file=installed.diff">installed.diff</a> -->
pankso@75 983 </p>
al@803 984
pascal@805 985 $(more_button activity "More activity" $CACHE/activity 12)
al@728 986 <h2 id="activity">Activity</h2>
al@891 987
al@891 988 <ul class="activity">
al@803 989 EOT
pankso@5 990
al@891 991 tac $CACHE/activity | head -n 12 | syntax_highlighter activity | \
al@894 992 sed 's|cooker.cgi||; s|^|<li>|; s|$|</li>|;'
al@891 993
al@891 994 echo '</ul>'
al@891 995
al@803 996 [ -s $cooknotes ] && cat <<EOT
pascal@805 997 $(more_button cooknotes "More notes" $cooknotes 12)
al@728 998 <h2 id="cooknotes">Cooknotes</h2>
pankso@23 999 <pre>
pankso@129 1000 $(tac $cooknotes | head -n 12 | syntax_highlighter activity)
pankso@23 1001 </pre>
al@803 1002 EOT
pankso@23 1003
al@803 1004 [ -s $commits ] && cat <<EOT
al@728 1005 <h2 id="commits">Commits</h2>
al@891 1006 <ul class="activity">
al@891 1007 $(sed 's|^|<li>|; s|$|</li>|' $commits)
al@891 1008 </ul>
al@803 1009 EOT
pankso@5 1010
al@803 1011 [ -s $cooklist ] && cat <<EOT
pascal@805 1012 $(more_button cooklist "Full cooklist" $cooklist 20)
al@728 1013 <h2 id="cooklist">Cooklist</h2>
al@891 1014 <ul class="activity">
al@891 1015 $(head -n 20 $cooklist | sed 's|^|<li>|; s|$|</li>|')
al@891 1016 </ul>
al@803 1017 EOT
pankso@18 1018
al@803 1019 [ -s $broken ] && cat <<EOT
pascal@805 1020 $(more_button broken "All broken packages" $broken 20)
al@728 1021 <h2 id="broken">Broken</h2>
al@891 1022 <ul class="activity">
al@891 1023 $(head -n 20 $broken | sed "s#^[^']*#<a href='?pkg=\0'>\0</a>#g" | sed 's|^|<li>|; s|$|</li>|')
al@891 1024 </ul>
al@803 1025 EOT
pankso@5 1026
al@803 1027 [ -s $blocked ] && cat <<EOT
al@728 1028 <h2 id="blocked">Blocked</h2>
al@891 1029 <ul class="activity">
al@891 1030 $(sed "s#^[^']*#<a href='?pkg=\0'>\0</a>#g" $blocked | sed 's|^|<li>|; s|$|</li>|')
al@891 1031 </ul>
al@803 1032 EOT
pankso@14 1033
al@803 1034 cat <<EOT
al@728 1035 <h2 id="lastcook">Latest cook</h2>
al@891 1036 <ul class="activity">
al@894 1037 $(list_packages | sed 's|.tazpkg$||' | \
al@894 1038 sed "s|^.* :|<span class='log-date'>\0</span> <span style='white-space:nowrap'>|g; s|^|<li>|; s|$|</span></li>|")
al@891 1039 </ul>
al@891 1040
pankso@5 1041 EOT
al@891 1042 datalist
pankso@5 1043 ;;
pankso@5 1044 esac
pankso@5 1045
al@728 1046
al@893 1047 page_footer
pankso@5 1048 exit 0