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

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