tazpkg diff tazpanel/pkgs.cgi @ rev 744

Store sidebar settings in the session cookies (browser sets, changes, and sends them automatically); use "<button>" tag instead of "<a>" and "<input type='button'>" to show buttons (it allows to translate button captions, and provides uniform look of buttons); "list" and "tag" commands shows short description about what is really listed; "tag" respects repo; "blocked" shows blocked packages; small style change; encode COPYING in UTF-8.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Jan 09 17:05:12 2015 +0200 (2015-01-09)
parents d2843d5ee9e6
children c4c2d523a719
line diff
     1.1 --- a/tazpanel/pkgs.cgi	Sat Jan 03 17:38:17 2015 +0200
     1.2 +++ b/tazpanel/pkgs.cgi	Fri Jan 09 17:05:12 2015 +0200
     1.3 @@ -132,20 +132,27 @@
     1.4  		tag=)         img='';         label="$(_ 'Tags')" ;;
     1.5  		linkable)     img='tazpkg';   label="$(_ 'Linkable packages')" ;;
     1.6  		admin)        img='edit';     label="$(_ 'Administration')" ;;
     1.7 -		*Install*nf*) img='';         label="$(_ 'Install (Non Free)')" ;;
     1.8 -		*Install*)    img='';         label="$(_ 'Install')" ;;
     1.9 +		*Install*nf*) img='tazpkg-installed'; label="$(_ 'Install (Non Free)')" ;;
    1.10 +		*Install*)    img='tazpkg-installed'; label="$(_ 'Install')" ;;
    1.11  		*Remove*)     img='stop';     label="$(_ 'Remove')" ;;
    1.12 -		*Block*)      img='';         label="$(_ 'Block')" ;;
    1.13 -		*Unblock*)    img='';         label="$(_ 'Unblock')" ;;
    1.14 -		*Repack*)     img='';         label="$(_ 'Repack')" ;;
    1.15 +		*Link*)       img='tazpkg';   label="$(_ 'Link')" ;;
    1.16 +		*Block*)      img='tazpkg';   label="$(_ 'Block')" ;;
    1.17 +		*Unblock*)    img='tazpkg';   label="$(_ 'Unblock')" ;;
    1.18 +		*Repack*)     img='tazpkg';   label="$(_ 'Repack')" ;;
    1.19  		*saveconf*)   img='tazpkg';   label="$(_ 'Save configuration')" ;;
    1.20  		*listconf*)   img='edit';     label="$(_ 'List configuration files')" ;;
    1.21  		*quickcheck*) img='recharge'; label="$(_ 'Quick check')" ;;
    1.22  		*fullcheck*)  img='recharge'; label="$(_ 'Full check')" ;;
    1.23 +		*clean*)      img='stop';     label="$(_ 'Clean')" ;;
    1.24 +		*setlink*)    img='harddisk'; label="$(_ 'Set link')" ;;
    1.25 +		*removelink*) img='stop';     label="$(_ 'Remove link')" ;;
    1.26  	esac
    1.27 -	echo -n "<a class=\"button\" href=\"?$1\">"
    1.28 -	[ -n "$img" ] && echo -n "<img src=\"$IMAGES/$img.png\" />"
    1.29 -	echo "$label</a>"
    1.30 +	cat << EOT
    1.31 +	<button class="button" type="submit" name="${1%%=*}" value="${1#*=}">
    1.32 +		<img src="$IMAGES/$img.png"/>$label
    1.33 +	</button>
    1.34 +EOT
    1.35 +
    1.36  }
    1.37  
    1.38  
    1.39 @@ -176,7 +183,7 @@
    1.40  
    1.41  table_head() {
    1.42  	cat << EOT
    1.43 -<table class="zebra outbox pkglist">
    1.44 +<table class="zebra pkglist">
    1.45  	<thead>
    1.46  		<tr>
    1.47  			<td>$(_ 'Name')</td>
    1.48 @@ -191,15 +198,22 @@
    1.49  
    1.50  
    1.51  sidebar() {
    1.52 -	repo=$(GET repo); repo=${repo:-Public}
    1.53 -	my=$(GET my); my=${my:-my}
    1.54 -	cat=$(GET cat); cat=${cat:-all}
    1.55 +	repo=$(COOKIE repo); repo=${repo:-Public}; [ -n "$(GET repo)" ] && repo=$(GET repo)
    1.56 +	  my=$(COOKIE my);     my=${my:-my};       [ -n "$(GET my)" ]   &&   my=$(GET my)
    1.57 +	 cat=$(COOKIE cat);   cat=${cat:-all};     [ -n "$(GET cat)" ]  &&  cat=$(GET cat)
    1.58  
    1.59  	cat << EOT
    1.60 -<form method="get" action="">
    1.61 +<script type="text/javascript">
    1.62 +function setCookie(name) {
    1.63 +	document.cookie = name+"="+document.getElementById(name).value; }
    1.64 +function setValue(name, value) {
    1.65 +	document.getElementById(name).value=value;
    1.66 +	setCookie(name); }
    1.67 +</script>
    1.68 +<form method="post" action="?list">
    1.69  
    1.70  <div id="sidebar">
    1.71 -	<select id="my" name="my" value="$my" onchange="this.form.submit()">
    1.72 +	<select id="my" value="$my" onchange="setCookie('my'); this.form.submit()">
    1.73  		<option value="my">$(_ 'My packages')</option>
    1.74  		<option value="no">$(_ 'All packages')</option>
    1.75  	</select>
    1.76 @@ -207,7 +221,7 @@
    1.77  	<h4>$(_ 'Categories')</h4>
    1.78  
    1.79  	<div class="select_wrap">
    1.80 -	<select id="cat" name="cat" size="16" onchange="this.form.submit()">
    1.81 +	<select id="cat" size="16" onclick="setCookie('cat'); this.form.submit()">
    1.82  		<option value="base-system" >$(_ 'base-system')</option>
    1.83  		<option value="x-window"    >$(_ 'x-window')</option>
    1.84  		<option value="utilities"   >$(_ 'utilities')</option>
    1.85 @@ -226,8 +240,8 @@
    1.86  		<option value="extra"       >$(_ 'extra')</option>
    1.87  	</select>
    1.88  	<script type="text/javascript">
    1.89 -		document.getElementById('my').value="$my"
    1.90 -		document.getElementById('cat').value="$cat"
    1.91 +		setValue('my', "$my")
    1.92 +		setValue('cat', "$cat")
    1.93  	</script>
    1.94  	</div>
    1.95  EOT
    1.96 @@ -236,19 +250,19 @@
    1.97  		cat << EOT
    1.98  	<h4>$(_ 'Repository')</h4>
    1.99  
   1.100 -	<select id="repo" name="repo" onchange="this.form.submit()">
   1.101 +	<select id="repo" onchange="setCookie('repo')">
   1.102  		<option value="Public">$(_ 'Public')</option>
   1.103  		$(for i in $(ls $PKGS_DB/undigest); do
   1.104  			echo "<option value=\"$i\">$i</option>"
   1.105  		done)
   1.106  		<option value="Any">$(_ 'Any')</option>
   1.107  	</select>
   1.108 -	<script type="text/javascript">document.getElementById('repo').value="$repo"</script>
   1.109 +	<script type="text/javascript">setValue('repo', "$repo")</script>
   1.110  EOT
   1.111  	fi
   1.112  	cat << EOT
   1.113 -	<a href="?tag=&amp;my=$my&amp;repo=$repo">$(_ 'All tags...')</a>
   1.114 -	<a href="?cat=&amp;my=$my&amp;repo=$repo">$(_ 'All categories...')</a>
   1.115 +	<a href="?tags">$(_ 'All tags...')</a>
   1.116 +	<a href="?cats">$(_ 'All categories...')</a>
   1.117  </div>
   1.118  </form>
   1.119  EOT
   1.120 @@ -283,10 +297,16 @@
   1.121  }
   1.122  
   1.123  
   1.124 +header_repo_name() {
   1.125 +	[ -d $PKGS_DB/undigest ] && [ "$repo" != "Public" ] && \
   1.126 +		echo "<h3>$(_ 'Repository: %s' $(repo_name $1))</h3>"
   1.127 +}
   1.128 +
   1.129 +
   1.130  # Print links to the pages
   1.131  
   1.132  pager() {
   1.133 -	awk -F'"' -vpage="$page" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="?cat=$category&amp;repo=$repo&amp;page=" '
   1.134 +	awk -F'"' -vpage="$page" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="?list&amp;page=" '
   1.135  BEGIN{
   1.136  	num_pages = int(num_lines / 100) + (num_lines % 100 != 0)
   1.137  	if (num_pages != 1) printf "<p>%s", text
   1.138 @@ -312,6 +332,7 @@
   1.139  
   1.140  show_list() {
   1.141  	cached=$(mktemp)
   1.142 +	[ -n "$tag" ] && cat=''
   1.143  	{
   1.144  		for L in $LANG ${LANG%%_*}; do
   1.145  			if [ -e "$PKGS_DB/packages-desc.$L" ]; then
   1.146 @@ -320,9 +341,9 @@
   1.147  		done
   1.148  		[ -e "$i/blocked-packages.list" ] && cat $i/blocked-packages.list
   1.149  		sed 's|.*|&\ti|' $i/installed.info
   1.150 -		[ "$category" == 'extra' ] || [ $1 == 'my' ] || cat $i/packages.info
   1.151 -		[ "$category" == 'extra' ] && sed 's|.*|&\t-\textra\t-\thttp://mirror.slitaz.org/packages/get/&\t-\t-\t-|' $PKGS_DB/extra.list
   1.152 -	} | sort -t$'\t' -k1,1 | sed '/^$/d' | awk -F$'\t' -vc="${category:--}" -vt="${tag:--}" '
   1.153 +		[ "$cat" == 'extra' ] || [ $1 == 'my' ] || cat $i/packages.info
   1.154 +		[ "$cat" == 'extra' ] && sed 's|.*|&\t-\textra\t-\thttp://mirror.slitaz.org/packages/get/&\t-\t-\t-|' $PKGS_DB/extra.list
   1.155 +	} | sort -t$'\t' -k1,1 | sed '/^$/d' | awk -F$'\t' -vc="${cat:--}" -vt="${tag:--}" '
   1.156  {
   1.157  	if (PKG && PKG != $1) {
   1.158  		if (SEL) {
   1.159 @@ -344,16 +365,17 @@
   1.160  	page=$(GET page); [ -z "$page" ] && page=1
   1.161  
   1.162  	pager="$(pager $cached)"
   1.163 -	if [ "$pager" != "<p>$(_ 'Pages:') </p>" ]; then
   1.164 -		[ -d $PKGS_DB/undigest ] && [ "$repo" != "Public" ] && \
   1.165 -			echo "<h3>$(_ 'Repository: %s' $(repo_name $i))</h3>"
   1.166 -		echo "$pager"
   1.167 -
   1.168 -		table_head
   1.169 -		tail -n+$((($page-1)*100+1)) $cached | head -n100
   1.170 -		echo "</tbody></table>"
   1.171 -
   1.172 -		echo "$pager"
   1.173 +	list="$(tail -n+$((($page-1)*100+1)) $cached | head -n100)"
   1.174 +	list1=${list:1:1}
   1.175 +	if [ "$pager" != "<p>$(_ 'Pages:') </p>" ] && [ -n "$list1" ]; then
   1.176 +		cat << EOT
   1.177 +$(header_repo_name $i)
   1.178 +$pager
   1.179 +	$(table_head)
   1.180 +		$list
   1.181 +	</tbody></table>
   1.182 +$pager
   1.183 +EOT
   1.184  	fi
   1.185  	rm -f $cached
   1.186  }
   1.187 @@ -385,24 +407,16 @@
   1.188  		#
   1.189  		# List linkable packages.
   1.190  		#
   1.191 -		search_form
   1.192 -		sidebar
   1.193 -		LOADING_MSG=$(_ 'Listing linkable packages...')
   1.194 -		loading_msg
   1.195 +		search_form; sidebar
   1.196 +		LOADING_MSG=$(_ 'Listing linkable packages...'); loading_msg
   1.197 +
   1.198  		cat << EOT
   1.199  <h2>$(_ 'Linkable packages')</h2>
   1.200  
   1.201  <form method="get" action="">
   1.202 -<input type="hidden" name="do" value="Link" />
   1.203  <div id="actions">
   1.204 -	<div class="float-left">
   1.205 -		$(_ 'Selection:')
   1.206 -		<input type="submit" value="$(_ 'Link')" />
   1.207 -	</div>
   1.208 -	<div class="float-right">
   1.209 -		$(show_button recharge)
   1.210 -		$(show_button up)
   1.211 -	</div>
   1.212 +	<div class="float-left">$(_ 'Selection:') $(show_button do=Link)</div>
   1.213 +	<div class="float-right">$(show_button recharge) $(show_button up)</div>
   1.214  </div>
   1.215  EOT
   1.216  		table_head
   1.217 @@ -428,17 +442,17 @@
   1.218  		;;
   1.219  
   1.220  
   1.221 -	*\ cat\ *)
   1.222 +	*\ cats\ *)
   1.223  		#
   1.224 -		# List all packages by category.
   1.225 +		# List of all categories.
   1.226  		#
   1.227 -		my=$(GET my); category=$(GET cat); repo=$(GET repo)
   1.228 -		search_form
   1.229 -		sidebar | sed "s/a_$category/active/;s/repo_$repo/active/"
   1.230 -		if [ -z "$category" ] || [ "$category" == 'cat' ]; then
   1.231 +		search_form; sidebar
   1.232 +
   1.233 +		echo "<h2>$(_ 'Categories list')</h2>"
   1.234 +
   1.235 +		for pkgsinfo in $(repo_list /packages.info); do
   1.236 +			header_repo_name $(dirname $pkgsinfo)
   1.237  			cat << EOT
   1.238 -<h2>$(_ 'Categories list')</h2>
   1.239 -
   1.240  <table class="zebra outbox">
   1.241  	<thead>
   1.242  		<tr>
   1.243 @@ -449,9 +463,8 @@
   1.244  	</thead>
   1.245  	<tbody>
   1.246  EOT
   1.247 -			params="&amp;my=$my&amp;repo=$repo" # don't forget it unexpectedly
   1.248  			{
   1.249 -				awk -F$'\t' '{print $3}' $PKGS_DB/packages.info | sort | uniq -c
   1.250 +				awk -F$'\t' '{print $3}' $pkgsinfo | sort | uniq -c
   1.251  				awk -F$'\t' '{print $3}' $PKGS_DB/installed.info | sed 's|.*|& i|' | sort | uniq -c
   1.252  			} | sort -k2,2 | awk '
   1.253  			{
   1.254 @@ -460,34 +473,52 @@
   1.255  			}
   1.256  			END {
   1.257  				for (n in c) print n, m[n], i[n]
   1.258 -			}' | sort | awk -vp="$params" '{
   1.259 -			printf "<tr><td><a href=\"?cat=%s%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, p, $1, $2, $3
   1.260 +			}' | sort | awk '{
   1.261 +			printf "<tr><td><a href=\"?list&amp;cat=%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, $1, $2, $3
   1.262  			}'
   1.263  			echo '</tbody></table>'
   1.264 -		else
   1.265 -			LOADING_MSG="$(_ 'Listing packages...')"
   1.266 -			loading_msg
   1.267 -			cat << EOT
   1.268 -<h2>$(_ 'Category: %s' $category)</h2>
   1.269 +		done
   1.270 +		;;
   1.271 +
   1.272 +
   1.273 +	*\ list\ *)
   1.274 +		#
   1.275 +		# List all packages by category.
   1.276 +		#
   1.277 +		search_form; sidebar
   1.278 +		LOADING_MSG="$(_ 'Listing packages...')"; loading_msg
   1.279 +
   1.280 +		bcat="<b>$cat</b>"; brepo="<b>$repo</b>"
   1.281 +		case $repo in
   1.282 +			Any)
   1.283 +				case $my in
   1.284 +					my) title="$(_ 'Installed packages of category "%s"' "$bcat")" ;;
   1.285 +					*)  title="$(_ 'All packages of category "%s"' "$bcat")" ;;
   1.286 +				esac ;;
   1.287 +			*)
   1.288 +				case $my in
   1.289 +					my) title="$(_ 'Installed packages of category "%s" in repository "%s"' "$bcat" "$brepo")" ;;
   1.290 +					*)  title="$(_ 'All packages of category "%s" in repository "%s"' "$bcat" "$brepo")" ;;
   1.291 +				esac ;;
   1.292 +		esac
   1.293 +
   1.294 +		cat << EOT
   1.295 +<h2>$(_ 'Packages list')</h2>
   1.296 +<p>$title</p>
   1.297  
   1.298  <form method="get" action="">
   1.299  <div id="actions">
   1.300 -	<div class="float-left">
   1.301 -		$(_ 'Selection:')
   1.302 -		<input type="submit" name="do" value="Install" />
   1.303 -		<input type="submit" name="do" value="Remove" />
   1.304 +	<div class="float-left">$(_ 'Selection:')
   1.305 +		$([ "$my" != 'my' ] && show_button do=Install)
   1.306 +		$(show_button do=Remove)
   1.307  	</div>
   1.308 -	<div class="float-right">
   1.309 -		$(show_button recharge)
   1.310 -		$(show_button up)
   1.311 -	</div>
   1.312 +	<div class="float-right">$(show_button recharge; show_button up)</div>
   1.313  </div>
   1.314  EOT
   1.315 -			for i in $(repo_list ""); do
   1.316 -				show_list ${my#no}
   1.317 -			done
   1.318 -			echo '</form>'
   1.319 -		fi
   1.320 +		for i in $(repo_list ""); do
   1.321 +			show_list ${my#no}
   1.322 +		done
   1.323 +		echo '</form>'
   1.324  		;;
   1.325  
   1.326  
   1.327 @@ -497,29 +528,20 @@
   1.328  		# and so get result including packages names and descriptions
   1.329  		#
   1.330  		pkg=$(GET search); [ -z "$pkg" ] && xhtml_footer && exit
   1.331 -		repo=$(GET repo)
   1.332  		cd $PKGS_DB
   1.333 -		search_form
   1.334 -		sidebar | sed "s/repo_$repo/active/"
   1.335 -		LOADING_MSG="$(_ 'Searching packages...')"
   1.336 -		loading_msg
   1.337 +
   1.338 +		search_form; sidebar
   1.339 +		LOADING_MSG="$(_ 'Searching packages...')"; loading_msg
   1.340 +
   1.341  		cat << EOT
   1.342  <h2>$(_ 'Search packages')</h2>
   1.343  
   1.344  <form method="get" action="">
   1.345  <div id="actions">
   1.346 -	<div class="float-left">
   1.347 -		$(_ 'Selection:')
   1.348 -		<input type="submit" name="do" value="Install" />
   1.349 -		<input type="submit" name="do" value="Remove" />
   1.350 -		<a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a>
   1.351 -	</div>
   1.352 -	<div class="float-right">
   1.353 -		$(show_button recharge)
   1.354 -		$(show_button up)
   1.355 -	</div>
   1.356 +	<div class="float-left">$(_ 'Selection:'; show_button do=Install; show_button do=Remove)
   1.357 +		<a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a></div>
   1.358 +	<div class="float-right">$(show_button recharge; show_button up)</div>
   1.359  </div>
   1.360 -<input type="hidden" name="repo" value="$repo" />
   1.361  EOT
   1.362  		if [ -n "$(GET files)" ]; then
   1.363  			cat <<EOT
   1.364 @@ -560,10 +582,9 @@
   1.365  		#
   1.366  		# Lets recharge the packages list
   1.367  		#
   1.368 -		search_form
   1.369 -		sidebar
   1.370 -		LOADING_MSG="$(_ 'Recharging lists...')"
   1.371 -		loading_msg
   1.372 +		search_form; sidebar
   1.373 +		LOADING_MSG="$(_ 'Recharging lists...')"; loading_msg
   1.374 +
   1.375  		cat << EOT
   1.376  <h2>$(_ 'Recharge')</h2>
   1.377  
   1.378 @@ -572,9 +593,7 @@
   1.379  	<div class="float-left">
   1.380  		<p>$(_ 'Recharge checks for new or updated packages')</p>
   1.381  	</div>
   1.382 -	<div class="float-right">
   1.383 -		$(show_button up)
   1.384 -	</div>
   1.385 +	<div class="float-right">$(show_button up)</div>
   1.386  </div>
   1.387  <div class="wrapper">
   1.388  <pre>
   1.389 @@ -593,25 +612,17 @@
   1.390  		#
   1.391  		# Upgrade packages
   1.392  		#
   1.393 -		cd $PKGS_DB
   1.394 -		search_form
   1.395 -		sidebar
   1.396 -		LOADING_MSG="$(_ 'Checking for upgrades...')"
   1.397 -		loading_msg
   1.398 +		search_form; sidebar
   1.399 +		LOADING_MSG="$(_ 'Checking for upgrades...')"; loading_msg
   1.400 +
   1.401  		cat << EOT
   1.402  <h2>$(_ 'Up packages')</h2>
   1.403  
   1.404  <form method="get" action="">
   1.405  <div id="actions">
   1.406 -	<div class="float-left">
   1.407 -		$(_ 'Selection:')
   1.408 -		<input type="submit" name="do" value="Install" />
   1.409 -		<input type="submit" name="do" value="Remove" />
   1.410 -		<a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a>
   1.411 -	</div>
   1.412 -	<div class="float-right">
   1.413 -		$(show_button recharge)
   1.414 -	</div>
   1.415 +	<div class="float-left">$(_ 'Selection:'; show_button do=Install; show_button do=Remove)
   1.416 +		<a href="$(cat $PANEL/lib/checkbox.js)">$(_ 'Toogle all')</a></div>
   1.417 +	<div class="float-right">$(show_button recharge)</div>
   1.418  </div>
   1.419  EOT
   1.420  		tazpkg up --check >/dev/null
   1.421 @@ -632,44 +643,25 @@
   1.422  		#
   1.423  		# Do an action on one or some packages
   1.424  		#
   1.425 +		search_form; sidebar
   1.426 +		LOADING_MSG="$(_ 'Please wait')"; loading_msg
   1.427 +
   1.428  		opt=""
   1.429 -		pkgs=""
   1.430 -		cmdline=$(echo ${QUERY_STRING#do=} | sed s'/&/ /g')
   1.431 -		cmd=$(echo ${cmdline} | awk '{print $1}')
   1.432 -		cmdline=${cmdline#*repo=* }
   1.433 -		pkgs=$(echo $cmdline | sed -e s'/+/ /g' -e s'/pkg=//g' -e s/$cmd//)
   1.434 -		pkgs="$(httpd -d "$pkgs")"
   1.435 -		cmd=$(echo $cmd | tr [:upper:] [:lower:])
   1.436 +		cmd=$(echo $(GET do) | tr [:upper:] [:lower:])
   1.437 +		pkgs=$(echo $QUERY_STRING | awk 'BEGIN{RS="&";FS="="}{if($1=="pkg")print $2}')
   1.438 +		pkgs=$(httpd -d "$pkgs")
   1.439 +		bpkgs="<b>$pkgs</b>"
   1.440  		case $cmd in
   1.441 -			install)
   1.442 -				cmd=get-install opt=--forced
   1.443 -				LOADING_MSG="get-installing packages..."
   1.444 -				MSG="$(_ 'Installing: %s' "$pkgs")" ;;
   1.445 -			remove)
   1.446 -				MSG="$(_ 'Removing: %s' "$pkgs")" ;;
   1.447 -			link)
   1.448 -				opt=$(readlink $PKGS_DB/fslink)
   1.449 -				LOADING_MSG="linking packages..."
   1.450 -				MSG="$(_ 'Linking: %s' "$pkgs")" ;;
   1.451 -			block)
   1.452 -				MSG="$(_ 'Blocking: %s' "$pkgs")" ;;
   1.453 -			unblock)
   1.454 -				MSG="$(_ 'Unblocking: %s' "$pkgs")" ;;
   1.455 -			repack)
   1.456 -				MSG="$(_ 'Repacking: %s' "$pkgs")" ;;
   1.457 +			install) MSG="$(_ 'Installing: %s' "$bpkgs")"; opt=--forced; cmd=get-install ;;
   1.458 +			remove)  MSG="$(_ 'Removing: %s'   "$bpkgs")" ;;
   1.459 +			link)    MSG="$(_ 'Linking: %s'    "$bpkgs")"; opt=$(readlink $PKGS_DB/fslink) ;;
   1.460 +			block)   MSG="$(_ 'Blocking: %s'   "$bpkgs")" ;;
   1.461 +			unblock) MSG="$(_ 'Unblocking: %s' "$bpkgs")" ;;
   1.462 +			repack)  MSG="$(_ 'Repacking: %s'  "$bpkgs")" ;;
   1.463  		esac
   1.464 -		search_form
   1.465 -		sidebar
   1.466 -		loading_msg
   1.467 -		pkgs=$pkgs
   1.468  		cat << EOT
   1.469 -<h2>TazPkg: $cmd</h2>
   1.470 +<h2>TazPkg: $(GET do)</h2>
   1.471  
   1.472 -<div id="actions">
   1.473 -	<div class="float-left">
   1.474 -		<p>$(_ 'Performing tasks on packages')</p>
   1.475 -	</div>
   1.476 -</div>
   1.477  <div class="box">$MSG</div>
   1.478  EOT
   1.479  		for pkg in $pkgs; do
   1.480 @@ -684,16 +676,16 @@
   1.481  		# Packages info
   1.482  		#
   1.483  		pkg=$(GET info)
   1.484 -		search_form
   1.485 -		sidebar
   1.486 +		search_form; sidebar
   1.487 +		LOADING_MSG=$(_ 'Getting package info...'); loading_msg
   1.488 +
   1.489 +		temp="${pkg#get-}"
   1.490  		if [ -d $INSTALLED/$pkg ]; then
   1.491  			. $INSTALLED/$pkg/receipt
   1.492  			files=$(wc -l < $INSTALLED/$pkg/files.list)
   1.493  			action="Remove"
   1.494  		else
   1.495  			cd $PKGS_DB
   1.496 -			LOADING_MSG=$(_ 'Getting package info...')
   1.497 -			loading_msg
   1.498  			eval "$(awk -F$'\t' -vp=$pkg '
   1.499  			$1==p{
   1.500  				printf "PACKAGE=\"%s\"; VERSION=\"%s\"; CATEGORY=\"%s\"; ", $1, $2, $3
   1.501 @@ -704,34 +696,30 @@
   1.502  			UNPACKED_SIZE=${SIZES#* }
   1.503  
   1.504  			action="Install"
   1.505 -			temp="${pkg#get-}"
   1.506  		fi
   1.507  		cat << EOT
   1.508  <h2>$(_ 'Package %s' $PACKAGE)</h2>
   1.509  
   1.510  <form method="get" action="">
   1.511 +<input type="hidden" name="pkg" value="$temp"/>
   1.512  <div id="actions">
   1.513 -	<div class="float-left">
   1.514 -		<p>
   1.515  EOT
   1.516  		if [ "$temp" != "$pkg" -a "$action" == "Install" ]; then
   1.517 -			show_button "do=Install&amp;$temp&amp;nf"
   1.518 +			show_button "do=Install&amp;nf"
   1.519  		else
   1.520 -			show_button "do=$action&amp;$pkg"
   1.521 +			show_button "do=$action"
   1.522  		fi
   1.523  
   1.524  		if [ -d $INSTALLED/$pkg ]; then
   1.525  			if grep -qs "^$pkg$" $PKGS_DB/blocked-packages.list; then
   1.526 -				show_button "do=Unblock&amp;$pkg"
   1.527 +				show_button do=Unblock
   1.528  			else
   1.529 -				show_button "do=Block&amp;$pkg"
   1.530 +				show_button do=Block
   1.531  			fi
   1.532 -			show_button "do=Repack&amp;$pkg"
   1.533 +			show_button do=Repack
   1.534  		fi
   1.535  		i18n_desc $pkg
   1.536  		cat << EOT
   1.537 -		</p>
   1.538 -	</div>
   1.539  </div>
   1.540  <table class="zebra outbox">
   1.541  <tbody>
   1.542 @@ -775,6 +763,8 @@
   1.543  		# TazPkg configuration page
   1.544  		#
   1.545  		cmd=$(GET admin)
   1.546 +		search_form; sidebar
   1.547 +
   1.548  		case "$cmd" in
   1.549  			clean)
   1.550  				rm -rf $CACHE_DIR/* ;;
   1.551 @@ -806,33 +796,32 @@
   1.552  			rm-repo=*)
   1.553  				repository=${cmd#rm-repo=}
   1.554  				rm -rf $PKGS_DB/undigest/$repository ;;
   1.555 +			setlink)
   1.556 +				[ -d "$(GET link)/$INSTALLED" ] && ln -fs $(GET link) $PKGS_DB/fslink ;;
   1.557 +			removelink)
   1.558 +				rm -f $PKGS_DB/fslink ;;
   1.559  		esac
   1.560 -		[ "$cmd" == "$(_n 'Set link')" ] &&
   1.561 -			[ -d "$(GET link)/$INSTALLED" ] && ln -fs $(GET link) $PKGS_DB/fslink
   1.562 -		[ "$cmd" == "$(_n 'Remove link')" ] && rm -f $PKGS_DB/fslink
   1.563  
   1.564 -		cache_files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
   1.565 -		cache_size=$(du -sh $CACHE_DIR | cut -f1 | sed 's|\.0||')
   1.566 -		sidebar
   1.567  		cat << EOT
   1.568  <h2>$(_ 'Administration')</h2>
   1.569  
   1.570  <form method="get" action="">
   1.571 +<input type="hidden" name="admin" />
   1.572 +
   1.573  <div>
   1.574  	<p>$(_ 'TazPkg administration and settings')</p>
   1.575  </div>
   1.576  <div id="actions">
   1.577 -	$(show_button 'admin=&amp;action=saveconf')
   1.578 -	$(show_button 'admin=&amp;action=listconf')
   1.579 -	$(show_button 'admin=&amp;action=quickcheck')
   1.580 -	$(show_button 'admin=&amp;action=fullcheck')
   1.581 +	$(show_button action=saveconf)
   1.582 +	$(show_button action=listconf)
   1.583 +	$(show_button action=quickcheck)
   1.584 +	$(show_button action=fullcheck)
   1.585  </div>
   1.586  </form>
   1.587  EOT
   1.588  		case "$(GET action)" in
   1.589  				saveconf)
   1.590 -					LOADING_MSG=$(_ 'Creating the package...')
   1.591 -					loading_msg
   1.592 +					LOADING_MSG=$(_ 'Creating the package...'); loading_msg
   1.593  					echo "<pre>"
   1.594  					cd $HOME
   1.595  					tazpkg repack-config | filter_taztools_msgs
   1.596 @@ -851,26 +840,29 @@
   1.597  					echo "</ul>"
   1.598  					;;
   1.599  				quickcheck)
   1.600 -					LOADING_MSG=$(_ 'Checking packages consistency...')
   1.601 -					loading_msg
   1.602 +					LOADING_MSG=$(_ 'Checking packages consistency...'); loading_msg
   1.603  					echo "<pre>"
   1.604  					tazpkg check
   1.605  					echo "</pre>" ;;
   1.606  				fullcheck)
   1.607 -					LOADING_MSG=$(_ 'Full packages check...')
   1.608 -					loading_msg
   1.609 +					LOADING_MSG=$(_ 'Full packages check...'); loading_msg
   1.610  					echo "<pre>"
   1.611  					tazpkg check --full
   1.612  					echo "</pre>" ;;
   1.613  				esac
   1.614 +
   1.615 +		cache_files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
   1.616 +		cache_size=$(du -sh $CACHE_DIR | cut -f1 | sed 's|\.0||')
   1.617 +		[ "$cache_files" == 0 ] && cache_size="0K"
   1.618  		cat << EOT
   1.619  <h3>$(_ 'Packages cache')</h3>
   1.620  
   1.621  <div>
   1.622  	<form method="get" action="">
   1.623  		<p>$(_ 'Packages in the cache: %s (%s)' $cache_files $cache_size)
   1.624 -			<input type="hidden" name="admin" value="clean" />
   1.625 -			<input type="submit" value="$(_n 'Clean')" />
   1.626 +			$(show_button admin=clean)
   1.627 +			<!--input type="hidden" name="admin" value="clean" />
   1.628 +			<input type="submit" value="$(_n 'Clean')" /-->
   1.629  		</p>
   1.630  	</form>
   1.631  </div>
   1.632 @@ -930,8 +922,8 @@
   1.633  <form method="get" action="">
   1.634  <p>
   1.635  	<input type="text" name="link" value="$(readlink $PKGS_DB/fslink 2> /dev/null)" size="50">
   1.636 -	<input type="submit" name="admin" value="$(_ 'Set link')" />
   1.637 -	<input type="submit" name="admin" value="$(_ 'Remove link')" />
   1.638 +	$(show_button admin=setlink)
   1.639 +	$(show_button admin=removelink)
   1.640  </p>
   1.641  </form>
   1.642  EOT
   1.643 @@ -991,8 +983,8 @@
   1.644  		#
   1.645  		# Show licenses for installed packages
   1.646  		#
   1.647 -		search_form
   1.648 -		sidebar
   1.649 +		search_form; sidebar
   1.650 +
   1.651  		pkg=$(GET license)
   1.652  		case $pkg in
   1.653  			/*)
   1.654 @@ -1072,16 +1064,42 @@
   1.655  		;;
   1.656  
   1.657  
   1.658 +	*\ tags\ *)
   1.659 +		#
   1.660 +		# Show tag cloud
   1.661 +		#
   1.662 +		search_form; sidebar
   1.663 +
   1.664 +		echo "<h2>$(_ 'Tags list')</h2>"
   1.665 +		brepo="<b>$repo</b>"
   1.666 +		case $repo in
   1.667 +			Any) title="$(_ 'List of tags in all repositories')" ;;
   1.668 +			*)   title="$(_ 'List of tags in repository "%s"' "$brepo")" ;;
   1.669 +		esac
   1.670 +		echo "<p>$title</p><p>"
   1.671 +		to_read=""
   1.672 +		for i in $(repo_list ""); do
   1.673 +			if [ ! -e $i/packages.info ] && [ $repo == 'Public' ]; then
   1.674 +				list=installed; else list=packages; fi
   1.675 +			to_read="$to_read $i/$list.info"
   1.676 +		done
   1.677 +		TAGS="$(awk -F$'\t' '{if($6){print $6}}' $to_read | tr ' ' $'\n' | sort | uniq -c)"
   1.678 +		MAX="$(echo "$TAGS" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')"
   1.679 +		echo "$TAGS" | awk -vMAX="$MAX" '{
   1.680 +			printf "<a class=\"tag%s\" href=\"?tag=%s\" title=\"%s\">%s</a> ", int($1 * 7 / MAX + 1), $2, $1, $2
   1.681 +		}'
   1.682 +		echo "</p>"
   1.683 +		;;
   1.684 +
   1.685 +
   1.686  	*\ tag\ *)
   1.687  		#
   1.688 -		# Show packages with matching tag; show tag cloud
   1.689 +		# Show packages with matching tag
   1.690  		#
   1.691 -		search_form
   1.692 -		sidebar
   1.693 -		tag=$(GET tag); repo=$(GET repo); my=$(GET my)
   1.694 -		[ -z "$repo" ] && repo='Any'
   1.695 -		if [ -n "$tag" ]; then
   1.696 -			cat << EOT
   1.697 +		search_form; sidebar
   1.698 +
   1.699 +		tag=$(GET tag)
   1.700 +		cat << EOT
   1.701  <h2>$(_ 'Tag "%s"' $tag)</h2>
   1.702  
   1.703  <form method="get" action="">
   1.704 @@ -1093,23 +1111,36 @@
   1.705  	</div>
   1.706  </div>
   1.707  EOT
   1.708 -			for i in $(repo_list ""); do
   1.709 -				show_list all
   1.710 -			done
   1.711 -			echo '</form>'
   1.712 +		for i in $(repo_list ""); do
   1.713 +			show_list all
   1.714 +		done
   1.715 +		echo '</form>'
   1.716 +		;;
   1.717  
   1.718 -		else
   1.719 -			params="&amp;my=$my&amp;repo=$repo" # don't forget it unexpectedly
   1.720 -			echo "<h2>$(_ 'Tags list')</h2>"
   1.721 -			echo "<p>"
   1.722 -			if [ ! -e $PKGS_DB/packages.info ]; then list=installed; else list=packages; fi
   1.723 -			TAGS="$(awk -F$'\t' '{if($6){print $6}}' $PKGS_DB/$list.info | tr ' ' $'\n' | sort | uniq -c)"
   1.724 -			MAX="$(echo "$TAGS" | awk '{if ($1 > MAX) MAX = $1} END{print MAX}')"
   1.725 -			echo "$TAGS" | awk -vMAX="$MAX" -vp="$params" '{
   1.726 -				printf "<a class=\"tag%s\" href=\"?tag=%s%s\" title=\"%s\">%s</a> ", int($1 * 7 / MAX + 1), $2, p, $1, $2
   1.727 -			}'
   1.728 -			echo "</p>"
   1.729 -		fi
   1.730 +
   1.731 +	*\ blocked\ *)
   1.732 +		#
   1.733 +		# Show blocked packages list
   1.734 +		#
   1.735 +		search_form; sidebar
   1.736 +
   1.737 +		cat << EOT
   1.738 +<h2>$(_ 'Blocked packages list')</h2>
   1.739 +
   1.740 +<form method="get" action="">
   1.741 +<div id="actions">
   1.742 +	<div class="float-left">$(_ 'Selection:'; show_button do=Unblock)
   1.743 +	</div>
   1.744 +</div>
   1.745 +EOT
   1.746 +		table_head
   1.747 +		for i in $(cat $PKGS_DB/blocked-packages.list); do
   1.748 +			awk -F$'\t' -vp="$i" '{
   1.749 +			if ($1 == p)
   1.750 +				printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"><a class=\"pkgib\" href=\"?info=%s\">%s</a></td><td>%s</td><td>%s</td><td><a href=\"%s\"></a></td></tr>\n", $1, gensub(/\+/, "%2B", "g", $1), $1, $2, $4, $5
   1.751 +			}' $PKGS_DB/installed.info
   1.752 +		done
   1.753 +		echo '</tbody></table></form>'
   1.754  		;;
   1.755  
   1.756  
   1.757 @@ -1117,8 +1148,8 @@
   1.758  		#
   1.759  		# Default to summary
   1.760  		#
   1.761 -		search_form
   1.762 -		sidebar
   1.763 +		search_form; sidebar
   1.764 +
   1.765  		[ -n "$(GET block)" ] && tazpkg block $(GET block)
   1.766  		[ -n "$(GET unblock)" ] && tazpkg unblock $(GET unblock)
   1.767  		cat << EOT
   1.768 @@ -1139,12 +1170,12 @@
   1.769  <tbody>
   1.770  <tr><td>$(_ 'Last recharge:')</td><td>
   1.771  EOT
   1.772 -		recharged="$(ls -l $PKGS_DB/packages.list | awk '{print $6, $7, $8}')"
   1.773 +		recharged="$(date -r $PKGS_DB/packages.info +%c 2>/dev/null)"
   1.774  		if [ -z "$recharged" ]; then
   1.775  			_ 'never'
   1.776  		else
   1.777 -			echo $recharged
   1.778 -			if [ -n "$(find $PKGS_DB/packages.list -mtime +10)" ]; then
   1.779 +			echo "<b>$recharged</b>"
   1.780 +			if [ -n "$(find $PKGS_DB/packages.info -mtime +10)" ]; then
   1.781  				_ '(Older than 10 days)'
   1.782  			else
   1.783  				_ '(Not older than 10 days)'
   1.784 @@ -1152,16 +1183,24 @@
   1.785  		fi
   1.786  		cat << EOT
   1.787  </td></tr>
   1.788 -<tr><td>$(_ 'Installed packages:')</td>
   1.789 -	<td>$(cat $PKGS_DB/installed.info | wc -l)</td></tr>
   1.790 -<tr><td>$(_ 'Mirrored packages:')</td>
   1.791 -	<td>$(cat $PKGS_DB/packages.list | wc -l)</td></tr>
   1.792 -<tr><td>$(_ 'Upgradeable packages:')</td>
   1.793 -	<td>$(cat $PKGS_DB/packages.up | wc -l)</td></tr>
   1.794 -<tr><td>$(_ 'Installed files:')</td>
   1.795 -	<td>$(cat $INSTALLED/*/files.list | wc -l)</td></tr>
   1.796 -<tr><td>$(_ 'Blocked packages:')</td>
   1.797 -	<td>$(cat $PKGS_DB/blocked-packages.list | wc -l)</td></tr>
   1.798 +<tr>
   1.799 +	<td>$(_ 'Installed packages:')</td>
   1.800 +	<td><b>$(cat $PKGS_DB/installed.info | wc -l)</a></b>
   1.801 +		<a href="?list&amp;my=my&amp;cat=all&amp;repo=Any">$(_ '(show)')</a></td></tr>
   1.802 +<tr>
   1.803 +	<td>$(_ 'Mirrored packages:')</td>
   1.804 +	<td><b>$(cat $PKGS_DB/packages.list | wc -l)</b></td></tr>
   1.805 +<tr>
   1.806 +	<td>$(_ 'Upgradeable packages:')</td>
   1.807 +	<td><b>$(cat $PKGS_DB/packages.up | wc -l)</b>
   1.808 +		<a href="?up">$(_ '(show)')</a></td></tr>
   1.809 +<tr>
   1.810 +	<td>$(_ 'Installed files:')</td>
   1.811 +	<td><b>$(cat $INSTALLED/*/files.list | wc -l)</b></td></tr>
   1.812 +<tr>
   1.813 +	<td>$(_ 'Blocked packages:')</td>
   1.814 +	<td><b>$(cat $PKGS_DB/blocked-packages.list | wc -l)</b>
   1.815 +		<a href="?blocked">$(_ '(show)')</a></td></tr>
   1.816  </tbody>
   1.817  </table>
   1.818