slitaz-forge view pkgs/mirror-search.sh @ rev 321

mirror-search.sh: be less cpu hungry...
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Jul 26 21:12:07 2012 +0200 (2012-07-26)
parents 26343c8fe3a2
children b4b47a61fb4b
line source
1 #!/bin/sh
3 # Tiny CGI search engine for SliTaz packages on http://pkgs.slitaz.org/
4 # Christophe Lincoln <pankso@slitaz.org>
5 # Pascal Bellard <pascal.bellard@slitaz.org>
6 # Aleksej Bobylev <al.bobylev@gmail.com>
7 #
9 renice -n 19 $$
11 # Parse query string
12 . /usr/lib/slitaz/httphelper.sh
15 # User preferred language
16 # parameter $1 have priority; without parameter $1 - browser language only
17 # if we don't support any of user languages (or only en), then return C locale
18 user_lang() {
19 LANG="C"
20 IFS=","
21 for lang in $1 $HTTP_ACCEPT_LANGUAGE
22 do
23 lang=${lang%;*} lang=${lang# } lang=${lang%-*} lang=${lang%_*}
24 case "$lang" in
25 de) LANG="de_DE" ;;
26 es) LANG="es_ES" ;;
27 fr) LANG="fr_FR" ;;
28 it) LANG="it_IT" ;;
29 pt) LANG="pt_BR" ;;
30 ru) LANG="ru_RU" ;;
31 zh) LANG="zh_TW" ;;
32 esac
33 if echo "de en fr pt ru zh" | fgrep -q "$lang"; then
34 break
35 fi
36 done
37 unset IFS
38 echo "$LANG"
39 }
41 # Short 2-letter lang code from ll_CC
42 ll_lang() {
43 ll_CC="$1"
44 echo ${ll_CC%_*}
45 }
47 # Nice URL replacer - to copy url from address bar
48 # TODO: deal with POST method of form submitting
49 nice_url() {
50 # if user submitted a form
51 if [ ! -z $(GET submit) ]; then
52 OBJECT="$(GET object)"
53 SEARCH="$(GET query)"
54 case $OBJECT in
55 Package) NICE="package=$SEARCH";;
56 Desc) NICE="desc=$SEARCH";;
57 Tags) NICE="tags=$SEARCH";;
58 Receipt) NICE="receipt=$SEARCH";;
59 Depends) NICE="depends=$SEARCH";;
60 BuildDepends) NICE="builddepends=$SEARCH";;
61 File) NICE="file=$SEARCH";;
62 File_list) NICE="filelist=$SEARCH";;
63 FileOverlap) NICE="fileoverlap=$SEARCH";;
64 esac
65 # version, if needed
66 version="$(GET version)"
67 if [ ! -z "$version" -a "$version" != "cooking" ]; then
68 NICE="${NICE}&version=${version:0:1}"
69 fi
70 # lang, if needed
71 query_lang="$(GET lang)"
72 pref_lang="$(user_lang)"
73 browser_lang="$(ll_lang $pref_lang)"
74 if [ ! -z "$query_lang" -a "$query_lang" != "$browser_lang" ]; then
75 NICE="${NICE}&lang=$query_lang"
76 fi
77 # verbose, if needed
78 verboseq="$(GET verbose)"
79 if [ ! -z "$verboseq" -a "$verboseq" != "0" ]; then
80 NICE="${NICE}&verbose=1"
81 fi
82 # redirect
83 # TODO: implement HTTP 301 Redirect
84 cat << EOT
85 Content-type: text/html
87 <!DOCTYPE html>
88 <html><head><meta http-equiv="refresh" content="0;url=$SCRIPT_NAME?$NICE" />
89 <title>Redirect</title></head></html>
90 EOT
91 # echo "Location: $SCRIPT_NAME?$NICE"
92 # echo
93 exit 0
94 fi
95 }
97 nice_url
101 OBJECT="$(GET object)"
102 SEARCH="$(GET query)"
103 SLITAZ_VERSION="$(GET version)"
104 VERBOSE="$(GET verbose)"
106 # Internal variables
107 #DATE=$(date +%Y-%m-%d\ %H:%M:%S)
109 # Internationalization
110 . /usr/bin/gettext.sh
111 export TEXTDOMAIN='tazpkg-web'
113 SEARCH=""
114 VERBOSE=0
115 for i in $(echo $QUERY_STRING | sed 's/[?&]/ /g'); do
116 # SLITAZ_VERSION=cooking
117 case "$(echo $i | tr [A-Z] [a-z])" in
118 query=*|search=*) [ ${i#*=} == Search ] || SEARCH=${i#*=};;
119 object=*) OBJECT=${i#*=};;
120 verbose=*) VERBOSE=${i#*=};;
121 lang=*) LANG=${i#*=};;
122 file=*) SEARCH=${i#*=}; OBJECT=File;;
123 desc=*) SEARCH=${i#*=}; OBJECT=Desc;;
124 tags=*) SEARCH=${i#*=}; OBJECT=Tags;;
125 receipt=*) SEARCH=${i#*=}; OBJECT=Receipt;;
126 filelist=*) SEARCH=${i#*=}; OBJECT=File_list;;
127 package=*) SEARCH=${i#*=}; OBJECT=Package;;
128 depends=*) SEARCH=${i#*=}; OBJECT=Depends;;
129 builddepends=*) SEARCH=${i#*=}; OBJECT=BuildDepends;;
130 fileoverlap=*) SEARCH=${i#*=}; OBJECT=FileOverlap;;
131 category=*) SEARCH=${i#*=}; OBJECT=Category;;
132 maintainer=*) SEARCH=${i#*=}; OBJECT=Maintainer;;
133 version=[1-9]*) i=${i%%.*}; SLITAZ_VERSION=${i#*=}.0;;
134 version=s*|version=4*) SLITAZ_VERSION=stable;;
135 version=u*) SLITAZ_VERSION=undigest;;
136 version=t*) SLITAZ_VERSION=tiny;;
137 esac
138 done
139 [ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION=cooking
140 #[ -n "$SEARCH" ] && REQUEST_METHOD="POST"
141 #[ "$SEARCH" == "." ] && SEARCH=
144 # Content negotiation for Gettext
145 LANG=$(user_lang $(GET lang))
146 lang="$(ll_lang $LANG)"
147 export LANG LC_ALL=$LANG
150 case "$OBJECT" in
151 File) selected_file="selected";;
152 Desc) selected_desc="selected";;
153 Tags) selected_tags="selected";;
154 Receipt) selected_receipt="selected";;
155 File_list) selected_file_list="selected";;
156 Depends) selected_depends="selected";;
157 BuildDepends) selected_build_depends="selected";;
158 FileOverlap) selected_overlap="selected";;
159 esac
161 case "$SLITAZ_VERSION" in
162 tiny) selected_tiny="selected";;
163 1.0) selected_1="selected";;
164 2.0) selected_2="selected";;
165 3.0) selected_3="selected";;
166 stable) selected_stable="selected";;
167 undigest) selected_undigest="selected";;
168 esac
170 # unescape query
171 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g; s/%3A/:/g; s|%2F|/|g')"
173 WOK=/home/slitaz/$SLITAZ_VERSION/wok
174 PACKAGES_REPOSITORY=/home/slitaz/$SLITAZ_VERSION/packages
177 # TODO: header function from httphelper
178 echo "Content-type: text/html"
179 echo
181 # Search form
182 # TODO: implement POST method
183 # ... method="post" enctype="multipart/form-data" ...
184 # TODO: add hint 'You are can search for depends loop, if textfield is empty'...
185 # add progress ticker while page is not complete
186 search_form()
187 {
188 cat << _EOT_
190 <form id="s_form" method="get" action="$SCRIPT_NAME">
191 <input type="hidden" name="lang" value="$lang" />
192 <select name="object">
193 <option value="Package">$(gettext "Package")</option>
194 <option $selected_desc value="Desc">$(gettext "Description")</option>
195 <option $selected_tags value="Tags">$(gettext "Tags")</option>
196 <option $selected_receipt value="Receipt">$(gettext "Receipt")</option>
197 <option $selected_depends value="Depends">$(gettext "Depends")</option>
198 <option $selected_build_depends value="BuildDepends">$(gettext "Build depends")</option>
199 <option $selected_file value="File">$(gettext "File")</option>
200 <option $selected_file_list value="File_list">$(gettext "File list")</option>
201 <option $selected_overlap value="FileOverlap">$(gettext "common files")</option>
202 </select>
203 <input type="text" name="query" id="query" size="20" value="$SEARCH" />
204 <select name="version">
205 <option value="cooking">$(gettext "cooking")</option>
206 <option $selected_stable value="stable">4.0</option>
207 <option $selected_3 value="3.0">3.0</option>
208 <option $selected_2 value="2.0">2.0</option>
209 <option $selected_1 value="1.0">1.0</option>
210 <option $selected_tiny value="tiny">$(gettext "tiny")</option>
211 <option $selected_undigest value="undigest">$(gettext "undigest")</option>
212 </select>
213 <input type="submit" name="submit" value="$(gettext 'Search')" />
214 </form>
215 _EOT_
216 }
218 # xHTML5 Header.
219 xhtml_header() {
220 . lib/header.sh
221 }
223 cat_files_list()
224 {
225 local tmp=/tmp/files.list.$(basename ${1%/packages})
226 if [ ! -s $tmp -o $1/files.list.lzma -nt $tmp ]; then
227 unlzma -c $1/files.list.lzma > $tmp.$$ && mv $tmp.$$ $tmp
228 fi
229 case "$2" in
230 lines) if [ ! -s $tmp.lines -o $tmp -nt $tmp.lines ]; then
231 cat $tmp | wc -l > $tmp.lines.$$ &&
232 mv $tmp.lines.$$ $tmp.lines
233 fi
234 cat $tmp.lines ;;
235 *) cat $tmp ;;
236 esac
237 }
239 # xHTML Footer.
240 # TODO: caching the summary for 5 minutes
241 xhtml_footer() {
242 PKGS=$(ls $WOK/ | wc -l)
243 FILES=$(cat_files_list $PACKAGES_REPOSITORY lines)
244 . lib/footer.sh
245 }
247 installed_size()
248 {
249 if [ $VERBOSE -gt 0 ]; then
250 inst=$(grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | grep installed)
251 # size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1)
252 echo $inst | sed 's/.*(\(.*\).*/(\1)/'
253 # echo $size
254 # | sed 's/.*(\(.*\) installed.*/(\1) /'
255 fi
256 }
258 package_entry()
259 {
260 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
261 cat << _EOT_
262 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
263 _EOT_
264 else
265 PACKAGE_HREF="<u>$PACKAGE</u>"
266 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
267 nslookup mirror.slitaz.org | grep -q 127.0.0.1 &&
268 [ -d /var/www/slitaz/mirror/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION ] &&
269 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION" ||
270 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls $PACKAGE-$VERSION*.tazpkg)"
271 busybox wget -s $PACKAGE_URL 2> /dev/null &&
272 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
273 cat << _EOT_
274 $PACKAGE_HREF $(installed_size $PACKAGE): $SHORT_DESC
275 _EOT_
276 fi
277 [ -n "$(GET debug)" ] && cat << _EOT_
278 <pre>
279 PACKAGE=$PACKAGE
280 VERSION=$VERSION
281 EXTRAVERSION=$EXTRAVERSION
282 SLITAZ_VERSION=$SLITAZ_VERSION
283 PACKAGE_URL=$PACKAGE_URL
284 $(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls -l $PACKAGE*)
285 </pre>
286 _EOT_
287 }
289 # Show loop in depends/build_depends chains
290 show_loops()
291 {
292 awk '
293 function chkloop(pkg, i, n)
294 {
295 if (n < 8)
296 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
297 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
298 split(deps[pkg],curdep," ")
299 p = curdep[i] " " p
300 return 1
301 }
302 }
303 return 0
304 }
305 {
306 for (i = 2; i <= NF; i++)
307 deps[$1] = deps[$1] " " $i
308 }
309 END {
310 for (pkg in deps) {
311 base = pkg
312 p = ""
313 if (chkloop(pkg, 0, 0))
314 print pkg " " p
315 #print pkg " : " p "..."
316 }
317 }' | while read line; do
318 set -- $line
319 case " $last " in
320 *\ $1\ *) continue
321 esac
322 last="$line"
323 pkg=$1
324 shift
325 echo "<strong>$pkg </strong>: $@ ..."
326 done
327 }
329 # recursive dependencies scan
330 dep_scan()
331 {
332 for i in $1; do
333 case " $ALL_DEPS " in
334 *\ $i\ *) continue;;
335 esac
336 ALL_DEPS="$ALL_DEPS $i"
337 if [ -n "$2" ]; then
338 echo -n "$2"
339 (
340 . $WOK/$i/receipt
341 package_entry
342 )
343 fi
344 [ -f $WOK/$i/receipt ] || continue
345 DEPENDS=""
346 BUILD_DEPENDS=""
347 WANTED=""
348 . $WOK/$i/receipt
349 if [ -n "$3" ]; then
350 [ -n "$BUILD_DEPENDS$WANTED" ] &&
351 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
352 else
353 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
354 fi
355 done
356 }
358 # recursive reverse dependencies scan
359 rdep_scan()
360 {
361 SEARCH=$1
362 case "$SEARCH" in
363 glibc-base|gcc-lib-base)
364 $(gettext " glibc-base and gcc-lib-base are implicit dependencies,
365 <b>every</b> package is supposed to depend on them."); echo
366 return;;
367 esac
368 for i in $WOK/* ; do
369 DEPENDS=""
370 BUILD_DEPENDS=""
371 WANTED=""
372 . $i/receipt
373 if [ -n "$2" ]; then
374 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
375 else
376 echo "$(basename $i) $(echo $DEPENDS)"
377 fi
378 done | awk -v search=$SEARCH '
379 function show_deps(deps, all_deps, pkg, space)
380 {
381 if (all_deps[pkg] == 1) return
382 all_deps[pkg] = 1
383 if (space != "") printf "%s%s\n",space,pkg
384 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
385 show_deps(deps, all_deps, mydeps[i],"////" space)
386 }
387 }
389 {
390 all_deps[$1] = 0
391 for (i = 2; i <= NF; i++)
392 deps[$i] = deps[$i] " " $1
393 }
395 END {
396 show_deps(deps, all_deps, search, "")
397 }
398 ' | while read pkg; do
399 . $WOK/${pkg##*/}/receipt
400 cat << _EOT_
401 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry)
402 _EOT_
403 done
404 }
406 # Check package exists
407 package_exist()
408 {
409 [ -f $WOK/$1/receipt ] && return 0
410 cat << _EOT_
412 <h3>$(eval_gettext "No package \$SEARCH")</h3>
413 _EOT_
414 return 1
415 }
417 # Display < > &
418 htmlize()
419 {
420 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
421 }
423 display_packages_and_files()
424 {
425 last=""
426 while read pkg file; do
427 pkg=${pkg%:}
428 if [ "$pkg" != "$last" ]; then
429 . $WOK/$pkg/receipt
430 package_entry
431 last=$pkg
432 fi
433 echo " $file"
434 done
435 }
437 build_cloud_cache()
438 {
439 grep -l ^$1= $WOK/*/receipt | while read file; do
440 eval $1=
441 . $file
442 eval echo \$$1
443 done | sed "$2" | awk '
444 {
445 for (i = 1; $i != ""; i++) {
446 count[$i]++
447 }
448 }
449 END {
450 min=10000
451 max=0
452 for (i in count) {
453 if (count[i] < min) min = count[i]
454 if (count[i] > max) max = count[i]
455 }
456 for (i in count)
457 print count[i] " " int((count[i] - min)*100/(max - min)) " " i
458 }' | sort -k 3
459 }
461 display_cloud()
462 {
463 echo "<p>"
464 while read cnt pct item ; do
465 cat <<EOT
466 <span style="color:#99f; font-size:9pt; padding-left:5px; padding-right:2px;">\
467 $cnt</span><a href="?$1=$item&amp;version=$SLITAZ_VERSION" style="\
468 font-size:$((8+($pct/10)))pt; font-weight:bold; \
469 color:black; text-decoration:none">$(echo $item | sed 's/-/\&minus;/g')</a>
470 EOT
471 done
472 echo "</p>"
473 }
475 xhtml_header
477 #
478 # Handle GET requests
479 #
480 case " $(GET) " in
481 *\ debug\ *|*\ debug*)
482 cat << EOT
483 <h2>Debug info</h2>
484 <pre>$(httpinfo)</pre>
485 <pre>LANG=$LANG;
486 OBJECT=$OBJECT;
487 SEARCH=$SEARCH;
488 SLITAZ_VERSION=$SLITAZ_VERSION;
489 WOK=$WOK;
490 </pre>
491 EOT
492 #$(xhtml_footer)
493 #EOT
494 # exit 0
495 ;;
496 esac
498 # Display search form and result if requested.
499 #xhtml_header
500 echo "<h2>$(gettext 'Search for packages')</h2>"
501 search_form
503 case "$OBJECT" in
506 ### Depends loops; [Reverse] Dependency tree [(SUGGESTED)]
507 Depends)
508 if [ -z "$SEARCH" ]; then
509 cat << _EOT_
511 <h3>$(gettext "Depends loops")</h3>
512 <pre>
513 _EOT_
514 for i in $WOK/*/receipt; do
515 PACKAGE=
516 DEPENDS=
517 . $i
518 echo "$PACKAGE $(echo $DEPENDS)"
519 done | show_loops
520 cat << _EOT_
521 </pre>
522 _EOT_
523 elif package_exist $SEARCH ; then
524 cat << _EOT_
526 <h3>$(eval_gettext "Dependency tree for: \$SEARCH")</h3>
527 <pre>
528 _EOT_
529 ALL_DEPS=""
530 dep_scan $SEARCH ""
531 SUGGESTED=""
532 . $WOK/$SEARCH/receipt
533 if [ -n "$SUGGESTED" ]; then
534 cat << _EOT_
535 </pre>
537 <h3>$(eval_gettext "Dependency tree for: \$SEARCH (SUGGESTED)")</h3>
538 <pre>
539 _EOT_
540 ALL_DEPS=""
541 dep_scan "$SUGGESTED" " "
542 fi
543 cat << _EOT_
544 </pre>
546 <h3>$(eval_gettext "Reverse dependency tree for: \$SEARCH")</h3>
547 <pre>
548 _EOT_
549 ALL_DEPS=""
550 rdep_scan $SEARCH
551 cat << _EOT_
552 </pre>
553 _EOT_
554 fi
555 ;;
558 ### Build depends loops; [Reverse] Build dependency tree
559 BuildDepends)
560 if [ -z "$SEARCH" ]; then
561 cat << _EOT_
563 <h3>$(gettext "Build depends loops")</h3>
564 <pre>
565 _EOT_
566 for i in $WOK/*/receipt; do
567 PACKAGE=
568 WANTED=
569 BUILD_DEPENDS=
570 . $i
571 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
572 done | show_loops
573 cat << _EOT_
574 </pre>
575 _EOT_
576 elif package_exist $SEARCH ; then
577 cat << _EOT_
579 <h3>$(eval_gettext "\$SEARCH needs these packages to be built")</h3>
580 <pre>
581 _EOT_
582 ALL_DEPS=""
583 dep_scan $SEARCH "" build
584 cat << _EOT_
585 </pre>
587 <h3>$(eval_gettext "Packages who need \$SEARCH to be built")</h3>
588 <pre>
589 _EOT_
590 ALL_DEPS=""
591 rdep_scan $SEARCH build
592 cat << _EOT_
593 </pre>
594 _EOT_
595 fi
596 ;;
599 ### Common files
600 FileOverlap)
601 if package_exist $SEARCH; then
602 cat << _EOT_
604 <h3>$(eval_gettext "These packages may overload files of \$SEARCH")</h3>
605 <pre>
606 _EOT_
607 ( cat_files_list $PACKAGES_REPOSITORY | grep ^$SEARCH: ;
608 cat_files_list $PACKAGES_REPOSITORY | grep -v ^$SEARCH: ) | awk '
609 BEGIN { pkg=""; last="x" }
610 {
611 if ($2 == "") next
612 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
613 delete file[last]
614 last=$2
615 if (pkg == "") pkg=$1
616 if ($1 == pkg) file[$2]=$1
617 else if (file[$2] == pkg) print
618 }
619 ' | display_packages_and_files
620 cat << _EOT_
621 </pre>
622 _EOT_
623 fi
624 ;;
627 ### File search
628 File)
629 if [ -n "$SEARCH" ]; then
630 cat << _EOT_
632 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
633 <pre>
634 _EOT_
635 last=""
636 cat_files_list $PACKAGES_REPOSITORY \
637 | grep "$SEARCH" | while read pkg file; do
638 echo "$file" | grep -q "$SEARCH" || continue
639 if [ "$last" != "${pkg%:}" ]; then
640 last=${pkg%:}
641 (
642 . $WOK/$last/receipt
643 cat << _EOT_
645 <i>$(package_entry)</i>
646 _EOT_
647 )
648 fi
649 echo " $file"
650 done
651 cat << _EOT_
652 </pre>
653 _EOT_
654 fi
655 ;;
658 ### List of files
659 File_list)
660 if package_exist $SEARCH; then
661 cat << _EOT_
663 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
664 <pre>
665 _EOT_
666 last=""
667 cat_files_list $PACKAGES_REPOSITORY \
668 | grep ^$SEARCH: | sed 's/.*: / /' | sort
669 cat << _EOT_
670 </pre>
671 <pre>
672 _EOT_
673 filenb=$(cat_files_list $PACKAGES_REPOSITORY | grep ^$SEARCH: | wc -l)
674 eval_ngettext "\$filenb file" "\$filenb files" $filenb
675 cat << _EOT_
676 \
677 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt)
678 </pre>
679 _EOT_
680 fi
681 ;;
684 ### Package description
685 Desc)
686 if [ -f $WOK/$SEARCH/description.txt ]; then
687 cat << _EOT_
689 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
690 <pre>
691 $(htmlize < $WOK/$SEARCH/description.txt)
692 </pre>
693 _EOT_
694 else
695 cat << _EOT_
697 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
698 <pre>
699 _EOT_
700 last=""
701 grep -i "$SEARCH" $PACKAGES_REPOSITORY/packages.desc | \
702 sort | while read pkg extras ; do
703 . $WOK/$pkg/receipt
704 package_entry
705 done
706 cat << _EOT_
707 </pre>
708 _EOT_
709 fi
710 ;;
713 ### Tags
714 Tags)
715 if [ -n "$SEARCH" ]; then
716 cat << _EOT_
718 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
719 <pre>
720 _EOT_
721 last=""
722 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
723 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
724 TAGS=
725 . $WOK/$pkg/receipt
726 echo " $TAGS " | grep -iq " $SEARCH " &&
727 package_entry
728 done
729 cat << _EOT_
730 </pre>
731 _EOT_
732 else
733 # Display clouds
734 while read var arg title filter; do
735 file=/tmp/$arg-$SLITAZ_VERSION
736 echo "<a name=\"$arg\"></a>"
737 echo "<h3>$title</h3>"
738 [ ! -e $file -o \
739 $PACKAGES_REPOSITORY/packages.txt -nt $file ] &&
740 build_cloud_cache $var "$filter" > $file.$$ &&
741 mv $file.$$ $file
742 display_cloud $arg < $file
743 done << EOT
744 TAGS tags Tag\ cloud
745 CATEGORY category Category\ cloud
746 MAINTAINER maintainer Maintainer\ cloud s/.*<//;s/.*\ //;s/>//
747 EOT
748 fi
749 ;;
752 ### Package receipt
753 # TODO: add style highlighting
754 Receipt)
755 package_exist $SEARCH && cat << _EOT_
757 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
758 <pre>
759 $(if [ -f $WOK/$SEARCH/taz/*/receipt ]; then
760 cat $WOK/$SEARCH/taz/*/receipt
761 else
762 cat $WOK/$SEARCH/receipt
763 fi | htmlize)
764 </pre>
765 _EOT_
766 ;;
769 ### Package
770 Package)
771 #WHY# if package_exist $SEARCH; then
772 cat << _EOT_
774 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
775 <pre>
776 _EOT_
777 for pkg in `ls $WOK/ | grep "$SEARCH"`
778 do
779 . $WOK/$pkg/receipt
780 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>"
781 [ -f $WOK/$pkg/description.txt ] || DESC=""
782 cat << _EOT_
783 $(package_entry)$DESC
784 _EOT_
785 done
786 equiv=$PACKAGES_REPOSITORY/packages.equiv
787 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
788 for vpkg in $vpkgs ; do
789 cat << _EOT_
790 </pre>
792 <h3>$(eval_gettext "Result for: \$SEARCH (package providing \$vpkg)")</h3>
793 <pre>
794 _EOT_
795 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
796 . $WOK/${pkg#*:}/receipt
797 package_entry
798 done
799 done
800 cat << _EOT_
801 </pre>
802 _EOT_
803 #WHY# fi
804 ;;
806 ### Category
807 Category)
808 cat << _EOT_
810 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
811 <pre>
812 _EOT_
813 for pkg in `ls $WOK/`
814 do
815 CATEGORY=
816 . $WOK/$pkg/receipt
817 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>"
818 [ -f $WOK/$pkg/description.txt ] || DESC=""
819 [ "$CATEGORY" == "$SEARCH" ] && cat << _EOT_
820 $(package_entry)$DESC
821 _EOT_
822 done
823 ;;
825 ### Maintainer
826 Maintainer)
827 cat << _EOT_
829 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
830 <pre>
831 _EOT_
832 for pkg in `ls $WOK/`
833 do
834 MAINTAINER=
835 . $WOK/$pkg/receipt
836 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>"
837 [ -f $WOK/$pkg/description.txt ] || DESC=""
838 [ "$MAINTAINER" == "$SEARCH" ] && cat << _EOT_
839 $(package_entry)$DESC
840 _EOT_
841 done
842 ;;
843 esac
845 xhtml_footer
847 exit 0