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