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

mirror-search.sh: add bugs
author Pascal Bellard <pascal.bellard@slitaz.org>
date Fri Sep 28 15:59:26 2012 +0200 (2012-09-28)
parents 987ce36a5b46
children 3d61397d3367
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 Arch) NICE="arch=$SEARCH";;
59 Bugs) NICE="bugs=$SEARCH";;
60 Receipt) NICE="receipt=$SEARCH";;
61 Depends) NICE="depends=$SEARCH";;
62 BuildDepends) NICE="builddepends=$SEARCH";;
63 File) NICE="file=$SEARCH";;
64 File_list) NICE="filelist=$SEARCH";;
65 FileOverlap) NICE="fileoverlap=$SEARCH";;
66 esac
67 # version, if needed
68 version="$(GET version)"
69 if [ ! -z "$version" -a "$version" != "cooking" ]; then
70 NICE="${NICE}&version=${version:0:1}"
71 fi
72 # lang, if needed
73 query_lang="$(GET lang)"
74 pref_lang="$(user_lang)"
75 browser_lang="$(ll_lang $pref_lang)"
76 if [ ! -z "$query_lang" -a "$query_lang" != "$browser_lang" ]; then
77 NICE="${NICE}&lang=$query_lang"
78 fi
79 # verbose, if needed
80 verboseq="$(GET verbose)"
81 if [ ! -z "$verboseq" -a "$verboseq" != "0" ]; then
82 NICE="${NICE}&verbose=1"
83 fi
84 # redirect
85 # TODO: implement HTTP 301 Redirect
86 cat << EOT
87 Content-type: text/html
89 <!DOCTYPE html>
90 <html><head><meta http-equiv="refresh" content="0;url=$SCRIPT_NAME?$NICE" />
91 <title>Redirect</title></head></html>
92 EOT
93 # echo "Location: $SCRIPT_NAME?$NICE"
94 # echo
95 exit 0
96 fi
97 }
99 nice_url
103 OBJECT="$(GET object)"
104 SEARCH="$(GET query)"
105 SLITAZ_VERSION="$(GET version)"
106 VERBOSE="$(GET verbose)"
108 # Internal variables
109 #DATE=$(date +%Y-%m-%d\ %H:%M:%S)
111 # Internationalization
112 . /usr/bin/gettext.sh
113 export TEXTDOMAIN='tazpkg-web'
115 SEARCH=""
116 VERBOSE=0
117 for i in $(echo $QUERY_STRING | sed 's/[?&]/ /g'); do
118 # SLITAZ_VERSION=cooking
119 case "$(echo $i | tr [A-Z] [a-z])" in
120 query=*|search=*) [ ${i#*=} == Search ] || SEARCH=${i#*=};;
121 object=*) OBJECT=${i#*=};;
122 verbose=*) VERBOSE=${i#*=};;
123 lang=*) LANG=${i#*=};;
124 file=*) SEARCH=${i#*=}; OBJECT=File;;
125 desc=*) SEARCH=${i#*=}; OBJECT=Desc;;
126 tags=*) SEARCH=${i#*=}; OBJECT=Tags;;
127 arch=*) SEARCH=${i#*=}; OBJECT=Arch;;
128 bugs=*) SEARCH=${i#*=}; OBJECT=Bugs;;
129 receipt=*) SEARCH=${i#*=}; OBJECT=Receipt;;
130 filelist=*) SEARCH=${i#*=}; OBJECT=File_list;;
131 package=*) SEARCH=${i#*=}; OBJECT=Package;;
132 depends=*) SEARCH=${i#*=}; OBJECT=Depends;;
133 builddepends=*) SEARCH=${i#*=}; OBJECT=BuildDepends;;
134 fileoverlap=*) SEARCH=${i#*=}; OBJECT=FileOverlap;;
135 category=*) SEARCH=${i#*=}; OBJECT=Category;;
136 maintainer=*) SEARCH=${i#*=}; OBJECT=Maintainer;;
137 version=[1-9]*) i=${i%%.*}; SLITAZ_VERSION=${i#*=}.0;;
138 version=s*|version=4*) SLITAZ_VERSION=stable;;
139 version=u*) SLITAZ_VERSION=undigest;;
140 version=t*) SLITAZ_VERSION=tiny;;
141 esac
142 done
143 [ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION=cooking
144 #[ -n "$SEARCH" ] && REQUEST_METHOD="POST"
145 #[ "$SEARCH" == "." ] && SEARCH=
148 # Content negotiation for Gettext
149 LANG=$(user_lang $(GET lang))
150 lang="$(ll_lang $LANG)"
151 export LANG LC_ALL=$LANG
154 case "$OBJECT" in
155 File) selected_file="selected";;
156 Desc) selected_desc="selected";;
157 Tags) selected_tags="selected";;
158 Arch) selected_arch="selected";;
159 Bugs) selected_bugs="selected";;
160 Receipt) selected_receipt="selected";;
161 File_list) selected_file_list="selected";;
162 Depends) selected_depends="selected";;
163 BuildDepends) selected_build_depends="selected";;
164 FileOverlap) selected_overlap="selected";;
165 esac
167 case "$SLITAZ_VERSION" in
168 tiny) selected_tiny="selected";;
169 1.0) selected_1="selected";;
170 2.0) selected_2="selected";;
171 3.0) selected_3="selected";;
172 stable) selected_stable="selected";;
173 undigest) selected_undigest="selected";;
174 esac
176 # unescape query
177 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g; s/%3A/:/g; s|%2F|/|g')"
179 WOK=/home/slitaz/$SLITAZ_VERSION/wok
180 PACKAGES_REPOSITORY=/home/slitaz/$SLITAZ_VERSION/packages
183 # TODO: header function from httphelper
184 echo "Content-type: text/html"
185 echo
187 # Search form
188 # TODO: implement POST method
189 # ... method="post" enctype="multipart/form-data" ...
190 # TODO: add hint 'You are can search for depends loop, if textfield is empty'...
191 # add progress ticker while page is not complete
192 search_form()
193 {
194 cat << _EOT_
196 <form id="s_form" method="get" action="$SCRIPT_NAME">
197 <input type="hidden" name="lang" value="$lang" />
198 <select name="object">
199 <option value="Package">$(gettext "Package")</option>
200 <option $selected_desc value="Desc">$(gettext "Description")</option>
201 <option $selected_tags value="Tags">$(gettext "Tags")</option>
202 <!-- option $selected_arch value="Tags">$(gettext "Arch")</option -->
203 <!-- option $selected_bugs value="Bugs">$(gettext "Bugs")</option -->
204 <option $selected_receipt value="Receipt">$(gettext "Receipt")</option>
205 <option $selected_depends value="Depends">$(gettext "Depends")</option>
206 <option $selected_build_depends value="BuildDepends">$(gettext "Build depends")</option>
207 <option $selected_file value="File">$(gettext "File")</option>
208 <option $selected_file_list value="File_list">$(gettext "File list")</option>
209 <option $selected_overlap value="FileOverlap">$(gettext "common files")</option>
210 </select>
211 <input type="text" name="query" id="query" size="20" value="$SEARCH" />
212 <select name="version">
213 <option value="cooking">$(gettext "cooking")</option>
214 <option $selected_stable value="stable">4.0</option>
215 <option $selected_3 value="3.0">3.0</option>
216 <option $selected_2 value="2.0">2.0</option>
217 <option $selected_1 value="1.0">1.0</option>
218 <option $selected_tiny value="tiny">$(gettext "tiny")</option>
219 <option $selected_undigest value="undigest">$(gettext "undigest")</option>
220 </select>
221 <input type="submit" name="submit" value="$(gettext 'Search')" />
222 </form>
223 _EOT_
224 }
226 # xHTML5 Header.
227 xhtml_header() {
228 . lib/header.sh
229 }
231 cat_files_list()
232 {
233 local tmp=/tmp/files.list.$(basename ${1%/packages})
234 if [ ! -s $tmp -o $1/files.list.lzma -nt $tmp ]; then
235 unlzma -c $1/files.list.lzma > $tmp.$$ && mv $tmp.$$ $tmp
236 fi
237 case "$2" in
238 lines) if [ ! -s $tmp.lines -o $tmp -nt $tmp.lines ]; then
239 cat $tmp | wc -l > $tmp.lines.$$ &&
240 mv $tmp.lines.$$ $tmp.lines
241 fi
242 cat $tmp.lines ;;
243 *) cat $tmp ;;
244 esac
245 }
247 # xHTML Footer.
248 # TODO: caching the summary for 5 minutes
249 xhtml_footer() {
250 PKGS=$(ls $WOK/ | wc -l)
251 FILES=$(cat_files_list $PACKAGES_REPOSITORY lines)
252 . lib/footer.sh
253 }
255 installed_size()
256 {
257 if [ $VERBOSE -gt 0 ]; then
258 inst=$(grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | grep installed)
259 # size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1)
260 echo $inst | sed 's/.*(\(.*\).*/(\1)/'
261 # echo $size
262 # | sed 's/.*(\(.*\) installed.*/(\1) /'
263 fi
264 }
266 package_entry()
267 {
268 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
269 cat << _EOT_
270 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
271 _EOT_
272 else
273 PACKAGE_HREF="<u>$PACKAGE</u>"
274 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
275 nslookup mirror.slitaz.org | grep -q 127.0.0.1 &&
276 [ -d /var/www/slitaz/mirror/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION ] &&
277 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION" ||
278 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls $PACKAGE-$VERSION*.tazpkg)"
279 busybox wget -s $PACKAGE_URL 2> /dev/null &&
280 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
281 cat << _EOT_
282 $PACKAGE_HREF $(installed_size $PACKAGE): $SHORT_DESC \
283 <a href="?receipt=$PACKAGE">$(gettext "Receipt")</a>
284 _EOT_
285 fi
286 [ -n "$(GET debug)" ] && cat << _EOT_
287 <pre>
288 PACKAGE=$PACKAGE
289 VERSION=$VERSION
290 EXTRAVERSION=$EXTRAVERSION
291 SLITAZ_VERSION=$SLITAZ_VERSION
292 PACKAGE_URL=$PACKAGE_URL
293 $(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls -l $PACKAGE*)
294 </pre>
295 _EOT_
296 }
298 # Show loop in depends/build_depends chains
299 show_loops()
300 {
301 awk '
302 function chkloop(pkg, i, n)
303 {
304 if (n < 8)
305 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
306 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
307 split(deps[pkg],curdep," ")
308 p = curdep[i] " " p
309 return 1
310 }
311 }
312 return 0
313 }
314 {
315 for (i = 2; i <= NF; i++)
316 deps[$1] = deps[$1] " " $i
317 }
318 END {
319 for (pkg in deps) {
320 base = pkg
321 p = ""
322 if (chkloop(pkg, 0, 0))
323 print pkg " " p
324 #print pkg " : " p "..."
325 }
326 }' | while read line; do
327 set -- $line
328 case " $last " in
329 *\ $1\ *) continue
330 esac
331 last="$line"
332 pkg=$1
333 shift
334 echo "<strong>$pkg </strong>: $@ ..."
335 done
336 }
338 # recursive dependencies scan
339 dep_scan()
340 {
341 for i in $1; do
342 case " $ALL_DEPS " in
343 *\ $i\ *) continue;;
344 esac
345 ALL_DEPS="$ALL_DEPS $i"
346 if [ -n "$2" ]; then
347 echo -n "$2"
348 (
349 . $WOK/$i/receipt
350 package_entry
351 )
352 fi
353 [ -f $WOK/$i/receipt ] || continue
354 DEPENDS=""
355 BUILD_DEPENDS=""
356 WANTED=""
357 . $WOK/$i/receipt
358 if [ -n "$3" ]; then
359 [ -n "$BUILD_DEPENDS$WANTED" ] &&
360 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
361 else
362 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
363 fi
364 done
365 }
367 # recursive reverse dependencies scan
368 rdep_scan()
369 {
370 SEARCH=$1
371 case "$SEARCH" in
372 glibc-base|gcc-lib-base)
373 $(gettext " glibc-base and gcc-lib-base are implicit dependencies,
374 <b>every</b> package is supposed to depend on them."); echo
375 return;;
376 esac
377 for i in $WOK/* ; do
378 DEPENDS=""
379 BUILD_DEPENDS=""
380 WANTED=""
381 . $i/receipt
382 if [ -n "$2" ]; then
383 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
384 else
385 echo "$(basename $i) $(echo $DEPENDS)"
386 fi
387 done | awk -v search=$SEARCH '
388 function show_deps(deps, all_deps, pkg, space)
389 {
390 if (all_deps[pkg] == 1) return
391 all_deps[pkg] = 1
392 if (space != "") printf "%s%s\n",space,pkg
393 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
394 show_deps(deps, all_deps, mydeps[i],"////" space)
395 }
396 }
398 {
399 all_deps[$1] = 0
400 for (i = 2; i <= NF; i++)
401 deps[$i] = deps[$i] " " $1
402 }
404 END {
405 show_deps(deps, all_deps, search, "")
406 }
407 ' | while read pkg; do
408 . $WOK/${pkg##*/}/receipt
409 cat << _EOT_
410 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry)
411 _EOT_
412 done
413 }
415 # Check package exists
416 package_exist()
417 {
418 [ -f $WOK/$1/receipt ] && return 0
419 cat << _EOT_
421 <h3>$(eval_gettext "No package \$SEARCH")</h3>
422 _EOT_
423 return 1
424 }
426 # Display < > &
427 htmlize()
428 {
429 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
430 }
432 # Create some clickable links
433 urllink()
434 {
435 sedit=""
436 [ -n "$WEB_SITE" ] && sedit="$sedit -e 's|^WEB_SITE=\"\\(.*\\)\"|WEB_SITE=\"<a href=\"$WEB_SITE\">\\1</a>\"|'"
437 [ -n "$WGET_URL" ] && sedit="$sedit -e 's|^WGET_URL=\"\\(.*\\)\"|WGET_URL=\"<a href=\"$WGET_URL\">\\1</a>\"|'"
438 [ -n "$CATEGORY" ] && sedit="$sedit -e 's|^CATEGORY=\"\\(.*\\)\"|CATEGORY=\"<a href=\"?category=$CATEGORY\">\\1</a>\"|'"
439 [ -n "$WANTED" ] && sedit="$sedit -e 's|^WANTED=\"\\(.*\\)\"|WANTED=\"<a href=\"?receipt=$WANTED\">\\1</a>\"|'"
440 [ -n "$BUGS" ] && sedit="$sedit -e 's|^BUGS=\"\\(.*\\)\"|BUGS=\"<a href=\"?bugs=$PACKAGE\">\\1</a>\"|'"
441 [ -f $WOK/$PACKAGE/description.txt ] && sedit="$sedit -e 's|^SHORT_DESC=\"\\(.*\\)\"|SHORT_DESC=\"<a href=\"?desc=$PACKAGE\">\\1</a>\"|'"
442 if [ -n "$HOST_ARCH" ]; then
443 tmp=""
444 for i in $HOST_ARCH ; do
445 tmp="$tmp <a href=\\\"?arch=$i\\\">$i</a>"
446 done
447 sedit="$sedit -e 's|^HOST_ARCH=\".*\"|HOST_ARCH=\"${tmp# }\"|'"
448 fi
449 if [ -n "$TAGS" ]; then
450 tmp=""
451 for i in $TAGS ; do
452 tmp="$tmp <a href=\\\"?tags=$i\\\">$i</a>"
453 done
454 sedit="$sedit -e 's|^TAGS=\".*\"|TAGS=\"${tmp# }\"|'"
455 fi
456 if [ -n "$DEPENDS$BUILD_DEPENDS$SUGGESTED" ]; then
457 for i in $(echo $DEPENDS $BUILD_DEPENDS $SUGGESTED) ; do
458 sedit="$sedit -e 's|\\([\" ]\\)$i\\([\" \\]\\)|\\1<a href=\\\"?package=$i\\\">$i</a>\\2|'"
459 sedit="$sedit -e 's|\\([\" ]\\)$i\$|\\1<a href=\\\"?package=$i\\\">$i</a>|'"
460 sedit="$sedit -e 's|^$i\\([\" \\]\\)|<a href=\\\"?package=$i\\\">$i</a>\\1|'"
461 sedit="$sedit -e 's|^$i\$|<a href=\\\"?package=$i\\\">$i</a>|'"
462 done
463 fi
464 if [ -n "$CONFIG_FILES" ]; then
465 tmp=""
466 for i in $(echo $CONFIG_FILES) ; do
467 tmp="$tmp <a href=\\\"?file=$i\\\">$i</a>"
468 done
469 sedit="$sedit -e 's|^CONFIG_FILES=\".*\"|CONFIG_FILES=\"${tmp# }\"|'"
470 fi
471 if [ -n "$PROVIDE" ]; then
472 tmp=""
473 for i in $(echo $PROVIDE) ; do
474 tmp="$tmp <a href=\\\"?package=${i%:*}\\\">$i</a>"
475 done
476 sedit="$sedit -e 's|^PROVIDE=\".*\"|PROVIDE=\"${tmp# }\"|'"
477 fi
478 eval sed $sedit \
479 -e "'s|^MAINTAINER=\".*\"|MAINTAINER=\"<a href=\"?maintainer=$MAINTAINER\">$MAINTAINER</a>\"|'" \
480 -e "'s|^genpkg_rules|<a href=\"?filelist=$PACKAGE\">&</a>|'"
481 }
483 display_packages_and_files()
484 {
485 last=""
486 while read pkg file; do
487 pkg=${pkg%:}
488 if [ "$pkg" != "$last" ]; then
489 . $WOK/$pkg/receipt
490 package_entry
491 last=$pkg
492 fi
493 echo " $file"
494 done
495 }
497 build_cloud_cache()
498 {
499 grep -l ^$1= $WOK/*/receipt | while read file; do
500 eval $1=
501 . $file
502 eval echo \$$1
503 done | sed "$2" | awk '
504 {
505 for (i = 1; $i != ""; i++) {
506 count[$i]++
507 }
508 }
509 END {
510 min=10000
511 max=0
512 for (i in count) {
513 if (count[i] < min) min = count[i]
514 if (count[i] > max) max = count[i]
515 }
516 for (i in count)
517 print count[i] " " int((count[i] - min)*100/(max - min)) " " i
518 }' | sort -k 3
519 }
521 display_cloud()
522 {
523 echo "<p>"
524 while read cnt pct item ; do
525 cat <<EOT
526 <span style="color:#99f; font-size:9pt; padding-left:5px; padding-right:2px;">\
527 $cnt</span><a href="?$1=$item&amp;version=$SLITAZ_VERSION" style="\
528 font-size:$((8+($pct/10)))pt; font-weight:bold; \
529 color:black; text-decoration:none">$(echo $item | sed 's/-/\&minus;/g')</a>
530 EOT
531 done | tee /dev/stderr | printf "</p><p align=right>$2" $(wc -l)
532 echo "</p>"
533 }
535 xhtml_header
537 #
538 # Handle GET requests
539 #
540 case " $(GET) " in
541 *\ debug\ *|*\ debug*)
542 cat << EOT
543 <h2>Debug info</h2>
544 <pre>$(httpinfo)</pre>
545 <pre>LANG=$LANG;
546 OBJECT=$OBJECT;
547 SEARCH=$SEARCH;
548 SLITAZ_VERSION=$SLITAZ_VERSION;
549 WOK=$WOK;
550 </pre>
551 EOT
552 #$(xhtml_footer)
553 #EOT
554 # exit 0
555 ;;
556 esac
558 # Display search form and result if requested.
559 #xhtml_header
560 echo "<h2>$(gettext 'Search for packages')</h2>"
561 search_form
563 case "$OBJECT" in
566 ### Depends loops; [Reverse] Dependency tree [(SUGGESTED)]
567 Depends)
568 if [ -z "$SEARCH" ]; then
569 cat << _EOT_
571 <h3>$(gettext "Depends loops")</h3>
572 <pre>
573 _EOT_
574 for i in $WOK/*/receipt; do
575 PACKAGE=
576 DEPENDS=
577 . $i
578 echo "$PACKAGE $(echo $DEPENDS)"
579 done | show_loops
580 cat << _EOT_
581 </pre>
582 _EOT_
583 elif package_exist $SEARCH ; then
584 cat << _EOT_
586 <h3>$(eval_gettext "Dependency tree for: \$SEARCH")</h3>
587 <pre>
588 _EOT_
589 ALL_DEPS=""
590 dep_scan $SEARCH ""
591 SUGGESTED=""
592 . $WOK/$SEARCH/receipt
593 if [ -n "$SUGGESTED" ]; then
594 cat << _EOT_
595 </pre>
597 <h3>$(eval_gettext "Dependency tree for: \$SEARCH (SUGGESTED)")</h3>
598 <pre>
599 _EOT_
600 ALL_DEPS=""
601 dep_scan "$SUGGESTED" " "
602 fi
603 cat << _EOT_
604 </pre>
606 <h3>$(eval_gettext "Reverse dependency tree for: \$SEARCH")</h3>
607 <pre>
608 _EOT_
609 ALL_DEPS=""
610 rdep_scan $SEARCH
611 cat << _EOT_
612 </pre>
613 _EOT_
614 fi
615 ;;
618 ### Build depends loops; [Reverse] Build dependency tree
619 BuildDepends)
620 if [ -z "$SEARCH" ]; then
621 cat << _EOT_
623 <h3>$(gettext "Build depends loops")</h3>
624 <pre>
625 _EOT_
626 for i in $WOK/*/receipt; do
627 PACKAGE=
628 WANTED=
629 BUILD_DEPENDS=
630 . $i
631 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
632 done | show_loops
633 cat << _EOT_
634 </pre>
635 _EOT_
636 elif package_exist $SEARCH ; then
637 cat << _EOT_
639 <h3>$(eval_gettext "\$SEARCH needs these packages to be built")</h3>
640 <pre>
641 _EOT_
642 ALL_DEPS=""
643 dep_scan $SEARCH "" build
644 cat << _EOT_
645 </pre>
647 <h3>$(eval_gettext "Packages who need \$SEARCH to be built")</h3>
648 <pre>
649 _EOT_
650 ALL_DEPS=""
651 rdep_scan $SEARCH build
652 cat << _EOT_
653 </pre>
654 _EOT_
655 fi
656 ;;
659 ### Common files
660 FileOverlap)
661 if package_exist $SEARCH; then
662 cat << _EOT_
664 <h3>$(eval_gettext "These packages may overload files of \$SEARCH")</h3>
665 <pre>
666 _EOT_
667 ( cat_files_list $PACKAGES_REPOSITORY | grep ^$SEARCH: ;
668 cat_files_list $PACKAGES_REPOSITORY | grep -v ^$SEARCH: ) | awk '
669 BEGIN { pkg=""; last="x" }
670 {
671 if ($2 == "") next
672 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
673 delete file[last]
674 last=$2
675 if (pkg == "") pkg=$1
676 if ($1 == pkg) file[$2]=$1
677 else if (file[$2] == pkg) print
678 }
679 ' | display_packages_and_files
680 cat << _EOT_
681 </pre>
682 _EOT_
683 fi
684 ;;
687 ### File search
688 File)
689 if [ -n "$SEARCH" ]; then
690 cat << _EOT_
692 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
693 <pre>
694 _EOT_
695 last=""
696 cat_files_list $PACKAGES_REPOSITORY \
697 | grep "$SEARCH" | while read pkg file; do
698 echo "$file" | grep -q "$SEARCH" || continue
699 if [ "$last" != "${pkg%:}" ]; then
700 last=${pkg%:}
701 (
702 . $WOK/$last/receipt
703 cat << _EOT_
705 <i>$(package_entry)</i>
706 _EOT_
707 )
708 fi
709 echo " $file"
710 done
711 cat << _EOT_
712 </pre>
713 _EOT_
714 fi
715 ;;
718 ### List of files
719 File_list)
720 if package_exist $SEARCH; then
721 cat << _EOT_
723 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
724 <pre>
725 _EOT_
726 last=""
727 cat_files_list $PACKAGES_REPOSITORY \
728 | grep ^$SEARCH: | sed 's/.*: / /' | sort
729 cat << _EOT_
730 </pre>
731 <pre>
732 _EOT_
733 filenb=$(cat_files_list $PACKAGES_REPOSITORY | grep ^$SEARCH: | wc -l)
734 eval_ngettext "\$filenb file" "\$filenb files" $filenb
735 cat << _EOT_
736 \
737 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt)
738 </pre>
739 _EOT_
740 fi
741 ;;
744 ### Package description
745 Desc)
746 cat << _EOT_
748 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
749 <pre>
750 _EOT_
751 if [ -f $WOK/$SEARCH/description.txt ]; then
752 htmlize < $WOK/$SEARCH/description.txt
753 else
754 last=""
755 grep -i "$SEARCH" $PACKAGES_REPOSITORY/packages.desc | \
756 sort | while read pkg extras ; do
757 . $WOK/$pkg/receipt
758 package_entry
759 done
760 fi
761 cat << _EOT_
762 </pre>
763 _EOT_
764 ;;
767 ### Bugs
768 Bugs)
769 cat << _EOT_
771 <h3>$(eval_gettext "Result for known bugs")</h3>
772 <pre>
773 _EOT_
774 last=""
775 grep ^BUGS= $WOK/*/receipt | \
776 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
777 BUGS=
778 . $WOK/$pkg/receipt
779 package_entry
780 echo " $BUGS "
781 done
782 cat << _EOT_
783 </pre>
784 _EOT_
785 ;;
788 ### Arch
789 Arch)
790 cat << _EOT_
792 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
793 <pre>
794 _EOT_
795 last=""
796 grep ^HOST_ARCH= $WOK/*/receipt | grep -i "$SEARCH" | \
797 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
798 HOST_ARCH=
799 . $WOK/$pkg/receipt
800 echo " $HOST_ARCH " | grep -iq " $SEARCH " &&
801 package_entry
802 done
803 cat << _EOT_
804 </pre>
805 _EOT_
806 ;;
809 ### Tags
810 Tags)
811 if [ -n "$SEARCH" ]; then
812 cat << _EOT_
814 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
815 <pre>
816 _EOT_
817 last=""
818 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
819 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
820 TAGS=
821 . $WOK/$pkg/receipt
822 echo " $TAGS " | grep -iq " $SEARCH " &&
823 package_entry
824 done
825 cat << _EOT_
826 </pre>
827 _EOT_
828 else
829 # Display clouds
830 while read var arg title fmt filter; do
831 file=/tmp/$arg-$SLITAZ_VERSION
832 echo "<a name=\"$arg\"></a>"
833 echo "<h3>$title</h3>"
834 [ ! -e $file -o \
835 $PACKAGES_REPOSITORY/packages.txt -nt $file ] &&
836 build_cloud_cache $var "$filter" > $file.$$ &&
837 mv $file.$$ $file
838 display_cloud $arg "$fmt" < $file 2>&1
839 done << EOT
840 TAGS tags Tag\ cloud %d\ tags.
841 CATEGORY category Category\ cloud %d\ categories.
842 MAINTAINER maintainer Maintainer\ cloud %d\ maintainers. s/.*<//;s/.*\ //;s/>//
843 EOT
844 fi
845 ;;
848 ### Package receipt
849 # TODO: add style highlighting
850 Receipt)
851 package_exist $SEARCH && cat << _EOT_
853 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
854 <pre>
855 $(receipt=$WOK/$SEARCH/taz/*/receipt
856 [ -f $receipt ] || receipt=$WOK/$SEARCH/receipt
857 . /home/slitaz/repos/cookutils/cook.conf
858 . $receipt
859 cat $receipt | htmlize | urllink)
860 </pre>
861 _EOT_
862 ;;
865 ### Package
866 Package)
867 #WHY# if package_exist $SEARCH; then
868 cat << _EOT_
870 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
871 <pre>
872 _EOT_
873 for pkg in `ls $WOK/ | grep "$SEARCH"`
874 do
875 . $WOK/$pkg/receipt
876 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>"
877 [ -f $WOK/$pkg/description.txt ] || DESC=""
878 cat << _EOT_
879 $(package_entry)$DESC
880 _EOT_
881 done
882 equiv=$PACKAGES_REPOSITORY/packages.equiv
883 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
884 for vpkg in $vpkgs ; do
885 cat << _EOT_
886 </pre>
888 <h3>$(eval_gettext "Result for: \$SEARCH (package providing \$vpkg)")</h3>
889 <pre>
890 _EOT_
891 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
892 . $WOK/${pkg#*:}/receipt
893 package_entry
894 done
895 done
896 cat << _EOT_
897 </pre>
898 _EOT_
899 #WHY# fi
900 ;;
902 ### Category
903 Category)
904 cat << _EOT_
906 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
907 <pre>
908 _EOT_
909 for pkg in `ls $WOK/`
910 do
911 CATEGORY=
912 . $WOK/$pkg/receipt
913 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>"
914 [ -f $WOK/$pkg/description.txt ] || DESC=""
915 [ "$CATEGORY" == "$SEARCH" ] && cat << _EOT_
916 $(package_entry)$DESC
917 _EOT_
918 done
919 ;;
921 ### Maintainer
922 Maintainer)
923 cat << _EOT_
925 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
926 <pre>
927 _EOT_
928 for pkg in `ls $WOK/`
929 do
930 MAINTAINER=
931 . $WOK/$pkg/receipt
932 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>"
933 [ -f $WOK/$pkg/description.txt ] || DESC=""
934 [ "$MAINTAINER" == "$SEARCH" ] && cat << _EOT_
935 $(package_entry)$DESC
936 _EOT_
937 done
938 ;;
939 esac
941 xhtml_footer
943 exit 0