slitaz-dev-tools rev 136

search.cgi: add loop detection in depends
author Pascal Bellard <pascal.bellard@slitaz.org>
date Thu Dec 08 17:47:18 2011 +0100 (2011-12-08)
parents 773051430d12
children e5593d4a3634
files tazpkg-web/search.cgi
line diff
     1.1 --- a/tazpkg-web/search.cgi	Sat Oct 08 22:31:16 2011 +0200
     1.2 +++ b/tazpkg-web/search.cgi	Thu Dec 08 17:47:18 2011 +0100
     1.3 @@ -8,22 +8,24 @@
     1.4  
     1.5  read QUERY_STRING
     1.6  for i in $(echo $QUERY_STRING | sed 's/&/ /g'); do
     1.7 +	i=$(httpd -d $i)
     1.8  	eval $i
     1.9  done
    1.10  LANG=$lang
    1.11  SEARCH=$query
    1.12  SLITAZ_VERSION=$version
    1.13  OBJECT=$object
    1.14 -DATE=`date +%Y-%m-%d\ \%H:%M:%S`
    1.15 +DATE=`date +%Y-%m-%d\ %H:%M:%S`
    1.16  VERSION=cooking
    1.17  if [ "$REQUEST_METHOD" = "GET" ]; then
    1.18  	SEARCH=""
    1.19  	VERBOSE=0
    1.20  	for i in $(echo $REQUEST_URI | sed 's/[?&]/ /g'); do
    1.21 +		# i=$(httpd -d $i)
    1.22  		SLITAZ_VERSION=cooking
    1.23  		case "$(echo $i | tr [A-Z] [a-z])" in
    1.24 -		search=*)
    1.25 -			SEARCH=${i#*=};;
    1.26 +		query=*|search=*)
    1.27 +			[ ${i#*=} == Search ] || SEARCH=${i#*=};;
    1.28  		object=*)
    1.29  			OBJECT=${i#*=};;
    1.30  		verbose=*)
    1.31 @@ -60,11 +62,14 @@
    1.32  		version=s*|version=3*)
    1.33  			SLITAZ_VERSION=stable;;
    1.34  		version=[1-9]*)
    1.35 -			i=${version%%.*}
    1.36 +			i=${i%%.*}
    1.37  			SLITAZ_VERSION=${i#*=}.0;;
    1.38 +		version=u*)
    1.39 +			SLITAZ_VERSION=undigest;;
    1.40  		esac
    1.41  	done
    1.42  	[ -n "$SEARCH" ] && REQUEST_METHOD="POST"
    1.43 +	[ "$SEARCH" == "." ] && SEARCH=
    1.44  fi
    1.45  
    1.46  case "$OBJECT" in
    1.47 @@ -79,9 +84,11 @@
    1.48  esac
    1.49  
    1.50  case "$SLITAZ_VERSION" in
    1.51 +tiny)		selected_tiny="selected";;
    1.52  1.0)	 	selected_1="selected";;
    1.53  2.0)	 	selected_2="selected";;
    1.54  stable)		selected_stable="selected";;
    1.55 +undigest)	selected_undigest="selected";;
    1.56  esac
    1.57  
    1.58  # unescape query
    1.59 @@ -105,6 +112,7 @@
    1.60  file_list="File list"
    1.61  depends="Depends"
    1.62  bdepends="Build depends"
    1.63 +loops="loops"
    1.64  search="Search"
    1.65  cooking="cooking"
    1.66  stable="stable"
    1.67 @@ -124,6 +132,7 @@
    1.68  	receipt="Recette"
    1.69  	depends="Dépendances"
    1.70  	bdepends="Fabrication"
    1.71 +	loops="sans fin"
    1.72  	search="Recherche"
    1.73  	result="Recherche de : $SEARCH"
    1.74  	noresult="Paquet $SEARCH introuvable"
    1.75 @@ -193,34 +202,36 @@
    1.76  	cat << _EOT_
    1.77  
    1.78  <div style="text-align: center; margin-bottom: 30px;">
    1.79 -	<form method="post" action="search.cgi">
    1.80 +	<form method="post" action="$(basename $SCRIPT_NAME)">
    1.81  		<div class="searchbox">
    1.82  			<p>
    1.83  				<input type="hidden" name="lang" value="$LANG" />
    1.84 -				<input type="text" name="query" 
    1.85 +				<input type="text" name="query"
    1.86  					size="20" value="$SEARCH" style="width: 80%;" />
    1.87  				<input type="submit" name="search" value="$search" />
    1.88  			</p>
    1.89  		</div>
    1.90 -		Search for:
    1.91 -		<select name="object">
    1.92 -			<option value="Package">$package</option>
    1.93 -			<option $selected_desc value="Desc">$desc</option>
    1.94 -			<option $selected_tags value="Tags">$tags</option>
    1.95 -			<option $selected_receipt value="Receipt">$receipt</option>
    1.96 -			<option $selected_depends value="Depends">$depends</option>
    1.97 -			<option $selected_build_depends value="BuildDepends">$bdepends</option>
    1.98 -			<option $selected_file value="File">$file</option>
    1.99 -			<option $selected_file_list value="File_list">$file_list</option>
   1.100 -			<option $selected_overlap value="FileOverlap">$overlap</option>
   1.101 -		</select>
   1.102 +	Search for:
   1.103 +	<select name="object">
   1.104 +		<option value="Package">$package</option>
   1.105 +		<option $selected_desc value="Desc">$desc</option>
   1.106 +		<option $selected_tags value="Tags">$tags</option>
   1.107 +		<option $selected_receipt value="Receipt">$receipt</option>
   1.108 +		<option $selected_depends value="Depends">$depends</option>
   1.109 +		<option $selected_build_depends value="BuildDepends">$bdepends</option>
   1.110 +		<option $selected_file value="File">$file</option>
   1.111 +		<option $selected_file_list value="File_list">$file_list</option>
   1.112 +		<option $selected_overlap value="FileOverlap">$overlap</option>
   1.113 +	</select>
   1.114  		in
   1.115 -		<select name="version">
   1.116 -			<option value="cooking">$cooking</option>
   1.117 -			<option $selected_stable value="stable">$stable</option>
   1.118 -			<option $selected_1 value="1.0">1.0</option>
   1.119 -			<option $selected_2 value="2.0">2.0</option>
   1.120 -		</select>
   1.121 +	<select name="version">
   1.122 +		<option value="cooking">$cooking</option>
   1.123 +		<option $selected_stable value="stable">$stable</option>
   1.124 +		<option $selected_2 value="2.0">2.0</option>
   1.125 +		<option $selected_1 value="1.0">1.0</option>
   1.126 +		<option $selected_tiny value="tiny">tiny</option>
   1.127 +		<option $selected_undigest value="undigest">undigest</option>
   1.128 +	</select>
   1.129  	</form>
   1.130  </div>
   1.131  _EOT_
   1.132 @@ -247,15 +258,17 @@
   1.133  
   1.134  <!-- Header -->
   1.135  <div id="header">
   1.136 +	<a name="top"></a>
   1.137  	<div id="logo"></div>
   1.138  	<div id="network">
   1.139  		<a href="http://www.slitaz.org/">
   1.140 -			<img src="images/network.png" alt="network.png" /></a>
   1.141 +		<img src="images/network.png" alt="network.png" /></a>
   1.142  		<a href="http://scn.slitaz.org/">Community</a>
   1.143  		<a href="http://doc.slitaz.org/">Doc</a>
   1.144  		<a href="http://forum.slitaz.org/">Forum</a>
   1.145  		<a href="http://bugs.slitaz.org/">Bugs</a>
   1.146  		<a href="http://hg.slitaz.org/">Hg</a>
   1.147 +		<a href="http://cook.slitaz.org/">BB</a>
   1.148  	</div>
   1.149  	<h1><a href="http://pkgs.slitaz.org/">SliTaz Packages</a></h1>
   1.150  </div>
   1.151 @@ -282,7 +295,7 @@
   1.152  	<div id="block_info">
   1.153  		<h4>$package</h4>
   1.154  		<p>
   1.155 -			Search for SliTaz packages! 
   1.156 +			Search for SliTaz packages!
   1.157  		</p>
   1.158  		<p>
   1.159  			Any results ? Make a package request on the official
   1.160 @@ -303,8 +316,8 @@
   1.161  </center>
   1.162  
   1.163  <!-- End of content -->
   1.164 +
   1.165  </div>
   1.166 -
   1.167  <!-- Footer -->
   1.168  <div id="footer">
   1.169  	Copyright &copy; <span class="year"></span>
   1.170 @@ -333,7 +346,7 @@
   1.171  installed_size()
   1.172  {
   1.173  [ $VERBOSE -gt 0 ] &&
   1.174 -grep -A 3 "^$1\$" $SLITAZ/$SLITAZ_VERSION/packages/packages.txt | \
   1.175 +grep -A 3 "^$1\$" $PACKAGES_REPOSITORY/packages.txt | \
   1.176         grep installed | sed 's/.*(\(.*\) installed.*/(\1) /'
   1.177  }
   1.178  
   1.179 @@ -344,12 +357,45 @@
   1.180  <a href="$SLITAZ_VERSION/$CATEGORY.html#$PACKAGE">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
   1.181  _EOT_
   1.182  else
   1.183 +	PACKAGE_HREF="<u>$PACKAGE</u>"
   1.184 +	PACKAGE_URL="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg"
   1.185 +	busybox wget -s $PACKAGE_URL 2> /dev/null && 
   1.186 +	PACKAGE_HREF="<a href=\"$PACKAGE_URL\">$PACKAGE</a>"
   1.187  	cat << _EOT_
   1.188 -<a href="http://mirror.slitaz.org/packages/$SLITAZ_VERSION/$PACKAGE-$VERSION$EXTRA_VERSION.tazpkg">$PACKAGE</a> $(installed_size $PACKAGE): $SHORT_DESC
   1.189 +$PACKAGE_HREF $(installed_size $PACKAGE): $SHORT_DESC
   1.190  _EOT_
   1.191  fi
   1.192  }
   1.193  
   1.194 +# Show loop in depends/build_depends chains
   1.195 +show_loops()
   1.196 +{
   1.197 +	awk '
   1.198 +function chkloop(pkg, i, n)
   1.199 +{
   1.200 +	if (n < 12)
   1.201 +	for (i = 1; i < split(deps[pkg],curdep," "); i++) {
   1.202 +		if (curdep[i] == base || chkloop(curdep[i], 0, n+1)) {
   1.203 +			p = curdep[i] " " p
   1.204 +			return 1
   1.205 +		}
   1.206 +	}
   1.207 +	return 0
   1.208 +}
   1.209 +{
   1.210 +	for (i = 2; i <= NF; i++)
   1.211 +		deps[$1] = deps[$1] " " $i
   1.212 +}
   1.213 +END {
   1.214 +	for (pkg in deps) {
   1.215 +		base = pkg
   1.216 +		p = ""
   1.217 +		if (chkloop(pkg, 0, 0))
   1.218 +			print pkg " : " p
   1.219 +	}
   1.220 +}'
   1.221 +}
   1.222 +
   1.223  # recursive dependencies scan
   1.224  dep_scan()
   1.225  {
   1.226 @@ -422,7 +468,7 @@
   1.227  	cat << _EOT_
   1.228  
   1.229  <h3>$noresult</h3>
   1.230 -<pre>
   1.231 +<pre class="package">
   1.232  _EOT_
   1.233  	return 1
   1.234  }
   1.235 @@ -433,6 +479,13 @@
   1.236  	sed -e 's/&/\&amp;/g' -e 's/</\&lt;/g' -e 's/>/\&gt;/g'
   1.237  }
   1.238  
   1.239 +echonb()
   1.240 +{
   1.241 +read n
   1.242 +echo -n "$n $1"
   1.243 +[ $n -gt 1 ] && echo -n s
   1.244 +}
   1.245 +
   1.246  display_packages_and_files()
   1.247  {
   1.248  last=""
   1.249 @@ -455,7 +508,10 @@
   1.250  
   1.251  <!-- Content -->
   1.252  <div id="content">
   1.253 +<a name="content"></a>
   1.254  
   1.255 +<h1>$package</h1>
   1.256 +<h2>$search</h2>
   1.257  _EOT_
   1.258  	search_form
   1.259  	xhtml_footer
   1.260 @@ -465,15 +521,33 @@
   1.261  
   1.262  <!-- Content -->
   1.263  <div id="content">
   1.264 +<a name="content"></a>
   1.265  
   1.266 +<h1>$package</h1>
   1.267 +<h2>$search</h2>
   1.268  _EOT_
   1.269  	search_form
   1.270  	if [ "$OBJECT" = "Depends" ]; then
   1.271 -		if package_exist $SEARCH ; then
   1.272 +		if [ -z "$SEARCH" ]; then
   1.273 +			cat << _EOT_
   1.274 +
   1.275 +<h3>$depends $loops</h3>
   1.276 +<pre class="package">
   1.277 +_EOT_
   1.278 +			for i in $WOK/*/receipt; do
   1.279 +				PACKAGE=
   1.280 +				DEPENDS=
   1.281 +				. $i
   1.282 +				echo "$PACKAGE $DEPENDS"
   1.283 +			done | show_loops
   1.284 +			cat << _EOT_
   1.285 +</pre>
   1.286 +_EOT_
   1.287 +		elif package_exist $SEARCH ; then
   1.288  			cat << _EOT_
   1.289  
   1.290  <h3>$deptree</h3>
   1.291 -<pre>
   1.292 +<pre class="package">
   1.293  _EOT_
   1.294  			ALL_DEPS=""
   1.295  			dep_scan $SEARCH ""
   1.296 @@ -484,7 +558,7 @@
   1.297  </pre>
   1.298  
   1.299  <h3>$deptree (SUGGESTED)</h3>
   1.300 -<pre>
   1.301 +<pre class="package">
   1.302  _EOT_
   1.303  				ALL_DEPS=""
   1.304  				dep_scan "$SUGGESTED" "    "
   1.305 @@ -493,7 +567,7 @@
   1.306  </pre>
   1.307  
   1.308  <h3>$rdeptree</h3>
   1.309 -<pre>
   1.310 +<pre class="package">
   1.311  _EOT_
   1.312  			ALL_DEPS=""
   1.313  			rdep_scan $SEARCH
   1.314 @@ -502,15 +576,32 @@
   1.315  _EOT_
   1.316  		fi
   1.317  	elif [ "$OBJECT" = "BuildDepends" ]; then
   1.318 -		if package_exist $SEARCH ; then
   1.319 +		if [ -z "$SEARCH" ]; then
   1.320 +			cat << _EOT_
   1.321 +
   1.322 +<h3>$bdepends $loops</h3>
   1.323 +<pre class="package">
   1.324 +_EOT_
   1.325 +			for i in $WOK/*/receipt; do
   1.326 +				PACKAGE=
   1.327 +				WANTED=
   1.328 +				BUILD_DEPENDS=
   1.329 +				. $i
   1.330 +				echo "$PACKAGE $WANTED $BUILD_DEPENDS"
   1.331 +			done | show_loops
   1.332 +			cat << _EOT_
   1.333 +</pre>
   1.334 +_EOT_
   1.335 +		elif package_exist $SEARCH ; then
   1.336  			cat << _EOT_
   1.337  
   1.338  <h3>$bdeplist</h3>
   1.339 -<pre>
   1.340 +<pre class="package">
   1.341  _EOT_
   1.342  			BUILD_DEPENDS=""
   1.343 +			WANTED=""
   1.344  			. $WOK/$SEARCH/receipt
   1.345 -			[ -n "$BUILD_DEPENDS" ] && for dep in $BUILD_DEPENDS ; do
   1.346 +			[ -n "$WANTED$BUILD_DEPENDS" ] && for dep in $WANTED $BUILD_DEPENDS ; do
   1.347  				if [ ! -s $WOK/$dep/receipt ]; then
   1.348  					cat << _EOT_
   1.349  $dep: not found !
   1.350 @@ -524,12 +615,13 @@
   1.351  </pre>
   1.352  
   1.353  <h3>$rbdeplist</h3>
   1.354 -<pre>
   1.355 +<pre class="package">
   1.356  _EOT_
   1.357  			for dep in $(grep -l $SEARCH $WOK/*/receipt); do
   1.358  				BUILD_DEPENDS=""
   1.359 +				WANTED=""
   1.360  				. $dep
   1.361 -				echo " $BUILD_DEPENDS " | grep -q " $SEARCH " &&
   1.362 +				echo " $WANTED $BUILD_DEPENDS " | grep -q " $SEARCH " &&
   1.363  				package_entry
   1.364  			done
   1.365  			cat << _EOT_
   1.366 @@ -541,7 +633,7 @@
   1.367  			cat << _EOT_
   1.368  
   1.369  <h3>$overloading $SEARCH</h3>
   1.370 -<pre>
   1.371 +<pre class="package">
   1.372  _EOT_
   1.373  			( unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: ;
   1.374  			  unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep -v ^$SEARCH: ) | awk '
   1.375 @@ -564,7 +656,7 @@
   1.376  		cat << _EOT_
   1.377  
   1.378  <h3>$result</h3>
   1.379 -<pre>
   1.380 +<pre class="package">
   1.381  _EOT_
   1.382  		last=""
   1.383  		unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
   1.384 @@ -583,20 +675,28 @@
   1.385  			echo "    $file"
   1.386  		done
   1.387  	elif [ "$OBJECT" = "File_list" ]; then
   1.388 -		package_exist $SEARCH && cat << _EOT_
   1.389 +		if package_exist $SEARCH; then
   1.390 +			cat << _EOT_
   1.391  
   1.392  <h3>$result</h3>
   1.393 -<pre>
   1.394 +<pre class="package">
   1.395  _EOT_
   1.396 -		last=""
   1.397 -		unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
   1.398 -		| grep ^$SEARCH: |  sed 's/.*: /    /' | sort
   1.399 +			last=""
   1.400 +			unlzma -c $PACKAGES_REPOSITORY/files.list.lzma \
   1.401 +			| grep ^$SEARCH: |  sed 's/.*: /    /' | sort
   1.402 +			cat << _EOT_
   1.403 +</pre>
   1.404 +<pre class="package">
   1.405 +$(unlzma -c $PACKAGES_REPOSITORY/files.list.lzma | grep ^$SEARCH: | wc -l | echonb file)  \
   1.406 +$(busybox sed -n "/^$SEARCH$/{nnnpq}" $PACKAGES_REPOSITORY/packages.txt)
   1.407 +_EOT_
   1.408 +		fi
   1.409  	elif [ "$OBJECT" = "Desc" ]; then
   1.410  		if [ -f $WOK/$SEARCH/description.txt ]; then
   1.411  			cat << _EOT_
   1.412  
   1.413  <h3>$result</h3>
   1.414 -<pre>
   1.415 +<pre class="package">
   1.416  <pre>
   1.417  $(htmlize < $WOK/$SEARCH/description.txt)
   1.418  </pre>
   1.419 @@ -605,7 +705,7 @@
   1.420  			cat << _EOT_
   1.421  
   1.422  <h3>$result</h3>
   1.423 -<pre>
   1.424 +<pre class="package">
   1.425  _EOT_
   1.426  			last=""
   1.427  			grep -i $SEARCH $PACKAGES_REPOSITORY/packages.desc | \
   1.428 @@ -618,7 +718,7 @@
   1.429  		cat << _EOT_
   1.430  
   1.431  <h3>$result</h3>
   1.432 -<pre>
   1.433 +<pre class="package">
   1.434  _EOT_
   1.435  		last=""
   1.436  		grep ^TAGS= $WOK/*/receipt |  grep -i $SEARCH | \
   1.437 @@ -630,7 +730,7 @@
   1.438  		package_exist $SEARCH && cat << _EOT_
   1.439  
   1.440  <h3>$result</h3>
   1.441 -<pre>
   1.442 +<pre class="package">
   1.443  <pre>
   1.444  $(if [ -f  $WOK/$SEARCH/taz/*/receipt ]; then
   1.445  	cat $WOK/$SEARCH/taz/*/receipt
   1.446 @@ -643,7 +743,7 @@
   1.447  		cat << _EOT_
   1.448  
   1.449  <h3>$result</h3>
   1.450 -<pre>
   1.451 +<pre class="package">
   1.452  _EOT_
   1.453  		for pkg in `ls $WOK/ | grep $SEARCH`
   1.454  		do
   1.455 @@ -661,7 +761,7 @@
   1.456  </pre>
   1.457  
   1.458  <h3>$result (package providing $vpkg)</h3>
   1.459 -<pre>
   1.460 +<pre class="package">
   1.461  _EOT_
   1.462  			for pkg in $(grep $vpkg= $equiv | sed "s/$vpkg=//"); do
   1.463  				. $WOK/${pkg#*:}/receipt