tazpkg diff modules/upgrade @ 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
children a02e36d44d06
line diff
     1.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     1.2 +++ b/modules/upgrade	Sat Aug 15 17:41:08 2015 +0300
     1.3 @@ -0,0 +1,209 @@
     1.4 +#!/bin/sh
     1.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
     1.6 +# upgrade - TazPkg module
     1.7 +# Check for upgrades and make system up-to-date
     1.8 +
     1.9 +
    1.10 +# Options:
    1.11 +
    1.12 +# Environment variables:
    1.13 +#   root							Root of the packages DB
    1.14 +#   check							Only check for upgrades
    1.15 +#   install							Check and install all upgraded packages
    1.16 +
    1.17 +
    1.18 +# Connect function libraries
    1.19 +. /lib/libtaz.sh
    1.20 +
    1.21 +
    1.22 +
    1.23 +
    1.24 +# Get TazPkg working environment
    1.25 +# ------------------------------
    1.26 +
    1.27 +[ ! -d "$root/etc/slitaz" ] && mkdir -p "$root/etc/slitaz"
    1.28 +[ ! -e "$root/etc/slitaz/slitaz.conf" ] && cp /etc/slitaz/slitaz.conf "$root/etc/slitaz"
    1.29 +[ ! -e "$root/etc/slitaz/tazpkg.conf" ] && cp /etc/slitaz/tazpkg.conf "$root/etc/slitaz"
    1.30 +[ ! -e "$root/etc/slitaz-release" ] && echo 'cooking' > "$root/etc/slitaz-release"
    1.31 +
    1.32 +# Read configuration
    1.33 +if [ -n "$root" ]; then
    1.34 +	# Patch external conf files to correctly handle --root value
    1.35 +	slitaz_conf=$(mktemp); cp "$root/etc/slitaz/slitaz.conf" $slitaz_conf
    1.36 +	tazpkg_conf=$(mktemp); cp "$root/etc/slitaz/tazpkg.conf" $tazpkg_conf
    1.37 +	sed -i "s| /| $root/|g; s|\"/|\"$root/|g" $slitaz_conf $tazpkg_conf
    1.38 +	. $slitaz_conf; . $tazpkg_conf; rm $slitaz_conf $tazpkg_conf
    1.39 +else
    1.40 +	. /etc/slitaz/slitaz.conf; . /etc/slitaz/tazpkg.conf
    1.41 +fi
    1.42 +
    1.43 +
    1.44 +
    1.45 +
    1.46 +# Functions
    1.47 +# ---------
    1.48 +
    1.49 +# Get repositories priority using $PKGS_DB/priority.
    1.50 +# In this file undigest repos are called by their names and main mirror
    1.51 +# by 'main'. Sort order: priority
    1.52 +
    1.53 +look_for_priority() {
    1.54 +	[ -s "$PKGS_DB/priority" ] && priority=$(cat $PKGS_DB/priority)
    1.55 +
    1.56 +	for rep in main $(ls $PKGS_DB/undigest 2>/dev/null); do
    1.57 +		if [ ! -s "$PKGS_DB/priority" ] || ! grep -q ^$rep$ $PKGS_DB/priority; then
    1.58 +			priority=$(echo -e "$priority\n$rep")
    1.59 +		fi
    1.60 +	done
    1.61 +
    1.62 +	priority=$(echo "$priority" | sed '/^$/d' | \
    1.63 +		while read line; do
    1.64 +		case $line in
    1.65 +			(main) echo $PKGS_DB;;
    1.66 +			(*)    echo $PKGS_DB/undigest/$line;;
    1.67 +		esac
    1.68 +	done)
    1.69 +}
    1.70 +
    1.71 +
    1.72 +
    1.73 +
    1.74 +time="$(date +%s)"
    1.75 +
    1.76 +# Recharge packages databases (if necessary) (respects "root" value)
    1.77 +tazpkg recharge >&2
    1.78 +
    1.79 +echo -n > $UP_LIST
    1.80 +blocked_counter=$(mktemp)
    1.81 +tmp_up_list=$(mktemp)
    1.82 +
    1.83 +look_for_priority
    1.84 +repo_number=1
    1.85 +for repo in $priority; do
    1.86 +	if [ "$repo" == "$PKGS_DB" ]; then
    1.87 +		repo_name='Main'
    1.88 +	else
    1.89 +		repo_name="$(basename "$repo")"
    1.90 +	fi
    1.91 +
    1.92 +	[ ! -f "$repo/packages.info" ] && continue
    1.93 +	{
    1.94 +		cat $BLOCKED | awk '{printf "%s\t%s\n", $1, "b"}';
    1.95 +		cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}';
    1.96 +		cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}'
    1.97 +	} | sort -t$'\t' -k1,1 | awk -F$'\t' \
    1.98 +	-vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \
    1.99 +	-vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \
   1.100 +	-vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \
   1.101 +	-vcolor0="$(emsg '</c>')" \
   1.102 +	-vreponum=$repo_number -vreponame=$repo_name \
   1.103 +	-vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \
   1.104 +'{
   1.105 +
   1.106 +	if ($1 != p) {
   1.107 +		if (vi && vp) {
   1.108 +			bb = (b=="") ? "i" : "b"
   1.109 +			if ("" vi != vp) { # important: compare as strings
   1.110 +				startc = (b=="") ? colornewver : colorblocked;
   1.111 +				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.112 +				print p >> uplist;
   1.113 +				if (b!="") printf 1 >> blocked_counter;
   1.114 +			} else if (mi != mp) {
   1.115 +				startc = (b=="") ? colornewbuild : colorblocked;
   1.116 +				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.117 +				print p >> uplist;
   1.118 +				if (b!="") printf 1 >> blocked_counter;
   1.119 +			}
   1.120 +		}
   1.121 +		p = $1; b = b1 = b2 = vi = mi = vp = mp = "";
   1.122 +	}
   1.123 +	if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; }
   1.124 +	if ($2 == "i") { vi = $3; mi = $4; }
   1.125 +	if ($2 == "p") { vp = $3; mp = $4; }
   1.126 +}' >> $tmp_up_list
   1.127 +
   1.128 +	repo_number=$((repo_number + 1))
   1.129 +
   1.130 +done
   1.131 +
   1.132 +case "$output" in
   1.133 +	html)
   1.134 +		cat <<EOT
   1.135 +<table class="wide zebra">
   1.136 +	<thead>
   1.137 +		<tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr>
   1.138 +	</thead>
   1.139 +	<tbody>
   1.140 +EOT
   1.141 +		sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{
   1.142 +			if($4=="Main"){repoicon="slitaz"}else{repoicon="web"}
   1.143 +			if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"}
   1.144 +
   1.145 +			printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1;
   1.146 +			printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1;
   1.147 +			printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4;
   1.148 +			printf "<td>%s</td>", $2;
   1.149 +			printf "<td>%s</td></tr>\n", $5;
   1.150 +			}'
   1.151 +		echo '</tbody></table>' ;;
   1.152 +	*)
   1.153 +		emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->"
   1.154 +		sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \
   1.155 +			'{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';;
   1.156 +esac
   1.157 +
   1.158 +sed -i /^$/d $UP_LIST
   1.159 +upnb=$(wc -l < $UP_LIST)
   1.160 +pkgs=$(wc -l < $PKGS_DB/installed.info)
   1.161 +time=$(($(date +%s) - $time))
   1.162 +if [ "$upnb" -eq 0 ]; then
   1.163 +	install="n"
   1.164 +	_ 'System is up-to-date...'
   1.165 +fi
   1.166 +
   1.167 +if [ "$upnb" -ne 0 ]; then
   1.168 +	blocked_count="$(wc -m < $blocked_counter)"
   1.169 +
   1.170 +	blocked="$(_p \
   1.171 +		'%s blocked' \
   1.172 +		'%s blocked' $blocked_count \
   1.173 +		$blocked_count)"
   1.174 +
   1.175 +	footer "$(_p \
   1.176 +		'You have %s available upgrade (%s)' \
   1.177 +		'You have %s available upgrades (%s)' $upnb \
   1.178 +		$upnb "$blocked")"
   1.179 +fi
   1.180 +emsg "$(_p \
   1.181 +	'%s installed package scanned in %ds' \
   1.182 +	'%s installed packages scanned in %ds' $pkgs \
   1.183 +	"<c 32>$pkgs</c>" $time)"
   1.184 +
   1.185 +
   1.186 +# Clean
   1.187 +rm $blocked_counter $tmp_up_list
   1.188 +
   1.189 +# Pkgs to upgrade ? Skip, let install them all, or ask user
   1.190 +[ -n "$check" ] && exit 0
   1.191 +if [ "$upnb" -gt 0 ]; then
   1.192 +	if [ -n "$install" ]; then
   1.193 +		answer=0
   1.194 +	else
   1.195 +		confirm "$(_ 'Do you wish to install them now? (y/N)')"
   1.196 +		answer=$?
   1.197 +	fi
   1.198 +	case "$answer" in
   1.199 +		0)
   1.200 +			for pkg in $(cat $UP_LIST); do
   1.201 +				echo 'y' | tazpkg -gi "$pkg" --forced		#--reason="upgrade"
   1.202 +			done
   1.203 +			# List is generated each time and must be cleaned so
   1.204 +			# tazpkg-notify doesn't find upgrades anymore.
   1.205 +			rm $UP_LIST; touch $UP_LIST ;;
   1.206 +		*)
   1.207 +			_ 'Leaving without any upgrades installed.'
   1.208 +			newline
   1.209 +			exit 0 ;;
   1.210 +	esac
   1.211 +fi
   1.212 +newline