slitaz-forge view pkgs/search.sh @ rev 633

arm/rpi/index.html: add some anchors
author Pascal Bellard <pascal.bellard@slitaz.org>
date Sun Jan 22 11:53:35 2017 +0100 (2017-01-22)
parents 8c57ef6cb7b0
children 05b611ddb67c
line source
1 #!/bin/sh -v
2 #
3 # Tiny CGI search engine for SliTaz packages on http://pkgs.slitaz.org/
4 # Christophe Lincoln <pankso@slitaz.org>
5 # Aleksej Bobylev <al.bobylev@gmail.com>
6 #
8 date_start="$(date -u +%s)"
10 renice -n 19 $$
13 # Parse query string
15 . /etc/slitaz/slitaz.conf
16 . /usr/lib/slitaz/httphelper.sh
17 cache='/var/cache/pkgs'
18 mkdir -p "$cache"
20 _() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; echo; }
21 _n() { local T="$1"; shift; printf "$(gettext "$T")" "$@"; }
22 _p() { local S="$1" P="$2" N="$3"; shift 3; printf "$(ngettext "$S" "$P" "$N")" "$@"; }
25 [ -n "$MIRROR_URL" ] || MIRROR_URL="http://mirror.slitaz.org"
28 # User preferred language
29 # parameter $1 have priority; without parameter $1 - browser language only
30 # if we don't support any of user languages (or only en), then return C locale
32 user_lang() {
33 unset LANG
34 IFS=','
35 for lang in $1 $HTTP_ACCEPT_LANGUAGE; do
36 lang=${lang%;*}; lang=${lang# }; lang=${lang%-*}; lang=${lang%_*}
37 case "$lang" in
38 de) LANG='de_DE';;
39 en) LANG='en_US';;
40 es) LANG='es_ES';;
41 fa) LANG='fa_IR';;
42 fr) LANG='fr_FR';;
43 #it) LANG='it_IT';; # We haven't Italian translations
44 pl) LANG='pl_PL';;
45 pt) LANG='pt_BR';;
46 ru) LANG='ru_RU';;
47 sv) LANG='sv_SE';;
48 uk) LANG='uk_UA';;
49 zh) LANG='zh_TW';;
50 esac
51 [ -n "$LANG" ] && break
52 done
53 unset IFS
54 echo "${LANG:-C}"
55 }
58 # Part of query to indicate current debug mode
60 ifdebug() {
61 ifdebug="$(GET debug)"
62 [ -n "$ifdebug" ] && ifdebug="$1$ifdebug"
63 echo "$ifdebug"
64 }
67 # GET or POST variable
69 GETPOST() {
70 echo "$(POST $1)$(GET $1)"
71 }
74 # Nice URL replacer - to copy URL from address bar
75 # TODO: deal with POST method of form submitting
77 nice_url() {
78 # if user submitted a form
79 if [ "$REQUEST_METHOD" == 'POST' -o -n "$(GET submit)" ]; then
80 OBJECT="$(GETPOST object)"
81 SEARCH="$(GETPOST query)"
82 case $OBJECT in
83 Package) NICE="package=$SEARCH";;
84 Desc) NICE="desc=$SEARCH";;
85 Tags) NICE="tags=$SEARCH";;
86 Arch) NICE="arch=$SEARCH";;
87 Bugs) NICE="bugs=$SEARCH";;
88 Receipt) NICE="receipt=$SEARCH";;
89 Depends) NICE="depends=$SEARCH";;
90 BuildDepends) NICE="builddepends=$SEARCH";;
91 File) NICE="file=$SEARCH";;
92 File_list) NICE="filelist=$SEARCH";;
93 FileOverlap) NICE="fileoverlap=$SEARCH";;
94 Category) NICE="category=$SEARCH";;
95 Maintainer) NICE="maintainer=$SEARCH";;
96 License) NICE="license=$SEARCH";;
97 esac
99 # version, if needed
100 version="$(GETPOST version)"
101 if [ -n "$version" -a "$version" != 'cooking' -a "$version" != 'c' ]; then
102 NICE="$NICE&version=${version:0:1}"
103 fi
105 # lang, if needed
106 query_lang="$(GETPOST lang)"
107 pref_lang="$(user_lang)"
108 browser_lang="${pref_lang%_*}"
109 if [ -n "$query_lang" ]; then
110 COOKIE="lang=$query_lang"
111 else
112 COOKIE=''
113 fi
115 # verbose, if needed
116 verboseq="$(GETPOST verbose)"
117 if [ -n "$verboseq" -a "$verboseq" != '0' ]; then
118 NICE="$NICE&verbose=1"
119 fi
121 # debug, if needed
122 debugq="$(GET debug)"
123 if [ -n "$debugq" -a "$debugq" == 'debug' ]; then
124 NICE="$NICE&debug"
125 fi
127 # redirect
128 if [ -z "$COOKIE" ]; then
129 header "HTTP/1.1 301 Moved Permanently" "Location: ?$NICE"
130 else
131 header "HTTP/1.1 301 Moved Permanently" "Set-Cookie: $COOKIE" "Location: ?$NICE"
132 fi
133 exit 0
134 fi
135 }
138 nice_url
143 # Internationalization
144 . /usr/bin/gettext.sh
145 export TEXTDOMAIN='tazpkg-web'
146 # Translate actions once
147 a_co="$(_ 'Cooker')"
148 a_dl="$(_ 'Download')"
149 a_rc="$(_ 'Receipt')"
154 # Cache icons to fast search
155 # Find the latest update in the "icons" folder
156 unset ICONS_CACHE_REBUILDED
157 iconslast="$cache/icons.$(date -u +%s -r /var/www/pkgs/icons/$(ls -t /var/www/pkgs/icons | head -n1))"
159 if [ ! -f "$iconslast" ]; then
160 find "$cache" -name 'icons.*' -delete
162 (
163 cat icons/packages.icons
164 awk '{printf "%s\tcli\n",$1}' icons/packages-cli.icons
165 awk '{printf "%s\tdoc\n",$1}' icons/packages-doc.icons
166 awk '{printf "%s\tfont\n",$1}' icons/packages-font.icons
167 awk '{printf "%s\ti18n\n",$1}' icons/packages-i18n.icons
168 awk '{printf "%s\tthm\n",$1}' icons/packages-thm.icons
169 awk '{printf "%s\tlib\n",$1}' icons/packages-lib.icons
170 awk '{printf "%s\tpy\n",$1}' icons/packages-py.icons
171 awk '{printf "%s\tperl\n",$1}' icons/packages-perl.icons
172 ls icons/*.png | awk -F/ '{sub(/\.png/,"",$2);printf "%s\t%s\n", $2, $2}'
173 ) | sort > "$iconslast"
174 ICONS_CACHE_REBUILDED='yes'
175 fi
179 unset SEARCH SLITAZ_VERSION
180 VERBOSE=0
181 s='selected'
182 for i in $(echo $QUERY_STRING | sed 's/[?&]/ /g'); do
183 case "$(echo $i | tr [A-Z] [a-z])" in
184 query=*|search=*) [ ${i#*=} == Search ] || SEARCH=${i#*=};;
185 object=*) OBJECT=${i#*=};;
186 verbose=*) VERBOSE=${i#*=};;
187 lang=*) LANG=${i#*=};;
188 file=*) SEARCH=${i#*=}; OBJECT='File'; sel_file=$s;;
189 desc=*) SEARCH=${i#*=}; OBJECT='Desc'; sel_desc=$s;;
190 tags=*) SEARCH=${i#*=}; OBJECT='Tags'; sel_tags=$s;;
191 arch=*) SEARCH=${i#*=}; OBJECT='Arch'; sel_arch=$s;;
192 bugs=*) SEARCH=${i#*=}; OBJECT='Bugs'; sel_bugs=$s;;
193 receipt=*) SEARCH=${i#*=}; OBJECT='Receipt'; sel_rcpt=$s;;
194 filelist=*) SEARCH=${i#*=}; OBJECT='File_list'; sel_flst=$s;;
195 package=*) SEARCH=${i#*=}; OBJECT='Package';;
196 depends=*) SEARCH=${i#*=}; OBJECT='Depends'; sel_deps=$s;;
197 builddepends=*) SEARCH=${i#*=}; OBJECT='BuildDepends'; sel_bdps=$s;;
198 fileoverlap=*) SEARCH=${i#*=}; OBJECT='FileOverlap'; sel_over=$s;;
199 category=*) SEARCH=${i#*=}; OBJECT='Category'; sel_catg=$s;;
200 maintainer=*) SEARCH=${i#*=}; OBJECT='Maintainer'; sel_mtnr=$s;;
201 license=*) SEARCH=${i#*=}; OBJECT='License'; sel_lcns=$s;;
202 version=1*) SLITAZ_VERSION='1.0'; sel_1=$s;;
203 version=2*) SLITAZ_VERSION='2.0'; sel_2=$s;;
204 version=3*) SLITAZ_VERSION='3.0'; sel_3=$s;;
205 version=s*|version=4*) SLITAZ_VERSION='stable'; sel_s=$s;;
206 version=u*) SLITAZ_VERSION='undigest'; sel_u=$s;;
207 version=b*) SLITAZ_VERSION='backports'; sel_b=$s;;
208 version=t*) SLITAZ_VERSION='tiny'; sel_t=$s;;
209 esac
210 done
211 [ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION='cooking'
212 addver=''; [ "$SLITAZ_VERSION" != 'cooking' ] && addver="&amp;version=$SLITAZ_VERSION"
213 SEARCH="${SEARCH//%20/ }"
215 #
216 # Content negotiation for Gettext
217 #
219 LANG=$(user_lang $(COOKIE lang))
220 lang="${LANG%_*}"
221 export LANG LC_ALL=$LANG
224 #
225 # Unescape query and set vars
226 #
228 SEARCH="$(echo $SEARCH | sed 's|%2B|+|g; s|%3A|:|g; s|%2F|/|g')"
230 SLITAZ_HOME="/home/slitaz"
231 if [ "$SLITAZ_VERSION" == 'cooking' ]; then
232 WOK="$SLITAZ_HOME/wok"
233 else
234 WOK="$SLITAZ_HOME/wok-$SLITAZ_VERSION"
235 fi
237 pkgsrepo="$SLITAZ_HOME/$SLITAZ_VERSION/packages"
238 repoid="$(cat "$pkgsrepo/ID")"
239 filelist="$pkgsrepo/files.list.lzma"
240 pkglist="$pkgsrepo/packages.txt"
241 equiv="$pkgsrepo/packages.equiv"
242 pinfo="$pkgsrepo/packages.info"
244 # Date of the last modification (both packages DB or icons DB)
245 if [ -f "$pkgsrepo/ID" ]; then
246 if [ "$iconslast" -nt "$pkgsrepo/ID" ]; then
247 lastmod="$(date -Rur "$iconslast")"
248 else
249 lastmod="$(date -Rur "$pkgsrepo/ID")"
250 fi
251 lastmod="${lastmod/UTC/GMT}"
252 fi
257 # Search form
258 # TODO: add hint 'You are can search for depends loop, if textfield is empty'...
259 # add progress ticker while page is not complete
261 search_form() {
262 [ -z "$SEARCH$(GET info)" ] && autofocus='autofocus'
264 cat <<EOT
266 <div class="form">
267 <form id="s_form" name="s_form" method="post" action="$(ifdebug '?')">
268 <span class="small">
269 <select name="object">
270 <option value="Package" class="pkg">$(_ 'Package name')</option>
271 <option $sel_desc value="Desc" class="description">$(_ 'Description')</option>
272 <option $sel_tags value="Tags" class="tag">$(_ 'Tag')</option>
273 <option $sel_arch value="Arch" class="arch">$(_ 'Architecture')</option>
274 <option $sel_bugs value="Bugs" class="bugs">$(_ 'Bugs')</option>
275 <option $sel_rcpt value="Receipt" class="receipt">$(_ 'Receipt')</option>
276 <option $sel_deps value="Depends" class="dep">$(_ 'Dependencies')</option>
277 <option $sel_bdps value="BuildDepends" class="dep">$(_ 'Build dependencies')</option>
278 <option $sel_file value="File" class="file">$(_ 'File')</option>
279 <option $sel_flst value="File_list" class="files-list">$(_ 'File list')</option>
280 <option $sel_over value="FileOverlap" class="common">$(_ 'Common files')</option>
281 <option $sel_catg value="Category" class="category">$(_ 'Category')</option>
282 <option $sel_mtnr value="Maintainer" class="avatar">$(_ 'Maintainer')</option>
283 <option $sel_lcns value="License" class="license">$(_ 'License')</option>
284 </select>
285 </span>
286 <span class="stretch">
287 <input $autofocus type="search" name="query" id="query" value="$SEARCH$(GET info)"
288 autocorrect="off" autocapitalize="off" autocomplete="on" spellcheck="false"
289 results="5" autosave="pkgsearch"/>
290 </span>
291 <span class="small">
292 <select name="version" title="$(_ 'SliTaz version')">
293 <option value="cooking">$( _ 'cooking')</option>
294 <option $sel_s value="stable">4.0</option>
295 <option $sel_3 value="3.0">3.0</option>
296 <option $sel_2 value="2.0">2.0</option>
297 <option $sel_1 value="1.0">1.0</option>
298 <option $sel_t value="tiny">$( _ 'tiny')</option>
299 <option $sel_u value="undigest">$( _ 'undigest')</option>
300 <option $sel_b value="backports">$( _ 'backports')</option>
301 </select>
302 </span>
303 <span class="small">
304 <button type="submit">$(_ 'Search')</button>
305 </span>
306 </form>
307 </div>
308 EOT
309 }
312 # xHTML5 Header.
314 xhtml_header() {
315 . lib/header.sh
316 }
319 # FIXME: unused function
321 cat_files_list() {
322 local tmp="/tmp/files.list.$(basename ${1%/packages})"
323 if [ ! -s "$tmp" -o "$1/files.list.lzma" -nt "$tmp" ]; then
324 unlzma < "$1/files.list.lzma" > "$tmp.$$" && mv "$tmp.$$" "$tmp"
325 fi
326 case "$2" in
327 lines)
328 if [ ! -s "$tmp.lines" -o "$tmp" -nt "$tmp.lines" ]; then
329 wc -l < "$tmp" > "$tmp.lines.$$" &&
330 mv "$tmp.lines.$$" "$tmp.lines"
331 fi
332 cat "$tmp.lines"
333 ;;
334 *)
335 cat "$tmp";;
336 esac
337 }
342 # xHTML Footer.
344 xhtml_footer() {
345 # Number of packages in the current repo
346 if [ ! -f "$cache/stat.p.$SLITAZ_VERSION.$repoid" ]; then
347 rm $cache/stat.p.$SLITAZ_VERSION.*
348 ls "$WOK/" | wc -l > "$cache/stat.p.$SLITAZ_VERSION.$repoid"
349 fi
351 # Number of files in the current repo
352 if [ ! -f "$cache/stat.f.$SLITAZ_VERSION.$repoid" ]; then
353 rm $cache/stat.f.$SLITAZ_VERSION.*
354 unlzma < "$filelist" | wc -l > "$cache/stat.f.$SLITAZ_VERSION.$repoid"
355 fi
357 PKGS=$( cat "$cache/stat.p.$SLITAZ_VERSION.$repoid")
358 FILES=$(cat "$cache/stat.f.$SLITAZ_VERSION.$repoid")
359 echo -en '\n<div class="summary">'
360 _p '%s package' '%s packages' "$PKGS" \
361 "$PKGS"
362 _p ' and %s file in %s database' ' and %s files in %s database' "$FILES" \
363 "$FILES" "$SLITAZ_VERSION"
365 # Date of the last update...
366 echo -n ' ('
367 if [ -e "$pkgsrepo/IDs" ]; then
368 # ...based on the value inside IDs
369 date +"%c" -d@$(cut -d' ' -f2 "$pkgsrepo/IDs") | tr -d '\n'
370 elif [ -e "$pkgsrepo/ID" ]; then
371 # ...based on the date of ID
372 date +"%c" -r "$pkgsrepo/ID" | tr -d '\n'
373 else
374 # ...based on the date of the newest file
375 date +"%c" -r "$pkgsrepo/$(ls -Lt "$pkgsrepo" | head -n1)" | tr -d '\n'
376 fi
377 echo -n ')'
379 cat <<EOT
380 </div>
381 </main>
383 EOT
385 local lang="${LANG%_*}"
386 if [ -e "lib/footer.$lang.sh" ]; then
387 echo '<footer>'
388 . lib/footer.$lang.sh
389 else
390 echo '<footer dir="ltr">'
391 . lib/footer.sh
392 fi
394 echo -n '<div class="summary">'
395 gen_time=$(( $(date -u +%s) - $date_start ))
396 _p 'Page generated in %s second.' 'Page generated in %s seconds.' "$gen_time" \
397 "$gen_time"
399 cat <<EOT
400 </div>
401 <img src="style/qr.png" alt="#" onmouseover="this.title = location.href"
402 onclick="this.src = QRCodePNG(location.href, this)"/>
403 </footer>
405 <script>
406 function QRCodePNG(str, obj) {
407 try {
408 obj.height = obj.width += 300;
409 return QRCode.generatePNG(str, {ecclevel: 'H'});
410 }
411 catch (any) {
412 var element = document.createElement("script");
413 element.src = "style/qrcode.min.js";
414 element.type ="text/javascript";
415 element.onload = function() {
416 obj.src = QRCode.generatePNG(str, {ecclevel: 'H'});
417 };
418 document.body.appendChild(element);
419 }
420 }
422 document.getElementById('ticker').style.visibility='hidden';
423 </script>
424 </body>
425 </html>
426 EOT
427 exit 0
428 }
433 # TODO: to remove
435 installed_size() {
436 if [ $VERBOSE -gt 0 ]; then
437 inst=$(grep -A 3 "^$1\$" $pkgslist | grep installed)
438 # size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1)
439 echo $inst | sed 's/.*(\(.*\).*/(\1)/'
440 # echo $size
441 # | sed 's/.*(\(.*\) installed.*/(\1) /'
442 fi
443 }
448 # Package icon
450 package_icon() {
451 local icon='pkg'
453 case "$1" in
454 *-dev) icon='dev';;
455 linux-*|linux64-*) icon='linux';;
456 xorg-*) icon='xorg';;
457 *) icon=$(awk -F$'\t' -vp="$1" '$1==p{print $2;exit}' "$iconslast");;
458 esac
459 echo "icons$2/${icon:-pkg}.png"
460 }
465 package_entry() {
467 # Level for packages tree
468 if [ -n "$1" ]; then
469 echo "<tr class=\"l$1\">"
470 else
471 echo '<tr>'
472 fi
474 PACKAGE_URL="$MIRROR_URL/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
476 case "$SLITAZ_VERSION" in
477 cooking)
478 COOKER="<a href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\" class=\"co\" title=\"$a_co\">$a_co</a>"
479 ;;
480 stable|undigest|backports)
481 COOKER="<a href=\"http://cook.slitaz.org/$SLITAZ_VERSION/cooker.cgi?pkg=$PACKAGE\" class=\"co\" title=\"$a_co\">$a_co</a>"
482 ;;
483 *)
484 COOKER=''
485 ;;
486 esac
488 cat <<EOT
489 <td class="first"><a href="?info=$PACKAGE$addver"><img src="$(package_icon $PACKAGE)" alt="$PACKAGE icon"/></a></td>
490 <td><b>$PACKAGE</b><br/>$SHORT_DESC</td>
491 <td class="last">
492 <a class="dl" href="$PACKAGE_URL" title="$a_dl">$a_dl</a>
493 <a class="rc" href="?receipt=$PACKAGE$addver" title="$a_rc">$a_rc</a>
494 $COOKER
495 </td>
496 </tr>
497 EOT
498 }
501 package_entries() {
502 # Input: $1 = [ desc | category | tags | name ]
503 # $2 = query
505 awk -F$'\t' -vtype="$1" -vquery="$2" -vmurl="$MIRROR_URL" -vver="$SLITAZ_VERSION" \
506 -vaco="$a_co" -vadl="$a_dl" -varc="$a_rc" -viconslast="$iconslast" \
507 -vnf="$(_ 'Nothing found')" -vaddver="$addver" '
508 BEGIN {
509 IGNORECASE = 1;
510 print "<table class=\"list\">";
511 notfound = "y";
512 }
514 function cooker() {
515 if (ver!="cooking" && ver!="stable" && ver!="undigest" && ver!="backports") return;
517 printf "\t<a href=\"http://cook.slitaz.org/";
518 if (ver=="stable" || ver=="undigest" || ver=="backports") printf "%s/", ver;
519 printf "cooker.cgi?pkg=%s\" class=\"co\" title=\"%s\">%s</a>", $1, aco, aco;
520 }
522 function icon(pkg) {
523 i="";
524 if (pkg ~ /-dev$/) { return "dev"; }
525 if (pkg ~ /^linux(64)?-/) { return "linux"; }
526 if (pkg ~ /^xorg-/) { return "xorg"; }
527 "awk -vp=\"" pkg "\" \"BEGIN{FS=\\\"\t\\\"}\\\$1==p{print \\\$2;exit}\" " iconslast | getline i;
528 if (i) { return i; }
529 return "pkg";
530 }
532 function tabline() {
533 markname = $1; if (type=="name") gsub(query, "<mark>&</mark>", markname);
534 markdesc = $4; if (type=="desc") gsub(query, "<mark>&</mark>", markdesc);
535 printf "<tr>\n\t<td class=\"first\">"
536 printf "<a href=\"?info=%s%s\">", gensub(/\+/, "%2B", "g", $1), addver;
537 printf "<img src=\"icons/%s.png\" alt=\"%s icon\"/></a></td>\n", icon($1), $1;
538 printf "\t<td><b>%s</b><br/>%s</td>\n", markname, markdesc;
539 printf "\t<td class=\"last\">\n";
540 printf "\t<a class=\"dl\" href=\"%s\" ", murl "/packages/" ver "/" $1 "-" $2 ".tazpkg";
541 printf "title=\"%s\">%s</a>\n", adl, adl;
542 printf "\t<a class=\"rc\" href=\"?receipt=%s%s\" ", $1, addver;
543 printf "title=\"%s\">%s</a>\n", arc, arc;
544 cooker();
545 printf "</td>\n</tr>\n"
546 }
549 {
550 if (type=="name" && match($1, query)) { tabline(); notfound = ""; }
551 if (type=="category" && $3==query) { tabline(); notfound = ""; }
552 if (type=="desc" && match($4, query)) { tabline(); notfound = ""; }
553 if (type=="tags" && match(" "$6" ", " "query" ")) { tabline(); notfound = ""; }
554 }
556 END {
557 if (notfound) printf "<tr><td class=\"first\"><img src=\"icons/notfound.png\" alt="Not found"/></td><td><b>%s</b></td></tr>", nf;
558 print "</table>";
559 }
560 ' "$pinfo";
561 }
566 package_entry_inline() {
567 # if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
568 # cat << _EOT_
569 #<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE) : $SHORT_DESC
570 #_EOT_
571 # else
572 PACKAGE_URL="$MIRROR_URL/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
573 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
574 case "$SLITAZ_VERSION" in
575 cooking)
576 COOKER="<a href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">$a_co</a>";;
577 stable|undigest|backports)
578 COOKER="<a href=\"http://cook.slitaz.org/$SLITAZ_VERSION/cooker.cgi?pkg=$PACKAGE\">$a_co</a>";;
579 *)
580 COOKER='';;
581 esac
582 cat <<EOT
583 $PACKAGE_HREF $(installed_size $PACKAGE) : $SHORT_DESC \
584 <a href="?receipt=$PACKAGE&amp;version=$SLITAZ_VERSION">$a_rc</a>&nbsp;$COOKER
585 EOT
586 # fi
587 }
590 # Show loop in depends/build_depends chains
592 show_loops() {
593 awk '
594 function chkloop(pkg, i, n)
595 {
596 if (n < 8)
597 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
598 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
599 split(deps[pkg],curdep," ")
600 p = curdep[i] " " p
601 return 1
602 }
603 }
604 return 0
605 }
606 {
607 for (i = 2; i <= NF; i++)
608 deps[$1] = deps[$1] " " $i
609 }
610 END {
611 for (pkg in deps) {
612 base = pkg
613 p = ""
614 if (chkloop(pkg, 0, 0))
615 print pkg " " p
616 #print pkg " : " p "..."
617 }
618 }' | while read line; do
619 set -- $line
620 case " $last " in
621 *\ $1\ *) continue
622 esac
623 last="$line"
624 pkg=$1
625 shift
626 echo "<strong>$pkg </strong>: $@ ..."
627 done
628 }
631 # recursive dependencies scan
633 dep_scan() {
634 for i in $1; do
635 case " $ALL_DEPS " in
636 *\ $i\ *)
637 continue;;
638 esac
639 ALL_DEPS="$ALL_DEPS $i"
640 if [ -n "$2" ]; then
641 echo -n "$2"
642 (
643 . $WOK/$i/receipt
644 package_entry_inline
645 )
646 fi
647 [ -f $WOK/$i/receipt ] || continue
648 unset BUILD_DEPENDS DEPENDS WANTED
649 . $WOK/$i/receipt
650 if [ -n "$3" ]; then
651 [ -n "$BUILD_DEPENDS$WANTED" ] &&
652 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
653 else
654 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
655 fi
656 done
657 }
660 # recursive reverse dependencies scan
662 rdep_scan() {
663 SEARCH=$1
664 case "$SEARCH" in
665 glibc-base|gcc-lib-base)
666 _ '"glibc-base" and "gcc-lib-base" are implicit dependencies, <b>every</b> package is supposed to depend on them.'
667 return;;
668 esac
669 for i in $WOK/* ; do
670 unset BUILD_DEPENDS DEPENDS WANTED
671 . $i/receipt
672 if [ -n "$2" ]; then
673 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
674 else
675 echo "$(basename $i) $(echo $DEPENDS)"
676 fi
677 done | awk -v search=$SEARCH '
678 function show_deps(deps, all_deps, pkg, space)
679 {
680 if (all_deps[pkg] == 1) return
681 all_deps[pkg] = 1
682 if (space != "") printf "%s%s\n",space,pkg
683 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
684 show_deps(deps, all_deps, mydeps[i],"////" space)
685 }
686 }
688 {
689 all_deps[$1] = 0
690 for (i = 2; i <= NF; i++)
691 deps[$i] = deps[$i] " " $1
692 }
694 END {
695 show_deps(deps, all_deps, search, "")
696 }
697 ' | while read pkg; do
698 . $WOK/${pkg##*/}/receipt
699 cat << _EOT_
700 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry_inline)
701 _EOT_
702 done
703 }
708 # Check non-empty argument
710 check_n() {
711 if [ -z "$1" ]; then
712 cat <<EOT
713 <div class="err">$(_ 'Please specify name of the package.')</div>
714 <p> <br/> </p>
715 EOT
716 return 1
717 fi
718 }
721 # Check package existence
723 package_exist() {
724 check_n "$1"
726 if [ ! -f "$WOK/$1/receipt" ]; then
727 cat <<EOT
728 <div class="err">$(_ 'Package "%s" was not found' "$1")</div>
729 <p> <br/> </p>
730 EOT
731 return 1
732 fi
734 return 0
735 }
740 # Display < > &
742 htmlize() {
743 sed -e 's|&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g'
744 }
749 display_packages_and_files() {
750 unset last
751 while read pkg file; do
752 pkg=${pkg%:}
753 if [ "$pkg" != "$last" ]; then
754 . "$WOK/$pkg/receipt"
756 package_entry_inline
757 last="$pkg"
758 fi
759 echo " $file"
760 done
761 }
764 # Syntax highlighting for receipt file - stolen from tazpanel:
765 # '/var/www/tazpanel/lib/libtazpanel' and developed
767 syntax_highlighter() {
768 . $1
769 sed -e "s|\&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g; s| | |g" \
770 -e "s|@|\&#64;|g; s|~|\&#126;|g" \
771 -e "#literals" \
772 -e "s|'\([^']*\)'|@l\0~|g" \
773 -e 's|"\([^"]*\)"|@l\0~|g' \
774 -e 's|"\([^"]*\)\\|@l\0~|g' \
775 -e 's|\([^"]*\)\"$|@l\0~|g' \
776 -e "#paths" \
777 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+\)\([ )]\)|\1@p\2~\3|g' \
778 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+$\)|\1@p\2~|g' \
779 -e 's|\(\$[a-zA-Z0-9_\.-]\+\)\(/[\$a-zA-Z0-9_/\.\*-]\+\)\([ )]*\)|@p\1\2~\3|g' \
780 -e "#functions" \
781 -e 's|^\([^()]*\)\(()\)|@f\0~|g' \
782 -e "#single line comments" \
783 -e 's|^\([ ]*\)#\([^#]*$\)|@c\0~|g' \
784 -e "#parameters" \
785 -e 's|\( \)\(-[a-z0-9]\+\)\( *\)|\1@r\2~\3|g' \
786 -e 's|\( \)\(--[a-z0-9\-]\+\)\([= ]\)|\1@r\2~\3|g' \
787 -e "#variables" \
788 -e "s|^\([^=@#' \-]*\)\(=\)|@v\1~\2|g" \
789 -e 's|\([ ^@-]*\)\([a-zA-Z0-9]\+\)\(=\)|\1@v\2~\3|g' \
790 -e "s#\(\$[a-zA-Z0-9_]\+\)#@v\0~#g" \
791 -e "#urls" \
792 -e s"#\"\(http:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
793 -e s"#\"\(ftp:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
794 -e "#commands" \
795 -e s"#^\( \+\)\([^'= @\-]\+\)#\1@m\2~#"g \
796 -e "#simple commands" \
797 -e s"#\([{}\]$\)#@s\0~#"g \
798 -e s"#\( \)\(\&amp;\&amp;\)\( *\)#\1@s\2~\3#"g \
799 -e s"#\(|\)#@s\0~#"g \
800 -e s"#\(\&lt;\)#@s\0~#"g \
801 -e s"#\(\&gt;\&amp;\)#@s\0~#"g \
802 -e s"#\(\&gt;\)#@s\0~#"g \
803 -e s"#\(\[\)#@s\0~#"g \
804 -e s"#\(\]\)#@s\0~#"g \
805 \
806 -e "s|´|'|g; s|›|</span>|g" \
807 -e "s|@c|<span class='r-comment'>|g" \
808 -e "s|@l|<span class='r-literal'>|g" \
809 -e "s|@v|<span class='r-var'>|g" \
810 -e "s|@f|<span class='r-func'>|g" \
811 -e "s|@u|class='r-url' target='_blank'|g" \
812 -e "s|@m|<span class='r-com'>|g" \
813 -e "s|@s|<span class='r-scom'>|g" \
814 -e "s|@p|<span class='r-path'>|g" \
815 -e "s|@r|<span class='r-param'>|g" \
816 -e "s|~|</span>|g" < "$1" | add_url_links
817 }
820 # Create some clickable links
822 add_url_links() {
823 local tarball_url
824 sedit=''
825 case "$SLITAZ_VERSION" in
826 cooking)
827 [ -n "$VERSION" ] &&
828 sedit="$sedit -e 's|\\(>VERSION<[^\"]*\"\\)\\([^\"]*\\)|\\1<a class='r-url' target='_blank' href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">\\2</a>|}'"
829 ;;
830 stable|undigest|backports)
831 [ -n "$VERSION" ] &&
832 sedit="$sedit -e 's|\\(>VERSION<[^\"]*\"\\)\\([^\"]*\\)|\\1<a class='r-url' target='_blank' href=\"http://cook.slitaz.org/$SLITAZ_VERSION/cooker.cgi?pkg=$PACKAGE\">\\2</a>|}'"
833 ;;
834 esac
835 #[ -n "$WEB_SITE" ] && sedit="$sedit -e '/WEB_SITE/{s|\\($WEB_SITE\\)|<a class='r-url' target='_blank' href=\"\\1\">\\1</a>|}'"
837 [ -n "$WGET_URL" ] &&
838 sedit="$sedit -e 's|\\(>WGET_URL<[^\"]*\"\\)\\([^\"]*\\)|\\1<a class='r-url' target='_blank' href=\"${WGET_URL//|/\\|}\">\\2</a>|}'"
840 [ -n "$MAINTAINER" ] &&
841 sedit="$sedit -e '/MAINTAINER/{s|\\(${MAINTAINER/@/&#64;}\\)|<a class='r-url' target='_blank' href=\"?maintainer=\\1\\&amp;version=$SLITAZ_VERSION\">\\1</a>|}'"
843 [ -n "$CATEGORY" ] &&
844 sedit="$sedit -e '/CATEGORY/{s|\\($CATEGORY\\)|<a class='r-url' target='_blank' href=\"?category=\\1\\&amp;version=$SLITAZ_VERSION\">\\1</a>|}'"
846 [ -f "$WOK/$PACKAGE/description.txt" ] &&
847 sedit="$sedit -e '/SHORT_DESC/{s|\\($SHORT_DESC\\)|<a class='r-url' target='_blank' href=\"?desc=$PACKAGE\\&amp;version=$SLITAZ_VERSION\">\\1</a>|}'"
849 tarball_url=sources/packages-$SLITAZ_VERSION/${TARBALL:0:1}/$TARBALL
850 [ -f /var/www/slitaz/mirror/$tarball_url ] || case "$tarball_url" in
851 *.gz) tarball_url=${tarball_url%gz}lzma ;;
852 *.tgz) tarball_url=${tarball_url%tgz}tar.lzma ;;
853 *.bz2) tarball_url=${tarball_url%bz2}lzma ;;
854 esac
855 [ -f /var/www/slitaz/mirror/$tarball_url ] && sedit="$sedit -e 's|\\(>TARBALL<[^\"]*\"\\)\\([^\"]*\\)|\\1<a class='r-url' target='_blank' href=\"http://mirror.slitaz.org/$tarball_url\">\\2</a>|'"
857 if [ -n "$EXTRA_SOURCE_FILES" ]; then
858 for i in $(echo $EXTRA_SOURCE_FILES) ; do
859 p="sources/packages-$SLITAZ_VERSION/${i:0:1}/$i"
860 [ -f "/var/www/slitaz/mirror/$p" ] || continue
861 #FIXME
862 sedit="$sedit -e 's|\\([\" >]\\)$i\\([\" <\\]\\)|\\1<a class='r-url' target='_blank' href=\"http://mirror.slitaz.org/$p\">$i</a>\\2|'"
863 sedit="$sedit -e 's|^$i\\([\" <\\]\\)|<a class='r-url' target='_blank' href=\"http://mirror.slitaz.org/$p\">$i</a>\\1|'"
864 done
865 fi
866 if [ -n "$DEPENDS$BUILD_DEPENDS$SUGGESTED$PROVIDE$WANTED" ]; then
867 for i in $(echo $DEPENDS $BUILD_DEPENDS $SUGGESTED $PROVIDE $WANTED) ; do
868 sedit="$sedit -e 's|\\([\" >]\\)$i\\([\" <\\]\\)|\\1<a class='r-url' target='_blank' href=\\\"?receipt=$i\\&amp;version=$SLITAZ_VERSION\\\">$i</a>\\2|'"
869 sedit="$sedit -e 's|^$i\\([\" <\\]\\)|<a class='r-url' target='_blank' href=\\\"?receipt=$i\\&amp;version=$SLITAZ_VERSION\\\">$i</a>\\1|'"
870 done
871 fi
872 if [ -n "$LICENSE" ]; then
873 for i in $LICENSE ; do
874 sedit="$sedit -e '/LICENSE/{s|\\($i\\)|<a class='r-url' target='_blank' href=\"?license=\\1\\&amp;version=$SLITAZ_VERSION\">\\1</a>|}'"
875 done
876 fi
877 if [ -n "$HOST_ARCH" ]; then
878 for i in $HOST_ARCH ; do
879 sedit="$sedit -e '/HOST_ARCH/{s|\\([\" ]\\)$i\\([\" ]\\)|\\1<a class='r-url' target='_blank' href=\\\"?arch=$i\\&amp;version=$SLITAZ_VERSION\\\">$i</a>\\2|}'"
880 done
881 fi
882 if [ -n "$TAGS" ]; then
883 for i in $TAGS ; do
884 sedit="$sedit -e '/TAGS/{s|\\([\" ]\\)$i\\([\" ]\\)|\\1<a class='r-url' target='_blank' href=\\\"?tags=$i\\&amp;version=$SLITAZ_VERSION\\\">$i</a>\\2|}'"
885 done
886 fi
887 eval sed $sedit \
888 -e "'s|genpkg_rules|<a class='r-url' target='_blank' href=\"?filelist=$PACKAGE\\&amp;version=$SLITAZ_VERSION\">&</a>|'"
889 }
892 display_cloud() {
893 arg=$1
894 awk '
895 {
896 for (i = 1; $i != ""; i++)
897 count[$i]++
898 }
899 END {
900 min=10000
901 max=0
902 cnt=0
903 for (i in count) {
904 if (count[i] < min) min = count[i]
905 if (count[i] > max) max = count[i]
906 cnt++
907 }
908 for (i in count)
909 print count[i] " " min " " max " " i
910 print cnt
911 }' | sed 's/[<>]//g' | sort -k 4 | {
912 while read cnt min max tag ; do
913 if [ -z "$min" ]; then
914 count="$cnt"
915 continue
916 fi
917 pct=$(((($cnt-$min)*100)/($max-$min)))
918 pct=$(((10000 - ((100 - $pct)**2))/100))
919 pct=$(((10000 - ((100 - $pct)**2))/100))
920 cat <<EOT
921 <span class="tagn">$cnt</span><a href="?$arg=$tag$addver" class="tag$(($pct/10))">$tag</a>
922 EOT
923 done
924 echo -n '<hr/><p class="lang">'
925 case $arg in
926 arch) _p '%s architecture' '%s architectures' "$count" "$count";;
927 maintainer) _p '%s maintainer' '%s maintainers' "$count" "$count";;
928 license) _p '%s license' '%s licenses' "$count" "$count";;
929 category) _p '%s category' '%s categories' "$count" "$count";;
930 tags) _p '%s tag' '%s tags' "$count" "$count";;
931 esac
932 echo '</p>'
933 }
934 }
937 #
938 # page begins
939 #
941 if [ -n "$HTTP_IF_MODIFIED_SINCE" -a "$HTTP_IF_MODIFIED_SINCE" == "$lastmod" ]; then
942 # When user agent asks if content modified since last seen and it is not modified
943 header "HTTP/1.1 304 Not Modified"
944 exit 0
945 fi
946 if [ -z "$lastmod" ]; then
947 # We don't know last modification date
948 header "HTTP/1.1 200 OK" "Content-type: text/html; charset=UTF-8"
949 else
950 header "HTTP/1.1 200 OK" "Content-type: text/html; charset=UTF-8" "Last-Modified: $lastmod"
951 fi
952 xhtml_header
955 #
956 # Language selector
957 #
959 cat <<EOT
960 <!-- Languages -->
961 <div class="lang"><a class="locale2" href="http://www.slitaz.org/i18n.php"
962 target="_blank"></a><select form="s_form" name="lang" onchange="this.form.submit();">
963 EOT
965 for i in en de es fa fr ja pl pt ru sv uk zh; do
966 case $i in
967 en) c='us'; l='English';;
968 de) c='de'; l='Deutsch';;
969 es) c='es'; l='Español';;
970 fa) c='ir'; l='فارسی';;
971 fr) c='fr'; l='Français';;
972 it) c='it'; l='Italiano';;
973 ja) c='jp'; l='日本語';;
974 pl) c='pl'; l='Polski';;
975 pt) c='br'; l='Português';;
976 ru) c='ru'; l='Русский';;
977 sv) c='se'; l='Svenska';;
978 uk) c='ua'; l='Українська';;
979 zh) c='tw'; l='中文';;
980 esac
982 echo -n "<option class=\"$c\" value=\"$i\""
983 [ "$i" == "${LANG%_*}" ] && echo -n " selected"
984 echo ">$l</option>"
985 done
986 echo '</select></div>'
988 cat <<EOT
989 <!-- Content -->
990 <main>
991 EOT
994 #
995 # Handle GET requests
996 #
998 case " $(GET) " in
999 *\ debug\ *|*\ debug*)
1000 cat <<EOT
1001 <h2>Debug info</h2>
1003 <pre>$(httpinfo)</pre>
1005 <pre>$(env)</pre>
1007 <pre>LANG="$LANG"
1008 OBJECT="$OBJECT"
1009 SEARCH="$SEARCH"
1010 SLITAZ_VERSION="$SLITAZ_VERSION"
1011 WOK="$WOK"
1012 GET="$(GET)"
1014 HTTP_IF_MODIFIED_SINCE="$HTTP_IF_MODIFIED_SINCE"
1015 lastmod ="$lastmod"
1016 </pre>
1017 EOT
1018 ;;
1019 esac
1024 # Display search form and result if requested.
1026 cat <<EOT
1027 <div id="ticker"><img src="loader.gif" alt="."/></div>
1028 EOT
1029 search_form
1034 # Show links for "info" page
1036 show_info_links() {
1037 if [ -n "$1" ]; then
1038 echo -n "<tr><td class=\"first\"><b>$2</b></td><td class=\"spkg\">"
1040 echo $1 | tr ' ' $'\n' | awk -vt="$3" -vv="$addver" -viconslast="$iconslast" '
1041 function icon(pkg) {
1042 i="";
1043 if (pkg ~ /-dev$/) { return "dev"; }
1044 if (pkg ~ /^linux(64)?-/) { return "linux"; }
1045 if (pkg ~ /^xorg-/) { return "xorg"; }
1046 "awk -vp=\"" pkg "\" \"BEGIN{FS=\\\"\t\\\"}\\\$1==p{print \\\$2;exit}\" " iconslast | getline i;
1047 if (i) { return i; }
1048 return "pkg";
1050 function link(pkg) {
1051 printf "<a href=\"?%s=%s%s\">", t, gensub(/\+/, "%2B", "g", pkg), v;
1052 if (t!="tags") printf "<img src=\"icons-s/%s.png\" alt=\"%s icon\"/>", icon(pkg), pkg;
1053 printf "%s</a>", pkg;
1056 split($1, line, ":");
1057 link(line[1]);
1058 if (line[2]) { printf ":"; link(line[2]); }
1059 printf "  ";
1060 }'
1061 echo "</td></tr>"
1062 fi
1065 # Source for categories names to translate
1067 noop() {
1068 _ 'base-system'; _ 'x-window'; _ 'utilities'; _ 'network'; _ 'graphics';
1069 _ 'multimedia'; _ 'office'; _ 'development'; _ 'system-tools'; _ 'security';
1070 _ 'games'; _ 'misc'; _ 'meta'; _ 'non-free'
1073 case " $(GET) " in
1074 *\ info\ *)
1075 package_exist $(GET info) || xhtml_footer
1076 . "$WOK/$(GET info)/receipt"
1078 cat <<EOT
1079 <table class="info">
1080 <tr>
1081 <td class="first"><b>$(gettext 'Name')</b></td>
1082 <td>$PACKAGE
1083 <div class="appImg" style="background: url($(package_icon $PACKAGE 2))"></div>
1084 </td>
1085 </tr>
1086 EOT
1087 [ -n "$VERSION" ] && cat <<EOT
1088 <tr>
1089 <td class="first"><b>$(gettext 'Version')</b></td>
1090 <td>$VERSION</td>
1091 </tr>
1092 EOT
1093 cat <<EOT
1094 <tr>
1095 <td class="first"><b>$(gettext 'Category')</b></td>
1096 <td><a href="?category=$CATEGORY$addver">$(gettext "$CATEGORY")</a></td>
1097 </tr>
1099 <tr>
1100 <td class="first"><b>$(gettext 'Description')</b></td>
1101 <td>$(echo "$SHORT_DESC" | htmlize)</td>
1102 </tr>
1103 EOT
1104 if [ -n "$MAINTAINER" ]; then
1105 # For form "John Doe <jdoe@example.org>"
1106 M="${MAINTAINER#*<}"; M="${M%>}" # extract address "jdoe@example.org"
1107 MAINTAINER=$(echo $MAINTAINER | htmlize) # escape "<" and ">" for use in HTML
1108 cat <<EOT
1109 <tr>
1110 <td class="first"><b>$(gettext 'Maintainer')</b></td>
1111 <td><a href="?maintainer=$M$addver">${MAINTAINER/@/&#8203;@&#8203;}</a></td>
1112 </tr>
1113 EOT
1114 fi
1115 [ -n "$LICENSE" ] && cat <<EOT
1116 <tr>
1117 <td class="first"><b>$(gettext 'License')</b></td>
1118 <td>$(for license in $LICENSE; do
1119 echo "<a href=\"?license=$license$addver\">$license</a> "
1120 done)</td>
1121 </tr>
1122 EOT
1123 web_site="${WEB_SITE#http://}"
1124 cat <<EOT
1125 <tr>
1126 <td class="first"><b>$(gettext 'Website')</b></td>
1127 <td><a href="$WEB_SITE" target="_blank">${web_site%/}</a></td>
1128 </tr>
1129 EOT
1130 show_info_links "$TAGS" "$(_ 'Tags')" 'tags'
1132 if [ -n "$PACKED_SIZE" ]; then
1133 cat <<EOT
1134 <tr>
1135 <td class="first"><b>$(gettext 'Sizes')</b></td>
1136 <td>${PACKED_SIZE/.0/} / ${UNPACKED_SIZE/.0/}</td>
1137 </tr>
1138 EOT
1139 elif [ -f "$pinfo" ]; then
1140 cat <<EOT
1141 <tr>
1142 <td class="first"><b>$(gettext 'Sizes')</b></td>
1143 <td>$(awk -F$'\t' -vp=$PACKAGE '$1==p{print $7}' "$pinfo" | sed 's| | / |')</td>
1144 </tr>
1145 EOT
1146 fi
1148 show_info_links "$DEPENDS" "$(gettext 'Depends on')" 'info'
1150 show_info_links "$PROVIDE" "$(gettext 'Provides')" 'info'
1152 show_info_links "$SUGGESTED" "$(gettext 'Suggested')" 'info'
1153 cat <<EOT
1154 </table>
1156 EOT
1158 # Actions / screenshot
1159 pkg=${PACKAGE//+/%2B}
1160 pkg_url="$MIRROR_URL/packages/$SLITAZ_VERSION/$pkg-$VERSION$EXTRA_VERSION.tazpkg"
1161 case "$SLITAZ_VERSION" in
1162 cooking)
1163 COOKER="<a class=\"cooker\" href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">$(gettext 'Show cooking log')</a>";;
1164 stable|undigest|backports)
1165 COOKER="<a class=\"cooker\" href=\"http://cook.slitaz.org/$SLITAZ_VERSION/cooker.cgi?pkg=$PACKAGE\">$(gettext 'Show cooking log')</a>";;
1166 *)
1167 COOKER="<span class=\"cooker\">$(gettext 'N/A')</span>";;
1168 esac
1169 cat <<EOT
1170 <div class="sssb desc center">
1171 <a href="http://screenshots.debian.net/package/$pkg" target="_blank"><img
1172 src="http://screenshots.debian.net/thumbnail/$pkg" alt="$PACKAGE screenshot"/></a>
1173 </div>
1175 <table class="info">
1176 <tr><td><span class="download"></span>
1177 <a href="$pkg_url">$(gettext 'Download package')</a>
1178 </td>
1179 <td rowspan="5" class="last hssc">
1180 <a href="http://screenshots.debian.net/package/$pkg" target="_blank"><img
1181 src="http://screenshots.debian.net/thumbnail/$pkg" alt="$PACKAGE screenshot"/></a>
1182 </td>
1183 </tr>
1184 <tr><td><a class="receipt" href="?receipt=$pkg$addver">$(gettext 'Show receipt')</a></td></tr>
1185 <tr><td><a class="files-list" href="?filelist=$pkg$addver">$(gettext 'Show files list')</a></td></tr>
1186 <tr><td>$COOKER</td></tr>
1187 <tr id="tazpanelButtons" class="hidden">
1188 <td>
1189 <span id="tazpaneli" class="hidden">
1190 <a class="pkgi" href="http://127.0.0.1:82/user/pkgs.cgi?do=Install&amp;pkg=$pkg" target="_blank">$(gettext 'Install package')</a>
1191 </span>
1192 <span id="tazpanelr" class="hidden">
1193 <a class="pkgr" href="http://127.0.0.1:82/user/pkgs.cgi?do=Remove&amp;pkg=$pkg" target="_blank">$(gettext 'Remove package')</a>
1194 </span>
1195 </td>
1196 </tr>
1197 </table>
1199 <script>
1200 function ajaxTazPanel(pkg) {
1201 var req = new XMLHttpRequest();
1202 req.onreadystatechange = function() {
1203 if (req.readyState == XMLHttpRequest.DONE) {
1204 if (req.status == 200) {
1205 if (req.responseText == 'i') {
1206 // Package installed, allow to remove
1207 document.getElementById('tazpanelr').className='';
1208 } else {
1209 // Package not installed, allow to install
1210 document.getElementById('tazpaneli').className='';
1212 document.getElementById('tazpanelButtons').className='';
1216 req.open('GET', 'http://tazpanel:82/pkgs.cgi?status&web=y&pkg=' + pkg, true);
1217 req.send();
1219 ajaxTazPanel('$pkg');
1220 </script>
1221 EOT
1223 # Description
1224 if [ -f "$WOK/$PACKAGE/description.txt" ]; then
1225 cat <<EOT
1226 <h3>$(gettext 'Description')</h3>
1227 <table><tr><td>$(./sundown < "$WOK/$PACKAGE/description.txt")</td></tr></table>
1228 EOT
1229 fi
1231 # Config files
1232 if [ -n "$CONFIG_FILES" ]; then
1233 cat <<EOT
1234 <div class="conf">
1235 <h3>$(gettext 'Configuration files')</h3>
1236 <table><tr><td><ul>
1237 EOT
1238 for file in $CONFIG_FILES; do
1239 cat <<EOT
1240 <li><a href="ftp://cook.slitaz.org/$PACKAGE/taz/$PACKAGE-$VERSION$EXTRAVERSION/fs$file" target="_blank">$file</a></li>
1241 EOT
1242 done
1243 cat <<EOT
1244 </ul></td></tr></table>
1245 </div>
1246 EOT
1247 fi
1249 ;;
1250 esac
1255 case "$OBJECT" in
1258 ### Depends loops; [Reverse] Dependency tree [(SUGGESTED)]
1259 Depends)
1260 if [ -z "$SEARCH" ]; then
1261 cat <<EOT
1262 <h3>$(_ 'Loop dependency')</h3>
1263 <pre class="hard">
1264 EOT
1265 for i in $WOK/*/receipt; do
1266 PACKAGE=
1267 DEPENDS=
1268 . $i
1269 echo "$PACKAGE $(echo $DEPENDS)"
1270 done | show_loops
1271 echo '</pre>'
1273 elif package_exist $SEARCH ; then
1274 cat <<EOT
1275 <h3>$(_ 'Dependency tree for package "%s"' "$SEARCH")</h3>
1276 <pre class="hard">
1277 EOT
1278 unset ALL_DEPS
1279 dep_scan $SEARCH ''
1280 unset SUGGESTED
1281 . $WOK/$SEARCH/receipt
1282 echo '</pre>'
1284 if [ -n "$SUGGESTED" ]; then
1285 cat <<EOT
1286 <h3>$(_ 'Dependency tree for packages suggested by package "%s"' "$SEARCH")</h3>
1287 <pre class="hard">
1288 EOT
1289 unset ALL_DEPS
1290 dep_scan "$SUGGESTED" ' '
1291 echo '</pre>'
1292 fi
1294 cat <<EOT
1295 <h3>$(_ 'Reverse dependency tree for package "%s"' "$SEARCH")</h3>
1296 <pre class="hard">
1297 EOT
1298 unset ALL_DEPS
1299 rdep_scan $SEARCH
1300 echo '</pre>'
1301 fi
1302 ;;
1307 ### Build depends loops; [Reverse] Build dependency tree
1309 BuildDepends)
1310 if [ -z "$SEARCH" ]; then
1311 cat <<EOT
1312 <h3>$(_ 'Loop dependency of build')</h3>
1313 <pre class="hard">
1314 EOT
1315 for i in $WOK/*/receipt; do
1316 PACKAGE=
1317 WANTED=
1318 BUILD_DEPENDS=
1319 . $i
1320 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
1321 done | show_loops
1322 echo '</pre>'
1324 elif package_exist $SEARCH ; then
1325 cat <<EOT
1326 <h3>$(_ 'Package "%s" requires next packages to be built' "$SEARCH")</h3>
1327 <pre class="hard">
1328 EOT
1329 unset ALL_DEPS
1330 dep_scan $SEARCH '' build
1331 echo '</pre>'
1333 cat <<EOT
1334 <h3>$(_ 'Next packages require package "%s" to be built' "$SEARCH")</h3>
1335 <pre class="hard">
1336 EOT
1337 unset ALL_DEPS
1338 rdep_scan $SEARCH build
1339 echo '</pre>'
1340 fi
1341 ;;
1346 ### Common files
1348 FileOverlap)
1349 if package_exist $SEARCH; then
1350 cat <<EOT
1352 <h3>$(_ 'Next packages may overwrite files of package "%s"' "$SEARCH")</h3>
1353 <pre class="hard">
1354 EOT
1355 ( unlzma < $filelist | grep ^$SEARCH: ;
1356 unlzma < $filelist | grep -v ^$SEARCH: ) | awk '
1357 BEGIN { pkg=""; last="x" }
1359 if ($2 == "") next
1360 if (index($2, last) == 1 && substr($2, 1+length(last), 1) == "/")
1361 delete file[last]
1362 last=$2
1363 if (pkg == "") pkg=$1
1364 if ($1 == pkg) file[$2]=$1
1365 else if (file[$2] == pkg) print
1367 ' | display_packages_and_files
1368 echo '</pre>'
1369 fi
1370 ;;
1375 ### File search
1377 File)
1378 if [ -n "$SEARCH" ]; then
1379 cat <<EOT
1381 <h3>$(_ 'File names matching "%s"' "$SEARCH")</h3>
1382 <table class="list">
1383 EOT
1384 unset last
1385 unlzma < $filelist | grep -i "$SEARCH" | \
1386 while read pkg file; do
1387 echo "$file" | grep -qi "$SEARCH" || continue
1388 if [ "$last" != "${pkg%:}" ]; then
1389 [ -n "$last" ] && cat <<EOT
1390 </td></tr>
1391 EOT
1392 last=${pkg%:}
1394 . $WOK/$last/receipt
1395 package_entry
1396 cat <<EOT
1397 <tr><td colspan="3" class="pre">
1398 EOT
1400 fi
1401 echo -n "$file" | awk -vquery="$SEARCH" 'BEGIN{IGNORECASE=1}gsub(query, "<mark>&</mark>")'
1402 echo "<br/>"
1403 done
1404 cat <<EOT
1405 </td></tr>
1406 </table>
1407 EOT
1408 fi
1409 ;;
1414 ### List of files
1416 File_list)
1417 if package_exist $SEARCH; then
1418 cat <<EOT
1420 <h3>$(_ 'List of files in the package "%s"' "$SEARCH")</h3>
1421 <pre class="hard">
1422 EOT
1423 unset last
1424 unlzma < $filelist \
1425 | grep ^$SEARCH: | sed 's|.*: | |' | sort
1426 cat <<EOT
1427 </pre>
1428 <pre class="hard">
1429 EOT
1430 filenb=$(unlzma < $filelist | grep ^$SEARCH: | wc -l)
1431 _p '%s file' '%s files' "$filenb" "$filenb"
1432 cat <<EOT
1434 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $pkglist)
1435 </pre>
1436 EOT
1437 fi
1438 ;;
1443 ### Package description
1445 Desc)
1446 if [ -z "$SEARCH" ]; then
1447 cat <<EOT
1448 <div class="err">$(_ 'Please specify name of the package.')</div>
1449 <p> <br/> </p>
1450 EOT
1451 xhtml_footer
1452 exit 0
1453 fi
1455 cat <<EOT
1456 <h3>$(_ 'Descriptions matching "%s"' "$SEARCH")</h3>
1457 EOT
1458 if [ -f "$pinfo" ]; then
1459 package_entries desc "$SEARCH"
1460 else
1461 echo '<table class="list">'
1462 unset last
1463 # FIXME packages.desc should not be used (at least this way)
1464 grep -i "$SEARCH" "$pkgsrepo/packages.desc" | \
1465 sort | while read pkg extras ; do
1466 . "$WOK/$pkg/receipt"
1467 package_entry
1468 done
1469 echo '</table>'
1470 fi
1471 ;;
1476 Bugs)
1477 cat <<EOT
1479 <h3>$(_ 'Known bugs in the packages')</h3>
1481 <table class="bugs list">
1482 EOT
1483 unset last
1484 grep ^BUGS= $WOK/*/receipt | \
1485 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
1486 unset BUGS
1487 . "$WOK/$pkg/receipt"
1488 package_entry
1489 echo -n '<tr><td> </td><td colspan="2">'
1490 echo -n "$BUGS" | htmlize
1491 echo '</td></tr>'
1492 done
1493 echo '</table>'
1494 ;;
1499 ### Arch
1501 Arch)
1502 if [ -n "$SEARCH" ]; then
1503 cat <<EOT
1505 <h3>$(_ 'The list of packages of architecture "%s"' "$SEARCH")</h3>
1506 <pre class="hard">
1507 EOT
1508 unset last
1509 grep ^HOST_ARCH= $WOK/*/receipt | grep -i "$SEARCH" | \
1510 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
1511 unset HOST_ARCH
1512 . "$WOK/$pkg/receipt"
1513 echo " $HOST_ARCH " | grep -iq " $SEARCH " &&
1514 package_entry_inline
1515 done
1516 cat <<EOT
1517 </pre>
1518 EOT
1519 else
1520 # Display arch cloud
1521 grep -l ^HOST_ARCH= $WOK/*/receipt | while read file; do
1522 HOST_ARCH=
1523 . $file
1524 echo $HOST_ARCH
1525 done | display_cloud arch
1526 fi
1527 ;;
1532 ### Maintainer
1534 Maintainer)
1535 if [ -n "$SEARCH" ]; then
1536 cat <<EOT
1538 <h3>$(_n 'The list of packages that <%s> maintains' "$SEARCH" | htmlize)</h3>
1539 <table class="list">
1540 EOT
1541 unset last
1542 grep ^MAINTAINER= $WOK/*/receipt | grep -i "$SEARCH" | \
1543 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
1544 . "$WOK/$pkg/receipt"
1545 package_entry
1546 done
1547 cat <<EOT
1548 </table>
1549 EOT
1550 else
1551 # Display maintainer cloud
1552 grep -l ^MAINTAINER= $WOK/*/receipt | while read file; do
1553 MAINTAINER=
1554 . $file
1555 case $MAINTAINER in
1556 # For form "John Doe <jdoe@example.org>
1557 *\<*) MAINTAINER="${MAINTAINER#*<}"; echo "${MAINTAINER%>}";;
1558 *) echo $MAINTAINER;;
1559 esac
1560 done | display_cloud maintainer
1561 fi
1562 ;;
1567 ### License
1569 License)
1570 if [ -n "$SEARCH" ]; then
1571 cat <<EOT
1572 <h3>$(_ 'Packages with "%s" license' "$SEARCH")</h3>
1573 <table class="list">
1574 EOT
1575 unset last
1576 grep ^LICENSE= $WOK/*/receipt | grep -i "$SEARCH" | \
1577 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
1578 . "$WOK/$pkg/receipt"
1579 package_entry
1580 done
1581 echo '</table>'
1582 else
1583 # Display license cloud
1584 grep -l ^LICENSE= $WOK/*/receipt | while read file; do
1585 LICENSE=
1586 . $file
1587 echo $LICENSE
1588 done | display_cloud license
1589 fi
1590 ;;
1595 ### Category
1597 Category)
1598 if [ -n "$SEARCH" ]; then
1599 cat <<EOT
1600 <h3>$(_ 'Packages of category "%s"' "$SEARCH")</h3>
1601 EOT
1602 if [ -f "$pinfo" ]; then
1603 package_entries category "$SEARCH"
1604 else
1605 echo '<table class="list">'
1606 unset last
1607 grep ^CATEGORY= $WOK/*/receipt | grep -i "$SEARCH" | \
1608 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
1609 . "$WOK/$pkg/receipt"
1610 package_entry
1611 done
1612 echo '</table>'
1613 fi
1614 else
1615 # Display category cloud
1616 if [ -f "$pinfo" ]; then
1617 tags="$(awk -F$'\t' '{if($3){print $3}}' "$pinfo" | tr ' ' $'\n' | sort | uniq -c)"
1618 max="$(echo "$tags" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')"
1619 echo "$tags" | awk -vMAX="$max" -vaddver="$addver" '{
1620 printf "<span class=\"tagn\">%s</span>", $1;
1621 printf "<a class=\"tag%s\" ", int($1 * 10 / MAX + 1);
1622 printf "href=\"?category=%s%s\">%s</a> ", $2, addver, $2;
1623 }'
1624 else
1625 grep -l ^CATEGORY= $WOK/*/receipt | \
1626 while read file; do
1627 CATEGORY=
1628 . $file
1629 echo $CATEGORY
1630 done | display_cloud category
1631 fi
1632 fi
1633 ;;
1638 ### Tags
1640 Tags)
1641 if [ -n "$SEARCH" ]; then
1642 cat <<EOT
1643 <h3>$(_ 'The list of packages tagged "%s"' "$SEARCH")</h3>
1644 EOT
1645 if [ -f "$pinfo" ]; then
1646 package_entries tags "$SEARCH"
1647 else
1648 echo '<table class="list">'
1649 unset last
1650 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
1651 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
1652 . "$WOK/$pkg/receipt"
1653 package_entry
1654 done
1655 echo '</table>'
1656 fi
1657 else
1658 # Display tag cloud
1659 if [ -f "$pinfo" ]; then
1660 TAGS="$(awk -F$'\t' '{if($6){print $6}}' "$pinfo" | tr ' ' $'\n' | sort | uniq -c)"
1661 MAX="$(echo "$TAGS" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')"
1662 echo "$TAGS" | awk -vMAX="$MAX" -vv="$addver" '{
1663 printf "<span class=\"tagn\">%s</span>", $1;
1664 printf "<a class=\"tag%s\" ", int($1 * 10 / MAX + 1);
1665 printf "href=\"?tags=%s%s\">%s</a> ", $2, v, $2;
1666 }'
1667 else
1668 grep -l ^TAGS= $WOK/*/receipt | \
1669 while read file; do
1670 TAGS=
1671 . $file
1672 echo $TAGS
1673 done | display_cloud tags
1674 fi
1675 fi
1676 ;;
1681 ### Package receipt with syntax highlighter
1683 Receipt)
1684 if package_exist "$SEARCH"; then
1685 cat <<EOT
1687 <h3>$(_ 'Receipt for package "%s"' "$SEARCH")</h3>
1688 <pre class="hard">
1689 EOT
1690 if [ -f $WOK/$SEARCH/taz/*/receipt ]; then
1691 syntax_highlighter $WOK/$SEARCH/taz/*/receipt
1692 else
1693 syntax_highlighter $WOK/$SEARCH/receipt
1694 fi
1695 echo '</pre>'
1696 fi
1697 ;;
1702 ### Package
1704 Package)
1705 if check_n "$SEARCH"; then
1706 cat <<EOT
1707 <h3>$(_ 'Package names matching "%s"' "$SEARCH")</h3>
1708 EOT
1710 if [ -f "$pinfo" ]; then
1711 package_entries name "$SEARCH"
1712 else
1713 echo '<table class="list">'
1714 for pkg in $(ls $WOK/ | grep -i "$SEARCH"); do
1715 . "$WOK/$pkg/receipt"
1716 package_entry
1717 done
1718 echo '</table>'
1719 fi
1721 vpkgs="$(cut -d= -f1 < $equiv | grep -i "$SEARCH")"
1722 for vpkg in $vpkgs; do
1723 cat <<EOT
1725 <h3>$(_ 'Packages providing the package "%s"' "$vpkg")</h3>
1727 <table class="list">
1728 EOT
1729 for pkg in $(grep $vpkg= $equiv | sed "s|$vpkg=||"); do
1730 echo " <!-- '$pkg' - '${pkg#*:}' -->"
1731 if [ -e "$WOK/${pkg#*:}/receipt" ]; then
1732 . $WOK/${pkg#*:}/receipt
1733 package_entry
1734 fi
1735 done
1736 echo '</table>'
1737 done
1738 fi
1739 ;;
1740 esac
1742 xhtml_footer
1744 exit 0