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

pkgs: add cooker links
author Pascal Bellard <pascal.bellard@slitaz.org>
date Mon Feb 17 14:29:16 2014 +0000 (2014-02-17)
parents 8553ee9ed29d
children 5500764333d0
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=t*) SLITAZ_VERSION=tiny;;
152 esac
153 done
154 [ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION=cooking
156 #
157 # Content negotiation for Gettext
158 #
159 LANG=$(user_lang $(GET lang))
160 lang="$(ll_lang $LANG)"
161 export LANG LC_ALL=$LANG
164 case "$OBJECT" in
165 File) selected_file="selected";;
166 Desc) selected_desc="selected";;
167 Tags) selected_tags="selected";;
168 Arch) selected_arch="selected";;
169 Bugs) selected_bugs="selected";;
170 Receipt) selected_receipt="selected";;
171 File_list) selected_file_list="selected";;
172 Depends) selected_depends="selected";;
173 BuildDepends) selected_build_depends="selected";;
174 FileOverlap) selected_overlap="selected";;
175 esac
177 case "$SLITAZ_VERSION" in
178 tiny) selected_tiny="selected";;
179 1.0) selected_1="selected";;
180 2.0) selected_2="selected";;
181 3.0) selected_3="selected";;
182 stable) selected_stable="selected";;
183 undigest) selected_undigest="selected";;
184 esac
186 #
187 # Unescape query and set vars
188 #
189 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g; s/%3A/:/g; s|%2F|/|g')"
190 SLITAZ_HOME="/home/slitaz"
191 if [ "$SLITAZ_VERSION" == "cooking" ]; then
192 WOK=$SLITAZ_HOME/wok
193 else
194 WOK=$SLITAZ_HOME/wok-${VERSION}
195 fi
196 pkgsrepo=$SLITAZ_HOME/$SLITAZ_VERSION/packages
197 filelist=$pkgsrepo/files.list.lzma
198 pkglist=$pkgsrepo/packages.txt
199 equiv=$pkgsrepo/packages.equiv
201 # Search form
202 # TODO: add hint 'You are can search for depends loop, if textfield is empty'...
203 # add progress ticker while page is not complete
204 search_form()
205 {
206 cat << _EOT_
208 <div class="form">
209 <form id="s_form" method="post" action="$SCRIPT_NAME$(ifdebug '?')">
210 <input type="hidden" name="lang" value="$lang" />
211 <span class="small">
212 <select name="object">
213 <option value="Package">$(gettext "Package")</option>
214 <option $selected_desc value="Desc">$(gettext "Description")</option>
215 <option $selected_tags value="Tags">$(gettext "Tags")</option>
216 <option $selected_arch value="Arch">$(gettext "Arch")</option>
217 <option $selected_bugs value="Bugs">$(gettext "Bugs")</option>
218 <option $selected_receipt value="Receipt">$(gettext "Receipt")</option>
219 <option $selected_depends value="Depends">$(gettext "Depends")</option>
220 <option $selected_build_depends value="BuildDepends">$(gettext "Build depends")</option>
221 <option $selected_file value="File">$(gettext "File")</option>
222 <option $selected_file_list value="File_list">$(gettext "File list")</option>
223 <option $selected_overlap value="FileOverlap">$(gettext "common files")</option>
224 </select>
225 </span>
226 <span class="stretch">
227 <input autofocus type="text" name="query" id="query" value="$SEARCH" />
228 </span>
229 <span class="small">
230 <select name="version">
231 <option value="cooking">$(gettext "cooking")</option>
232 <option $selected_stable value="stable">4.0</option>
233 <option $selected_3 value="3.0">3.0</option>
234 <option $selected_2 value="2.0">2.0</option>
235 <option $selected_1 value="1.0">1.0</option>
236 <option $selected_tiny value="tiny">$(gettext "tiny")</option>
237 <option $selected_undigest value="undigest">$(gettext "undigest")</option>
238 </select>
239 </span>
240 <span class="small">
241 <input type="submit" value="$(gettext 'Search')" />
242 </span>
243 </form>
244 </div>
245 _EOT_
246 }
248 # xHTML5 Header.
249 xhtml_header() {
250 . lib/header.sh
251 }
253 cat_files_list()
254 {
255 local tmp=/tmp/files.list.$(basename ${1%/packages})
256 if [ ! -s $tmp -o $1/files.list.lzma -nt $tmp ]; then
257 unlzma -c $1/files.list.lzma > $tmp.$$ && mv $tmp.$$ $tmp
258 fi
259 case "$2" in
260 lines) if [ ! -s $tmp.lines -o $tmp -nt $tmp.lines ]; then
261 cat $tmp | wc -l > $tmp.lines.$$ &&
262 mv $tmp.lines.$$ $tmp.lines
263 fi
264 cat $tmp.lines ;;
265 *) cat $tmp ;;
266 esac
267 }
269 # xHTML Footer.
270 # TODO: caching the summary for 5 minutes
271 xhtml_footer() {
272 PKGS=$(ls $WOK/ | wc -l)
273 #FILES=$(unlzma -c $filelist | wc -l)
274 . lib/footer.sh
275 }
277 installed_size()
278 {
279 if [ $VERBOSE -gt 0 ]; then
280 inst=$(grep -A 3 "^$1\$" $pkgslist | grep installed)
281 # size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1)
282 echo $inst | sed 's/.*(\(.*\).*/(\1)/'
283 # echo $size
284 # | sed 's/.*(\(.*\) installed.*/(\1) /'
285 fi
286 }
288 oddeven() {
289 ifEven=$(cat $HOME/ifEven)
290 [ "$1" == "1" ] && ifEven="0"
291 case "$ifEven" in
292 "0") ifEven="1"; echo -n " class=\"even\"";;
293 "1") ifEven="0";;
294 esac
295 echo -n "$ifEven" > $HOME/ifEven
296 }
298 package_entry() {
299 cat << EOT
300 <tr$(oddeven $1)>
301 EOT
302 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
303 cat << _EOT_
304 <td class="first"><a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a></td>
305 <td class="first">$(installed_size $PACKAGE)</td>
306 <td>$SHORT_DESC</td>
307 _EOT_
308 else
309 PACKAGE_URL="$MIRROR_URL/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
310 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
311 case "$SLITAZ_VERSION" in
312 cooking) COOKER="<a href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
313 undigest) COOKER="<a href=\"http://cook.slitaz.org/undigest/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
314 backports) COOKER="<a href=\"http://cook.slitaz.org/backports/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
315 *) COOKER="";;
316 esac
317 cat << _EOT_
318 <td class="first">$PACKAGE_HREF</td>
319 <td class="first">$(installed_size $PACKAGE)</td>
320 <td>$SHORT_DESC <a href="?receipt=$PACKAGE&amp;version=$SLITAZ_VERSION">$(gettext "Receipt")</a> $COOKER</td>
321 _EOT_
322 fi
323 cat << EOT
324 </tr>
325 EOT
326 }
328 package_entry_inline() {
329 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
330 cat << _EOT_
331 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE) : $SHORT_DESC
332 _EOT_
333 else
334 PACKAGE_URL="$MIRROR_URL/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
335 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
336 case "$SLITAZ_VERSION" in
337 cooking) COOKER="<a href=\"http://cook.slitaz.org/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
338 undigest) COOKER="<a href=\"http://cook.slitaz.org/undigest/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
339 backports) COOKER="<a href=\"http://cook.slitaz.org/backports/cooker.cgi?pkg=$PACKAGE\">$(gettext "Cooker")</a>";;
340 *) COOKER="";;
341 esac
342 cat << _EOT_
343 $PACKAGE_HREF $(installed_size $PACKAGE) : $SHORT_DESC \
344 <a href="?receipt=$PACKAGE&amp;version=$SLITAZ_VERSION">$(gettext "Receipt")</a> $COOKER
345 _EOT_
346 fi
347 }
349 # Show loop in depends/build_depends chains
350 show_loops()
351 {
352 awk '
353 function chkloop(pkg, i, n)
354 {
355 if (n < 8)
356 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
357 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
358 split(deps[pkg],curdep," ")
359 p = curdep[i] " " p
360 return 1
361 }
362 }
363 return 0
364 }
365 {
366 for (i = 2; i <= NF; i++)
367 deps[$1] = deps[$1] " " $i
368 }
369 END {
370 for (pkg in deps) {
371 base = pkg
372 p = ""
373 if (chkloop(pkg, 0, 0))
374 print pkg " " p
375 #print pkg " : " p "..."
376 }
377 }' | while read line; do
378 set -- $line
379 case " $last " in
380 *\ $1\ *) continue
381 esac
382 last="$line"
383 pkg=$1
384 shift
385 echo "<strong>$pkg </strong>: $@ ..."
386 done
387 }
389 # recursive dependencies scan
390 dep_scan()
391 {
392 for i in $1; do
393 case " $ALL_DEPS " in
394 *\ $i\ *) continue;;
395 esac
396 ALL_DEPS="$ALL_DEPS $i"
397 if [ -n "$2" ]; then
398 echo -n "$2"
399 (
400 . $WOK/$i/receipt
401 package_entry_inline
402 )
403 fi
404 [ -f $WOK/$i/receipt ] || continue
405 unset BUILD_DEPENDS DEPENDS WANTED
406 . $WOK/$i/receipt
407 if [ -n "$3" ]; then
408 [ -n "$BUILD_DEPENDS$WANTED" ] &&
409 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
410 else
411 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
412 fi
413 done
414 }
416 # recursive reverse dependencies scan
417 rdep_scan()
418 {
419 SEARCH=$1
420 case "$SEARCH" in
421 glibc-base|gcc-lib-base)
422 $(gettext " glibc-base and gcc-lib-base are implicit dependencies,
423 <b>every</b> package is supposed to depend on them."); echo
424 return;;
425 esac
426 for i in $WOK/* ; do
427 unset BUILD_DEPENDS DEPENDS WANTED
428 . $i/receipt
429 if [ -n "$2" ]; then
430 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
431 else
432 echo "$(basename $i) $(echo $DEPENDS)"
433 fi
434 done | awk -v search=$SEARCH '
435 function show_deps(deps, all_deps, pkg, space)
436 {
437 if (all_deps[pkg] == 1) return
438 all_deps[pkg] = 1
439 if (space != "") printf "%s%s\n",space,pkg
440 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
441 show_deps(deps, all_deps, mydeps[i],"////" space)
442 }
443 }
445 {
446 all_deps[$1] = 0
447 for (i = 2; i <= NF; i++)
448 deps[$i] = deps[$i] " " $1
449 }
451 END {
452 show_deps(deps, all_deps, search, "")
453 }
454 ' | while read pkg; do
455 . $WOK/${pkg##*/}/receipt
456 cat << _EOT_
457 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry_inline)
458 _EOT_
459 done
460 }
462 # Check package exists
463 package_exist()
464 {
465 [ -f $WOK/$1/receipt ] && return 0
466 cat << _EOT_
468 <h3>$(eval_gettext "No package \$SEARCH")</h3>
469 _EOT_
470 return 1
471 }
473 # Display < > &
474 htmlize() {
475 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
476 }
478 display_packages_and_files() {
479 unset last
480 while read pkg file; do
481 pkg=${pkg%:}
482 if [ "$pkg" != "$last" ]; then
483 . $WOK/$pkg/receipt
485 package_entry_inline
486 last=$pkg
487 fi
488 echo " $file"
489 done
490 }
492 # Syntax highlighting for receipt file - stolen from tazpanel:
493 # '/var/www/tazpanel/lib/libtazpanel' and developed
494 syntax_highlighter() {
495 cat "$1" | sed -e "s|\&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g; s| | |g" \
496 -e "s|@|\&#64;|g; s|~|\&#126;|g" \
497 -e "#literals" \
498 -e "s|'\([^']*\)'|@l\0~|g" \
499 -e 's|"\([^"]*\)"|@l\0~|g' \
500 -e 's|"\([^"]*\)\\|@l\0~|g' \
501 -e 's|\([^"]*\)\"$|@l\0~|g' \
502 -e "#paths" \
503 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+\)\([ )]\)|\1@p\2~\3|g' \
504 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+$\)|\1@p\2~|g' \
505 -e 's|\(\$[a-zA-Z0-9_\.-]\+\)\(/[\$a-zA-Z0-9_/\.\*-]\+\)\([ )]*\)|@p\1\2~\3|g' \
506 -e "#functions" \
507 -e 's|^\([^()]*\)\(()\)|@f\0~|g' \
508 -e "#single line comments" \
509 -e 's|^\([ ]*\)#\([^#]*$\)|@c\0~|g' \
510 -e "#parameters" \
511 -e 's|\( \)\(-[a-z0-9]\+\)\( *\)|\1@r\2~\3|g' \
512 -e 's|\( \)\(--[a-z0-9\-]\+\)\([= ]\)|\1@r\2~\3|g' \
513 -e "#variables" \
514 -e "s|^\([^=@#' \-]*\)\(=\)|@v\1~\2|g" \
515 -e 's|\([ ^@-]*\)\([a-zA-Z0-9]\+\)\(=\)|\1@v\2~\3|g' \
516 -e "s#\(\$[a-zA-Z0-9_]\+\)#@v\0~#g" \
517 -e "#urls" \
518 -e s"#\"\(http:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
519 -e s"#\"\(ftp:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
520 -e "#commands" \
521 -e s"#^\( \+\)\([^'= @\-]\+\)#\1@m\2~#"g \
522 -e "#simple commands" \
523 -e s"#\([{}\]$\)#@s\0~#"g \
524 -e s"#\( \)\(\&amp;\&amp;\)\( *\)#\1@s\2~\3#"g \
525 -e s"#\(|\)#@s\0~#"g \
526 -e s"#\(\&lt;\)#@s\0~#"g \
527 -e s"#\(\&gt;\&amp;\)#@s\0~#"g \
528 -e s"#\(\&gt;\)#@s\0~#"g \
529 -e s"#\(\[\)#@s\0~#"g \
530 -e s"#\(\]\)#@s\0~#"g \
531 \
532 -e "s|´|'|g; s|›|</span>|g" \
533 -e "s|@c|<span class='r-comment'>|g" \
534 -e "s|@l|<span class='r-literal'>|g" \
535 -e "s|@v|<span class='r-var'>|g" \
536 -e "s|@f|<span class='r-func'>|g" \
537 -e "s|@u|class='r-url' target='_blank'|g" \
538 -e "s|@m|<span class='r-com'>|g" \
539 -e "s|@s|<span class='r-scom'>|g" \
540 -e "s|@p|<span class='r-path'>|g" \
541 -e "s|@r|<span class='r-param'>|g" \
542 -e "s|~|</span>|g"
543 }
546 #
547 # page begins
548 #
549 header "HTTP/1.1 200 OK" "Content-type: text/html"
550 xhtml_header
552 #
553 # language selector, if needed
554 #
555 if [ -z "$HTTP_ACCEPT_LANGUAGE" ]; then
556 oldlang=$(GETPOST lang)
557 if [ -z "$oldlang" ]; then
558 oldlang="C"
559 [ -z "$QUERY_STRING" ] && QUERY_STRING="lang=C" || QUERY_STRING="${QUERY_STRING}&lang=C"
560 fi
561 cat << EOT
562 <!-- Languages -->
563 <div id="lang">
564 EOT
565 for i in en de fr pt ru zh; do
566 cat << EOT
567 <a href="$SCRIPT_NAME?$(echo "$QUERY_STRING" | sed s/"lang=$oldlang"/"lang=$i"/)">$(
568 case $i in
569 en) echo -n "English";;
570 de) echo -n "Deutsch";;
571 fr) echo -n "Français";;
572 pt) echo -n "Português";;
573 ru) echo -n "Русский";;
574 zh) echo -n "中文";;
575 esac)</a>
576 EOT
577 done
578 cat << EOT
579 </div>
581 EOT
582 fi
584 cat << EOT
585 <!-- Content -->
586 <div id="content">
587 EOT
589 #
590 # Handle GET requests
591 #
592 case " $(GET) " in
593 *\ debug\ *|*\ debug*)
594 cat << EOT
595 <h2>Debug info</h2>
596 <pre>$(httpinfo)</pre>
597 <pre>LANG=$LANG;
598 OBJECT=$OBJECT;
599 SEARCH=$SEARCH;
600 SLITAZ_VERSION=$SLITAZ_VERSION;
601 WOK=$WOK;
602 GET=$(GET);
603 </pre>
604 EOT
605 #$(xhtml_footer)
606 #EOT
607 # exit 0
608 ;;
609 esac
611 # Display search form and result if requested.
612 #xhtml_header
613 cat << EOT
614 <h2>$(gettext 'Search for packages')</h2>
615 <div id="ticker"><img src="style/images/loader.gif" alt="." /></div>
616 EOT
617 search_form
620 case "$OBJECT" in
623 ### Depends loops; [Reverse] Dependency tree [(SUGGESTED)]
624 Depends)
625 if [ -z "$SEARCH" ]; then
626 cat << _EOT_
628 <h3>$(gettext "Depends loops")</h3>
629 <pre>
630 _EOT_
631 for i in $WOK/*/receipt; do
632 PACKAGE=
633 DEPENDS=
634 . $i
635 echo "$PACKAGE $(echo $DEPENDS)"
636 done | show_loops
637 cat << _EOT_
638 </pre>
639 _EOT_
640 elif package_exist $SEARCH ; then
641 cat << _EOT_
643 <h3>$(eval_gettext "Dependency tree for: \$SEARCH")</h3>
644 <pre>
645 _EOT_
646 unset ALL_DEPS
647 dep_scan $SEARCH ""
648 unset SUGGESTED
649 . $WOK/$SEARCH/receipt
650 if [ -n "$SUGGESTED" ]; then
651 cat << _EOT_
652 </pre>
654 <h3>$(eval_gettext "Dependency tree for: \$SEARCH (SUGGESTED)")</h3>
655 <pre>
656 _EOT_
657 unset ALL_DEPS
658 dep_scan "$SUGGESTED" " "
659 fi
660 cat << _EOT_
661 </pre>
663 <h3>$(eval_gettext "Reverse dependency tree for: \$SEARCH")</h3>
664 <pre>
665 _EOT_
666 unset ALL_DEPS
667 rdep_scan $SEARCH
668 cat << _EOT_
669 </pre>
670 _EOT_
671 fi
672 ;;
675 ### Build depends loops; [Reverse] Build dependency tree
676 BuildDepends)
677 if [ -z "$SEARCH" ]; then
678 cat << _EOT_
680 <h3>$(gettext "Build depends loops")</h3>
681 <pre>
682 _EOT_
683 for i in $WOK/*/receipt; do
684 PACKAGE=
685 WANTED=
686 BUILD_DEPENDS=
687 . $i
688 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
689 done | show_loops
690 cat << _EOT_
691 </pre>
692 _EOT_
693 elif package_exist $SEARCH ; then
694 cat << _EOT_
696 <h3>$(eval_gettext "\$SEARCH needs these packages to be built")</h3>
697 <pre>
698 _EOT_
699 unset ALL_DEPS
700 dep_scan $SEARCH "" build
701 cat << _EOT_
702 </pre>
704 <h3>$(eval_gettext "Packages who need \$SEARCH to be built")</h3>
705 <pre>
706 _EOT_
707 unset ALL_DEPS
708 rdep_scan $SEARCH build
709 cat << _EOT_
710 </pre>
711 _EOT_
712 fi
713 ;;
716 ### Common files
717 FileOverlap)
718 if package_exist $SEARCH; then
719 cat << _EOT_
721 <h3>$(eval_gettext "These packages may overload files of \$SEARCH")</h3>
722 <pre>
723 _EOT_
724 ( unlzma -c $filelist | grep ^$SEARCH: ;
725 unlzma -c $filelist | grep -v ^$SEARCH: ) | awk '
726 BEGIN { pkg=""; last="x" }
727 {
728 if ($2 == "") next
729 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
730 delete file[last]
731 last=$2
732 if (pkg == "") pkg=$1
733 if ($1 == pkg) file[$2]=$1
734 else if (file[$2] == pkg) print
735 }
736 ' | display_packages_and_files
737 cat << _EOT_
738 </pre>
739 _EOT_
740 fi
741 ;;
744 ### File search
745 File)
746 if [ -n "$SEARCH" ]; then
747 cat << _EOT_
749 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
750 <table>
751 _EOT_
752 unset last
753 unlzma -c $filelist \
754 | grep "$SEARCH" | while read pkg file; do
755 echo "$file" | grep -q "$SEARCH" || continue
756 if [ "$last" != "${pkg%:}" ]; then
757 last=${pkg%:}
758 (
759 . $WOK/$last/receipt
760 [ -n "$last" ] && cat << EOT
761 </td></tr>
762 EOT
763 cat << _EOT_
765 $(package_entry 1)
766 <tr><td colspan="3" class="pre">
767 _EOT_
768 )
769 fi
770 echo -n "$file" | sed s/"$SEARCH"/"<span class='match'>$SEARCH<\/span>"/g
771 echo "<br />"
772 done
773 cat << _EOT_
774 </td></tr>
775 </table>
776 _EOT_
777 fi
778 ;;
781 ### List of files
782 File_list)
783 if package_exist $SEARCH; then
784 cat << _EOT_
786 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
787 <pre>
788 _EOT_
789 unset last
790 unlzma -c $filelist \
791 | grep ^$SEARCH: | sed 's/.*: / /' | sort
792 cat << _EOT_
793 </pre>
794 <pre>
795 _EOT_
796 filenb=$(unlzma -c $filelist | grep ^$SEARCH: | wc -l)
797 eval_ngettext "\$filenb file" "\$filenb files" $filenb
798 cat << _EOT_
799 \
800 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $pkglist)
801 </pre>
802 _EOT_
803 fi
804 ;;
807 ### Package description
808 Desc)
809 if [ -f $WOK/$SEARCH/description.txt ]; then
810 cat << _EOT_
812 <h3>$(eval_gettext "Description of package: \$SEARCH")</h3>
813 <table>
814 $(htmlize < $WOK/$SEARCH/description.txt)
815 </table>
816 _EOT_
817 else
818 cat << _EOT_
820 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
821 <table>
822 _EOT_
823 unset last
824 grep -i "$SEARCH" $pkgsrepo/packages.desc | \
825 sort | while read pkg extras ; do
826 . $WOK/$pkg/receipt
827 package_entry
828 done
829 cat << _EOT_
830 </table>
831 _EOT_
832 fi
833 ;;
835 Bugs)
836 cat << _EOT_
838 <h3>$(eval_gettext "Result for known bugs")</h3>
839 <pre>
840 _EOT_
841 unset last
842 grep ^BUGS= $WOK/*/receipt | \
843 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
844 unset BUGS
845 . $WOK/$pkg/receipt
846 package_entry_inline
847 echo " $BUGS "
848 done
849 cat << _EOT_
850 </pre>
851 _EOT_
852 ;;
855 ### Arch
856 Arch)
857 cat << _EOT_
859 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
860 <pre>
861 _EOT_
862 unset last
863 grep ^HOST_ARCH= $WOK/*/receipt | grep -i "$SEARCH" | \
864 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
865 unset HOST_ARCH
866 . $WOK/$pkg/receipt
867 echo " $HOST_ARCH " | grep -iq " $SEARCH " &&
868 package_entry_inline
869 done
870 cat << _EOT_
871 </pre>
872 _EOT_
873 ;;
875 ### Tags
876 Tags)
877 if [ -n "$SEARCH" ]; then
878 cat << _EOT_
880 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
881 <table>
882 _EOT_
883 unset last
884 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
885 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
886 . $WOK/$pkg/receipt
887 package_entry
888 done
889 cat << _EOT_
890 </table>
891 _EOT_
892 else
893 # Display tag cloud
894 grep -l ^TAGS= $WOK/*/receipt | while read file; do
895 TAGS=
896 . $file
897 echo $TAGS
898 done | awk '
899 {
900 for (i = 1; $i != ""; i++)
901 count[$i]++
902 }
903 END {
904 min=10000
905 max=0
906 for (i in count) {
907 if (count[i] < min) min = count[i]
908 if (count[i] > max) max = count[i]
909 }
910 for (i in count)
911 print count[i] " " min " " max " " i
912 }' | while read cnt min max tag ; do
913 cat <<EOT
914 <span style="color:#99f; font-size:9pt; padding-left:5px; padding-right:2px;">\
915 $cnt</span><a href="?tags=$tag&amp;version=$SLITAZ_VERSION" style="\
916 font-size:$((8+(($cnt-$min)*10)/($max-$min)))pt; font-weight:bold; \
917 color:black; text-decoration:none">$tag</a>
918 EOT
919 done
920 fi
921 ;;
924 ### Package receipt with syntax highlighter
925 Receipt)
926 if package_exist "$SEARCH"; then
927 cat << _EOT_
929 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
930 <pre>
931 _EOT_
932 if [ -f "$WOK/$SEARCH/taz/*/receipt" ]; then
933 syntax_highlighter "$WOK/$SEARCH/taz/*/receipt"
934 else
935 syntax_highlighter "$WOK/$SEARCH/receipt"
936 fi
937 echo '</pre>'
938 fi
939 ;;
942 ### Package
943 Package)
944 if package_exist $SEARCH; then
945 cat << _EOT_
947 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
948 <table>
949 _EOT_
950 for pkg in `ls $WOK/ | grep "$SEARCH"`
951 do
952 . $WOK/$pkg/receipt
953 DESC=" <p><a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION$(ifdebug '&')&submit=go\">$(gettext description)</a><p>"
954 [ -f $WOK/$pkg/description.txt ] || unset DESC
955 cat << _EOT_
956 $(package_entry)$DESC
957 _EOT_
958 done
959 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
960 for vpkg in $vpkgs ; do
961 cat << _EOT_
962 </table>
964 <h3>$(eval_gettext "Result for: \$SEARCH (package providing \$vpkg)")</h3>
965 <table>
966 _EOT_
967 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
968 . $WOK/${pkg#*:}/receipt
969 package_entry
970 done
971 done
972 cat << _EOT_
973 </table>
974 _EOT_
975 fi
976 ;;
977 esac
979 xhtml_footer
981 exit 0