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

pkgs: full i18n provided, russian translate added, please recheck other langs
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Apr 06 15:25:58 2012 +0300 (2012-04-06)
parents 0d73b41d5f08
children a870612e2065
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 #
6 renice 20
7 read QUERY_STRING
8 for i in $(echo $QUERY_STRING | sed 's/&/ /g'); do
9 i=$(httpd -d $i)
10 eval $i
11 done
12 LANG=$lang
13 SEARCH=$query
14 SLITAZ_VERSION=$version
15 OBJECT=$object
16 DATE=$(date +%Y-%m-%d\ %H:%M:%S)
17 VERSION=cooking
18 if [ "$REQUEST_METHOD" = "GET" ]; then
19 SEARCH=""
20 VERBOSE=0
21 for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do
22 # i=$(httpd -d $i)
23 SLITAZ_VERSION=cooking
24 case "$(echo $i | tr [A-Z] [a-z])" in
25 query=*|search=*)
26 [ ${i#*=} == Search ] || SEARCH=${i#*=};;
27 object=*)
28 OBJECT=${i#*=};;
29 verbose=*)
30 VERBOSE=${i#*=};;
31 lang=*)
32 LANG=${i#*=};;
33 file=*)
34 SEARCH=${i#*=}
35 OBJECT=File;;
36 desc=*)
37 SEARCH=${i#*=}
38 OBJECT=Desc;;
39 tags=*)
40 SEARCH=${i#*=}
41 OBJECT=Tags;;
42 receipt=*)
43 SEARCH=${i#*=}
44 OBJECT=Receipt;;
45 filelist=*)
46 SEARCH=${i#*=}
47 OBJECT=File_list;;
48 package=*)
49 SEARCH=${i#*=}
50 OBJECT=Package;;
51 depends=*)
52 SEARCH=${i#*=}
53 OBJECT=Depends;;
54 builddepends=*)
55 SEARCH=${i#*=}
56 OBJECT=BuildDepends;;
57 fileoverlap=*)
58 SEARCH=${i#*=}
59 OBJECT=FileOverlap;;
60 version=s*|version=3*)
61 SLITAZ_VERSION=stable;;
62 version=[1-9]*)
63 i=${i%%.*}
64 SLITAZ_VERSION=${i#*=}.0;;
65 version=u*)
66 SLITAZ_VERSION=undigest;;
67 esac
68 done
69 [ -n "$SEARCH" ] && REQUEST_METHOD="POST"
70 [ "$SEARCH" == "." ] && SEARCH=
71 fi
73 case "$OBJECT" in
74 File) selected_file="selected";;
75 Desc) selected_desc="selected";;
76 Tags) selected_tags="selected";;
77 Receipt) selected_receipt="selected";;
78 File_list) selected_file_list="selected";;
79 Depends) selected_depends="selected";;
80 BuildDepends) selected_build_depends="selected";;
81 FileOverlap) selected_overlap="selected";;
82 esac
84 case "$SLITAZ_VERSION" in
85 tiny) selected_tiny="selected";;
86 1.0) selected_1="selected";;
87 2.0) selected_2="selected";;
88 stable) selected_stable="selected";;
89 undigest) selected_undigest="selected";;
90 esac
92 # unescape query
93 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')"
95 if [ -z "$LANG" ]; then
96 for i in $(echo $HTTP_ACCEPT_LANGUAGE | sed 's/[,;]/ /g'); do
97 case "$i" in
98 fr|de|pt|ru|cn)
99 LANG=$i
100 break;;
101 esac
102 done
103 fi
105 # --- Search form
106 _package="Package"
107 _desc="Description"
108 _tags="Tags"
109 _receipt="Receipt"
110 _depends="Depends"
111 _bdepends="Build depends"
112 _file="File"
113 _file_list="File list"
114 _overlap="common files"
115 _cooking="cooking"
116 _search="Search"
117 # --- Titles
118 _noresult="No package $SEARCH"
119 _search_title="Search"
120 _depends_loops="Depends loops"
121 _deptree="Dependency tree for: $SEARCH"
122 _deptree_suggested="$_deptree (SUGGESTED)"
123 _rdeptree="Reverse dependency tree for: $SEARCH"
124 _bdepends_loops="Build depends loops"
125 _bdeplist="$SEARCH needs these packages to be built"
126 _rbdeplist="Packages who need $SEARCH to be built"
127 _overloading="Theses packages may overload files of $SEARCH"
128 _result="Result for: $SEARCH"
129 _result_providing="$_result (package providing %VPKG%)"
130 # --- Messages
131 _main_libs_warn="glibc-base and gcc-lib-base are implicit dependencies, <b>every</b> package is supposed to depend on them."
132 _description="description"
133 _pkgs_report="%PKGS% packages and %FILES% files in $SLITAZ_VERSION database"
134 # --- HTML Header
135 _h_title="SliTaz Packages - Search %SEARCH%"
137 case "$LANG" in
139 fr) _package="Paquet"
140 # _desc=
141 # _tags=
142 _receipt="Recette"
143 _depends="Dépendances"
144 _bdepends="Fabrication"
145 _file="Fichier"
146 _file_list="Liste des fichiers"
147 _overlap="Fichiers communs"
148 # _cooking=
149 _search="Recherche"
151 _noresult="Paquet $SEARCH introuvable"
152 _search_title="Search"
153 _depends_loops="Dépendances sans fin"
154 _deptree="Arbre des dépendances de $SEARCH"
155 _deptree_suggested="$_deptree (SUGGESTED)"
156 _rdeptree="Arbre inversé des dépendances de $SEARCH"
157 _bdepends_loops="Fabrication sans fin"
158 _bdeplist="$SEARCH a besion de ces paquets pour être fabriqué"
159 _rbdeplist="Paquets ayant besion de $SEARCH pour être fabriqués"
160 _overloading="Paquets pouvant écraser des fichiers de $SEARCH"
161 _result="Recherche de : $SEARCH"
162 _result_providing="$_result (package providing %VPKG%)"
164 _main_libs_warn=" glibc-base and gcc-lib-base are implicit dependencies,
165 <b>every</b> package is supposed to depend on them."
166 _description="description"
167 _pkgs_report="%PKGS% packages and %FILES% files in $SLITAZ_VERSION database"
168 ;;
170 de) _package="Paket"
171 _desc="Beschreibung"
172 # _tags=
173 # _receipt=
174 _depends="Abhängigkeiten"
175 # _bdepends=
176 _file="Datei"
177 _file_list="Datei liste"
178 # _overlap=
179 _cooking="Cooking"
180 _search="Suche"
182 _noresult="Kein Paket für $SEARCH"
183 _search_title="Search"
184 _depends_loops="Abhängigkeiten loops"
185 _deptree="Abhängigkeiten von: $SEARCH"
186 _deptree_suggested="$_deptree (SUGGESTED)"
187 _rdeptree="Abhängigkeit für: $SEARCH"
188 # _bdepends_loops=
189 # _bdeplist=
190 # _rbdeplist=
191 # _overloading=
192 _result="Resultate für : $SEARCH"
193 _result_providing="$_result (package providing %VPKG%)"
195 # _main_libs_warn=
196 # _description=
197 # _pkgs_report=
198 ;;
200 pt) _package="Pacote"
201 _desc="Descrição"
202 # _tags=
203 # _receipt=
204 _depends="Dependências"
205 # _bdepends=
206 _file="Arquivo"
207 _file_list="Arquivo lista"
208 # _overlap=
209 # _cooking=
210 _search="Buscar"
212 _noresult="Sem resultado: $SEARCH"
213 # _search_title=
214 _depends_loops="Dependências loops"
215 _deptree="Árvore de dependências para: $SEARCH"
216 _deptree_suggested="$_deptree (SUGGESTED)"
217 _rdeptree="Árvore de dependências reversa para: $SEARCH"
218 # _bdepends_loops=
219 # _bdeplist=
220 # _rbdeplist=
221 # _overloading=
222 _result="Resultado para : $SEARCH"
223 _result_providing="$_result (package providing %VPKG%)"
225 # _main_libs_warn=
226 # _description=
227 # _pkgs_report=
228 ;;
230 cn) _package="软件包:"
231 _desc="描述"
232 _tags="标签"
233 # _receipt=
234 _depends="依赖"
235 # _bdepends=
236 _file="文件"
237 _file_list="文件列表"
238 # _overlap=
239 _cooking="开发版"
240 # _search=
242 # _noresult=
243 # _search_title=
244 _depends_loops="依赖 loops"
245 # _deptree=
246 # _deptree_suggested=
247 # _rdeptree=
248 # _bdepends_loops=
249 # _bdeplist=
250 # _rbdeplist=
251 # _overloading=
252 # _result=
253 # _result_providing=
255 # _main_libs_warn=
256 # _description=
257 # _pkgs_report=
258 # _stable="稳定版"
259 ;;
261 ru) _package="пакет"
262 _desc="описание"
263 _tags="теги"
264 _receipt="рецепт"
265 _depends="зависимости"
266 _bdepends="зависимости сборки"
267 _file="файл"
268 _file_list="список файлов"
269 _overlap="общие файлы"
270 # _cooking=
271 _search="Искать"
273 _noresult="Пакет $SEARCH отсутствует"
274 _search_title="Поиск"
275 _depends_loops="Циклические зависимости"
276 _deptree="Дерево зависимостей для $SEARCH"
277 _deptree_suggested="Дерево необязательных зависимостей для $SEARCH"
278 _rdeptree="Обратное дерево зависимостей для $SEARCH"
279 _bdepends_loops="Циклические зависимости сборки"
280 _bdeplist="Следующие пакеты нужны, чтобы собрать $SEARCH"
281 _rbdeplist="$SEARCH нужен, чтобы собрать следующие пакеты"
282 _overloading="Следующие пакеты могут заменить файлы $SEARCH"
283 _result="Результаты поиска $SEARCH"
284 _result_providing="$_result (пакеты, предлагающие %VPKG%)"
286 _main_libs_warn="glibc-base и gcc-lib-base являются неявными зависимостями <b>любого</b> пакета."
287 _description="описание"
288 _pkgs_report="%PKGS% пакетов и %FILES% файлов в базе данных $SLITAZ_VERSION"
289 ;;
291 *) LANG="en";;
293 esac
295 WOK=/home/slitaz/$SLITAZ_VERSION/wok
296 PACKAGES_REPOSITORY=/home/slitaz/$SLITAZ_VERSION/packages
298 echo "Content-type: text/html"
299 echo
301 # Search form
302 search_form()
303 {
304 cat << _EOT_
306 <div style="text-align: center; padding: 20px;">
307 <form method="post" action="$(basename $SCRIPT_NAME)">
308 <input type="hidden" name="lang" value="$LANG" />
309 <select name="object">
310 <option value="Package">$_package</option>
311 <option $selected_desc value="Desc">$_desc</option>
312 <option $selected_tags value="Tags">$_tags</option>
313 <option $selected_receipt value="Receipt">$_receipt</option>
314 <option $selected_depends value="Depends">$_depends</option>
315 <option $selected_build_depends value="BuildDepends">$_bdepends</option>
316 <option $selected_file value="File">$_file</option>
317 <option $selected_file_list value="File_list">$_file_list</option>
318 <option $selected_overlap value="FileOverlap">$_overlap</option>
319 </select>
320 <input type="text" name="query" size="20" value="$SEARCH" />
321 <select name="version">
322 <option value="cooking">$_cooking</option>
323 <option $selected_stable value="stable">3.0</option>
324 <option $selected_2 value="2.0">2.0</option>
325 <option $selected_1 value="1.0">1.0</option>
326 <option $selected_tiny value="tiny">tiny</option>
327 <option $selected_undigest value="undigest">undigest</option>
328 </select>
329 <input type="submit" name="search" value="$_search" />
330 </form>
331 </div>
332 _EOT_
333 }
335 # xHTML Header.
336 xhtml_header() {
337 header=$(cat lib/header.html | sed s/'%SEARCH%'/"$SEARCH"/)
338 # header i18n
339 case "$LANG" in
340 pt)
341 header=$(echo "$header" | sed 's/SliTaz Packages/SliTaz Pacotes/g;s/Community/Comunidade/;s/Forum/Fórum');;
342 ru)
343 header=$(echo "$header" | sed 's/SliTaz Packages/Пакеты SliTaz/g;s/Home/Сайт/;s/Community/Сообщество/;s/Doc/Документация/;s/Forum/Форум/;s/Pro/PRO/;s/Shop/Магазин/;s/Bugs/Баг-трекер/');;
344 esac
345 echo "$header"
346 }
348 # xHTML Footer.
349 xhtml_footer() {
350 # Is it not too hard? (unlzma etc...) -- lexeii
351 PKGS=$(ls $WOK/ | wc -l)
352 FILES=$(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | wc -l)
353 cat << _EOT_
355 <center>
356 <i>$(echo $_pkgs_report | sed s/'%PKGS%'/"$PKGS"/ | sed s/'%FILES%'/"$FILES"/)</i>
357 </center>
359 _EOT_
360 cat lib/footer.html
361 }
363 installed_size()
364 {
365 [ $VERBOSE -gt 0 ] &&
366 grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | \
367 grep installed | sed 's/.*(\(.*\) installed.*/(\1) /'
368 }
370 package_entry()
371 {
372 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
373 cat << _EOT_
374 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
375 _EOT_
376 else
377 PACKAGE_HREF="<u>$PACKAGE</u>"
378 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
379 nslookup mirror.slitaz.org | grep -q 127.0.0.1 &&
380 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls $PACKAGE-$VERSION*.tazpkg)"
381 busybox wget -s $PACKAGE_URL 2> /dev/null &&
382 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
383 cat << _EOT_
384 $PACKAGE_HREF $(installed_size $PACKAGE): $SHORT_DESC
385 _EOT_
386 fi
387 }
389 # Show loop in depends/build_depends chains
390 show_loops()
391 {
392 awk '
393 function chkloop(pkg, i, n)
394 {
395 if (n < 8)
396 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
397 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
398 split(deps[pkg],curdep," ")
399 p = curdep[i] " " p
400 return 1
401 }
402 }
403 return 0
404 }
405 {
406 for (i = 2; i <= NF; i++)
407 deps[$1] = deps[$1] " " $i
408 }
409 END {
410 for (pkg in deps) {
411 base = pkg
412 p = ""
413 if (chkloop(pkg, 0, 0))
414 print pkg " " p
415 #print pkg " : " p "..."
416 }
417 }' | while read line; do
418 set -- $line
419 case " $last " in
420 *\ $1\ *) continue
421 esac
422 last="$line"
423 pkg=$1
424 shift
425 echo $pkg ":" $@ "..."
426 done
427 }
429 # recursive dependencies scan
430 dep_scan()
431 {
432 for i in $1; do
433 case " $ALL_DEPS " in
434 *\ $i\ *) continue;;
435 esac
436 ALL_DEPS="$ALL_DEPS $i"
437 if [ -n "$2" ]; then
438 echo -n "$2"
439 (
440 . $WOK/$i/receipt
441 package_entry
442 )
443 fi
444 [ -f $WOK/$i/receipt ] || continue
445 DEPENDS=""
446 BUILD_DEPENDS=""
447 WANTED=""
448 . $WOK/$i/receipt
449 if [ -n "$3" ]; then
450 [ -n "$BUILD_DEPENDS$WANTED" ] &&
451 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
452 else
453 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
454 fi
455 done
456 }
458 # recursive reverse dependencies scan
459 rdep_scan()
460 {
461 SEARCH=$1
462 case "$SEARCH" in
463 glibc-base|gcc-lib-base) echo $_main_libs_warn
464 return;;
465 esac
466 for i in $WOK/* ; do
467 DEPENDS=""
468 BUILD_DEPENDS=""
469 WANTED=""
470 . $i/receipt
471 if [ -n "$2" ]; then
472 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
473 else
474 echo "$(basename $i) $(echo $DEPENDS)"
475 fi
476 done | awk -v search=$SEARCH '
477 function show_deps(deps, all_deps, pkg, space)
478 {
479 if (all_deps[pkg] == 1) return
480 all_deps[pkg] = 1
481 if (space != "") printf "%s%s\n",space,pkg
482 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
483 show_deps(deps, all_deps, mydeps[i],"////" space)
484 }
485 }
487 {
488 all_deps[$1] = 0
489 for (i = 2; i <= NF; i++)
490 deps[$i] = deps[$i] " " $1
491 }
493 END {
494 show_deps(deps, all_deps, search, "")
495 }
496 ' | while read pkg; do
497 . $WOK/${pkg##*/}/receipt
498 cat << _EOT_
499 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry)
500 _EOT_
501 done
502 }
504 # Check package exists
505 package_exist()
506 {
507 [ -f $WOK/$1/receipt ] && return 0
508 cat << _EOT_
510 <h3>$_noresult</h3>
511 <pre>
512 _EOT_
513 return 1
514 }
516 # Display < > &
517 htmlize()
518 {
519 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
520 }
522 echonb()
523 {
524 read n
525 echo -n "$n $1"
526 [ $n -gt 1 ] && echo -n s
527 }
529 display_packages_and_files()
530 {
531 last=""
532 while read pkg file; do
533 pkg=${pkg%:}
534 if [ "$pkg" != "$last" ]; then
535 . $WOK/$pkg/receipt
537 package_entry
538 last=$pkg
539 fi
540 echo " $file"
541 done
542 }
544 # Display search form and result if requested.
545 if [ "$REQUEST_METHOD" != "POST" ]; then
546 xhtml_header
547 cat << _EOT_
549 <!-- Content -->
550 <div id="content">
551 <a name="content"></a>
553 <h2>$_search_title</h2>
554 _EOT_
555 search_form
556 xhtml_footer
557 else
558 xhtml_header
559 cat << _EOT_
561 <!-- Content -->
562 <div id="content">
563 <a name="content"></a>
565 <h2>$_search_title</h2>
566 _EOT_
567 search_form
568 if [ "$OBJECT" = "Depends" ]; then
569 if [ -z "$SEARCH" ]; then
570 cat << _EOT_
572 <h3>$_depends_loops</h3>
573 <pre>
574 _EOT_
575 for i in $WOK/*/receipt; do
576 PACKAGE=
577 DEPENDS=
578 . $i
579 echo "$PACKAGE $(echo $DEPENDS)"
580 done | show_loops
581 cat << _EOT_
582 </pre>
583 _EOT_
584 elif package_exist $SEARCH ; then
585 cat << _EOT_
587 <h3>$_deptree</h3>
588 <pre>
589 _EOT_
590 ALL_DEPS=""
591 dep_scan $SEARCH ""
592 SUGGESTED=""
593 . $WOK/$SEARCH/receipt
594 if [ -n "$SUGGESTED" ]; then
595 cat << _EOT_
596 </pre>
598 <h3>$_deptree_suggested</h3>
599 <pre>
600 _EOT_
601 ALL_DEPS=""
602 dep_scan "$SUGGESTED" " "
603 fi
604 cat << _EOT_
605 </pre>
607 <h3>$_rdeptree</h3>
608 <pre>
609 _EOT_
610 ALL_DEPS=""
611 rdep_scan $SEARCH
612 cat << _EOT_
613 </pre>
614 _EOT_
615 fi
616 elif [ "$OBJECT" = "BuildDepends" ]; then
617 if [ -z "$SEARCH" ]; then
618 cat << _EOT_
620 <h3>$_bdepends_loops</h3>
621 <pre>
622 _EOT_
623 for i in $WOK/*/receipt; do
624 PACKAGE=
625 WANTED=
626 BUILD_DEPENDS=
627 . $i
628 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
629 done | show_loops
630 cat << _EOT_
631 </pre>
632 _EOT_
633 elif package_exist $SEARCH ; then
634 cat << _EOT_
636 <h3>$_bdeplist</h3>
637 <pre>
638 _EOT_
639 ALL_DEPS=""
640 dep_scan $SEARCH "" build
641 cat << _EOT_
642 </pre>
644 <h3>$_rbdeplist</h3>
645 <pre>
646 _EOT_
647 ALL_DEPS=""
648 rdep_scan $SEARCH build
649 cat << _EOT_
650 </pre>
651 _EOT_
652 fi
653 elif [ "$OBJECT" = "FileOverlap" ]; then
654 if package_exist $SEARCH ; then
655 cat << _EOT_
657 <h3>$_overloading</h3>
658 <pre>
659 _EOT_
660 ( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ;
661 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk '
662 BEGIN { pkg=""; last="x" }
663 {
664 if ($2 == "") next
665 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
666 delete file[last]
667 last=$2
668 if (pkg == "") pkg=$1
669 if ($1 == pkg) file[$2]=$1
670 else if (file[$2] == pkg) print
671 }
672 ' | display_packages_and_files
673 cat << _EOT_
674 </pre>
675 _EOT_
676 fi
677 elif [ "$OBJECT" = "File" ]; then
678 cat << _EOT_
680 <h3>$_result</h3>
681 <pre>
682 _EOT_
683 last=""
684 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
685 | grep "$SEARCH" | while read pkg file; do
686 echo "$file" | grep -q "$SEARCH" || continue
687 if [ "$last" != "${pkg%:}" ]; then
688 last=${pkg%:}
689 (
690 . $WOK/$last/receipt
691 cat << _EOT_
693 <i>$(package_entry)</i>
694 _EOT_
695 )
696 fi
697 echo " $file"
698 done
699 elif [ "$OBJECT" = "File_list" ]; then
700 if package_exist $SEARCH; then
701 cat << _EOT_
703 <h3>$_result</h3>
704 <pre>
705 _EOT_
706 last=""
707 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
708 | grep ^$SEARCH: | sed 's/.*: / /' | sort
709 cat << _EOT_
710 </pre>
711 <pre>
712 $(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: | wc -l | echonb file) \
713 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt)
714 _EOT_
715 fi
716 elif [ "$OBJECT" = "Desc" ]; then
717 if [ -f $WOK/$SEARCH/description.txt ]; then
718 cat << _EOT_
720 <h3>$_result</h3>
721 <pre>
722 $(htmlize < $WOK/$SEARCH/description.txt)
723 </pre>
724 _EOT_
725 else
726 cat << _EOT_
728 <h3>$_result</h3>
729 <pre>
730 _EOT_
731 last=""
732 grep -i "$SEARCH" $PACKAGES_REPOSITORY/packages.desc | \
733 sort | while read pkg extras ; do
734 . $WOK/$pkg/receipt
735 package_entry
736 done
737 fi
738 elif [ "$OBJECT" = "Tags" ]; then
739 cat << _EOT_
741 <h3>$_result</h3>
742 <pre>
743 _EOT_
744 last=""
745 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
746 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
747 . $WOK/$pkg/receipt
748 package_entry
749 done
750 elif [ "$OBJECT" = "Receipt" ]; then
751 package_exist $SEARCH && cat << _EOT_
753 <h3>$_result</h3>
754 <pre>
755 $(if [ -f $WOK/$SEARCH/taz/*/receipt ]; then
756 cat $WOK/$SEARCH/taz/*/receipt
757 else
758 cat $WOK/$SEARCH/receipt
759 fi | htmlize)
760 </pre>
761 _EOT_
762 else
763 cat << _EOT_
765 <h3>$_result</h3>
766 <pre>
767 _EOT_
768 for pkg in `ls $WOK/ | grep "$SEARCH"`
769 do
770 . $WOK/$pkg/receipt
771 DESC=" <a href=\"?desc=$pkg\">$_description</a>"
772 [ -f $WOK/$pkg/description.txt ] || DESC=""
773 cat << _EOT_
774 $(package_entry)$DESC
775 _EOT_
776 done
777 equiv=$PACKAGES_REPOSITORY/packages.equiv
778 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
779 for vpkg in $vpkgs ; do
780 cat << _EOT_
781 </pre>
783 <h3>$(echo $_result_providing | sed s/'%VPKG%'/"$vpkg"/)</h3>
784 <pre>
785 _EOT_
786 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
787 . $WOK/${pkg#*:}/receipt
788 package_entry
789 done
790 done
791 fi
792 cat << _EOT_
793 </pre>
794 _EOT_
795 xhtml_footer
796 fi
798 exit 0