tazpkg rev 728

pkgs.cgi: empty "cat" shows list of categories; introduce "tag": list packages by tag, or list of all tags if empty
list packages by tag not shows installed/blocked at the moment; "tag cloud" will be soon
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sat Dec 27 16:02:32 2014 +0200 (2014-12-27)
parents f32370a20712
children 96e9dcccb7af
files tazpanel/pkgs.cgi
line diff
     1.1 --- a/tazpanel/pkgs.cgi	Fri Dec 26 15:14:01 2014 +0200
     1.2 +++ b/tazpanel/pkgs.cgi	Sat Dec 27 16:02:32 2014 +0200
     1.3 @@ -306,21 +306,23 @@
     1.4  # Print links to the pages
     1.5  
     1.6  pager() {
     1.7 -	awk -F'"' -vpage="$page" -vcached="$1" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="cat=$category&amp;repo=$repo&amp;page=" '
     1.8 +	awk -F'"' -vpage="$page" -vnum_lines="$(wc -l < $1)" -vtext="$(_ 'Pages:') " -vurl="?cat=$category&amp;repo=$repo&amp;page=" '
     1.9  BEGIN{
    1.10  	num_pages = int(num_lines / 100) + (num_lines % 100 != 0)
    1.11  	if (num_pages != 1) printf "<p>%s", text
    1.12  }
    1.13  {
    1.14  	if (num_pages == 1) exit
    1.15 -	p = int(NR/100) + 1
    1.16 -
    1.17 -	if (NR%100 == 1) printf "<a class=\"pages%s\" href=\"?%s%s\" title=\"%s\n···\n", p==page?" current":"", url, p, $6
    1.18 -	if (NR%100 == 0) printf "%s\">%s</a> ", $6, p - 1
    1.19 +	r = NR % 100
    1.20 +	if (r == 1) {
    1.21 +		p = int(NR / 100) + 1
    1.22 +		printf "<a class=\"pages%s\" href=\"%s%s\" title=\"%s\n···\n", p==page?" current":"", url, p, $6
    1.23 +	} else if (r == 0)
    1.24 +		printf "%s\">%s</a> ", $6, int(NR / 100)
    1.25  }
    1.26  END{
    1.27  	if (num_pages == 1) exit
    1.28 -	if (NR%100 != 0) printf "%s\">%s</a>", $6, p
    1.29 +	if (r != 0) printf "%s\">%s</a>", $6, int(NR / 100) + 1
    1.30  	print "</p>"
    1.31  }' $1
    1.32  }
    1.33 @@ -332,7 +334,7 @@
    1.34  	if [ -n "$1" ]; then
    1.35  		echo -n "<tr><td><b>$2</b></td><td>"
    1.36  		echo $1 | tr ' ' $'\n' | awk -vt="$3" '{
    1.37 -			printf "<a href=\"%s%s\">%s</a> ", t?("?"t"="):"", gensub(/\+/, "%2B", "g", $1), $1
    1.38 +			printf "<a href=\"?%s=%s\">%s</a> ", t, gensub(/\+/, "%2B", "g", $1), $1
    1.39  		}'
    1.40  		echo "</td></tr>"
    1.41  	fi
    1.42 @@ -453,18 +455,39 @@
    1.43  
    1.44  	*\ cat\ *)
    1.45  		#
    1.46 -		# List all available packages by category on mirror. Listing all
    1.47 -		# packages is too resource intensive and not useful.
    1.48 +		# List all available packages by category on mirror.
    1.49  		#
    1.50  		cd $PKGS_DB
    1.51  		repo=$(GET repo)
    1.52  		category=$(GET cat)
    1.53 -		[ -z "$category" ] && category="base-system"
    1.54  		search_form
    1.55  		sidebar | sed "s/active_$category/active/;s/repo_$repo/active/"
    1.56 -		LOADING_MSG="$(_ 'Listing packages...')"
    1.57 -		loading_msg
    1.58 -		cat << EOT
    1.59 +		if [ -z "$category" ] || [ "$category" == 'cat' ]; then
    1.60 +			cat << EOT
    1.61 +<h2>$(_ 'Categories list')</h2>
    1.62 +<table class="zebra outbox">
    1.63 +<thead>
    1.64 +<tr><td>$(_ 'Category')</td><td>$(_ 'Repository')</td><td>$(_ 'Installed')</td></tr>
    1.65 +</thead><tbody>
    1.66 +EOT
    1.67 +			{
    1.68 +				awk -F$'\t' '{print $3}' $PKGS_DB/packages.info | sort | uniq -c
    1.69 +				awk -F$'\t' '{print $3}' $PKGS_DB/installed.info | sed 's|.*|& i|' | sort | uniq -c
    1.70 +			} | sort -k2,2 | awk '
    1.71 +			{
    1.72 +				c [$2] = "."
    1.73 +				if ($3) { i[$2] = $1; } else { m[$2] = $1; }
    1.74 +			}
    1.75 +			END {
    1.76 +				for (n in c) print n, m[n], i[n]
    1.77 +			}' | sort | awk '{
    1.78 +			printf "<tr><td><a href=\"?cat=%s\">%s</a></td><td>%d</td><td>%d</td></tr>", $1, $1, $2, $3
    1.79 +			}'
    1.80 +			echo '</tbody></table>'
    1.81 +		else
    1.82 +			LOADING_MSG="$(_ 'Listing packages...')"
    1.83 +			loading_msg
    1.84 +			cat << EOT
    1.85  <h2>$(_ 'Category: %s' $category)</h2>
    1.86  
    1.87  <form method='get' action='$SCRIPT_NAME'>
    1.88 @@ -482,35 +505,35 @@
    1.89  </div>
    1.90  </div>
    1.91  EOT
    1.92 -		for i in $(repo_list ""); do
    1.93 -			if [ "$repo" != "Public" ]; then
    1.94 -				Repo_Name="$(repo_name $i)"
    1.95 -				cat << EOT
    1.96 +			for i in $(repo_list ""); do
    1.97 +				if [ "$repo" != "Public" ]; then
    1.98 +					Repo_Name="$(repo_name $i)"
    1.99 +					cat << EOT
   1.100  <h3>$(_ 'Repository: %s' $Repo_Name)</h3>
   1.101  EOT
   1.102 -			fi
   1.103 +				fi
   1.104  
   1.105 -			case $category in
   1.106 -				extra)
   1.107 -					echo '<table class="zebra outbox pkglist">'
   1.108 -					table_head
   1.109 -					echo '<tbody>'
   1.110 -					NA="$(_n 'n/a')"
   1.111 -					for pkg in $(cat $i/extra.list); do
   1.112 -						PKG="$(grep ^$pkg$'\t' $i/installed.info)"
   1.113 -						if [ -n "$PKG" ]; then
   1.114 -							echo "$PKG"
   1.115 -						else
   1.116 -							echo "$pkg	$NA	-	$NA	http://mirror.slitaz.org/packages/get/$pkg	-	-	-"
   1.117 -						fi
   1.118 -					done | parse_packages_info
   1.119 -					echo "</tbody></table>"
   1.120 -					;;
   1.121 -				*)
   1.122 -					cached="$CACHE_DIR/$repo-$category"
   1.123 -					make_mixed_list | sort -t$'\t' -k1,1 | awk -F$'\t' -vc="$category" '
   1.124 +				case $category in
   1.125 +					extra)
   1.126 +						echo '<table class="zebra outbox pkglist">'
   1.127 +						table_head
   1.128 +						echo '<tbody>'
   1.129 +						NA="$(_n 'n/a')"
   1.130 +						for pkg in $(cat $i/extra.list); do
   1.131 +							PKG="$(grep ^$pkg$'\t' $i/installed.info)"
   1.132 +							if [ -n "$PKG" ]; then
   1.133 +								echo "$PKG"
   1.134 +							else
   1.135 +								echo "$pkg	$NA	-	$NA	http://mirror.slitaz.org/packages/get/$pkg	-	-	-"
   1.136 +							fi
   1.137 +						done | parse_packages_info
   1.138 +						echo "</tbody></table>"
   1.139 +						;;
   1.140 +					*)
   1.141 +						cached="$CACHE_DIR/$repo-$category"
   1.142 +						make_mixed_list | sort -t$'\t' -k1,1 | tee /tmp/mixed_list | awk -F$'\t' -vc="$category" '
   1.143  {
   1.144 -	if (PKG && PKG != $1) {
   1.145 +	if (PKG && (PKG != $1)) {
   1.146  		if (CAT) {
   1.147  			if (DSCL) DSC = DSCL
   1.148  			printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"><a class=\"pkg%s%s\" href=\"?info=%s\">%s</a></td><td>%s</td><td>%s</td><td><a href=\"%s\"></a></td></tr>\n", PKG, INS, BLK, gensub(/\+/, "%2B", "g", PKG), PKG, VER, DSC, WEB
   1.149 @@ -527,21 +550,23 @@
   1.150  		if (! INS)     { PKG = $1; VER = $2; DSC = $4; WEB = $5 }
   1.151  	}
   1.152  }' > $cached
   1.153 -					page=$(GET page); [ -z "$page" ] && page=1
   1.154 -					pager="$(pager $cached)"
   1.155 +						page=$(GET page); [ -z "$page" ] && page=1
   1.156 +						pager="$(pager $cached)"
   1.157  
   1.158 -					echo "$pager"
   1.159 -					echo '<table class="zebra outbox pkglist">'
   1.160 -					table_head
   1.161 -					echo '<tbody>'
   1.162 -					tail -n+$((($page-1)*100+1)) $cached | head -n100
   1.163 -					echo "</tbody></table>"
   1.164 -					echo "$pager"
   1.165 -					rm -f $cached
   1.166 -					;;
   1.167 -			esac
   1.168 -		done
   1.169 -		echo '</form>' ;;
   1.170 +						echo "$pager"
   1.171 +						echo '<table class="zebra outbox pkglist">'
   1.172 +						table_head
   1.173 +						echo '<tbody>'
   1.174 +						tail -n+$((($page-1)*100+1)) $cached | head -n100
   1.175 +						echo "</tbody></table>"
   1.176 +						echo "$pager"
   1.177 +						rm -f $cached
   1.178 +						;;
   1.179 +				esac
   1.180 +			done
   1.181 +			echo '</form>'
   1.182 +		fi
   1.183 +		;;
   1.184  
   1.185  
   1.186  	*\ search\ *)
   1.187 @@ -1131,6 +1156,31 @@
   1.188  		;;
   1.189  
   1.190  
   1.191 +	*\ tag\ *)
   1.192 +		#
   1.193 +		# Show packages with matching tag; show tag cloud
   1.194 +		#
   1.195 +		search_form
   1.196 +		sidebar
   1.197 +		tag=$(GET tag)
   1.198 +		if [ -n "$tag" ]; then
   1.199 +			echo "<h2>$(_ 'Tag "%s"' $tag)</h2>"
   1.200 +			echo '<table class="zebra outbox pkglist">'
   1.201 +			table_head
   1.202 +			echo '<tbody>'
   1.203 +			awk -F$'\t' '$6 ~ /(^| )'$tag'( |$)/{
   1.204 +				printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"><a class=\"pkg%s%s\" href=\"?info=%s\">%s</a></td><td>%s</td><td>%s</td><td><a href=\"%s\"></a></td></tr>\n", $1, INS, BLK, gensub(/\+/, "%2B", "g", $1), $1, $2, $4, $5
   1.205 +			}' $PKGS_DB/packages.info
   1.206 +			echo "</tbody></table>"
   1.207 +		else
   1.208 +			echo "<h2>$(_ 'Tags list')</h2>"
   1.209 +			echo "<p>"
   1.210 +			awk -F$'\t' '{if($6){print $6}}' $PKGS_DB/packages.info | tr ' ' $'\n' | sort -u | sed 's|.*|<a href="?tag=&">&</a> |'
   1.211 +			echo "</p>"
   1.212 +		fi
   1.213 +		;;
   1.214 +
   1.215 +
   1.216  		*)
   1.217  		#
   1.218  		# Default to summary