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

cook: use cookutils default CSS style
author Christophe Lincoln <pankso@slitaz.org>
date Sat May 12 23:32:22 2012 +0200 (2012-05-12)
parents c0e954250657
children bcf91a0f91d9
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 # Aleksej Bobylev <al.bobylev@gmail.com>
5 #
7 # Parse query string
8 . /usr/lib/slitaz/httphelper.sh
9 echo -n "0" > $HOME/ifEven
11 # User preferred language
12 # parameter $1 have priority; without parameter $1 - browser language only
13 # if we don't support any of user languages (or only en), then return C locale
14 user_lang() {
15 LANG="C"
16 IFS=","
17 for lang in $1 $HTTP_ACCEPT_LANGUAGE
18 do
19 lang=${lang%;*} lang=${lang# } lang=${lang%-*} lang=${lang%_*}
20 case "$lang" in
21 de) LANG="de_DE" ;;
22 es) LANG="es_ES" ;;
23 fr) LANG="fr_FR" ;;
24 it) LANG="it_IT" ;;
25 pt) LANG="pt_BR" ;;
26 ru) LANG="ru_RU" ;;
27 zh) LANG="zh_TW" ;;
28 esac
29 if echo "de en fr pt ru zh" | fgrep -q "$lang"; then
30 break
31 fi
32 done
33 unset IFS
34 echo "$LANG"
35 }
37 # Short 2-letter lang code from ll_CC
38 ll_lang() {
39 ll_CC="$1"
40 echo ${ll_CC%_*}
41 }
43 # Part of query to indicate current debug mode
44 ifdebug() {
45 ifdebug="$(GET debug)"
46 [ ! -z "$ifdebug" ] && ifdebug="$1$ifdebug"
47 echo "$ifdebug"
48 }
50 # GET or POST variable
51 GETPOST() {
52 echo "$(POST $1)$(GET $1)"
53 }
55 # Nice URL replacer - to copy url from address bar
56 if [ "$REQUEST_METHOD" == "POST" -o ! -z $(GET submit) ]; then
57 OBJECT=$(GETPOST object)
58 SEARCH=$(GETPOST query)
59 case "$OBJECT" in
60 Package) NICE="package=$SEARCH";;
61 Desc) NICE="desc=$SEARCH";;
62 Tags) NICE="tags=$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="$(GETPOST 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="$(GETPOST 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="$(GETPOST verbose)"
84 if [ ! -z "$verboseq" -a "$verboseq" != "0" ]; then
85 NICE="${NICE}&verbose=1"
86 fi
87 # debug, if needed
88 debugq="$(GET debug)"
89 if [ ! -z "$debugq" -a "$debugq" == "debug" ]; then
90 NICE="${NICE}&debug"
91 fi
92 # redirect
93 header "HTTP/1.1 301 Moved Permanently" "Location: $SCRIPT_NAME?$NICE"
94 exit 0
95 fi
99 OBJECT="$(GET object)"
100 SEARCH="$(GET query)"
101 SLITAZ_VERSION="$(GET version)"
102 VERBOSE="$(GET verbose)"
104 # Internal variables
105 #DATE=$(date +%Y-%m-%d\ %H:%M:%S)
107 # Internationalization
108 . /usr/bin/gettext.sh
109 export TEXTDOMAIN='tazpkg-web'
111 SEARCH=""
112 VERBOSE=0
113 for i in $(echo $QUERY_STRING | sed 's/[?&]/ /g'); do
114 # SLITAZ_VERSION=cooking
115 case "$(echo $i | tr [A-Z] [a-z])" in
116 query=*|search=*) [ ${i#*=} == Search ] || SEARCH=${i#*=};;
117 object=*) OBJECT=${i#*=};;
118 verbose=*) VERBOSE=${i#*=};;
119 lang=*) LANG=${i#*=};;
120 file=*) SEARCH=${i#*=}; OBJECT=File;;
121 desc=*) SEARCH=${i#*=}; OBJECT=Desc;;
122 tags=*) SEARCH=${i#*=}; OBJECT=Tags;;
123 receipt=*) SEARCH=${i#*=}; OBJECT=Receipt;;
124 filelist=*) SEARCH=${i#*=}; OBJECT=File_list;;
125 package=*) SEARCH=${i#*=}; OBJECT=Package;;
126 depends=*) SEARCH=${i#*=}; OBJECT=Depends;;
127 builddepends=*) SEARCH=${i#*=}; OBJECT=BuildDepends;;
128 fileoverlap=*) SEARCH=${i#*=}; OBJECT=FileOverlap;;
129 version=[1-9]*) i=${i%%.*}; SLITAZ_VERSION=${i#*=}.0;;
130 version=s*|version=4*) SLITAZ_VERSION=stable;;
131 version=u*) SLITAZ_VERSION=undigest;;
132 version=t*) SLITAZ_VERSION=tiny;;
133 esac
134 done
135 [ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION=cooking
137 #
138 # Content negotiation for Gettext
139 #
140 LANG=$(user_lang $(GET lang))
141 lang="$(ll_lang $LANG)"
142 export LANG LC_ALL=$LANG
145 case "$OBJECT" in
146 File) selected_file="selected";;
147 Desc) selected_desc="selected";;
148 Tags) selected_tags="selected";;
149 Receipt) selected_receipt="selected";;
150 File_list) selected_file_list="selected";;
151 Depends) selected_depends="selected";;
152 BuildDepends) selected_build_depends="selected";;
153 FileOverlap) selected_overlap="selected";;
154 esac
156 case "$SLITAZ_VERSION" in
157 tiny) selected_tiny="selected";;
158 1.0) selected_1="selected";;
159 2.0) selected_2="selected";;
160 3.0) selected_3="selected";;
161 stable) selected_stable="selected";;
162 undigest) selected_undigest="selected";;
163 esac
165 # unescape query
166 SEARCH="$(echo $SEARCH | sed 's/%2B/+/g; s/%3A/:/g; s|%2F|/|g')"
168 WOK=/home/slitaz/$SLITAZ_VERSION/wok
169 PACKAGES_REPOSITORY=/home/slitaz/$SLITAZ_VERSION/packages
171 # Search form
172 # TODO: add hint 'You are can search for depends loop, if textfield is empty'...
173 # add progress ticker while page is not complete
174 search_form()
175 {
176 cat << _EOT_
178 <div class="form">
179 <form id="s_form" method="post" action="$SCRIPT_NAME$(ifdebug '?')">
180 <input type="hidden" name="lang" value="$lang" />
181 <span class="small">
182 <select name="object">
183 <option value="Package">$(gettext "Package")</option>
184 <option $selected_desc value="Desc">$(gettext "Description")</option>
185 <option $selected_tags value="Tags">$(gettext "Tags")</option>
186 <option $selected_receipt value="Receipt">$(gettext "Receipt")</option>
187 <option $selected_depends value="Depends">$(gettext "Depends")</option>
188 <option $selected_build_depends value="BuildDepends">$(gettext "Build depends")</option>
189 <option $selected_file value="File">$(gettext "File")</option>
190 <option $selected_file_list value="File_list">$(gettext "File list")</option>
191 <option $selected_overlap value="FileOverlap">$(gettext "common files")</option>
192 </select>
193 </span>
194 <span class="stretch">
195 <input autofocus type="text" name="query" id="query" value="$SEARCH" />
196 </span>
197 <span class="small">
198 <select name="version">
199 <option value="cooking">$(gettext "cooking")</option>
200 <option $selected_stable value="stable">4.0</option>
201 <option $selected_3 value="3.0">3.0</option>
202 <option $selected_2 value="2.0">2.0</option>
203 <option $selected_1 value="1.0">1.0</option>
204 <option $selected_tiny value="tiny">$(gettext "tiny")</option>
205 <option $selected_undigest value="undigest">$(gettext "undigest")</option>
206 </select>
207 </span>
208 <span class="small">
209 <input type="submit" value="$(gettext 'Search')" />
210 </span>
211 </form>
212 </div>
213 _EOT_
214 }
216 # xHTML5 Header.
217 xhtml_header() {
218 . lib/header.sh
219 }
221 # xHTML Footer.
222 # TODO: caching the summary for 5 minutes
223 xhtml_footer() {
224 PKGS=$(ls $WOK/ | wc -l)
225 FILES=$(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | wc -l)
226 . lib/footer.sh
227 }
229 installed_size()
230 {
231 if [ $VERBOSE -gt 0 ]; then
232 inst=$(grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | grep installed)
233 # size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1)
234 echo $inst | sed 's/.*(\(.*\).*/(\1)/'
235 # echo $size
236 # | sed 's/.*(\(.*\) installed.*/(\1) /'
237 fi
238 }
240 oddeven() {
241 ifEven=$(cat $HOME/ifEven)
242 [ "$1" == "1" ] && ifEven="0"
243 case "$ifEven" in
244 "0") ifEven="1"; echo -n " class=\"even\"";;
245 "1") ifEven="0";;
246 esac
247 echo -n "$ifEven" > $HOME/ifEven
248 }
250 package_entry() {
251 cat << EOT
252 <tr$(oddeven $1)>
253 EOT
254 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
255 cat << _EOT_
256 <td class="first"><a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a></td>
257 <td class="first">$(installed_size $PACKAGE)</td>
258 <td>$SHORT_DESC</td>
259 _EOT_
260 else
261 PACKAGE_HREF="<u>$PACKAGE</u>"
262 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
263 nslookup mirror.slitaz.org | grep -q 127.0.0.1 &&
264 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls $PACKAGE-$VERSION*.tazpkg)"
265 busybox wget -s $PACKAGE_URL 2> /dev/null &&
266 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
267 cat << _EOT_
268 <td class="first">$PACKAGE_HREF</td>
269 <td class="first">$(installed_size $PACKAGE)</td>
270 <td>$SHORT_DESC</td>
271 _EOT_
272 fi
273 cat << EOT
274 </tr>
275 EOT
276 }
277 package_entry_inline() {
278 if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then
279 cat << _EOT_
280 <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE) : $SHORT_DESC
281 _EOT_
282 else
283 PACKAGE_HREF="<u>$PACKAGE</u>"
284 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
285 nslookup mirror.slitaz.org | grep -q 127.0.0.1 &&
286 PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls $PACKAGE-$VERSION*.tazpkg)"
287 busybox wget -s $PACKAGE_URL 2> /dev/null &&
288 PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
289 cat << _EOT_
290 $PACKAGE_HREF $(installed_size $PACKAGE) : $SHORT_DESC
291 _EOT_
292 fi
293 }
295 # Show loop in depends/build_depends chains
296 show_loops()
297 {
298 awk '
299 function chkloop(pkg, i, n)
300 {
301 if (n < 8)
302 for (i = 1; i <= split(deps[pkg],curdep," "); i++) {
303 if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
304 split(deps[pkg],curdep," ")
305 p = curdep[i] " " p
306 return 1
307 }
308 }
309 return 0
310 }
311 {
312 for (i = 2; i <= NF; i++)
313 deps[$1] = deps[$1] " " $i
314 }
315 END {
316 for (pkg in deps) {
317 base = pkg
318 p = ""
319 if (chkloop(pkg, 0, 0))
320 print pkg " " p
321 #print pkg " : " p "..."
322 }
323 }' | while read line; do
324 set -- $line
325 case " $last " in
326 *\ $1\ *) continue
327 esac
328 last="$line"
329 pkg=$1
330 shift
331 echo "<strong>$pkg </strong>: $@ ..."
332 done
333 }
335 # recursive dependencies scan
336 dep_scan()
337 {
338 for i in $1; do
339 case " $ALL_DEPS " in
340 *\ $i\ *) continue;;
341 esac
342 ALL_DEPS="$ALL_DEPS $i"
343 if [ -n "$2" ]; then
344 echo -n "$2"
345 (
346 . $WOK/$i/receipt
347 package_entry_inline
348 )
349 fi
350 [ -f $WOK/$i/receipt ] || continue
351 DEPENDS=""
352 BUILD_DEPENDS=""
353 WANTED=""
354 . $WOK/$i/receipt
355 if [ -n "$3" ]; then
356 [ -n "$BUILD_DEPENDS$WANTED" ] &&
357 dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3
358 else
359 [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 "
360 fi
361 done
362 }
364 # recursive reverse dependencies scan
365 rdep_scan()
366 {
367 SEARCH=$1
368 case "$SEARCH" in
369 glibc-base|gcc-lib-base)
370 $(gettext " glibc-base and gcc-lib-base are implicit dependencies,
371 <b>every</b> package is supposed to depend on them."); echo
372 return;;
373 esac
374 for i in $WOK/* ; do
375 DEPENDS=""
376 BUILD_DEPENDS=""
377 WANTED=""
378 . $i/receipt
379 if [ -n "$2" ]; then
380 echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)"
381 else
382 echo "$(basename $i) $(echo $DEPENDS)"
383 fi
384 done | awk -v search=$SEARCH '
385 function show_deps(deps, all_deps, pkg, space)
386 {
387 if (all_deps[pkg] == 1) return
388 all_deps[pkg] = 1
389 if (space != "") printf "%s%s\n",space,pkg
390 for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) {
391 show_deps(deps, all_deps, mydeps[i],"////" space)
392 }
393 }
395 {
396 all_deps[$1] = 0
397 for (i = 2; i <= NF; i++)
398 deps[$i] = deps[$i] " " $1
399 }
401 END {
402 show_deps(deps, all_deps, search, "")
403 }
404 ' | while read pkg; do
405 . $WOK/${pkg##*/}/receipt
406 cat << _EOT_
407 $(echo ${pkg%/*} | sed 's|/| |g') $(package_entry_inline)
408 _EOT_
409 done
410 }
412 # Check package exists
413 package_exist()
414 {
415 [ -f $WOK/$1/receipt ] && return 0
416 cat << _EOT_
418 <h3>$(eval_gettext "No package \$SEARCH")</h3>
419 _EOT_
420 return 1
421 }
423 # Display < > &
424 htmlize() {
425 sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
426 }
428 display_packages_and_files() {
429 last=""
430 while read pkg file; do
431 pkg=${pkg%:}
432 if [ "$pkg" != "$last" ]; then
433 . $WOK/$pkg/receipt
435 package_entry_inline
436 last=$pkg
437 fi
438 echo " $file"
439 done
440 }
442 # Syntax highlighting for receipt file - stolen from tazpanel:
443 # '/var/www/tazpanel/lib/libtazpanel' and developed
444 syntax_highlighter() {
445 cat "$1" | sed -e "s|\&|\&amp;|g; s|<|\&lt;|g; s|>|\&gt;|g; s| | |g" \
446 -e "s|@|\&#64;|g; s|~|\&#126;|g" \
447 -e "#literals" \
448 -e "s|'\([^']*\)'|@l\0~|g" \
449 -e 's|"\([^"]*\)"|@l\0~|g' \
450 -e 's|"\([^"]*\)\\|@l\0~|g' \
451 -e 's|\([^"]*\)\"$|@l\0~|g' \
452 -e "#paths" \
453 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+\)\([ )]\)|\1@p\2~\3|g' \
454 -e 's|\([ =]\)\([a-zA-Z0-9/-]*/[\$a-zA-Z0-9/\.-]\+$\)|\1@p\2~|g' \
455 -e 's|\(\$[a-zA-Z0-9_\.-]\+\)\(/[\$a-zA-Z0-9_/\.\*-]\+\)\([ )]*\)|@p\1\2~\3|g' \
456 -e "#functions" \
457 -e 's|^\([^()]*\)\(()\)|@f\0~|g' \
458 -e "#single line comments" \
459 -e 's|^\([ ]*\)#\([^#]*$\)|@c\0~|g' \
460 -e "#parameters" \
461 -e 's|\( \)\(-[a-z0-9]\+\)\( *\)|\1@r\2~\3|g' \
462 -e 's|\( \)\(--[a-z0-9\-]\+\)\([= ]\)|\1@r\2~\3|g' \
463 -e "#variables" \
464 -e "s|^\([^=@#' \-]*\)\(=\)|@v\1~\2|g" \
465 -e 's|\([ ^@-]*\)\([a-zA-Z0-9]\+\)\(=\)|\1@v\2~\3|g' \
466 -e "s#\(\$[a-zA-Z0-9_]\+\)#@v\0~#g" \
467 -e "#urls" \
468 -e s"#\"\(http:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
469 -e s"#\"\(ftp:[^\"\$ ]*\)\"#\"<a @u href=\0>\1</a>\"#"g \
470 -e "#commands" \
471 -e s"#^\( \+\)\([^'= @\-]\+\)#\1@m\2~#"g \
472 -e "#simple commands" \
473 -e s"#\([{}\]$\)#@s\0~#"g \
474 -e s"#\( \)\(\&amp;\&amp;\)\( *\)#\1@s\2~\3#"g \
475 -e s"#\(|\)#@s\0~#"g \
476 -e s"#\(\&lt;\)#@s\0~#"g \
477 -e s"#\(\&gt;\&amp;\)#@s\0~#"g \
478 -e s"#\(\&gt;\)#@s\0~#"g \
479 -e s"#\(\[\)#@s\0~#"g \
480 -e s"#\(\]\)#@s\0~#"g \
481 \
482 -e "s|´|'|g; s|›|</span>|g" \
483 -e "s|@c|<span class='r-comment'>|g" \
484 -e "s|@l|<span class='r-literal'>|g" \
485 -e "s|@v|<span class='r-var'>|g" \
486 -e "s|@f|<span class='r-func'>|g" \
487 -e "s|@u|class='r-url' target='_blank'|g" \
488 -e "s|@m|<span class='r-com'>|g" \
489 -e "s|@s|<span class='r-scom'>|g" \
490 -e "s|@p|<span class='r-path'>|g" \
491 -e "s|@r|<span class='r-param'>|g" \
492 -e "s|~|</span>|g"
493 }
496 #
497 # page begins
498 #
499 header "HTTP/1.1 200 OK" "Content-type: text/html"
500 xhtml_header
502 #
503 # language selector, if needed
504 #
505 if [ -z "$HTTP_ACCEPT_LANGUAGE" ]; then
506 oldlang=$(GETPOST lang)
507 if [ -z "$oldlang" ]; then
508 oldlang="C"
509 [ -z "$QUERY_STRING" ] && QUERY_STRING="lang=C" || QUERY_STRING="${QUERY_STRING}&lang=C"
510 fi
511 cat << EOT
512 <!-- Languages -->
513 <div id="lang">
514 EOT
515 for i in en de fr pt ru zh; do
516 cat << EOT
517 <a href="$SCRIPT_NAME?$(echo "$QUERY_STRING" | sed s/"lang=$oldlang"/"lang=$i"/)">$(
518 case $i in
519 en) echo -n "English";;
520 de) echo -n "Deutsch";;
521 fr) echo -n "Français";;
522 pt) echo -n "Português";;
523 ru) echo -n "Русский";;
524 zh) echo -n "中文";;
525 esac)</a>
526 EOT
527 done
528 cat << EOT
529 </div>
531 EOT
532 fi
534 cat << EOT
535 <!-- Content -->
536 <div id="content">
537 EOT
539 #
540 # Handle GET requests
541 #
542 case " $(GET) " in
543 *\ debug\ *|*\ debug*)
544 cat << EOT
545 <h2>Debug info</h2>
546 <pre>$(httpinfo)</pre>
547 <pre>LANG=$LANG;
548 OBJECT=$OBJECT;
549 SEARCH=$SEARCH;
550 SLITAZ_VERSION=$SLITAZ_VERSION;
551 WOK=$WOK;
552 GET=$(GET);
553 </pre>
554 EOT
555 #$(xhtml_footer)
556 #EOT
557 # exit 0
558 ;;
559 esac
561 # Display search form and result if requested.
562 #xhtml_header
563 cat << EOT
564 <h2>$(gettext 'Search for packages')</h2>
565 <div id="ticker"><img src="style/images/loader.gif" alt="." /></div>
566 EOT
567 search_form
571 case "$OBJECT" in
574 ### Depends loops; [Reverse] Dependency tree [(SUGGESTED)]
575 Depends)
576 if [ -z "$SEARCH" ]; then
577 cat << _EOT_
579 <h3>$(gettext "Depends loops")</h3>
580 <pre>
581 _EOT_
582 for i in $WOK/*/receipt; do
583 PACKAGE=
584 DEPENDS=
585 . $i
586 echo "$PACKAGE $(echo $DEPENDS)"
587 done | show_loops
588 cat << _EOT_
589 </pre>
590 _EOT_
591 elif package_exist $SEARCH ; then
592 cat << _EOT_
594 <h3>$(eval_gettext "Dependency tree for: \$SEARCH")</h3>
595 <pre>
596 _EOT_
597 ALL_DEPS=""
598 dep_scan $SEARCH ""
599 SUGGESTED=""
600 . $WOK/$SEARCH/receipt
601 if [ -n "$SUGGESTED" ]; then
602 cat << _EOT_
603 </pre>
605 <h3>$(eval_gettext "Dependency tree for: \$SEARCH (SUGGESTED)")</h3>
606 <pre>
607 _EOT_
608 ALL_DEPS=""
609 dep_scan "$SUGGESTED" " "
610 fi
611 cat << _EOT_
612 </pre>
614 <h3>$(eval_gettext "Reverse dependency tree for: \$SEARCH")</h3>
615 <pre>
616 _EOT_
617 ALL_DEPS=""
618 rdep_scan $SEARCH
619 cat << _EOT_
620 </pre>
621 _EOT_
622 fi
623 ;;
626 ### Build depends loops; [Reverse] Build dependency tree
627 BuildDepends)
628 if [ -z "$SEARCH" ]; then
629 cat << _EOT_
631 <h3>$(gettext "Build depends loops")</h3>
632 <pre>
633 _EOT_
634 for i in $WOK/*/receipt; do
635 PACKAGE=
636 WANTED=
637 BUILD_DEPENDS=
638 . $i
639 echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)"
640 done | show_loops
641 cat << _EOT_
642 </pre>
643 _EOT_
644 elif package_exist $SEARCH ; then
645 cat << _EOT_
647 <h3>$(eval_gettext "\$SEARCH needs these packages to be built")</h3>
648 <pre>
649 _EOT_
650 ALL_DEPS=""
651 dep_scan $SEARCH "" build
652 cat << _EOT_
653 </pre>
655 <h3>$(eval_gettext "Packages who need \$SEARCH to be built")</h3>
656 <pre>
657 _EOT_
658 ALL_DEPS=""
659 rdep_scan $SEARCH build
660 cat << _EOT_
661 </pre>
662 _EOT_
663 fi
664 ;;
667 ### Common files
668 FileOverlap)
669 if [ package_exist $SEARCH ]; then
670 cat << _EOT_
672 <h3>$(eval_gettext "These packages may overload files of \$SEARCH")</h3>
673 <pre>
674 _EOT_
675 ( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ;
676 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk '
677 BEGIN { pkg=""; last="x" }
678 {
679 if ($2 == "") next
680 if (index($2,last) == 1 && substr($2,1+length(last),1) == "/")
681 delete file[last]
682 last=$2
683 if (pkg == "") pkg=$1
684 if ($1 == pkg) file[$2]=$1
685 else if (file[$2] == pkg) print
686 }
687 ' | display_packages_and_files
688 cat << _EOT_
689 </pre>
690 _EOT_
691 fi
692 ;;
695 ### File search
696 File)
697 if [ -n "$SEARCH" ]; then
698 cat << _EOT_
700 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
701 <table>
702 _EOT_
703 last=""
704 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
705 | grep "$SEARCH" | while read pkg file; do
706 echo "$file" | grep -q "$SEARCH" || continue
707 if [ "$last" != "${pkg%:}" ]; then
708 last=${pkg%:}
709 (
710 . $WOK/$last/receipt
711 [ -n "$last" ] && cat << EOT
712 </td></tr>
713 EOT
714 cat << _EOT_
716 $(package_entry 1)
717 <tr><td colspan="3" class="pre">
718 _EOT_
719 )
720 fi
721 echo -n "$file" | sed s/"$SEARCH"/"<span class='match'>$SEARCH<\/span>"/g
722 echo "<br />"
723 done
724 cat << _EOT_
725 </td></tr>
726 </table>
727 _EOT_
728 fi
729 ;;
732 ### List of files
733 File_list)
734 if package_exist $SEARCH; then
735 cat << _EOT_
737 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
738 <pre>
739 _EOT_
740 last=""
741 unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
742 | grep ^$SEARCH: | sed 's/.*: / /' | sort
743 cat << _EOT_
744 </pre>
745 <pre>
746 _EOT_
747 filenb=$(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: | wc -l)
748 eval_ngettext "\$filenb file" "\$filenb files" $filenb
749 cat << _EOT_
750 \
751 $(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt)
752 </pre>
753 _EOT_
754 fi
755 ;;
758 ### Package description
759 Desc)
760 if [ -f $WOK/$SEARCH/description.txt ]; then
761 cat << _EOT_
763 <h3>$(eval_gettext "Description of package: \$SEARCH")</h3>
764 <table>
765 $(htmlize < $WOK/$SEARCH/description.txt)
766 </table>
767 _EOT_
768 else
769 cat << _EOT_
771 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
772 <table>
773 _EOT_
774 last=""
775 grep -i "$SEARCH" $PACKAGES_REPOSITORY/packages.desc | \
776 sort | while read pkg extras ; do
777 . $WOK/$pkg/receipt
778 package_entry
779 done
780 cat << _EOT_
781 </table>
782 _EOT_
783 fi
784 ;;
787 ### Tags
788 Tags)
789 cat << _EOT_
791 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
792 <table>
793 _EOT_
794 last=""
795 grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \
796 sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do
797 . $WOK/$pkg/receipt
798 package_entry
799 done
800 cat << _EOT_
801 </table>
802 _EOT_
803 ;;
806 ### Package receipt with syntax highlighter
807 Receipt)
808 if package_exist "$SEARCH"; then
809 cat << _EOT_
811 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
812 <pre>
813 _EOT_
814 if [ -f "$WOK/$SEARCH/taz/*/receipt" ]; then
815 syntax_highlighter "$WOK/$SEARCH/taz/*/receipt"
816 else
817 syntax_highlighter "$WOK/$SEARCH/receipt"
818 fi
819 echo '</pre>'
820 fi
821 ;;
824 ### Package
825 Package)
826 if package_exist $SEARCH; then
827 cat << _EOT_
829 <h3>$(eval_gettext "Result for: \$SEARCH")</h3>
830 <table>
831 _EOT_
832 for pkg in `ls $WOK/ | grep "$SEARCH"`
833 do
834 . $WOK/$pkg/receipt
835 DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION$(ifdebug '&')&submit=go\">$(gettext description)</a>"
836 [ -f $WOK/$pkg/description.txt ] || DESC=""
837 cat << _EOT_
838 $(package_entry)$DESC
839 _EOT_
840 done
841 equiv=$PACKAGES_REPOSITORY/packages.equiv
842 vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)"
843 for vpkg in $vpkgs ; do
844 cat << _EOT_
845 </table>
847 <h3>$(eval_gettext "Result for: \$SEARCH (package providing \$vpkg)")</h3>
848 <table>
849 _EOT_
850 for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
851 . $WOK/${pkg#*:}/receipt
852 package_entry
853 done
854 done
855 cat << _EOT_
856 </table>
857 _EOT_
858 fi
859 ;;
860 esac
862 xhtml_footer
864 exit 0