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

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