slitaz-dev-tools view tazpkg-web/search.cgi @ rev 309

Remove ashism ==
author Pascal Bellard <pascal.bellard@slitaz.org>
date Tue Feb 26 08:23:49 2019 +0100 (2019-02-26)
parents 8ce6c56c13a5
children
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 [ -f "/etc/slitaz/tazpkg-web.conf" ] && . /etc/slitaz/tazpkg-web.conf
7 [ -f "tazpkg-web.conf" ] && . ./tazpkg-web.conf
9 read QUERY_STRING
10 for i in $(echo $QUERY_STRING | sed 's/&/ /g'); do
11 i=$(httpd -d $i)
12 eval $i
13 done
14 LANG=$lang
15 SEARCH=$query
16 SLITAZ_VERSION=$version
17 OBJECT=$object
18 DATE=`date +%Y-%m-%d\ %H:%M:%S`
19 VERSION=cooking
20 if [ "$REQUEST_METHOD" = "GET" ]; then
21 SEARCH=""
22 VERBOSE=0
23 for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do
24 # i=$(httpd -d $i)
25 SLITAZ_VERSION=cooking
26 case "$(echo $i | tr [A-Z] [a-z])" in
27 query=*|search=*)
28 [ ${i#*=} = Search ] || SEARCH=${i#*=};;
29 object=*)
30 OBJECT=${i#*=};;
31 verbose=*)
32 VERBOSE=${i#*=};;
33 lang=*)
34 LANG=${i#*=};;
35 file=*)
36 SEARCH=${i#*=}
37 OBJECT=File;;
38 desc=*)
39 SEARCH=${i#*=}
40 OBJECT=Desc;;
41 tags=*)
42 SEARCH=${i#*=}
43 OBJECT=Tags;;
44 receipt=*)
45 SEARCH=${i#*=}
46 OBJECT=Receipt;;
47 filelist=*)
48 SEARCH=${i#*=}
49 OBJECT=File_list;;
50 package=*)
51 SEARCH=${i#*=}
52 OBJECT=Package;;
53 depends=*)
54 SEARCH=${i#*=}
55 OBJECT=Depends;;
56 builddepends=*)
57 SEARCH=${i#*=}
58 OBJECT=BuildDepends;;
59 fileoverlap=*)
60 SEARCH=${i#*=}
61 OBJECT=FileOverlap;;
62 version=s*|version=3*)
63 SLITAZ_VERSION=stable;;
64 version=[1-9]*)
65 i=${i%%.*}
66 SLITAZ_VERSION=${i#*=}.0;;
67 version=u*)
68 SLITAZ_VERSION=undigest;;
69 esac
70 done
71 [ -n "$SEARCH" ] && REQUEST_METHOD="POST"
72 [ "$SEARCH" = "." ] && SEARCH=
73 fi
75 case "$OBJECT" in
76 File) selected_file="selected";;
77 Desc) selected_desc="selected";;
78 Tags) selected_tags="selected";;
79 Receipt) selected_receipt="selected";;
80 File_list) selected_file_list="selected";;
81 Depends) selected_depends="selected";;
82 BuildDepends) selected_build_depends="selected";;
83 FileOverlap) selected_overlap="selected";;
84 esac
86 case "$SLITAZ_VERSION" in
87 tiny) selected_tiny="selected";;
88 1.0) selected_1="selected";;
89 2.0) selected_2="selected";;
90 stable) selected_stable="selected";;
91 undigest) selected_undigest="selected";;
92 esac
94 # unescape query
95 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g' | sed 's/%3A/:/g' | sed 's|%2F|/|g')"
97 if [ -z "$LANG" ]; then
98 for i in $(echo $HTTP_ACCEPT_LANGUAGE | sed 's/[,;]/ /g'); do
99 case "$i" in
100 fr|de|pt|cn)
101 LANG=$i
102 break;;
103 esac
104 done
105 fi
107 package="Package"
108 file="File"
109 desc="Description"
110 tags="Tags"
111 receipt="Receipt"
112 file_list="File list"
113 depends="Depends"
114 bdepends="Build depends"
115 loops="loops"
116 search="Search"
117 cooking="cooking"
118 stable="stable"
119 result="Result for : $SEARCH"
120 noresult="No package $SEARCH"
121 deptree="Dependency tree for : $SEARCH"
122 rdeptree="Reverse dependency tree for : $SEARCH"
123 bdeplist="$SEARCH needs these packages to be built"
124 rbdeplist="Packages who need $SEARCH to be built"
125 overloading="Theses packages may overload files of "
126 overlap="common files"
127 charset="ISO-8859-1"
129 case "$LANG" in
131 fr) package="Paquet"
132 receipt="Recette"
133 depends="Dépendances"
134 bdepends="Fabrication"
135 loops="sans fin"
136 search="Recherche"
137 result="Recherche de : $SEARCH"
138 noresult="Paquet $SEARCH introuvable"
139 deptree="Arbre des dépendances de $SEARCH"
140 rdeptree="Arbre inversé des dépendances de $SEARCH"
141 bdeplist="$SEARCH a besion de ces paquets pour être fabriqué"
142 rbdeplist="Paquets ayant besion de $SEARCH pour être fabriqués"
143 overloading="Paquets pouvant écraser des fichiers de "
144 overlap="Fichiers communs"
145 file_list="Liste des fichiers"
146 file="Fichier";;
148 de) package="Paket"
149 depends="Abhängigkeiten"
150 desc="Beschreibung"
151 search="Suche"
152 cooking="Cooking"
153 stable="Stable"
154 result="Resultate für : $SEARCH"
155 noresult="Kein Paket für $SEARCH"
156 deptree="Abhängigkeiten von: $SEARCH"
157 rdeptree="Abhängigkeit für: $SEARCH"
158 file_list="Datei liste"
159 file="Datei";;
161 pt) package="Pacote"
162 search="Buscar"
163 cooking="cooking"
164 stable="stable"
165 result="Resultado para : $SEARCH"
166 noresult="Sem resultado: $SEARCH"
167 deptree="Árvore de dependências para: $SEARCH"
168 rdeptree="Árvore de dependências reversa para: $SEARCH"
169 depends="Dependências"
170 desc="Descrição"
171 file_list="Arquivo lista"
172 file="Arquivo";;
174 cn) package="软件包:"
175 cooking="å¼€å‘版"
176 stable="稳定版"
177 desc="æè¿°"
178 tags="标签"
179 depends="ä¾èµ–"
180 file="文件"
181 file_list="文件列表"
182 search="Search"
183 result="Result for : $SEARCH"
184 noresult="No package $SEARCH"
185 deptree="Dependency tree for : $SEARCH"
186 rdeptree="Reverse dependency tree for : $SEARCH"
187 charset="UTF-8";;
189 *) LANG="en";;
191 esac
193 WOK=$SLITAZ/$SLITAZ_VERSION/wok-hg
194 PACKAGES_REPOSITORY=$SLITAZ/$SLITAZ_VERSION/packages
196 echo Content-type: text/html
197 echo
199 # Search form
200 search_form()
201 {
202 cat << _EOT_
204 <div style="text-align: center; margin-bottom: 30px;">
205 <form method="post" action="$(basename $SCRIPT_NAME)">
206 <div class="searchbox">
207 <p>
208 <input type="hidden" name="lang" value="$LANG" />
209 <input type="text" name="query"
210 size="20" value="$SEARCH" style="width: 80%;" />
211 <input type="submit" name="search" value="$search" />
212 </p>
213 </div>
214 Search for:
215 <select name="object">
216 <option value="Package">$package</option>
217 <option $selected_desc value="Desc">$desc</option>
218 <option $selected_tags value="Tags">$tags</option>
219 <option $selected_receipt value="Receipt">$receipt</option>
220 <option $selected_depends value="Depends">$depends</option>
221 <option $selected_build_depends value="BuildDepends">$bdepends</option>
222 <option $selected_file value="File">$file</option>
223 <option $selected_file_list value="File_list">$file_list</option>
224 <option $selected_overlap value="FileOverlap">$overlap</option>
225 </select>
226 in
227 <select name="version">
228 <option value="cooking">$cooking</option>
229 <option $selected_stable value="stable">$stable</option>
230 <option $selected_2 value="2.0">2.0</option>
231 <option $selected_1 value="1.0">1.0</option>
232 <option $selected_tiny value="tiny">tiny</option>
233 <option $selected_undigest value="undigest">undigest</option>
234 </select>
235 </form>
236 </div>
237 _EOT_
238 }
240 # xHTML Header.
241 xhtml_header()
242 {
243 cat << _EOF_
244 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
245 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
246 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="$LANG" lang="$LANG">
247 <head>
248 <title>SliTaz Packages - Search $SEARCH</title>
249 <meta http-equiv="content-type" content="text/html; charset=$charset" />
250 <meta name="description" content="SliTaz packages" />
251 <meta name="keywords" lang="en" content="tazpkg" />
252 <meta name="robots" content="index, follow, all" />
253 <meta name="modified" content="$DATE" />
254 <link rel="shortcut icon" href="favicon.ico" />
255 <link rel="stylesheet" type="text/css" href="slitaz.css" />
256 </head>
257 <body>
259 <!-- Header -->
260 <div id="header">
261 <a name="top"></a>
262 <div id="logo"></div>
263 <div id="network">
264 <a href="http://www.slitaz.org/">
265 <img src="images/network.png" alt="network.png" /></a>
266 <a href="http://scn.slitaz.org/">Community</a>
267 <a href="http://doc.slitaz.org/">Doc</a>
268 <a href="http://forum.slitaz.org/">Forum</a>
269 <a href="http://bugs.slitaz.org/">Bugs</a>
270 <a href="http://hg.slitaz.org/">Hg</a>
271 <a href="http://cook.slitaz.org/">BB</a>
272 </div>
273 <h1><a href="http://pkgs.slitaz.org/">SliTaz Packages</a></h1>
274 </div>
276 <!-- Block -->
277 <div id="block">
278 <!-- Navigation -->
279 <div id="block_nav" style="padding: 10px;">
280 <h4><img src="images/tazpkg.png" alt="tazpkg.png" />Tools &amp; Doc</h4>
281 <div class="right_box">
282 <ul>
283 <li><a href="http://doc.slitaz.org/en:cookbook:wok">Wok &amp; Tools</a></li>
284 <li><a href="http://doc.slitaz.org/en:cookbook:receipt">Receipts</a></li>
285 </ul>
286 </div>
287 <ul>
288 <li><a href="http://hg.slitaz.org/wok">Hg Repos</a></li>
289 <li><a href="http://cook.slitaz.org/">Build Bot</a></li>
290 <li><a href="http://bugs.slitaz.org/">Bug Tracker</a></li>
291 <li><a href="http://forum.slitaz.org/">Get Support</a></li>
292 </ul>
293 </div>
294 <!-- Information/image -->
295 <div id="block_info">
296 <h4>$package</h4>
297 <p>
298 Search for SliTaz packages!
299 </p>
300 <p>
301 Any results ? Make a package request on the official
302 <a href="http://forum.slitaz.org/">forum</a>
303 </p>
304 </div>
305 </div>
307 _EOF_
308 }
310 # xHTML Footer.
311 xhtml_footer()
312 {
313 cat << _EOT_
314 <center>
315 <i>$(ls $WOK/ | wc -l) packages and $(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | wc -l) files in $SLITAZ_VERSION database</i>
316 </center>
318 <!-- End of content -->
320 </div>
321 <!-- Footer -->
322 <div id="footer">
323 Copyright &copy; <span class="year"></span>
324 <a href="http://www.slitaz.org/">SliTaz</a> - Network:
325 <a href="http://scn.slitaz.org/">Community</a>
326 <a href="http://doc.slitaz.org/">Doc</a>
327 <a href="http://forum.slitaz.org/">Forum</a>
328 <a href="http://pkgs.slitaz.org/">Packages</a>
329 <a href="http://bugs.slitaz.org/">Bugs</a>
330 <a href="http://hg.slitaz.org/">Hg</a>
331 <p>
332 SliTaz @
333 <a href="http://twitter.com/slitaz">Twitter</a>
334 <a href="http://www.facebook.com/slitaz">Facebook</a>
335 <a href="http://distrowatch.com/slitaz">Distrowatch</a>
336 <a href="http://en.wikipedia.org/wiki/SliTaz">Wikipedia</a>
337 <a href="http://flattr.com/profile/slitaz">Flattr</a>
338 </p>
339 </div>
341 </body>
342 </html>
343 _EOT_
344 }
346 installed_size()
347 {
348 [ $VERBOSE -gt 0 ] &&
349 grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | \
350 grep installed | sed 's/.*(\(.*\) installed.*/(\1) /'
351 }
353 package_entry()
354 {
355 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
356 cat << _EOT_
357 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
358 _EOT_
359 else
360 PACKAGE_HREF="<u>$PACKAGE</u>"
361 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
362 busybox wget -s $PACKAGE_URL 2> /dev/null &&
363 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
364 cat << _EOT_
365 $PACKAGE_HREF $(installed_size $PACKAGE): $SHORT_DESC
366 _EOT_
367 fi
368 }
370 # Show loop in depends/build_depends chains
371 show_loops()
372 {
373 awk '
374 function chkloop(pkg, i, n)
375 {
376 if (n < 12)
377 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
378 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
379 split(deps[pkg],curdep," ")
380 p = curdep[i] " " p
381 return 1
382 }
383 }
384 return 0
385 }
386 {
387 for (i = 2; i <= NF; i++)
388 deps[$1] = deps[$1] " " $i
389 }
390 END {
391 for (pkg in deps) {
392 base = pkg
393 p = ""
394 if (chkloop(pkg, 0, 0))
395 print pkg " : " p
396 }
397 }'
398 }
400 # recursive dependencies scan
401 dep_scan()
402 {
403 for i in $1; do
404 case " $ALL_DEPS " in
405 *\ $i\ *) continue;;
406 esac
407 ALL_DEPS="$ALL_DEPS $i"
408 if [ -n "$2" ]; then
409 echo -n "$2"
410 (
411 . $WOK/$i/receipt
412 package_entry
413 )
414 fi
415 [ -f $WOK/$i/receipt ] || continue
416 DEPENDS=""
417 . $WOK/$i/receipt
418 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
419 done
420 }
422 # recursive reverse dependencies scan
423 rdep_scan()
424 {
425 SEARCH=$1
426 case "$SEARCH" in
427 glibc-base|gcc-lib-base) cat <<EOT
428 glibc-base and gcc-lib-base are implicit dependencies,
429 <b>every</b> package is supposed to depend on them.
430 EOT
431 return;;
432 esac
433 for i in $WOK/* ; do
434 DEPENDS=""
435 . $i/receipt
436 echo "$(basename $i) $(echo $DEPENDS)"
437 done | awk -v search=$SEARCH '
438 function show_deps(deps, all_deps, pkg, space)
439 {
440 if (all_deps[pkg] == 1) return
441 all_deps[pkg] = 1
442 if (space != "") printf "%s%s\n",space,pkg
443 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
444 show_deps(deps, all_deps, mydeps[i],"////" space)
445 }
446 }
448 {
449 all_deps[$1] = 0
450 for (i = 2; i <= NF; i++)
451 deps[$i] = deps[$i] " " $1
452 }
454 END {
455 show_deps(deps, all_deps, search, "")
456 }
457 ' | while read pkg; do
458 . $WOK/${pkg##*/}/receipt
459 cat << _EOT_
460 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry)
461 _EOT_
462 done
463 }
465 # Check package exists
466 package_exist()
467 {
468 [ -f $WOK/$1/receipt ] && return 0
469 cat << _EOT_
471 <h3>$noresult</h3>
472 <pre class="package">
473 _EOT_
474 return 1
475 }
477 # Display < > &
478 htmlize()
479 {
480 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
481 }
483 echonb()
484 {
485 read n
486 echo -n "$n $1"
487 [ $n -gt 1 ] && echo -n s
488 }
490 display_packages_and_files()
491 {
492 last=""
493 while read pkg file; do
494 pkg=${pkg%:}
495 if [ "$pkg" != "$last" ]; then
496 . $WOK/$pkg/receipt
498 package_entry
499 last=$pkg
500 fi
501 echo " $file"
502 done
503 }
505 # Display search form and result if requested.
506 if [ "$REQUEST_METHOD" != "POST" ]; then
507 xhtml_header
508 cat << _EOT_
510 <!-- Content -->
511 <div id="content">
512 <a name="content"></a>
514 <h1>$package</h1>
515 <h2>$search</h2>
516 _EOT_
517 search_form
518 xhtml_footer
519 else
520 xhtml_header
521 cat << _EOT_
523 <!-- Content -->
524 <div id="content">
525 <a name="content"></a>
527 <h1>$package</h1>
528 <h2>$search</h2>
529 _EOT_
530 search_form
531 if [ "$OBJECT" = "Depends" ]; then
532 if [ -z "$SEARCH" ]; then
533 cat << _EOT_
535 <h3>$depends $loops</h3>
536 <pre class="package">
537 _EOT_
538 for i in $WOK/*/receipt; do
539 PACKAGE=
540 DEPENDS=
541 . $i
542 echo "$PACKAGE $(echo $DEPENDS)"
543 done | show_loops
544 cat << _EOT_
545 </pre>
546 _EOT_
547 elif package_exist $SEARCH ; then
548 cat << _EOT_
550 <h3>$deptree</h3>
551 <pre class="package">
552 _EOT_
553 ALL_DEPS=""
554 dep_scan $SEARCH ""
555 SUGGESTED=""
556 . $WOK/$SEARCH/receipt
557 if [ -n "$SUGGESTED" ]; then
558 cat << _EOT_
559 </pre>
561 <h3>$deptree (SUGGESTED)</h3>
562 <pre class="package">
563 _EOT_
564 ALL_DEPS=""
565 dep_scan "$SUGGESTED" " "
566 fi
567 cat << _EOT_
568 </pre>
570 <h3>$rdeptree</h3>
571 <pre class="package">
572 _EOT_
573 ALL_DEPS=""
574 rdep_scan $SEARCH
575 cat << _EOT_
576 </pre>
577 _EOT_
578 fi
579 elif [ "$OBJECT" = "BuildDepends" ]; then
580 if [ -z "$SEARCH" ]; then
581 cat << _EOT_
583 <h3>$bdepends $loops</h3>
584 <pre class="package">
585 _EOT_
586 for i in $WOK/*/receipt; do
587 PACKAGE=
588 WANTED=
589 BUILD_DEPENDS=
590 . $i
591 echo "$PACKAGE $(echo $WANTED $BUILD_DEPENDS)"
592 done | show_loops
593 cat << _EOT_
594 </pre>
595 _EOT_
596 elif package_exist $SEARCH ; then
597 cat << _EOT_
599 <h3>$bdeplist</h3>
600 <pre class="package">
601 _EOT_
602 BUILD_DEPENDS=""
603 WANTED=""
604 . $WOK/$SEARCH/receipt
605 [ -n "$WANTED$BUILD_DEPENDS" ] && for dep in $WANTED $BUILD_DEPENDS ; do
606 if [ ! -s $WOK/$dep/receipt ]; then
607 cat << _EOT_
608 $dep: not found !
609 _EOT_
610 continue
611 fi
612 . $WOK/$dep/receipt
613 package_entry
614 done
615 cat << _EOT_
616 </pre>
618 <h3>$rbdeplist</h3>
619 <pre class="package">
620 _EOT_
621 for dep in $(grep -l $SEARCH $WOK/*/receipt); do
622 BUILD_DEPENDS=""
623 WANTED=""
624 . $dep
625 echo " $WANTED $BUILD_DEPENDS " | grep -q " $SEARCH " &&
626 package_entry
627 done
628 cat << _EOT_
629 </pre>
630 _EOT_
631 fi
632 elif [ "$OBJECT" = "FileOverlap" ]; then
633 if package_exist $SEARCH ; then
634 cat << _EOT_
636 <h3>$overloading $SEARCH</h3>
637 <pre class="package">
638 _EOT_
639 ( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ;
640 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk '
641 BEGIN { pkg=""; last="x" }
642 {
643 if ($2 == "") next
644 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
645 delete file[last]
646 last=$2
647 if (pkg == "") pkg=$1
648 if ($1 == pkg) file[$2]=$1
649 else if (file[$2] == pkg) print
650 }
651 ' | display_packages_and_files
652 cat << _EOT_
653 </pre>
654 _EOT_
655 fi
656 elif [ "$OBJECT" = "File" ]; then
657 cat << _EOT_
659 <h3>$result</h3>
660 <pre class="package">
661 _EOT_
662 last=""
663 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
664 | grep $SEARCH | while read pkg file; do
665 echo "$file" | grep -q $SEARCH || continue
666 if [ "$last" != "${pkg%:}" ]; then
667 last=${pkg%:}
668 (
669 . $WOK/$last/receipt
670 cat << _EOT_
672 <i>$(package_entry)</i>
673 _EOT_
674 )
675 fi
676 echo " $file"
677 done
678 elif [ "$OBJECT" = "File_list" ]; then
679 if package_exist $SEARCH; then
680 cat << _EOT_
682 <h3>$result</h3>
683 <pre class="package">
684 _EOT_
685 last=""
686 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
687 | grep ^$SEARCH: | sed 's/.*: / /' | sort
688 cat << _EOT_
689 </pre>
690 <pre class="package">
691 $(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: | wc -l | echonb file) \
692 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt)
693 _EOT_
694 fi
695 elif [ "$OBJECT" = "Desc" ]; then
696 if [ -f $WOK/$SEARCH/description.txt ]; then
697 cat << _EOT_
699 <h3>$result</h3>
700 <pre class="package">
701 <pre>
702 $(htmlize < $WOK/$SEARCH/description.txt)
703 </pre>
704 _EOT_
705 else
706 cat << _EOT_
708 <h3>$result</h3>
709 <pre class="package">
710 _EOT_
711 last=""
712 grep -i $SEARCH $PACKAGES_REPOSITORY/packages.desc | \
713 sort | while read pkg extras ; do
714 . $WOK/$pkg/receipt
715 package_entry
716 done
717 fi
718 elif [ "$OBJECT" = "Tags" ]; then
719 cat << _EOT_
721 <h3>$result</h3>
722 <pre class="package">
723 _EOT_
724 last=""
725 grep ^TAGS= $WOK/*/receipt | grep -i $SEARCH | \
726 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
727 . $WOK/$pkg/receipt
728 package_entry
729 done
730 elif [ "$OBJECT" = "Receipt" ]; then
731 package_exist $SEARCH && cat << _EOT_
733 <h3>$result</h3>
734 <pre class="package">
735 <pre>
736 $(if [ -f $WOK/$SEARCH/taz/*/receipt ]; then
737 cat $WOK/$SEARCH/taz/*/receipt
738 else
739 cat $WOK/$SEARCH/receipt
740 fi | htmlize)
741 </pre>
742 _EOT_
743 else
744 cat << _EOT_
746 <h3>$result</h3>
747 <pre class="package">
748 _EOT_
749 for pkg in `ls $WOK/ | grep $SEARCH`
750 do
751 . $WOK/$pkg/receipt
752 DESC=" <a href=\"?desc=$pkg\">description</a>"
753 [ -f $WOK/$pkg/description.txt ] || DESC=""
754 cat << _EOT_
755 $(package_entry)$DESC
756 _EOT_
757 done
758 equiv=$PACKAGES_REPOSITORY/packages.equiv
759 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
760 for vpkg in $vpkgs ; do
761 cat << _EOT_
762 </pre>
764 <h3>$result (package providing $vpkg)</h3>
765 <pre class="package">
766 _EOT_
767 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
768 . $WOK/${pkg#*:}/receipt
769 package_entry
770 done
771 done
772 fi
773 cat << _EOT_
774 </pre>
775 _EOT_
776 xhtml_footer
777 fi
779 exit 0