slitaz-forge rev 316
Add pkgs/mirror-search.sh: mirror.slitaz.org fork from tank.slitaz.org, needs conciliation
author | Pascal Bellard <pascal.bellard@slitaz.org> |
---|---|
date | Sun Jul 15 09:25:01 2012 +0200 (2012-07-15) |
parents | 83581929dde2 |
children | 26343c8fe3a2 |
files | pkgs/mirror-search.sh |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/pkgs/mirror-search.sh Sun Jul 15 09:25:01 2012 +0200 1.3 @@ -0,0 +1,827 @@ 1.4 +#!/bin/sh 1.5 +# Tiny CGI search engine for SliTaz packages on http://pkgs.slitaz.org/ 1.6 +# Christophe Lincoln <pankso@slitaz.org> 1.7 +# Aleksej Bobylev <al.bobylev@gmail.com> 1.8 +# 1.9 + 1.10 +# Parse query string 1.11 +. /usr/lib/slitaz/httphelper.sh 1.12 + 1.13 + 1.14 +# User preferred language 1.15 +# parameter $1 have priority; without parameter $1 - browser language only 1.16 +# if we don't support any of user languages (or only en), then return C locale 1.17 +user_lang() { 1.18 + LANG="C" 1.19 + IFS="," 1.20 + for lang in $1 $HTTP_ACCEPT_LANGUAGE 1.21 + do 1.22 + lang=${lang%;*} lang=${lang# } lang=${lang%-*} lang=${lang%_*} 1.23 + case "$lang" in 1.24 + de) LANG="de_DE" ;; 1.25 + es) LANG="es_ES" ;; 1.26 + fr) LANG="fr_FR" ;; 1.27 + it) LANG="it_IT" ;; 1.28 + pt) LANG="pt_BR" ;; 1.29 + ru) LANG="ru_RU" ;; 1.30 + zh) LANG="zh_TW" ;; 1.31 + esac 1.32 + if echo "de en fr pt ru zh" | fgrep -q "$lang"; then 1.33 + break 1.34 + fi 1.35 + done 1.36 + unset IFS 1.37 + echo "$LANG" 1.38 +} 1.39 + 1.40 +# Short 2-letter lang code from ll_CC 1.41 +ll_lang() { 1.42 + ll_CC="$1" 1.43 + echo ${ll_CC%_*} 1.44 +} 1.45 + 1.46 +# Nice URL replacer - to copy url from address bar 1.47 +# TODO: deal with POST method of form submitting 1.48 +nice_url() { 1.49 + # if user submitted a form 1.50 + if [ ! -z $(GET submit) ]; then 1.51 + OBJECT="$(GET object)" 1.52 + SEARCH="$(GET query)" 1.53 + case $OBJECT in 1.54 + Package) NICE="package=$SEARCH";; 1.55 + Desc) NICE="desc=$SEARCH";; 1.56 + Tags) NICE="tags=$SEARCH";; 1.57 + Receipt) NICE="receipt=$SEARCH";; 1.58 + Depends) NICE="depends=$SEARCH";; 1.59 + BuildDepends) NICE="builddepends=$SEARCH";; 1.60 + File) NICE="file=$SEARCH";; 1.61 + File_list) NICE="filelist=$SEARCH";; 1.62 + FileOverlap) NICE="fileoverlap=$SEARCH";; 1.63 + esac 1.64 + # version, if needed 1.65 + version="$(GET version)" 1.66 + if [ ! -z "$version" -a "$version" != "cooking" ]; then 1.67 + NICE="${NICE}&version=${version:0:1}" 1.68 + fi 1.69 + # lang, if needed 1.70 + query_lang="$(GET lang)" 1.71 + pref_lang="$(user_lang)" 1.72 + browser_lang="$(ll_lang $pref_lang)" 1.73 + if [ ! -z "$query_lang" -a "$query_lang" != "$browser_lang" ]; then 1.74 + NICE="${NICE}&lang=$query_lang" 1.75 + fi 1.76 + # verbose, if needed 1.77 + verboseq="$(GET verbose)" 1.78 + if [ ! -z "$verboseq" -a "$verboseq" != "0" ]; then 1.79 + NICE="${NICE}&verbose=1" 1.80 + fi 1.81 + # redirect 1.82 + # TODO: implement HTTP 301 Redirect 1.83 + cat << EOT 1.84 +Content-type: text/html 1.85 + 1.86 +<!DOCTYPE html> 1.87 +<html><head><meta http-equiv="refresh" content="0;url=$SCRIPT_NAME?$NICE" /> 1.88 +<title>Redirect</title></head></html> 1.89 +EOT 1.90 +# echo "Location: $SCRIPT_NAME?$NICE" 1.91 +# echo 1.92 + exit 0 1.93 + fi 1.94 +} 1.95 + 1.96 +nice_url 1.97 + 1.98 + 1.99 + 1.100 +OBJECT="$(GET object)" 1.101 +SEARCH="$(GET query)" 1.102 +SLITAZ_VERSION="$(GET version)" 1.103 +VERBOSE="$(GET verbose)" 1.104 + 1.105 +# Internal variables 1.106 +#DATE=$(date +%Y-%m-%d\ %H:%M:%S) 1.107 + 1.108 +# Internationalization 1.109 +. /usr/bin/gettext.sh 1.110 +export TEXTDOMAIN='tazpkg-web' 1.111 + 1.112 +SEARCH="" 1.113 +VERBOSE=0 1.114 +for i in $(echo $QUERY_STRING | sed 's/[?&]/ /g'); do 1.115 +# SLITAZ_VERSION=cooking 1.116 + case "$(echo $i | tr [A-Z] [a-z])" in 1.117 + query=*|search=*) [ ${i#*=} == Search ] || SEARCH=${i#*=};; 1.118 + object=*) OBJECT=${i#*=};; 1.119 + verbose=*) VERBOSE=${i#*=};; 1.120 + lang=*) LANG=${i#*=};; 1.121 + file=*) SEARCH=${i#*=}; OBJECT=File;; 1.122 + desc=*) SEARCH=${i#*=}; OBJECT=Desc;; 1.123 + tags=*) SEARCH=${i#*=}; OBJECT=Tags;; 1.124 + receipt=*) SEARCH=${i#*=}; OBJECT=Receipt;; 1.125 + filelist=*) SEARCH=${i#*=}; OBJECT=File_list;; 1.126 + package=*) SEARCH=${i#*=}; OBJECT=Package;; 1.127 + depends=*) SEARCH=${i#*=}; OBJECT=Depends;; 1.128 + builddepends=*) SEARCH=${i#*=}; OBJECT=BuildDepends;; 1.129 + fileoverlap=*) SEARCH=${i#*=}; OBJECT=FileOverlap;; 1.130 + category=*) SEARCH=${i#*=}; OBJECT=Category;; 1.131 + maintainer=*) SEARCH=${i#*=}; OBJECT=Maintainer;; 1.132 + version=[1-9]*) i=${i%%.*}; SLITAZ_VERSION=${i#*=}.0;; 1.133 + version=s*|version=4*) SLITAZ_VERSION=stable;; 1.134 + version=u*) SLITAZ_VERSION=undigest;; 1.135 + version=t*) SLITAZ_VERSION=tiny;; 1.136 + esac 1.137 +done 1.138 +[ -z "$SLITAZ_VERSION" ] && SLITAZ_VERSION=cooking 1.139 +#[ -n "$SEARCH" ] && REQUEST_METHOD="POST" 1.140 +#[ "$SEARCH" == "." ] && SEARCH= 1.141 + 1.142 + 1.143 +# Content negotiation for Gettext 1.144 +LANG=$(user_lang $(GET lang)) 1.145 +lang="$(ll_lang $LANG)" 1.146 +export LANG LC_ALL=$LANG 1.147 + 1.148 + 1.149 +case "$OBJECT" in 1.150 + File) selected_file="selected";; 1.151 + Desc) selected_desc="selected";; 1.152 + Tags) selected_tags="selected";; 1.153 + Receipt) selected_receipt="selected";; 1.154 + File_list) selected_file_list="selected";; 1.155 + Depends) selected_depends="selected";; 1.156 + BuildDepends) selected_build_depends="selected";; 1.157 + FileOverlap) selected_overlap="selected";; 1.158 +esac 1.159 + 1.160 +case "$SLITAZ_VERSION" in 1.161 + tiny) selected_tiny="selected";; 1.162 + 1.0) selected_1="selected";; 1.163 + 2.0) selected_2="selected";; 1.164 + 3.0) selected_3="selected";; 1.165 + stable) selected_stable="selected";; 1.166 + undigest) selected_undigest="selected";; 1.167 +esac 1.168 + 1.169 +# unescape query 1.170 +SEARCH="$(echo $SEARCH | sed 's/%2B/+/g; s/%3A/:/g; s|%2F|/|g')" 1.171 + 1.172 +WOK=/home/slitaz/$SLITAZ_VERSION/wok 1.173 +PACKAGES_REPOSITORY=/home/slitaz/$SLITAZ_VERSION/packages 1.174 + 1.175 + 1.176 +# TODO: header function from httphelper 1.177 +echo "Content-type: text/html" 1.178 +echo 1.179 + 1.180 +# Search form 1.181 +# TODO: implement POST method 1.182 +# ... method="post" enctype="multipart/form-data" ... 1.183 +# TODO: add hint 'You are can search for depends loop, if textfield is empty'... 1.184 +# add progress ticker while page is not complete 1.185 +search_form() 1.186 +{ 1.187 + cat << _EOT_ 1.188 + 1.189 +<form id="s_form" method="get" action="$SCRIPT_NAME"> 1.190 + <input type="hidden" name="lang" value="$lang" /> 1.191 + <select name="object"> 1.192 + <option value="Package">$(gettext "Package")</option> 1.193 + <option $selected_desc value="Desc">$(gettext "Description")</option> 1.194 + <option $selected_tags value="Tags">$(gettext "Tags")</option> 1.195 + <option $selected_receipt value="Receipt">$(gettext "Receipt")</option> 1.196 + <option $selected_depends value="Depends">$(gettext "Depends")</option> 1.197 + <option $selected_build_depends value="BuildDepends">$(gettext "Build depends")</option> 1.198 + <option $selected_file value="File">$(gettext "File")</option> 1.199 + <option $selected_file_list value="File_list">$(gettext "File list")</option> 1.200 + <option $selected_overlap value="FileOverlap">$(gettext "common files")</option> 1.201 + </select> 1.202 + <input type="text" name="query" id="query" size="20" value="$SEARCH" /> 1.203 + <select name="version"> 1.204 + <option value="cooking">$(gettext "cooking")</option> 1.205 + <option $selected_stable value="stable">4.0</option> 1.206 + <option $selected_3 value="3.0">3.0</option> 1.207 + <option $selected_2 value="2.0">2.0</option> 1.208 + <option $selected_1 value="1.0">1.0</option> 1.209 + <option $selected_tiny value="tiny">$(gettext "tiny")</option> 1.210 + <option $selected_undigest value="undigest">$(gettext "undigest")</option> 1.211 + </select> 1.212 + <input type="submit" name="submit" value="$(gettext 'Search')" /> 1.213 +</form> 1.214 +_EOT_ 1.215 +} 1.216 + 1.217 +# xHTML5 Header. 1.218 +xhtml_header() { 1.219 + . lib/header.sh 1.220 +} 1.221 + 1.222 +# xHTML Footer. 1.223 +# TODO: caching the summary for 5 minutes 1.224 +xhtml_footer() { 1.225 + PKGS=$(ls $WOK/ | wc -l) 1.226 + FILES=$(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | wc -l) 1.227 + . lib/footer.sh 1.228 +} 1.229 + 1.230 +installed_size() 1.231 +{ 1.232 + if [ $VERBOSE -gt 0 ]; then 1.233 + inst=$(grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | grep installed) 1.234 +# size=$(echo $inst | cut -d'(' -f2 | cut -d' ' -f1) 1.235 + echo $inst | sed 's/.*(\(.*\).*/(\1)/' 1.236 +# echo $size 1.237 +# | sed 's/.*(\(.*\) installed.*/(\1) /' 1.238 + fi 1.239 +} 1.240 + 1.241 +package_entry() 1.242 +{ 1.243 +if [ -s "$(dirname $0)/$SLITAZ_VERSION/$CATEGORY.html" ]; then 1.244 + cat << _EOT_ 1.245 +<a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC 1.246 +_EOT_ 1.247 +else 1.248 + PACKAGE_HREF="<u>$PACKAGE</u>" 1.249 + PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg" 1.250 + nslookup mirror.slitaz.org | grep -q 127.0.0.1 && 1.251 + [ -d /var/www/slitaz/mirror/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION ] && 1.252 + PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION" || 1.253 + PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls $PACKAGE-$VERSION*.tazpkg)" 1.254 + busybox wget -s $PACKAGE_URL 2> /dev/null && 1.255 + PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>" 1.256 + cat << _EOT_ 1.257 +$PACKAGE_HREF $(installed_size $PACKAGE): $SHORT_DESC 1.258 +_EOT_ 1.259 +fi 1.260 + [ -n "$(GET debug)" ] && cat << _EOT_ 1.261 +<pre> 1.262 +PACKAGE=$PACKAGE 1.263 +VERSION=$VERSION 1.264 +EXTRAVERSION=$EXTRAVERSION 1.265 +SLITAZ_VERSION=$SLITAZ_VERSION 1.266 +PACKAGE_URL=$PACKAGE_URL 1.267 +$(cd /var/www/slitaz/mirror/packages/$SLITAZ_VERSION ; ls -l $PACKAGE*) 1.268 +</pre> 1.269 +_EOT_ 1.270 +} 1.271 + 1.272 +# Show loop in depends/build_depends chains 1.273 +show_loops() 1.274 +{ 1.275 + awk ' 1.276 +function chkloop(pkg, i, n) 1.277 +{ 1.278 + if (n < 8) 1.279 + for (i = 1; i <= split(deps[pkg],curdep," "); i++) { 1.280 + if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) { 1.281 + split(deps[pkg],curdep," ") 1.282 + p = curdep[i] " " p 1.283 + return 1 1.284 + } 1.285 + } 1.286 + return 0 1.287 +} 1.288 +{ 1.289 + for (i = 2; i <= NF; i++) 1.290 + deps[$1] = deps[$1] " " $i 1.291 +} 1.292 +END { 1.293 + for (pkg in deps) { 1.294 + base = pkg 1.295 + p = "" 1.296 + if (chkloop(pkg, 0, 0)) 1.297 + print pkg " " p 1.298 + #print pkg " : " p "..." 1.299 + } 1.300 +}' | while read line; do 1.301 + set -- $line 1.302 + case " $last " in 1.303 + *\ $1\ *) continue 1.304 + esac 1.305 + last="$line" 1.306 + pkg=$1 1.307 + shift 1.308 + echo "<strong>$pkg </strong>: $@ ..." 1.309 +done 1.310 +} 1.311 + 1.312 +# recursive dependencies scan 1.313 +dep_scan() 1.314 +{ 1.315 +for i in $1; do 1.316 + case " $ALL_DEPS " in 1.317 + *\ $i\ *) continue;; 1.318 + esac 1.319 + ALL_DEPS="$ALL_DEPS $i" 1.320 + if [ -n "$2" ]; then 1.321 + echo -n "$2" 1.322 + ( 1.323 + . $WOK/$i/receipt 1.324 + package_entry 1.325 + ) 1.326 + fi 1.327 + [ -f $WOK/$i/receipt ] || continue 1.328 + DEPENDS="" 1.329 + BUILD_DEPENDS="" 1.330 + WANTED="" 1.331 + . $WOK/$i/receipt 1.332 + if [ -n "$3" ]; then 1.333 + [ -n "$BUILD_DEPENDS$WANTED" ] && 1.334 + dep_scan "$WANTED $BUILD_DEPENDS" "$2 " $3 1.335 + else 1.336 + [ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2 " 1.337 + fi 1.338 +done 1.339 +} 1.340 + 1.341 +# recursive reverse dependencies scan 1.342 +rdep_scan() 1.343 +{ 1.344 +SEARCH=$1 1.345 +case "$SEARCH" in 1.346 +glibc-base|gcc-lib-base) 1.347 + $(gettext " glibc-base and gcc-lib-base are implicit dependencies, 1.348 + <b>every</b> package is supposed to depend on them."); echo 1.349 + return;; 1.350 +esac 1.351 +for i in $WOK/* ; do 1.352 + DEPENDS="" 1.353 + BUILD_DEPENDS="" 1.354 + WANTED="" 1.355 + . $i/receipt 1.356 + if [ -n "$2" ]; then 1.357 + echo "$(basename $i) $(echo $WANTED $BUILD_DEPENDS)" 1.358 + else 1.359 + echo "$(basename $i) $(echo $DEPENDS)" 1.360 + fi 1.361 +done | awk -v search=$SEARCH ' 1.362 +function show_deps(deps, all_deps, pkg, space) 1.363 +{ 1.364 + if (all_deps[pkg] == 1) return 1.365 + all_deps[pkg] = 1 1.366 + if (space != "") printf "%s%s\n",space,pkg 1.367 + for (i = 1; i <= split(deps[pkg], mydeps, " "); i++) { 1.368 + show_deps(deps, all_deps, mydeps[i],"////" space) 1.369 + } 1.370 +} 1.371 + 1.372 +{ 1.373 + all_deps[$1] = 0 1.374 + for (i = 2; i <= NF; i++) 1.375 + deps[$i] = deps[$i] " " $1 1.376 +} 1.377 + 1.378 +END { 1.379 + show_deps(deps, all_deps, search, "") 1.380 +} 1.381 +' | while read pkg; do 1.382 + . $WOK/${pkg##*/}/receipt 1.383 + cat << _EOT_ 1.384 +$(echo ${pkg%/*} | sed 's|/| |g') $(package_entry) 1.385 +_EOT_ 1.386 +done 1.387 +} 1.388 + 1.389 +# Check package exists 1.390 +package_exist() 1.391 +{ 1.392 + [ -f $WOK/$1/receipt ] && return 0 1.393 + cat << _EOT_ 1.394 + 1.395 +<h3>$(eval_gettext "No package \$SEARCH")</h3> 1.396 +_EOT_ 1.397 + return 1 1.398 +} 1.399 + 1.400 +# Display < > & 1.401 +htmlize() 1.402 +{ 1.403 + sed -e 's/&/\&/g' -e 's/</\</g' -e 's/>/\>/g' 1.404 +} 1.405 + 1.406 +display_packages_and_files() 1.407 +{ 1.408 +last="" 1.409 +while read pkg file; do 1.410 + pkg=${pkg%:} 1.411 + if [ "$pkg" != "$last" ]; then 1.412 + . $WOK/$pkg/receipt 1.413 + package_entry 1.414 + last=$pkg 1.415 + fi 1.416 + echo " $file" 1.417 +done 1.418 +} 1.419 + 1.420 +build_cloud_cache() 1.421 +{ 1.422 + grep -l ^$1= $WOK/*/receipt | while read file; do 1.423 + eval $1= 1.424 + . $file 1.425 + eval echo \$$1 1.426 + done | sed "$2" | awk ' 1.427 +{ 1.428 + for (i = 1; $i != ""; i++) { 1.429 + count[$i]++ 1.430 + } 1.431 +} 1.432 +END { 1.433 + min=10000 1.434 + max=0 1.435 + for (i in count) { 1.436 + if (count[i] < min) min = count[i] 1.437 + if (count[i] > max) max = count[i] 1.438 + } 1.439 + for (i in count) 1.440 + print count[i] " " int((count[i] - min)*100/(max - min)) " " i 1.441 +}' | sort -k 3 1.442 +} 1.443 + 1.444 +display_cloud() 1.445 +{ 1.446 + echo "<p>" 1.447 + while read cnt pct item ; do 1.448 + cat <<EOT 1.449 +<span style="color:#99f; font-size:9pt; padding-left:5px; padding-right:2px;">\ 1.450 +$cnt</span><a href="?$1=$item&version=$SLITAZ_VERSION" style="\ 1.451 +font-size:$((8+($pct/10)))pt; font-weight:bold; \ 1.452 +color:black; text-decoration:none">$(echo $item | sed 's/-/\−/g')</a> 1.453 +EOT 1.454 + done 1.455 + echo "</p>" 1.456 +} 1.457 + 1.458 +xhtml_header 1.459 + 1.460 +# 1.461 +# Handle GET requests 1.462 +# 1.463 +case " $(GET) " in 1.464 + *\ debug\ *|*\ debug*) 1.465 + cat << EOT 1.466 +<h2>Debug info</h2> 1.467 +<pre>$(httpinfo)</pre> 1.468 +<pre>LANG=$LANG; 1.469 +OBJECT=$OBJECT; 1.470 +SEARCH=$SEARCH; 1.471 +SLITAZ_VERSION=$SLITAZ_VERSION; 1.472 +WOK=$WOK; 1.473 +</pre> 1.474 +EOT 1.475 +#$(xhtml_footer) 1.476 +#EOT 1.477 +# exit 0 1.478 + ;; 1.479 +esac 1.480 + 1.481 +# Display search form and result if requested. 1.482 +#xhtml_header 1.483 +echo "<h2>$(gettext 'Search for packages')</h2>" 1.484 +search_form 1.485 + 1.486 +case "$OBJECT" in 1.487 + 1.488 + 1.489 +### Depends loops; [Reverse] Dependency tree [(SUGGESTED)] 1.490 +Depends) 1.491 + if [ -z "$SEARCH" ]; then 1.492 + cat << _EOT_ 1.493 + 1.494 +<h3>$(gettext "Depends loops")</h3> 1.495 +<pre> 1.496 +_EOT_ 1.497 + for i in $WOK/*/receipt; do 1.498 + PACKAGE= 1.499 + DEPENDS= 1.500 + . $i 1.501 + echo "$PACKAGE $(echo $DEPENDS)" 1.502 + done | show_loops 1.503 + cat << _EOT_ 1.504 +</pre> 1.505 +_EOT_ 1.506 + elif package_exist $SEARCH ; then 1.507 + cat << _EOT_ 1.508 + 1.509 +<h3>$(eval_gettext "Dependency tree for: \$SEARCH")</h3> 1.510 +<pre> 1.511 +_EOT_ 1.512 + ALL_DEPS="" 1.513 + dep_scan $SEARCH "" 1.514 + SUGGESTED="" 1.515 + . $WOK/$SEARCH/receipt 1.516 + if [ -n "$SUGGESTED" ]; then 1.517 + cat << _EOT_ 1.518 +</pre> 1.519 + 1.520 +<h3>$(eval_gettext "Dependency tree for: \$SEARCH (SUGGESTED)")</h3> 1.521 +<pre> 1.522 +_EOT_ 1.523 + ALL_DEPS="" 1.524 + dep_scan "$SUGGESTED" " " 1.525 + fi 1.526 + cat << _EOT_ 1.527 +</pre> 1.528 + 1.529 +<h3>$(eval_gettext "Reverse dependency tree for: \$SEARCH")</h3> 1.530 +<pre> 1.531 +_EOT_ 1.532 + ALL_DEPS="" 1.533 + rdep_scan $SEARCH 1.534 + cat << _EOT_ 1.535 +</pre> 1.536 +_EOT_ 1.537 + fi 1.538 + ;; 1.539 + 1.540 + 1.541 +### Build depends loops; [Reverse] Build dependency tree 1.542 +BuildDepends) 1.543 + if [ -z "$SEARCH" ]; then 1.544 + cat << _EOT_ 1.545 + 1.546 +<h3>$(gettext "Build depends loops")</h3> 1.547 +<pre> 1.548 +_EOT_ 1.549 + for i in $WOK/*/receipt; do 1.550 + PACKAGE= 1.551 + WANTED= 1.552 + BUILD_DEPENDS= 1.553 + . $i 1.554 + echo "$PACKAGE $WANTED $(echo $BUILD_DEPENDS)" 1.555 + done | show_loops 1.556 + cat << _EOT_ 1.557 +</pre> 1.558 +_EOT_ 1.559 + elif package_exist $SEARCH ; then 1.560 + cat << _EOT_ 1.561 + 1.562 +<h3>$(eval_gettext "\$SEARCH needs these packages to be built")</h3> 1.563 +<pre> 1.564 +_EOT_ 1.565 + ALL_DEPS="" 1.566 + dep_scan $SEARCH "" build 1.567 + cat << _EOT_ 1.568 +</pre> 1.569 + 1.570 +<h3>$(eval_gettext "Packages who need \$SEARCH to be built")</h3> 1.571 +<pre> 1.572 +_EOT_ 1.573 + ALL_DEPS="" 1.574 + rdep_scan $SEARCH build 1.575 + cat << _EOT_ 1.576 +</pre> 1.577 +_EOT_ 1.578 + fi 1.579 + ;; 1.580 + 1.581 + 1.582 +### Common files 1.583 +FileOverlap) 1.584 + if [ package_exist $SEARCH ]; then 1.585 + cat << _EOT_ 1.586 + 1.587 +<h3>$(eval_gettext "These packages may overload files of \$SEARCH")</h3> 1.588 +<pre> 1.589 +_EOT_ 1.590 + ( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ; 1.591 + unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk ' 1.592 +BEGIN { pkg=""; last="x" } 1.593 +{ 1.594 + if ($2 == "") next 1.595 + if (index($2,last) == 1 && substr($2,1+length(last),1) == "/") 1.596 + delete file[last] 1.597 + last=$2 1.598 + if (pkg == "") pkg=$1 1.599 + if ($1 == pkg) file[$2]=$1 1.600 + else if (file[$2] == pkg) print 1.601 +} 1.602 +' | display_packages_and_files 1.603 + cat << _EOT_ 1.604 +</pre> 1.605 +_EOT_ 1.606 + fi 1.607 + ;; 1.608 + 1.609 + 1.610 +### File search 1.611 +File) 1.612 + if [ -n "$SEARCH" ]; then 1.613 + cat << _EOT_ 1.614 + 1.615 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.616 +<pre> 1.617 +_EOT_ 1.618 + last="" 1.619 + unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \ 1.620 + | grep "$SEARCH" | while read pkg file; do 1.621 + echo "$file" | grep -q "$SEARCH" || continue 1.622 + if [ "$last" != "${pkg%:}" ]; then 1.623 + last=${pkg%:} 1.624 + ( 1.625 + . $WOK/$last/receipt 1.626 + cat << _EOT_ 1.627 + 1.628 +<i>$(package_entry)</i> 1.629 +_EOT_ 1.630 + ) 1.631 + fi 1.632 + echo " $file" 1.633 + done 1.634 + cat << _EOT_ 1.635 +</pre> 1.636 +_EOT_ 1.637 + fi 1.638 + ;; 1.639 + 1.640 + 1.641 +### List of files 1.642 +File_list) 1.643 + if package_exist $SEARCH; then 1.644 + cat << _EOT_ 1.645 + 1.646 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.647 +<pre> 1.648 +_EOT_ 1.649 + last="" 1.650 + unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \ 1.651 + | grep ^$SEARCH: | sed 's/.*: / /' | sort 1.652 + cat << _EOT_ 1.653 +</pre> 1.654 +<pre> 1.655 +_EOT_ 1.656 + filenb=$(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: | wc -l) 1.657 + eval_ngettext "\$filenb file" "\$filenb files" $filenb 1.658 + cat << _EOT_ 1.659 + \ 1.660 +$(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt) 1.661 +</pre> 1.662 +_EOT_ 1.663 + fi 1.664 + ;; 1.665 + 1.666 + 1.667 +### Package description 1.668 +Desc) 1.669 + if [ -f $WOK/$SEARCH/description.txt ]; then 1.670 + cat << _EOT_ 1.671 + 1.672 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.673 +<pre> 1.674 +$(htmlize < $WOK/$SEARCH/description.txt) 1.675 +</pre> 1.676 +_EOT_ 1.677 + else 1.678 + cat << _EOT_ 1.679 + 1.680 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.681 +<pre> 1.682 +_EOT_ 1.683 + last="" 1.684 + grep -i "$SEARCH" $PACKAGES_REPOSITORY/packages.desc | \ 1.685 + sort | while read pkg extras ; do 1.686 + . $WOK/$pkg/receipt 1.687 + package_entry 1.688 + done 1.689 + cat << _EOT_ 1.690 +</pre> 1.691 +_EOT_ 1.692 + fi 1.693 + ;; 1.694 + 1.695 + 1.696 +### Tags 1.697 +Tags) 1.698 + if [ -n "$SEARCH" ]; then 1.699 + cat << _EOT_ 1.700 + 1.701 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.702 +<pre> 1.703 +_EOT_ 1.704 + last="" 1.705 + grep ^TAGS= $WOK/*/receipt | grep -i "$SEARCH" | \ 1.706 + sed "s|$WOK/\(.*\)/receipt:.*|\1|" | sort | while read pkg ; do 1.707 + TAGS= 1.708 + . $WOK/$pkg/receipt 1.709 + echo " $TAGS " | grep -iq " $SEARCH " && 1.710 + package_entry 1.711 + done 1.712 + cat << _EOT_ 1.713 +</pre> 1.714 +_EOT_ 1.715 + else 1.716 + # Display clouds 1.717 + while read var arg title filter; do 1.718 + file=/tmp/$arg-$SLITAZ_VERSION 1.719 + echo "<a name=\"$arg\"></a>" 1.720 + echo "<h3>$title</h3>" 1.721 + [ ! -e $file -o \ 1.722 + $PACKAGES_REPOSITORY/packages.txt -nt $file ] && 1.723 + build_cloud_cache $var "$filter" > $file.$$ && 1.724 + mv $file.$$ $file 1.725 + display_cloud $arg < $file 1.726 + done << EOT 1.727 +TAGS tags Tag\ cloud 1.728 +CATEGORY category Category\ cloud 1.729 +MAINTAINER maintainer Maintainer\ cloud s/.*<//;s/.*\ //;s/>// 1.730 +EOT 1.731 + fi 1.732 + ;; 1.733 + 1.734 + 1.735 +### Package receipt 1.736 +# TODO: add style highlighting 1.737 +Receipt) 1.738 + package_exist $SEARCH && cat << _EOT_ 1.739 + 1.740 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.741 +<pre> 1.742 +$(if [ -f $WOK/$SEARCH/taz/*/receipt ]; then 1.743 + cat $WOK/$SEARCH/taz/*/receipt 1.744 + else 1.745 + cat $WOK/$SEARCH/receipt 1.746 + fi | htmlize) 1.747 +</pre> 1.748 +_EOT_ 1.749 + ;; 1.750 + 1.751 + 1.752 +### Package 1.753 +Package) 1.754 +#WHY# if package_exist $SEARCH; then 1.755 + cat << _EOT_ 1.756 + 1.757 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.758 +<pre> 1.759 +_EOT_ 1.760 + for pkg in `ls $WOK/ | grep "$SEARCH"` 1.761 + do 1.762 + . $WOK/$pkg/receipt 1.763 + DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>" 1.764 + [ -f $WOK/$pkg/description.txt ] || DESC="" 1.765 + cat << _EOT_ 1.766 +$(package_entry)$DESC 1.767 +_EOT_ 1.768 + done 1.769 + equiv=$PACKAGES_REPOSITORY/packages.equiv 1.770 + vpkgs="$(cat $equiv | cut -d= -f1 | grep $SEARCH)" 1.771 + for vpkg in $vpkgs ; do 1.772 + cat << _EOT_ 1.773 +</pre> 1.774 + 1.775 +<h3>$(eval_gettext "Result for: \$SEARCH (package providing \$vpkg)")</h3> 1.776 +<pre> 1.777 +_EOT_ 1.778 + for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do 1.779 + . $WOK/${pkg#*:}/receipt 1.780 + package_entry 1.781 + done 1.782 + done 1.783 + cat << _EOT_ 1.784 +</pre> 1.785 +_EOT_ 1.786 +#WHY# fi 1.787 + ;; 1.788 + 1.789 +### Category 1.790 +Category) 1.791 + cat << _EOT_ 1.792 + 1.793 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.794 +<pre> 1.795 +_EOT_ 1.796 + for pkg in `ls $WOK/` 1.797 + do 1.798 + CATEGORY= 1.799 + . $WOK/$pkg/receipt 1.800 + DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>" 1.801 + [ -f $WOK/$pkg/description.txt ] || DESC="" 1.802 + [ "$CATEGORY" == "$SEARCH" ] && cat << _EOT_ 1.803 +$(package_entry)$DESC 1.804 +_EOT_ 1.805 + done 1.806 + ;; 1.807 + 1.808 +### Maintainer 1.809 +Maintainer) 1.810 + cat << _EOT_ 1.811 + 1.812 +<h3>$(eval_gettext "Result for: \$SEARCH")</h3> 1.813 +<pre> 1.814 +_EOT_ 1.815 + for pkg in `ls $WOK/` 1.816 + do 1.817 + MAINTAINER= 1.818 + . $WOK/$pkg/receipt 1.819 + DESC=" <a href=\"?object=Desc&query=$pkg&lang=$lang&version=$SLITAZ_VERSION&submit=go\">$(gettext description)</a>" 1.820 + [ -f $WOK/$pkg/description.txt ] || DESC="" 1.821 + [ "$MAINTAINER" == "$SEARCH" ] && cat << _EOT_ 1.822 +$(package_entry)$DESC 1.823 +_EOT_ 1.824 + done 1.825 + ;; 1.826 +esac 1.827 + 1.828 +xhtml_footer 1.829 + 1.830 +exit 0