cookutils annotate web/cooker.cgi @ rev 893

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