tazpkg diff tazpkg @ rev 836

Add module "upgrade"; make bullet-proof code to work with "root" ("recharge" and "upgrade" modules); re-make depends/rdepends commands.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Sat Aug 15 17:41:08 2015 +0300 (2015-08-15)
parents f1c82b2d20aa
children 358a978f45a9
line diff
     1.1 --- a/tazpkg	Fri Aug 14 16:55:14 2015 +0300
     1.2 +++ b/tazpkg	Sat Aug 15 17:41:08 2015 +0300
     1.3 @@ -78,14 +78,14 @@
     1.4  
     1.5  # Path to tazpkg used dir and configuration files
     1.6  MIRROR="$PKGS_DB/mirror"
     1.7 -BLOCKED="$PKGS_DB/blocked-packages.list"
     1.8 -UP_LIST="$PKGS_DB/packages.up"
     1.9 +export BLOCKED="$PKGS_DB/blocked-packages.list"
    1.10 +export UP_LIST="$PKGS_DB/packages.up"
    1.11  DEFAULT_MIRROR="$ONLINE_PKGS"
    1.12  
    1.13  # TazPkg version
    1.14  VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' $PKGS_DB/installed.info)
    1.15  # User Agent
    1.16 -UA="TazPkg-$VERSION"
    1.17 +export UA="TazPkg-$VERSION"
    1.18  
    1.19  #title 'DEBUG'; emsg "<b>COMMAND</b>=\"$COMMAND\"\n<b>PACKAGE</b>=\"$PACKAGE\"\n<b>PACKAGE_FILE</b>=\"$PACKAGE_FILE\"\n<b>TARGET_DIR</b>=\"$TARGET_DIR\"\n<b>TOP_DIR</b>=\"$TOP_DIR\"\n<b>TMP_DIR</b>=\"$TMP_DIR\"\n<b>INSTALL_LIST</b>=\"$INSTALL_LIST\"\n<b>SAVE_CACHE_DIR</b>=\"$SAVE_CACHE_DIR\"\n<b>MIRROR</b>=\"$MIRROR\"\n<b>BLOCKED</b>=\"$BLOCKED\"\n<b>UP_LIST</b>=\"$UP_LIST\"\n<b>DEFAULT_MIRROR</b>=\"$DEFAULT_MIRROR\"\n<b>VERSION</b>=\"$VERSION\""; footer
    1.20  
    1.21 @@ -1248,11 +1248,18 @@
    1.22  			*\ $i\ *) continue;;
    1.23  		esac
    1.24  		ALL_DEPS="$ALL_DEPS $i"
    1.25 -		[ -n "$2" ] && echo "$2$i ($(fgrep -A 3 $i $PKGS_DB/packages.txt | \
    1.26 -						tail -1 | sed 's/.*(\([^ ]*\).*/\1/'))"
    1.27 -		[ -f $i/receipt ] || continue
    1.28 -		DEPENDS=""
    1.29 -		. $i/receipt
    1.30 +
    1.31 +		if [ -z "$mark" ]; then
    1.32 +			ii="$i"
    1.33 +		else
    1.34 +			ii="- $i"; grep -q ^$i$'\t' "$PKGS_DB/installed.info" && ii="+ $i"
    1.35 +		fi
    1.36 +		[ -n "$2" ] && echo "$2$ii ($(awk -F$'\t' -vp="$i" '
    1.37 +			$1==p{split($7,s," ");print s[2]}' "$PKGS_DB/packages.info"))"
    1.38 +
    1.39 +		DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/installed.info")"
    1.40 +		[ -z "$DEPENDS" ] && \
    1.41 +		DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/packages.info")"
    1.42  		[ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2  "
    1.43  	done
    1.44  }
    1.45 @@ -1263,36 +1270,40 @@
    1.46  rdep_scan() {
    1.47  	SEARCH="$1"
    1.48  
    1.49 -	for i in * ; do
    1.50 -		DEPENDS=''
    1.51 -		. $i/receipt
    1.52 -		echo "$i $(echo $DEPENDS)"
    1.53 -	done | busybox awk -v search=$SEARCH '
    1.54 -function show_deps(deps, all_deps, pkg, space)
    1.55 +	DB='installed'; [ -n "$all" ] && DB='packages'
    1.56 +
    1.57 +	awk -F$'\t' '$8 {print $1 " " $8}' "$PKGS_DB/$DB.info" | \
    1.58 +	busybox awk -F' ' -v search="$SEARCH" '
    1.59 +function show_deps(pkg, space,   i, n, mydeps) {
    1.60 +	if (processed[pkg]) return
    1.61 +	processed[pkg] = 1;
    1.62 +
    1.63 +	if (space) printf "%s %s\n", space, pkg;
    1.64 +
    1.65 +	n = split(deps[pkg], mydeps, " ");
    1.66 +	for (i = 1; i <= n; i++)
    1.67 +		show_deps(mydeps[i], "==" space);
    1.68 +}
    1.69 +
    1.70  {
    1.71 -	if (all_deps[pkg] == 1) return
    1.72 -	all_deps[pkg] = 1
    1.73 -	if (space != "") printf "%s %s\n",space,pkg
    1.74 -	for (i = 1, n = split(deps[pkg], mydeps, " "); i <= n; i++) {
    1.75 -		show_deps(deps, all_deps, mydeps[i],"==" space)
    1.76 -	}
    1.77 +	for (i = 2; i <= NF; i++)
    1.78 +		deps[$i] = deps[$i] " " $1;
    1.79  }
    1.80  
    1.81 -{
    1.82 -	all_deps[$1] = 0
    1.83 -	for (i = 2; i <= NF; i++)
    1.84 -		deps[$i] = deps[$i] " " $1
    1.85 -}
    1.86 -
    1.87  END {
    1.88 -	show_deps(deps, all_deps, search, "")
    1.89 +	show_deps(search, "")
    1.90  }
    1.91  ' | while read spc pkg; do
    1.92 +		if [ -z "$mark" ]; then
    1.93 +			pkgi="$pkg"
    1.94 +		else
    1.95 +			pkgi="- $pkg"; grep -q ^$pkg$'\t' "$PKGS_DB/installed.info" && pkgi="+ $pkg"
    1.96 +		fi
    1.97 +
    1.98  		echo -n $spc | sed 's/=/ /g'
    1.99 -		echo -n $pkg
   1.100 -		echo -n ' ('
   1.101 -		fgrep -A 3 $pkg $PKGS_DB/packages.txt | tail -1 | \
   1.102 -			sed 's/.*(\([^ ]*\).*/\1)/'
   1.103 +
   1.104 +		echo "$pkgi ($(awk -F$'\t' -vp="$pkg" '$1==p{split($7,s," ");print s[2]}' \
   1.105 +			"$PKGS_DB/$DB.info"))"
   1.106  	done
   1.107  }
   1.108  
   1.109 @@ -2043,7 +2054,6 @@
   1.110  		# must have only the chosen main mirror.
   1.111  		#
   1.112  		check_root $@
   1.113 -		export UA
   1.114  		@@MODULES@@/recharge $2
   1.115  		;;
   1.116  
   1.117 @@ -2055,7 +2065,7 @@
   1.118  
   1.119  
   1.120  	up|upgrade)
   1.121 -		check_root
   1.122 +		check_root $@
   1.123  		#
   1.124  		# This is the new way to upgrade packages making 'upgrade' and
   1.125  		# upgradeable out-of-date. This new way is much, much more faster!
   1.126 @@ -2064,151 +2074,12 @@
   1.127  		#
   1.128  		for opt in $@; do
   1.129  			case "$opt" in
   1.130 -				-i) install='yes';;
   1.131 -				-c) check='yes';;
   1.132 +				-i) export install='yes';;
   1.133 +				-c) export check='yes';;
   1.134  			esac
   1.135  		done
   1.136  
   1.137 -		time="$(date +%s)"
   1.138 -
   1.139 -		# Recharge packages databases (if necessary)
   1.140 -		tazpkg recharge >/dev/null
   1.141 -
   1.142 -		cd $INSTALLED
   1.143 -		echo -n > $UP_LIST
   1.144 -		blocked_counter=$(mktemp)
   1.145 -		tmp_up_list=$(mktemp)
   1.146 -
   1.147 -		look_for_priority
   1.148 -		repo_number=1
   1.149 -		for repo in $priority; do
   1.150 -			if [ "$repo" == "$PKGS_DB" ]; then
   1.151 -				repo_name='Main'
   1.152 -			else
   1.153 -				repo_name="$(basename "$repo")"
   1.154 -			fi
   1.155 -
   1.156 -			[ ! -f "$repo/packages.info" ] && continue
   1.157 -			{
   1.158 -				cat $PKGS_DB/blocked-packages.list | awk '{printf "%s\t%s\n", $1, "b"}';
   1.159 -				cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}';
   1.160 -				cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}'
   1.161 -			} | sort -t$'\t' -k1,1 | awk -F$'\t' \
   1.162 -			-vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \
   1.163 -			-vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \
   1.164 -			-vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \
   1.165 -			-vcolor0="$(emsg '</c>')" \
   1.166 -			-vreponum=$repo_number -vreponame=$repo_name \
   1.167 -			-vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \
   1.168 -'{
   1.169 -
   1.170 -	if ($1 != p) {
   1.171 -		if (vi && vp) {
   1.172 -			bb = (b=="") ? "i" : "b"
   1.173 -			if ("" vi != vp) { # important: compare as strings
   1.174 -				startc = (b=="") ? colornewver : colorblocked;
   1.175 -				printf "%s\t%s\t%s\t%s\t%s%s%s%s%s\t%s\n", p, vi, reponum, reponame, startc, newver, vp, b, color0, bb;
   1.176 -				print p >> uplist;
   1.177 -				if (b!="") printf 1 >> blocked_counter;
   1.178 -			} else if (mi != mp) {
   1.179 -				startc = (b=="") ? colornewbuild : colorblocked;
   1.180 -				printf "%s\t%s\t%s\t%s\t%s%s%s%s\t%s\n",   p, vi, reponum, reponame, startc, newbuild, b, color0, bb;
   1.181 -				print p >> uplist;
   1.182 -				if (b!="") printf 1 >> blocked_counter;
   1.183 -			}
   1.184 -		}
   1.185 -		p = $1; b = b1 = b2 = vi = mi = vp = mp = "";
   1.186 -	}
   1.187 -	if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; }
   1.188 -	if ($2 == "i") { vi = $3; mi = $4; }
   1.189 -	if ($2 == "p") { vp = $3; mp = $4; }
   1.190 -}' >> $tmp_up_list
   1.191 -
   1.192 -			repo_number=$((repo_number + 1))
   1.193 -
   1.194 -		done
   1.195 -
   1.196 -		case "$output" in
   1.197 -			html)
   1.198 -				cat <<EOT
   1.199 -<table class="wide zebra">
   1.200 -	<thead>
   1.201 -		<tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr>
   1.202 -	</thead>
   1.203 -	<tbody>
   1.204 -EOT
   1.205 -				sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{
   1.206 -					if($4=="Main"){repoicon="slitaz"}else{repoicon="web"}
   1.207 -					if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"}
   1.208 -
   1.209 -					printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1;
   1.210 -					printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1;
   1.211 -					printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4;
   1.212 -					printf "<td>%s</td>", $2;
   1.213 -					printf "<td>%s</td></tr>\n", $5;
   1.214 -					}'
   1.215 -				echo '</tbody></table>' ;;
   1.216 -			*)
   1.217 -				emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->"
   1.218 -				sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \
   1.219 -					'{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';;
   1.220 -		esac
   1.221 -
   1.222 -		sed -i /^$/d $UP_LIST
   1.223 -		upnb=$(wc -l < $UP_LIST)
   1.224 -		pkgs=$(ls | wc -l)
   1.225 -		time=$(($(date +%s) - $time))
   1.226 -		if [ "$upnb" -eq 0 ]; then
   1.227 -			install="n"
   1.228 -			_ 'System is up-to-date...'
   1.229 -		fi
   1.230 -
   1.231 -		if [ "$upnb" -ne 0 ]; then
   1.232 -			blocked_count="$(wc -m < $blocked_counter)"
   1.233 -
   1.234 -			blocked="$(_p \
   1.235 -				'%s blocked' \
   1.236 -				'%s blocked' $blocked_count \
   1.237 -				$blocked_count)"
   1.238 -
   1.239 -			footer "$(_p \
   1.240 -				'You have %s available upgrade (%s)' \
   1.241 -				'You have %s available upgrades (%s)' $upnb \
   1.242 -				$upnb "$blocked")"
   1.243 -		fi
   1.244 -		emsg "$(_p \
   1.245 -			'%s installed package scanned in %ds' \
   1.246 -			'%s installed packages scanned in %ds' $pkgs \
   1.247 -			"<c 32>$pkgs</c>" $time)"
   1.248 -
   1.249 -
   1.250 -		# Clean
   1.251 -		rm $blocked_counter $tmp_up_list
   1.252 -
   1.253 -		# Pkgs to upgrade ? Skip, let install them all or ask user
   1.254 -		[ -n "$check" ] && exit 0
   1.255 -		if [ "$upnb" -gt 0 ]; then
   1.256 -			if [ -n "$install" ]; then
   1.257 -				answer=0
   1.258 -			else
   1.259 -				confirm "$(_ 'Do you wish to install them now? (y/N)')"
   1.260 -				answer=$?
   1.261 -			fi
   1.262 -			case "$answer" in
   1.263 -				0)
   1.264 -					for pkg in $(cat $UP_LIST); do
   1.265 -						echo 'y' | tazpkg -gi "$pkg" --forced		#--reason="upgrade"
   1.266 -					done
   1.267 -					# List is generated each time and must be cleaned so
   1.268 -					# tazpkg-notify doesn't find upgrades anymore.
   1.269 -					rm $UP_LIST; touch $UP_LIST ;;
   1.270 -				*)
   1.271 -					_ 'Leaving without any upgrades installed.'
   1.272 -					newline
   1.273 -					exit 0 ;;
   1.274 -			esac
   1.275 -		fi
   1.276 -		newline
   1.277 +		@@MODULES@@/upgrade
   1.278  		;;
   1.279  
   1.280  
   1.281 @@ -2694,20 +2565,34 @@
   1.282  
   1.283  	depends)
   1.284  		# Display dependencies tree
   1.285 -		cd $INSTALLED
   1.286 -		ALL_DEPS=''
   1.287 -		if [ -f "$2/receipt" ]; then
   1.288 -			dep_scan $2 ''
   1.289 -		fi ;;
   1.290 +		unset ALL_DEPS
   1.291 +		mkdir $TMP_DIR
   1.292 +		dep_scan $2 '' | tee "$TMP_DIR/depends"
   1.293 +		if [ -n "$total" ]; then
   1.294 +			separator
   1.295 +			NUM="$(wc -l < "$TMP_DIR/depends")"
   1.296 +			TOTAL="$(sed 's|.*(\([^)]*\))|\1|' "$TMP_DIR/depends" | hrsum)"
   1.297 +			_p 'Total: %s package (%s)' 'Total: %s packages (%s)' "$NUM" \
   1.298 +				"$NUM" "$TOTAL"
   1.299 +			newline
   1.300 +
   1.301 +			if [ -n "$mark" ]; then
   1.302 +				NUM="$(grep '^ *-' "$TMP_DIR/depends" | wc -l)"
   1.303 +				TOTAL="$(grep '^ *-' "$TMP_DIR/depends" | sed 's|.*(\([^)]*\))|\1|' | hrsum)"
   1.304 +				_p 'To install: %s package (%s)' 'To install: %s packages (%s)' "$NUM" \
   1.305 +					"$NUM" "$TOTAL"
   1.306 +				newline
   1.307 +			fi
   1.308 +		fi
   1.309 +		rm -rf "$TMP_DIR"
   1.310 +		;;
   1.311  
   1.312  
   1.313  	rdepends)
   1.314  		# Display reverse dependencies tree
   1.315  		cd $INSTALLED
   1.316 -		ALL_DEPS=''
   1.317 -		if [ -f "$2/receipt" ]; then
   1.318 -			rdep_scan $2
   1.319 -		fi
   1.320 +		unset ALL_DEPS
   1.321 +		rdep_scan "$2"
   1.322  		;;
   1.323  
   1.324