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