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

pkgs: add backports
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Feb 17 14:55:17 2014 +0000 (2014-02-17)
parents f14e1d28ce93
children ea7fb53f95b9
line source
1 #!/bin/sh
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 renice -n 19 $$
10 # Parse query string
11 . /etc/slitaz/slitaz.conf
12 . /usr/lib/slitaz/httphelper.sh
13 echo -n "0" > $HOME/ifEven
14 [ -n "$MIRROR_URL" ] || MIRROR_URL="http://mirror.slitaz.org"
16 # User preferred language
17 # parameter $1 have priority; without parameter $1 - browser language only
18 # if we don't support any of user languages (or only en), then return C locale
19 user_lang() {
20 LANG="C"
21 IFS=","
22 for lang in $1 $HTTP_ACCEPT_LANGUAGE
23 do
24 lang=${lang%;*} lang=${lang# } lang=${lang%-*} lang=${lang%_*}
25 case "$lang" in
26 de) LANG="de_DE" ;;
27 es) LANG="es_AR" ;;
28 fr) LANG="fr_FR" ;;
29 it) LANG="it_IT" ;;
30 pl) LANG="pl_PL" ;;
31 pt) LANG="pt_BR" ;;
32 ru) LANG="ru_RU" ;;
33 sv) LANG="sv_SE" ;;
34 zh) LANG="zh_TW" ;;
35 esac
36 if echo "de en es fr pl pt ru sv zh" | fgrep -q "$lang"; then
37 break
38 fi
39 done
40 unset IFS
41 echo "$LANG"
42 }
44 # Short 2-letter lang code from ll_CC
45 ll_lang() {
46 ll_CC="$1"
47 echo ${ll_CC%_*}
48 }
50 # Part of query to indicate current debug mode
51 ifdebug() {
52 ifdebug="$(GET debug)"
53 [ ! -z "$ifdebug" ] && ifdebug="$1$ifdebug"
54 echo "$ifdebug"
55 }
57 # GET or POST variable
58 GETPOST() {
59 echo "$(POST $1)$(GET $1)"
60 }
62 # Nice URL replacer - to copy url from address bar
63 # TODO: deal with POST method of form submitting
64 nice_url() {
65 # if user submitted a form
66 if [ "$REQUEST_METHOD" == "POST" -o ! -z $(GET submit) ]; then
67 OBJECT="$(GETPOST object)"
68 SEARCH="$(GETPOST query)"
69 case $OBJECT in
70 Package) NICE="package=$SEARCH";;
71 Desc) NICE="desc=$SEARCH";;
72 Tags) NICE="tags=$SEARCH";;
73 Arch) NICE="arch=$SEARCH";;
74 Bugs) NICE="bugs=$SEARCH";;
75 Receipt) NICE="receipt=$SEARCH";;
76 Depends) NICE="depends=$SEARCH";;
77 BuildDepends) NICE="builddepends=$SEARCH";;
78 File) NICE="file=$SEARCH";;
79 File_list) NICE="filelist=$SEARCH";;
80 FileOverlap) NICE="fileoverlap=$SEARCH";;
81 esac
82 # version, if needed
83 version="$(GETPOST version)"
84 if [ ! -z "$version" -a "$version" != "cooking" ]; then
85 NICE="${NICE}&version=${version:0:1}"
86 fi
87 # lang, if needed
88 query_lang="$(GETPOST lang)"
89 pref_lang="$(user_lang)"
90 browser_lang="$(ll_lang $pref_lang)"
91 if [ ! -z "$query_lang" -a "$query_lang" != "$browser_lang" ]; then
92 NICE="${NICE}&lang=$query_lang"
93 fi
94 # verbose, if needed
95 verboseq="$(GETPOST verbose)"
96 if [ ! -z "$verboseq" -a "$verboseq" != "0" ]; then
97 NICE="${NICE}&verbose=1"
98 fi
99 # debug, if needed
100 debugq="$(GET debug)"
101 if [ ! -z "$debugq" -a "$debugq" == "debug" ]; then
102 NICE="${NICE}&debug"
103 fi
104 # redirect
105 header "HTTP/1.1 301 Moved Permanently" "Location: $SCRIPT_NAME?$NICE"
106 # echo "Location: $SCRIPT_NAME?$NICE"
107 # echo
108 exit 0
109 fi
110 }
112 nice_url
114 OBJECT="$(GET object)"
115 SEARCH="$(GET query)"
116 SLITAZ_VERSION="$(GET version)"
117 VERBOSE="$(GET verbose)"
119 # Internal variables
120 #DATE=$(date +%Y-%m-%d\ %H:%M:%S)
122 # Internationalization
123 . /usr/bin/gettext.sh
124 export TEXTDOMAIN='tazpkg-web'
126 unset SEARCH
127 VERBOSE=0
128 for i in $(echo $QUERY_STRING | sed 's/[?&]/ /g'); do
129 # SLITAZ_VERSION=cooking
130 case "$(echo $i | tr [A-Z] [a-z])" in
131 query=*|search=*) [ ${i#*=} == Search ] || SEARCH=${i#*=};;
132 object=*) OBJECT=${i#*=};;
133 verbose=*) VERBOSE=${i#*=};;
134 lang=*) LANG=${i#*=};;
135 file=*) SEARCH=${i#*=}; OBJECT=File;;
136 desc=*) SEARCH=${i#*=}; OBJECT=Desc;;
137 tags=*) SEARCH=${i#*=}; OBJECT=Tags;;
138 arch=*) SEARCH=${i#*=}; OBJECT=Arch;;
139 bugs=*) SEARCH=${i#*=}; OBJECT=Bugs;;
140 receipt=*) SEARCH=${i#*=}; OBJECT=Receipt;;
141 filelist=*) SEARCH=${i#*=}; OBJECT=File_list;;
142 package=*) SEARCH=${i#*=}; OBJECT=Package;;
143 depends=*) SEARCH=${i#*=}; OBJECT=Depends;;
144 builddepends=*) SEARCH=${i#*=}; OBJECT=BuildDepends;;
145 fileoverlap=*) SEARCH=${i#*=}; OBJECT=FileOverlap;;
146 category=*) SEARCH=${i#*=}; OBJECT=Category;;
147 maintainer=*) SEARCH=${i#*=}; OBJECT=Maintainer;;
148 version=[1-9]*) i=${i%%.*}; SLITAZ_VERSION=${i#*=}.0;;
149 version=s*|version=4*) SLITAZ_VERSION=stable;;
150 version=u*) SLITAZ_VERSION=undigest;;
151 version=b*) SLITAZ_VERSION=backports;;
152 version=t*) SLITAZ_VERSION=tiny;;
153 esac
154 done
155 [ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION=cooking
157 #
158 # Content negotiation for Gettext
159 #
160 LANG=$(user_lang $(GET lang))
161 lang="$(ll_lang $LANG)"
162 export LANG LC_ALL=$LANG
165 case "$OBJECT" in
166 File) selected_file="selected";;
167 Desc) selected_desc="selected";;
168 Tags) selected_tags="selected";;
169 Arch) selected_arch="selected";;
170 Bugs) selected_bugs="selected";;
171 Receipt) selected_receipt="selected";;
172 File_list) selected_file_list="selected";;
173 Depends) selected_depends="selected";;
174 BuildDepends) selected_build_depends="selected";;
175 FileOverlap) selected_overlap="selected";;
176 esac
178 case "$SLITAZ_VERSION" in
179 tiny) selected_tiny="selected";;
180 1.0) selected_1="selected";;
181 2.0) selected_2="selected";;
182 3.0) selected_3="selected";;
183 stable) selected_stable="selected";;
184 undigest) selected_undigest="selected";;
185 backports) selected_backports="selected";;
186 esac
188 #
189 # Unescape query and set vars
190 #
191 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g; s/%3A/:/g; s|%2F|/|g')"
192 SLITAZ_HOME="/home/slitaz"
193 if [ "$SLITAZ_VERSION" == "cooking" ]; then
194 WOK=$SLITAZ_HOME/wok
195 else
196 WOK=$SLITAZ_HOME/wok-${VERSION}
197 fi
198 pkgsrepo=$SLITAZ_HOME/$SLITAZ_VERSION/packages
199 filelist=$pkgsrepo/files.list.lzma
200 pkglist=$pkgsrepo/packages.txt
201 equiv=$pkgsrepo/packages.equiv
203 # Search form
204 # TODO: add hint 'You are can search for depends loop, if textfield is empty'...
205 # add progress ticker while page is not complete
206 search_form()
207 {
208 cat << _EOT_
210 <div class="form">
211 <form id="s_form" method="post" action="$SCRIPT_NAME$(ifdebug '?')">
212 <input type="hidden" name="lang" value="$lang" />
213 <span class="small">
214 <select name="object">
215 <option value="Package">$(gettext "Package")</option>
216 <option $selected_desc value="Desc">$(gettext "Description")</option>
217 <option $selected_tags value="Tags">$(gettext "Tags")</option>
218 <option $selected_arch value="Arch">$(gettext "Arch")</option>
219 <option $selected_bugs value="Bugs">$(gettext "Bugs")</option>
220 <option $selected_receipt value="Receipt">$(gettext "Receipt")</option>
221 <option $selected_depends value="Depends">$(gettext "Depends")</option>
222 <option $selected_build_depends value="BuildDepends">$(gettext "Build depends")</option>
223 <option $selected_file value="File">$(gettext "File")</option>
224 <option $selected_file_list value="File_list">$(gettext "File list")</option>
225 <option $selected_overlap value="FileOverlap">$(gettext "common files")</option>
226 </select>
227 </span>
228 <span class="stretch">
229 <input autofocus type="text" name="query" id="query" value="$SEARCH" />
230 </span>
231 <span class="small">
232 <select name="version">
233 <option value="cooking">$(gettext "cooking")</option>
234 <option $selected_stable value="stable">4.0</option>
235 <option $selected_3 value="3.0">3.0</option>
236 <option $selected_2 value="2.0">2.0</option>
237 <option $selected_1 value="1.0">1.0</option>
238 <option $selected_tiny value="tiny">$(gettext "tiny")</option>
239 <option $selected_undigest value="undigest">$(gettext "undigest")</option>
240 <option $selected_backports value="backports">$(gettext "backports")</option>
241 </select>
242 </span>
243 <span class="small">
244 <input type="submit" value="$(gettext 'Search')" />
245 </span>
246 </form>
247 </div>
248 _EOT_
249 }
251 # xHTML5 Header.
252 xhtml_header() {
253 . lib/header.sh
254 }
256 cat_files_list()
257 {
258 local tmp=/tmp/files.list.$(basename ${1%/packages})
259 if [ ! -s $tmp -o $1/files.list.lzma -nt $tmp ]; then
260 unlzma < $1/files.list.lzma > $tmp.$$ && mv $tmp.$$ $tmp
261 fi
262 case "$2" in
263 lines) if [ ! -s $tmp.lines -o $tmp -nt $tmp.lines ]; then
264 wc -l < $tmp > $tmp.lines.$$ &&
265 mv $tmp.lines.$$ $tmp.lines
266 fi
267 cat $tmp.lines ;;
268 *) cat $tmp ;;
269 esac
270 }
272 # xHTML Footer.
273 # TODO: caching the summary for 5 minutes
274 xhtml_footer() {
275 PKGS=$(ls $WOK/ | wc -l)
276 #FILES=$(unlzma < $filelist | wc -l)
277 . lib/footer.sh
278 }
280 installed_size()
281 {
282 if [ $VERBOSE -gt 0 ]; then
283 inst=$(grep -A 3 "^$1\$" $pkgslist | grep installed)
284 # size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1)
285 echo $inst | sed 's/.*(\(.*\).*/(\1)/'
286 # echo $size
287 # | sed 's/.*(\(.*\) installed.*/(\1) /'
288 fi
289 }
291 oddeven() {
292 ifEven=$(cat $HOME/ifEven)
293 [ "$1" == "1" ] && ifEven="0"
294 case "$ifEven" in
295 "0") ifEven="1"; echo -n " class=\"even\"";;
296 "1") ifEven="0";;
297 esac
298 echo -n "$ifEven" > $HOME/ifEven
299 }
301 package_entry() {
302 cat << EOT
303 <tr$(oddeven $1)>
304 EOT
305 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
306 cat << _EOT_
307 <td class="first"><a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a></td>
308 <td class="first">$(installed_size $PACKAGE)</td>
309 <td>$SHORT_DESC</td>
310 _EOT_
311 else
312 PACKAGE_URL="$MIRROR_URL/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
313 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
314 case "$SLITAZ_VERSION" in
315 cooking) COOKER="<a href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
316 undigest) COOKER="<a href=\"http://cook.slitaz.org/undigest/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
317 backports) COOKER="<a href=\"http://cook.slitaz.org/backports/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
318 *) COOKER="";;
319 esac
320 cat << _EOT_
321 <td class="first">$PACKAGE_HREF</td>
322 <td class="first">$(installed_size $PACKAGE)</td>
323 <td>$SHORT_DESC</td>
324 <td><a href="?receipt=$PACKAGE&amp;version=$SLITAZ_VERSION">$(gettext "Receipt")</a> $COOKER</td>
325 _EOT_
326 fi
327 cat << EOT
328 </tr>
329 EOT
330 }
332 package_entry_inline() {
333 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
334 cat << _EOT_
335 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE) : $SHORT_DESC
336 _EOT_
337 else
338 PACKAGE_URL="$MIRROR_URL/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
339 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
340 case "$SLITAZ_VERSION" in
341 cooking) COOKER="<a href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
342 undigest) COOKER="<a href=\"http://cook.slitaz.org/undigest/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
343 backports) COOKER="<a href=\"http://cook.slitaz.org/backports/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
344 *) COOKER="";;
345 esac
346 cat << _EOT_
347 $PACKAGE_HREF $(installed_size $PACKAGE) : $SHORT_DESC \
348 <a href="?receipt=$PACKAGE&amp;version=$SLITAZ_VERSION">$(gettext "Receipt")</a> $COOKER
349 _EOT_
350 fi
351 }
353 # Show loop in depends/build_depends chains
354 show_loops()
355 {
356 awk '
357 function chkloop(pkg, i, n)
358 {
359 if (n < 8)
360 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
361 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
362 split(deps[pkg],curdep," ")
363 p = curdep[i] " " p
364 return 1
365 }
366 }
367 return 0
368 }
369 {
370 for (i = 2; i <= NF; i++)
371 deps[$1] = deps[$1] " " $i
372 }
373 END {
374 for (pkg in deps) {
375 base = pkg
376 p = ""
377 if (chkloop(pkg, 0, 0))
378 print pkg " " p
379 #print pkg " : " p "..."
380 }
381 }' | while read line; do
382 set -- $line
383 case " $last " in
384 *\ $1\ *) continue
385 esac
386 last="$line"
387 pkg=$1
388 shift
389 echo "<strong>$pkg </strong>: $@ ..."
390 done
391 }
393 # recursive dependencies scan
394 dep_scan()
395 {
396 for i in $1; do
397 case " $ALL_DEPS " in
398 *\ $i\ *) continue;;
399 esac
400 ALL_DEPS="$ALL_DEPS $i"
401 if [ -n "$2" ]; then
402 echo -n "$2"
403 (
404 . $WOK/$i/receipt
405 package_entry_inline
406 )
407 fi
408 [ -f $WOK/$i/receipt ] || continue
409 unset BUILD_DEPENDS DEPENDS WANTED
410 . $WOK/$i/receipt
411 if [ -n "$3" ]; then
412 [ -n "$BUILD_DEPENDS$WANTED" ] &&
413 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
414 else
415 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
416 fi
417 done
418 }
420 # recursive reverse dependencies scan
421 rdep_scan()
422 {
423 SEARCH=$1
424 case "$SEARCH" in
425 glibc-base|gcc-lib-base)
426 $(gettext " glibc-base and gcc-lib-base are implicit dependencies,
427 <b>every</b> package is supposed to depend on them."); echo
428 return;;
429 esac
430 for i in $WOK/* ; do
431 unset BUILD_DEPENDS DEPENDS WANTED
432 . $i/receipt
433 if [ -n "$2" ]; then
434 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
435 else
436 echo "$(basename $i) $(echo $DEPENDS)"
437 fi
438 done | awk -v search=$SEARCH '
439 function show_deps(deps, all_deps, pkg, space)
440 {
441 if (all_deps[pkg] == 1) return
442 all_deps[pkg] = 1
443 if (space != "") printf "%s%s\n",space,pkg
444 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
445 show_deps(deps, all_deps, mydeps[i],"////" space)
446 }
447 }
449 {
450 all_deps[$1] = 0
451 for (i = 2; i <= NF; i++)
452 deps[$i] = deps[$i] " " $1
453 }
455 END {
456 show_deps(deps, all_deps, search, "")
457 }
458 ' | while read pkg; do
459 . $WOK/${pkg##*/}/receipt
460 cat << _EOT_
461 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry_inline)
462 _EOT_
463 done
464 }
466 # Check package exists
467 package_exist()
468 {
469 [ -f $WOK/$1/receipt ] && return 0
470 cat << _EOT_
472 <h3>$(eval_gettext "No package \$SEARCH")</h3>
473 _EOT_
474 return 1
475 }
477 # Display < > &
478 htmlize() {
479 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
480 }
482 display_packages_and_files() {
483 unset last
484 while read pkg file; do
485 pkg=${pkg%:}
486 if [ "$pkg" != "$last" ]; then
487 . $WOK/$pkg/receipt
489 package_entry_inline
490 last=$pkg
491 fi
492 echo " $file"
493 done
494 }
496 # Syntax highlighting for receipt file - stolen from tazpanel:
497 # '/var/www/tazpanel/lib/libtazpanel' and developed
498 syntax_highlighter() {
499 sed -e "s|\&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g; s| | |g" \
500 -e "s|@|\&#64;|g; s|~|\&#126;|g" \
501 -e "#literals" \
502 -e "s|'\([^']*\)'|@l\0~|g" \
503 -e 's|"\([^"]*\)"|@l\0~|g' \
504 -e 's|"\([^"]*\)\\|@l\0~|g' \
505 -e 's|\([^"]*\)\"$|@l\0~|g' \
506 -e "#paths" \
507 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+\)\([ )]\)|\1@p\2~\3|g' \
508 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+$\)|\1@p\2~|g' \
509 -e 's|\(\$[a-zA-Z0-9_\.-]\+\)\(/[\$a-zA-Z0-9_/\.\*-]\+\)\([ )]*\)|@p\1\2~\3|g' \
510 -e "#functions" \
511 -e 's|^\([^()]*\)\(()\)|@f\0~|g' \
512 -e "#single line comments" \
513 -e 's|^\([ ]*\)#\([^#]*$\)|@c\0~|g' \
514 -e "#parameters" \
515 -e 's|\( \)\(-[a-z0-9]\+\)\( *\)|\1@r\2~\3|g' \
516 -e 's|\( \)\(--[a-z0-9\-]\+\)\([= ]\)|\1@r\2~\3|g' \
517 -e "#variables" \
518 -e "s|^\([^=@#' \-]*\)\(=\)|@v\1~\2|g" \
519 -e 's|\([ ^@-]*\)\([a-zA-Z0-9]\+\)\(=\)|\1@v\2~\3|g' \
520 -e "s#\(\$[a-zA-Z0-9_]\+\)#@v\0~#g" \
521 -e "#urls" \
522 -e s"#\"\(http:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
523 -e s"#\"\(ftp:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
524 -e "#commands" \
525 -e s"#^\( \+\)\([^'= @\-]\+\)#\1@m\2~#"g \
526 -e "#simple commands" \
527 -e s"#\([{}\]$\)#@s\0~#"g \
528 -e s"#\( \)\(\&amp;\&amp;\)\( *\)#\1@s\2~\3#"g \
529 -e s"#\(|\)#@s\0~#"g \
530 -e s"#\(\&lt;\)#@s\0~#"g \
531 -e s"#\(\&gt;\&amp;\)#@s\0~#"g \
532 -e s"#\(\&gt;\)#@s\0~#"g \
533 -e s"#\(\[\)#@s\0~#"g \
534 -e s"#\(\]\)#@s\0~#"g \
535 \
536 -e "s|´|'|g; s|›|</span>|g" \
537 -e "s|@c|<span class='r-comment'>|g" \
538 -e "s|@l|<span class='r-literal'>|g" \
539 -e "s|@v|<span class='r-var'>|g" \
540 -e "s|@f|<span class='r-func'>|g" \
541 -e "s|@u|class='r-url' target='_blank'|g" \
542 -e "s|@m|<span class='r-com'>|g" \
543 -e "s|@s|<span class='r-scom'>|g" \
544 -e "s|@p|<span class='r-path'>|g" \
545 -e "s|@r|<span class='r-param'>|g" \
546 -e "s|~|</span>|g" < "$1"
547 }
550 #
551 # page begins
552 #
553 header "HTTP/1.1 200 OK" "Content-type: text/html"
554 xhtml_header
556 #
557 # language selector, if needed
558 #
559 if [ -z "$HTTP_ACCEPT_LANGUAGE" ]; then
560 oldlang=$(GETPOST lang)
561 if [ -z "$oldlang" ]; then
562 oldlang="C"
563 [ -z "$QUERY_STRING" ] && QUERY_STRING="lang=C" || QUERY_STRING="${QUERY_STRING}&lang=C"
564 fi
565 cat << EOT
566 <!-- Languages -->
567 <div id="lang">
568 EOT
569 for i in en de fr pt ru zh; do
570 cat << EOT
571 <a href="$SCRIPT_NAME?$(echo "$QUERY_STRING" | sed s/"lang=$oldlang"/"lang=$i"/)">$(
572 case $i in
573 en) echo -n "English";;
574 de) echo -n "Deutsch";;
575 fr) echo -n "Français";;
576 pt) echo -n "Português";;
577 ru) echo -n "Русский";;
578 zh) echo -n "中文";;
579 esac)</a>
580 EOT
581 done
582 cat << EOT
583 </div>
585 EOT
586 fi
588 cat << EOT
589 <!-- Content -->
590 <div id="content">
591 EOT
593 #
594 # Handle GET requests
595 #
596 case " $(GET) " in
597 *\ debug\ *|*\ debug*)
598 cat << EOT
599 <h2>Debug info</h2>
600 <pre>$(httpinfo)</pre>
601 <pre>LANG=$LANG;
602 OBJECT=$OBJECT;
603 SEARCH=$SEARCH;
604 SLITAZ_VERSION=$SLITAZ_VERSION;
605 WOK=$WOK;
606 GET=$(GET);
607 </pre>
608 EOT
609 #$(xhtml_footer)
610 #EOT
611 # exit 0
612 ;;
613 esac
615 # Display search form and result if requested.
616 #xhtml_header
617 cat << EOT
618 <h2>$(gettext 'Search for packages')</h2>
619 <div id="ticker"><img src="style/images/loader.gif" alt="." /></div>
620 EOT
621 search_form
624 case "$OBJECT" in
627 ### Depends loops; [Reverse] Dependency tree [(SUGGESTED)]
628 Depends)
629 if [ -z "$SEARCH" ]; then
630 cat << _EOT_
632 <h3>$(gettext "Depends loops")</h3>
633 <pre>
634 _EOT_
635 for i in $WOK/*/receipt; do
636 PACKAGE=
637 DEPENDS=
638 . $i
639 echo "$PACKAGE $(echo $DEPENDS)"
640 done | show_loops
641 cat << _EOT_
642 </pre>
643 _EOT_
644 elif package_exist $SEARCH ; then
645 cat << _EOT_
647 <h3>$(eval_gettext "Dependency tree for: \$SEARCH")</h3>
648 <pre>
649 _EOT_
650 unset ALL_DEPS
651 dep_scan $SEARCH ""
652 unset SUGGESTED
653 . $WOK/$SEARCH/receipt
654 if [ -n "$SUGGESTED" ]; then
655 cat << _EOT_
656 </pre>
658 <h3>$(eval_gettext "Dependency tree for: \$SEARCH (SUGGESTED)")</h3>
659 <pre>
660 _EOT_
661 unset ALL_DEPS
662 dep_scan "$SUGGESTED" " "
663 fi
664 cat << _EOT_
665 </pre>
667 <h3>$(eval_gettext "Reverse dependency tree for: \$SEARCH")</h3>
668 <pre>
669 _EOT_
670 unset ALL_DEPS
671 rdep_scan $SEARCH
672 cat << _EOT_
673 </pre>
674 _EOT_
675 fi
676 ;;
679 ### Build depends loops; [Reverse] Build dependency tree
680 BuildDepends)
681 if [ -z "$SEARCH" ]; then
682 cat << _EOT_
684 <h3>$(gettext "Build depends loops")</h3>
685 <pre>
686 _EOT_
687 for i in $WOK/*/receipt; do
688 PACKAGE=
689 WANTED=
690 BUILD_DEPENDS=
691 . $i
692 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
693 done | show_loops
694 cat << _EOT_
695 </pre>
696 _EOT_
697 elif package_exist $SEARCH ; then
698 cat << _EOT_
700 <h3>$(eval_gettext "\$SEARCH needs these packages to be built")</h3>
701 <pre>
702 _EOT_
703 unset ALL_DEPS
704 dep_scan $SEARCH "" build
705 cat << _EOT_
706 </pre>
708 <h3>$(eval_gettext "Packages who need \$SEARCH to be built")</h3>
709 <pre>
710 _EOT_
711 unset ALL_DEPS
712 rdep_scan $SEARCH build
713 cat << _EOT_
714 </pre>
715 _EOT_
716 fi
717 ;;
720 ### Common files
721 FileOverlap)
722 if package_exist $SEARCH; then
723 cat << _EOT_
725 <h3>$(eval_gettext "These packages may overload files of \$SEARCH")</h3>
726 <pre>
727 _EOT_
728 ( unlzma < $filelist | grep ^$SEARCH: ;
729 unlzma < $filelist | grep -v ^$SEARCH: ) | awk '
730 BEGIN { pkg=""; last="x" }
731 {
732 if ($2 == "") next
733 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
734 delete file[last]
735 last=$2
736 if (pkg == "") pkg=$1
737 if ($1 == pkg) file[$2]=$1
738 else if (file[$2] == pkg) print
739 }
740 ' | display_packages_and_files
741 cat << _EOT_
742 </pre>
743 _EOT_
744 fi
745 ;;
748 ### File search
749 File)
750 if [ -n "$SEARCH" ]; then
751 cat << _EOT_
753 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
754 <table>
755 _EOT_
756 unset last
757 unlzma < $filelist \
758 | grep "$SEARCH" | while read pkg file; do
759 echo "$file" | grep -q "$SEARCH" || continue
760 if [ "$last" != "${pkg%:}" ]; then
761 last=${pkg%:}
762 (
763 . $WOK/$last/receipt
764 [ -n "$last" ] && cat << EOT
765 </td></tr>
766 EOT
767 cat << _EOT_
769 $(package_entry 1)
770 <tr><td colspan="3" class="pre">
771 _EOT_
772 )
773 fi
774 echo -n "$file" | sed s/"$SEARCH"/"<span class='match'>$SEARCH<\/span>"/g
775 echo "<br />"
776 done
777 cat << _EOT_
778 </td></tr>
779 </table>
780 _EOT_
781 fi
782 ;;
785 ### List of files
786 File_list)
787 if package_exist $SEARCH; then
788 cat << _EOT_
790 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
791 <pre>
792 _EOT_
793 unset last
794 unlzma < $filelist \
795 | grep ^$SEARCH: | sed 's/.*: / /' | sort
796 cat << _EOT_
797 </pre>
798 <pre>
799 _EOT_
800 filenb=$(unlzma < $filelist | grep ^$SEARCH: | wc -l)
801 eval_ngettext "\$filenb file" "\$filenb files" $filenb
802 cat << _EOT_
803 \
804 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $pkglist)
805 </pre>
806 _EOT_
807 fi
808 ;;
811 ### Package description
812 Desc)
813 if [ -f $WOK/$SEARCH/description.txt ]; then
814 cat << _EOT_
816 <h3>$(eval_gettext "Description of package: \$SEARCH")</h3>
817 <table>
818 $(htmlize < $WOK/$SEARCH/description.txt)
819 </table>
820 _EOT_
821 else
822 cat << _EOT_
824 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
825 <table>
826 _EOT_
827 unset last
828 grep -i "$SEARCH" $pkgsrepo/packages.desc | \
829 sort | while read pkg extras ; do
830 . $WOK/$pkg/receipt
831 package_entry
832 done
833 cat << _EOT_
834 </table>
835 _EOT_
836 fi
837 ;;
839 Bugs)
840 cat << _EOT_
842 <h3>$(eval_gettext "Result for known bugs")</h3>
843 <pre>
844 _EOT_
845 unset last
846 grep ^BUGS= $WOK/*/receipt | \
847 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
848 unset BUGS
849 . $WOK/$pkg/receipt
850 package_entry_inline
851 echo " $BUGS "
852 done
853 cat << _EOT_
854 </pre>
855 _EOT_
856 ;;
859 ### Arch
860 Arch)
861 cat << _EOT_
863 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
864 <pre>
865 _EOT_
866 unset last
867 grep ^HOST_ARCH= $WOK/*/receipt | grep -i "$SEARCH" | \
868 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
869 unset HOST_ARCH
870 . $WOK/$pkg/receipt
871 echo " $HOST_ARCH " | grep -iq " $SEARCH " &&
872 package_entry_inline
873 done
874 cat << _EOT_
875 </pre>
876 _EOT_
877 ;;
879 ### Tags
880 Tags)
881 if [ -n "$SEARCH" ]; then
882 cat << _EOT_
884 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
885 <table>
886 _EOT_
887 unset last
888 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
889 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
890 . $WOK/$pkg/receipt
891 package_entry
892 done
893 cat << _EOT_
894 </table>
895 _EOT_
896 else
897 # Display tag cloud
898 grep -l ^TAGS= $WOK/*/receipt | while read file; do
899 TAGS=
900 . $file
901 echo $TAGS
902 done | awk '
903 {
904 for (i = 1; $i != ""; i++)
905 count[$i]++
906 }
907 END {
908 min=10000
909 max=0
910 for (i in count) {
911 if (count[i] < min) min = count[i]
912 if (count[i] > max) max = count[i]
913 }
914 for (i in count)
915 print count[i] " " min " " max " " i
916 }' | while read cnt min max tag ; do
917 cat <<EOT
918 <span style="color:#99f; font-size:9pt; padding-left:5px; padding-right:2px;">\
919 $cnt</span><a href="?tags=$tag&amp;version=$SLITAZ_VERSION" style="\
920 font-size:$((8+(($cnt-$min)*10)/($max-$min)))pt; font-weight:bold; \
921 color:black; text-decoration:none">$tag</a>
922 EOT
923 done
924 fi
925 ;;
928 ### Package receipt with syntax highlighter
929 Receipt)
930 if package_exist "$SEARCH"; then
931 cat << _EOT_
933 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
934 <pre>
935 _EOT_
936 if [ -f "$WOK/$SEARCH/taz/*/receipt" ]; then
937 syntax_highlighter "$WOK/$SEARCH/taz/*/receipt"
938 else
939 syntax_highlighter "$WOK/$SEARCH/receipt"
940 fi
941 echo '</pre>'
942 fi
943 ;;
946 ### Package
947 Package)
948 if package_exist $SEARCH; then
949 cat << _EOT_
951 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
952 <table>
953 _EOT_
954 for pkg in `ls $WOK/ | grep "$SEARCH"`
955 do
956 . $WOK/$pkg/receipt
957 DESC=" <p><a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION$(ifdebug '&')&submit=go\">$(gettext description)</a><p>"
958 [ -f $WOK/$pkg/description.txt ] || unset DESC
959 cat << _EOT_
960 $(package_entry)$DESC
961 _EOT_
962 done
963 vpkgs="$(cut -d= -f1 < $equiv | grep $SEARCH)"
964 for vpkg in $vpkgs ; do
965 cat << _EOT_
966 </table>
968 <h3>$(eval_gettext "Result for: \$SEARCH (package providing \$vpkg)")</h3>
969 <table>
970 _EOT_
971 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
972 . $WOK/${pkg#*:}/receipt
973 package_entry
974 done
975 done
976 cat << _EOT_
977 </table>
978 _EOT_
979 fi
980 ;;
981 esac
983 xhtml_footer
985 exit 0