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 c45468fb179e
children 358a978f45a9
files Makefile modules/recharge modules/upgrade po/fr.po po/ru.po tazpkg
line diff
     1.1 --- a/Makefile	Sat Aug 15 12:23:33 2015 +0100
     1.2 +++ b/Makefile	Sat Aug 15 17:41:08 2015 +0300
     1.3 @@ -31,7 +31,7 @@
     1.4  		--package-version="$(VERSION)" -kaction -ktitle -kdie -k_ -k_n -k_p:1,2 \
     1.5  		./tazpkg \
     1.6  		./modules/convert ./modules/find-depends ./modules/help ./modules/info \
     1.7 -		./modules/list ./modules/mkdb ./modules/recharge \
     1.8 +		./modules/list ./modules/mkdb ./modules/recharge ./modules/upgrade \
     1.9  		./tazpkg-box ./tazpkg-notify ./tazpanel/pkgs.cgi
    1.10  
    1.11  msgmerge:
     2.1 --- a/modules/recharge	Sat Aug 15 12:23:33 2015 +0100
     2.2 +++ b/modules/recharge	Sat Aug 15 17:41:08 2015 +0300
     2.3 @@ -14,33 +14,49 @@
     2.4  
     2.5  # Connect function libraries
     2.6  . /lib/libtaz.sh
     2.7 -# Get TazPkg configuration variables
     2.8 -. "$root/etc/slitaz/slitaz.conf"
     2.9 -. "$root/etc/slitaz/tazpkg.conf"
    2.10 -PKGS_DB="$root$PKGS_DB"
    2.11  
    2.12 -# Fallback actions
    2.13 +
    2.14 +
    2.15 +
    2.16 +# Get TazPkg working environment
    2.17 +# ------------------------------
    2.18 +
    2.19 +[ ! -d "$root/etc/slitaz" ] && mkdir -p "$root/etc/slitaz"
    2.20 +[ ! -e "$root/etc/slitaz/slitaz.conf" ] && cp /etc/slitaz/slitaz.conf "$root/etc/slitaz"
    2.21 +[ ! -e "$root/etc/slitaz/tazpkg.conf" ] && cp /etc/slitaz/tazpkg.conf "$root/etc/slitaz"
    2.22 +[ ! -e "$root/etc/slitaz-release" ] && echo 'cooking' > "$root/etc/slitaz-release"
    2.23 +
    2.24 +# Read configuration
    2.25 +if [ -n "$root" ]; then
    2.26 +	# Patch external conf files to correctly handle --root value
    2.27 +	slitaz_conf=$(mktemp); cp "$root/etc/slitaz/slitaz.conf" $slitaz_conf
    2.28 +	tazpkg_conf=$(mktemp); cp "$root/etc/slitaz/tazpkg.conf" $tazpkg_conf
    2.29 +	sed -i "s| /| $root/|g; s|\"/|\"$root/|g" $slitaz_conf $tazpkg_conf
    2.30 +	. $slitaz_conf; . $tazpkg_conf; rm $slitaz_conf $tazpkg_conf
    2.31 +else
    2.32 +	. /etc/slitaz/slitaz.conf; . /etc/slitaz/tazpkg.conf
    2.33 +fi
    2.34 +
    2.35 +# Silent make missing files
    2.36  mkdir -p "$PKGS_DB"
    2.37  [ ! -e "$PKGS_DB/mirror" ] && echo "$ONLINE_PKGS" > "$PKGS_DB/mirror"
    2.38  
    2.39  
    2.40 +
    2.41 +
    2.42  # Functions
    2.43  # ---------
    2.44  
    2.45  # Download a file from specified mirror
    2.46  
    2.47 -download_from() {
    2.48 -	# input: "<mirror_url>+" "file_name"
    2.49 -	local i
    2.50 -	for i in $1; do
    2.51 -		case "$i" in
    2.52 -			# Mirror URL can have a trailing slash or not.
    2.53 -			http://* | https://* | ftp://*)
    2.54 -				busybox wget -c -q -T 30 -U $UA ${i%/}/$2 2>/dev/null && break ;;
    2.55 -			*)
    2.56 -				ln -sf ${i%/}/$2 . && break ;;
    2.57 -		esac
    2.58 -	done
    2.59 +get_from_mirror() {
    2.60 +	case "$mirror" in
    2.61 +		http://* | https://* | ftp://*)
    2.62 +			busybox wget -c -q -T 30 -U $UA "$mirror$1" 2>/dev/null;;
    2.63 +		*)
    2.64 +			ln -sf "$mirror$1" .;;
    2.65 +	esac
    2.66 +	status
    2.67  }
    2.68  
    2.69  
    2.70 @@ -79,7 +95,8 @@
    2.71  for path in $repo_to_recharge; do
    2.72  	[ ! -f $path/mirror ] && continue	# skip
    2.73  	cd $path
    2.74 -	mirror="$(cat mirror)"
    2.75 +	# Mirror URL will have a trailing slash
    2.76 +	mirror="$(cat mirror)"; mirror="${mirror%/}/"
    2.77  
    2.78  	# Repository name
    2.79  	if [ "$path" == "$PKGS_DB" ]; then
    2.80 @@ -96,33 +113,32 @@
    2.81  
    2.82  	[ -f ID ]  && mv ID  ID.bak					# Compatibility with "old" ID
    2.83  	[ -f IDs ] && mv IDs IDs.bak
    2.84 -	download_from "$mirror" IDs
    2.85 +	action 'Checking...'
    2.86 +	get_from_mirror IDs
    2.87 +
    2.88  	[ -e 'IDs' ] && awk '{print $1}' IDs > ID	# Compatibility with "old" ID
    2.89 +	[ -e 'IDs' ] && _ 'Database timestamp: %s' "$(date -d "@$(awk '{print $2}' IDs)" "+%x %R")"
    2.90  
    2.91  	# Check if recharging is needed
    2.92  	if [ -f 'IDs' ] && cmp -s IDs IDs.bak; then
    2.93 -		action 'Checking...'; status			# "Fake" message
    2.94  		footer "$(_ 'Repository "%s" is up to date.' "$repo_name")"
    2.95  		rm IDs.bak ID.bak
    2.96  		continue
    2.97  	fi
    2.98  	rm IDs.bak ID.bak 2>/dev/null
    2.99  
   2.100 -	[ -e 'IDs' ] && _ 'Database timestamp: %s' "$(date -d "@$(awk '{print $2}' IDs)" "+%x %R")"
   2.101 -
   2.102  	action 'Creating backup of the last packages list...'
   2.103  	for i in packages.desc packages.$SUM packages.txt packages.list \
   2.104  		packages.equiv files.list.lzma extra.list mirrors packages.info; do
   2.105  		[ -f "$i" ] && mv -f $i $i.bak 2>/dev/null
   2.106  	done
   2.107 -	:; status
   2.108 +	:; status		# Always "[ Done ]"
   2.109  
   2.110  	# Download and extract bundle: extra.list, mirrors, files-list.md5,
   2.111  	#   packages.{info,desc,md5,txt,list,equiv}
   2.112  	bundle='bundle.tar.lzma'
   2.113  	action 'Getting "%s"...' $bundle
   2.114 -	download_from "$mirror" $bundle
   2.115 -	status
   2.116 +	get_from_mirror $bundle
   2.117  	if [ -f "$bundle" ]; then
   2.118  		busybox tar -xaf $bundle; rm $bundle
   2.119  	else
   2.120 @@ -137,13 +153,11 @@
   2.121  			mv $files_local.bak $files_remote
   2.122  		else
   2.123  			action 'Getting "%s"...' $files_remote
   2.124 -			download_from "$mirror" $files_remote
   2.125 -			status
   2.126 +			get_from_mirror $files_remote
   2.127  		fi
   2.128  	else
   2.129  		action 'Getting "%s"...' $files_remote
   2.130 -		download_from "$mirror" $files_remote
   2.131 -		status
   2.132 +		get_from_mirror $files_remote
   2.133  	fi
   2.134  
   2.135  	if [ ! -e "$files_remote" ]; then
     3.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     3.2 +++ b/modules/upgrade	Sat Aug 15 17:41:08 2015 +0300
     3.3 @@ -0,0 +1,209 @@
     3.4 +#!/bin/sh
     3.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
     3.6 +# upgrade - TazPkg module
     3.7 +# Check for upgrades and make system up-to-date
     3.8 +
     3.9 +
    3.10 +# Options:
    3.11 +
    3.12 +# Environment variables:
    3.13 +#   root							Root of the packages DB
    3.14 +#   check							Only check for upgrades
    3.15 +#   install							Check and install all upgraded packages
    3.16 +
    3.17 +
    3.18 +# Connect function libraries
    3.19 +. /lib/libtaz.sh
    3.20 +
    3.21 +
    3.22 +
    3.23 +
    3.24 +# Get TazPkg working environment
    3.25 +# ------------------------------
    3.26 +
    3.27 +[ ! -d "$root/etc/slitaz" ] && mkdir -p "$root/etc/slitaz"
    3.28 +[ ! -e "$root/etc/slitaz/slitaz.conf" ] && cp /etc/slitaz/slitaz.conf "$root/etc/slitaz"
    3.29 +[ ! -e "$root/etc/slitaz/tazpkg.conf" ] && cp /etc/slitaz/tazpkg.conf "$root/etc/slitaz"
    3.30 +[ ! -e "$root/etc/slitaz-release" ] && echo 'cooking' > "$root/etc/slitaz-release"
    3.31 +
    3.32 +# Read configuration
    3.33 +if [ -n "$root" ]; then
    3.34 +	# Patch external conf files to correctly handle --root value
    3.35 +	slitaz_conf=$(mktemp); cp "$root/etc/slitaz/slitaz.conf" $slitaz_conf
    3.36 +	tazpkg_conf=$(mktemp); cp "$root/etc/slitaz/tazpkg.conf" $tazpkg_conf
    3.37 +	sed -i "s| /| $root/|g; s|\"/|\"$root/|g" $slitaz_conf $tazpkg_conf
    3.38 +	. $slitaz_conf; . $tazpkg_conf; rm $slitaz_conf $tazpkg_conf
    3.39 +else
    3.40 +	. /etc/slitaz/slitaz.conf; . /etc/slitaz/tazpkg.conf
    3.41 +fi
    3.42 +
    3.43 +
    3.44 +
    3.45 +
    3.46 +# Functions
    3.47 +# ---------
    3.48 +
    3.49 +# Get repositories priority using $PKGS_DB/priority.
    3.50 +# In this file undigest repos are called by their names and main mirror
    3.51 +# by 'main'. Sort order: priority
    3.52 +
    3.53 +look_for_priority() {
    3.54 +	[ -s "$PKGS_DB/priority" ] && priority=$(cat $PKGS_DB/priority)
    3.55 +
    3.56 +	for rep in main $(ls $PKGS_DB/undigest 2>/dev/null); do
    3.57 +		if [ ! -s "$PKGS_DB/priority" ] || ! grep -q ^$rep$ $PKGS_DB/priority; then
    3.58 +			priority=$(echo -e "$priority\n$rep")
    3.59 +		fi
    3.60 +	done
    3.61 +
    3.62 +	priority=$(echo "$priority" | sed '/^$/d' | \
    3.63 +		while read line; do
    3.64 +		case $line in
    3.65 +			(main) echo $PKGS_DB;;
    3.66 +			(*)    echo $PKGS_DB/undigest/$line;;
    3.67 +		esac
    3.68 +	done)
    3.69 +}
    3.70 +
    3.71 +
    3.72 +
    3.73 +
    3.74 +time="$(date +%s)"
    3.75 +
    3.76 +# Recharge packages databases (if necessary) (respects "root" value)
    3.77 +tazpkg recharge >&2
    3.78 +
    3.79 +echo -n > $UP_LIST
    3.80 +blocked_counter=$(mktemp)
    3.81 +tmp_up_list=$(mktemp)
    3.82 +
    3.83 +look_for_priority
    3.84 +repo_number=1
    3.85 +for repo in $priority; do
    3.86 +	if [ "$repo" == "$PKGS_DB" ]; then
    3.87 +		repo_name='Main'
    3.88 +	else
    3.89 +		repo_name="$(basename "$repo")"
    3.90 +	fi
    3.91 +
    3.92 +	[ ! -f "$repo/packages.info" ] && continue
    3.93 +	{
    3.94 +		cat $BLOCKED | awk '{printf "%s\t%s\n", $1, "b"}';
    3.95 +		cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}';
    3.96 +		cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}'
    3.97 +	} | sort -t$'\t' -k1,1 | awk -F$'\t' \
    3.98 +	-vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \
    3.99 +	-vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \
   3.100 +	-vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \
   3.101 +	-vcolor0="$(emsg '</c>')" \
   3.102 +	-vreponum=$repo_number -vreponame=$repo_name \
   3.103 +	-vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \
   3.104 +'{
   3.105 +
   3.106 +	if ($1 != p) {
   3.107 +		if (vi && vp) {
   3.108 +			bb = (b=="") ? "i" : "b"
   3.109 +			if ("" vi != vp) { # important: compare as strings
   3.110 +				startc = (b=="") ? colornewver : colorblocked;
   3.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;
   3.112 +				print p >> uplist;
   3.113 +				if (b!="") printf 1 >> blocked_counter;
   3.114 +			} else if (mi != mp) {
   3.115 +				startc = (b=="") ? colornewbuild : colorblocked;
   3.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;
   3.117 +				print p >> uplist;
   3.118 +				if (b!="") printf 1 >> blocked_counter;
   3.119 +			}
   3.120 +		}
   3.121 +		p = $1; b = b1 = b2 = vi = mi = vp = mp = "";
   3.122 +	}
   3.123 +	if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; }
   3.124 +	if ($2 == "i") { vi = $3; mi = $4; }
   3.125 +	if ($2 == "p") { vp = $3; mp = $4; }
   3.126 +}' >> $tmp_up_list
   3.127 +
   3.128 +	repo_number=$((repo_number + 1))
   3.129 +
   3.130 +done
   3.131 +
   3.132 +case "$output" in
   3.133 +	html)
   3.134 +		cat <<EOT
   3.135 +<table class="wide zebra">
   3.136 +	<thead>
   3.137 +		<tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr>
   3.138 +	</thead>
   3.139 +	<tbody>
   3.140 +EOT
   3.141 +		sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{
   3.142 +			if($4=="Main"){repoicon="slitaz"}else{repoicon="web"}
   3.143 +			if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"}
   3.144 +
   3.145 +			printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1;
   3.146 +			printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1;
   3.147 +			printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4;
   3.148 +			printf "<td>%s</td>", $2;
   3.149 +			printf "<td>%s</td></tr>\n", $5;
   3.150 +			}'
   3.151 +		echo '</tbody></table>' ;;
   3.152 +	*)
   3.153 +		emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->"
   3.154 +		sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \
   3.155 +			'{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';;
   3.156 +esac
   3.157 +
   3.158 +sed -i /^$/d $UP_LIST
   3.159 +upnb=$(wc -l < $UP_LIST)
   3.160 +pkgs=$(wc -l < $PKGS_DB/installed.info)
   3.161 +time=$(($(date +%s) - $time))
   3.162 +if [ "$upnb" -eq 0 ]; then
   3.163 +	install="n"
   3.164 +	_ 'System is up-to-date...'
   3.165 +fi
   3.166 +
   3.167 +if [ "$upnb" -ne 0 ]; then
   3.168 +	blocked_count="$(wc -m < $blocked_counter)"
   3.169 +
   3.170 +	blocked="$(_p \
   3.171 +		'%s blocked' \
   3.172 +		'%s blocked' $blocked_count \
   3.173 +		$blocked_count)"
   3.174 +
   3.175 +	footer "$(_p \
   3.176 +		'You have %s available upgrade (%s)' \
   3.177 +		'You have %s available upgrades (%s)' $upnb \
   3.178 +		$upnb "$blocked")"
   3.179 +fi
   3.180 +emsg "$(_p \
   3.181 +	'%s installed package scanned in %ds' \
   3.182 +	'%s installed packages scanned in %ds' $pkgs \
   3.183 +	"<c 32>$pkgs</c>" $time)"
   3.184 +
   3.185 +
   3.186 +# Clean
   3.187 +rm $blocked_counter $tmp_up_list
   3.188 +
   3.189 +# Pkgs to upgrade ? Skip, let install them all, or ask user
   3.190 +[ -n "$check" ] && exit 0
   3.191 +if [ "$upnb" -gt 0 ]; then
   3.192 +	if [ -n "$install" ]; then
   3.193 +		answer=0
   3.194 +	else
   3.195 +		confirm "$(_ 'Do you wish to install them now? (y/N)')"
   3.196 +		answer=$?
   3.197 +	fi
   3.198 +	case "$answer" in
   3.199 +		0)
   3.200 +			for pkg in $(cat $UP_LIST); do
   3.201 +				echo 'y' | tazpkg -gi "$pkg" --forced		#--reason="upgrade"
   3.202 +			done
   3.203 +			# List is generated each time and must be cleaned so
   3.204 +			# tazpkg-notify doesn't find upgrades anymore.
   3.205 +			rm $UP_LIST; touch $UP_LIST ;;
   3.206 +		*)
   3.207 +			_ 'Leaving without any upgrades installed.'
   3.208 +			newline
   3.209 +			exit 0 ;;
   3.210 +	esac
   3.211 +fi
   3.212 +newline
     4.1 --- a/po/fr.po	Sat Aug 15 12:23:33 2015 +0100
     4.2 +++ b/po/fr.po	Sat Aug 15 17:41:08 2015 +0300
     4.3 @@ -2025,13 +2025,6 @@
     4.4  #~ msgid "Web"
     4.5  #~ msgstr "Internet"
     4.6  
     4.7 -#~ msgid "all"
     4.8 -#~ msgstr "Toutes"
     4.9 -
    4.10 -#, fuzzy
    4.11 -#~ msgid "extra"
    4.12 -#~ msgstr "supplémentaire"
    4.13 -
    4.14  #~ msgid "Repositories"
    4.15  #~ msgstr "Dépôts"
    4.16  
     5.1 --- a/po/ru.po	Sat Aug 15 12:23:33 2015 +0100
     5.2 +++ b/po/ru.po	Sat Aug 15 17:41:08 2015 +0300
     5.3 @@ -2043,6 +2043,9 @@
     5.4  msgid "Packages suggested by %s"
     5.5  msgstr "Пакеты, предложенные пакетом %s"
     5.6  
     5.7 +msgid "State"
     5.8 +msgstr "Состояние"
     5.9 +
    5.10  #~ msgid "Unknown option \"%s\"."
    5.11  #~ msgstr "Неизвестный параметр «%s»."
    5.12  
     6.1 --- a/tazpkg	Sat Aug 15 12:23:33 2015 +0100
     6.2 +++ b/tazpkg	Sat Aug 15 17:41:08 2015 +0300
     6.3 @@ -78,14 +78,14 @@
     6.4  
     6.5  # Path to tazpkg used dir and configuration files
     6.6  MIRROR="$PKGS_DB/mirror"
     6.7 -BLOCKED="$PKGS_DB/blocked-packages.list"
     6.8 -UP_LIST="$PKGS_DB/packages.up"
     6.9 +export BLOCKED="$PKGS_DB/blocked-packages.list"
    6.10 +export UP_LIST="$PKGS_DB/packages.up"
    6.11  DEFAULT_MIRROR="$ONLINE_PKGS"
    6.12  
    6.13  # TazPkg version
    6.14  VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' $PKGS_DB/installed.info)
    6.15  # User Agent
    6.16 -UA="TazPkg-$VERSION"
    6.17 +export UA="TazPkg-$VERSION"
    6.18  
    6.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
    6.20  
    6.21 @@ -1248,11 +1248,18 @@
    6.22  			*\ $i\ *) continue;;
    6.23  		esac
    6.24  		ALL_DEPS="$ALL_DEPS $i"
    6.25 -		[ -n "$2" ] && echo "$2$i ($(fgrep -A 3 $i $PKGS_DB/packages.txt | \
    6.26 -						tail -1 | sed 's/.*(\([^ ]*\).*/\1/'))"
    6.27 -		[ -f $i/receipt ] || continue
    6.28 -		DEPENDS=""
    6.29 -		. $i/receipt
    6.30 +
    6.31 +		if [ -z "$mark" ]; then
    6.32 +			ii="$i"
    6.33 +		else
    6.34 +			ii="- $i"; grep -q ^$i$'\t' "$PKGS_DB/installed.info" && ii="+ $i"
    6.35 +		fi
    6.36 +		[ -n "$2" ] && echo "$2$ii ($(awk -F$'\t' -vp="$i" '
    6.37 +			$1==p{split($7,s," ");print s[2]}' "$PKGS_DB/packages.info"))"
    6.38 +
    6.39 +		DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/installed.info")"
    6.40 +		[ -z "$DEPENDS" ] && \
    6.41 +		DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/packages.info")"
    6.42  		[ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2  "
    6.43  	done
    6.44  }
    6.45 @@ -1263,36 +1270,40 @@
    6.46  rdep_scan() {
    6.47  	SEARCH="$1"
    6.48  
    6.49 -	for i in * ; do
    6.50 -		DEPENDS=''
    6.51 -		. $i/receipt
    6.52 -		echo "$i $(echo $DEPENDS)"
    6.53 -	done | busybox awk -v search=$SEARCH '
    6.54 -function show_deps(deps, all_deps, pkg, space)
    6.55 +	DB='installed'; [ -n "$all" ] && DB='packages'
    6.56 +
    6.57 +	awk -F$'\t' '$8 {print $1 " " $8}' "$PKGS_DB/$DB.info" | \
    6.58 +	busybox awk -F' ' -v search="$SEARCH" '
    6.59 +function show_deps(pkg, space,   i, n, mydeps) {
    6.60 +	if (processed[pkg]) return
    6.61 +	processed[pkg] = 1;
    6.62 +
    6.63 +	if (space) printf "%s %s\n", space, pkg;
    6.64 +
    6.65 +	n = split(deps[pkg], mydeps, " ");
    6.66 +	for (i = 1; i <= n; i++)
    6.67 +		show_deps(mydeps[i], "==" space);
    6.68 +}
    6.69 +
    6.70  {
    6.71 -	if (all_deps[pkg] == 1) return
    6.72 -	all_deps[pkg] = 1
    6.73 -	if (space != "") printf "%s %s\n",space,pkg
    6.74 -	for (i = 1, n = split(deps[pkg], mydeps, " "); i <= n; i++) {
    6.75 -		show_deps(deps, all_deps, mydeps[i],"==" space)
    6.76 -	}
    6.77 +	for (i = 2; i <= NF; i++)
    6.78 +		deps[$i] = deps[$i] " " $1;
    6.79  }
    6.80  
    6.81 -{
    6.82 -	all_deps[$1] = 0
    6.83 -	for (i = 2; i <= NF; i++)
    6.84 -		deps[$i] = deps[$i] " " $1
    6.85 -}
    6.86 -
    6.87  END {
    6.88 -	show_deps(deps, all_deps, search, "")
    6.89 +	show_deps(search, "")
    6.90  }
    6.91  ' | while read spc pkg; do
    6.92 +		if [ -z "$mark" ]; then
    6.93 +			pkgi="$pkg"
    6.94 +		else
    6.95 +			pkgi="- $pkg"; grep -q ^$pkg$'\t' "$PKGS_DB/installed.info" && pkgi="+ $pkg"
    6.96 +		fi
    6.97 +
    6.98  		echo -n $spc | sed 's/=/ /g'
    6.99 -		echo -n $pkg
   6.100 -		echo -n ' ('
   6.101 -		fgrep -A 3 $pkg $PKGS_DB/packages.txt | tail -1 | \
   6.102 -			sed 's/.*(\([^ ]*\).*/\1)/'
   6.103 +
   6.104 +		echo "$pkgi ($(awk -F$'\t' -vp="$pkg" '$1==p{split($7,s," ");print s[2]}' \
   6.105 +			"$PKGS_DB/$DB.info"))"
   6.106  	done
   6.107  }
   6.108  
   6.109 @@ -2043,7 +2054,6 @@
   6.110  		# must have only the chosen main mirror.
   6.111  		#
   6.112  		check_root $@
   6.113 -		export UA
   6.114  		@@MODULES@@/recharge $2
   6.115  		;;
   6.116  
   6.117 @@ -2055,7 +2065,7 @@
   6.118  
   6.119  
   6.120  	up|upgrade)
   6.121 -		check_root
   6.122 +		check_root $@
   6.123  		#
   6.124  		# This is the new way to upgrade packages making 'upgrade' and
   6.125  		# upgradeable out-of-date. This new way is much, much more faster!
   6.126 @@ -2064,151 +2074,12 @@
   6.127  		#
   6.128  		for opt in $@; do
   6.129  			case "$opt" in
   6.130 -				-i) install='yes';;
   6.131 -				-c) check='yes';;
   6.132 +				-i) export install='yes';;
   6.133 +				-c) export check='yes';;
   6.134  			esac
   6.135  		done
   6.136  
   6.137 -		time="$(date +%s)"
   6.138 -
   6.139 -		# Recharge packages databases (if necessary)
   6.140 -		tazpkg recharge >/dev/null
   6.141 -
   6.142 -		cd $INSTALLED
   6.143 -		echo -n > $UP_LIST
   6.144 -		blocked_counter=$(mktemp)
   6.145 -		tmp_up_list=$(mktemp)
   6.146 -
   6.147 -		look_for_priority
   6.148 -		repo_number=1
   6.149 -		for repo in $priority; do
   6.150 -			if [ "$repo" == "$PKGS_DB" ]; then
   6.151 -				repo_name='Main'
   6.152 -			else
   6.153 -				repo_name="$(basename "$repo")"
   6.154 -			fi
   6.155 -
   6.156 -			[ ! -f "$repo/packages.info" ] && continue
   6.157 -			{
   6.158 -				cat $PKGS_DB/blocked-packages.list | awk '{printf "%s\t%s\n", $1, "b"}';
   6.159 -				cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}';
   6.160 -				cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}'
   6.161 -			} | sort -t$'\t' -k1,1 | awk -F$'\t' \
   6.162 -			-vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \
   6.163 -			-vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \
   6.164 -			-vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \
   6.165 -			-vcolor0="$(emsg '</c>')" \
   6.166 -			-vreponum=$repo_number -vreponame=$repo_name \
   6.167 -			-vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \
   6.168 -'{
   6.169 -
   6.170 -	if ($1 != p) {
   6.171 -		if (vi && vp) {
   6.172 -			bb = (b=="") ? "i" : "b"
   6.173 -			if ("" vi != vp) { # important: compare as strings
   6.174 -				startc = (b=="") ? colornewver : colorblocked;
   6.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;
   6.176 -				print p >> uplist;
   6.177 -				if (b!="") printf 1 >> blocked_counter;
   6.178 -			} else if (mi != mp) {
   6.179 -				startc = (b=="") ? colornewbuild : colorblocked;
   6.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;
   6.181 -				print p >> uplist;
   6.182 -				if (b!="") printf 1 >> blocked_counter;
   6.183 -			}
   6.184 -		}
   6.185 -		p = $1; b = b1 = b2 = vi = mi = vp = mp = "";
   6.186 -	}
   6.187 -	if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; }
   6.188 -	if ($2 == "i") { vi = $3; mi = $4; }
   6.189 -	if ($2 == "p") { vp = $3; mp = $4; }
   6.190 -}' >> $tmp_up_list
   6.191 -
   6.192 -			repo_number=$((repo_number + 1))
   6.193 -
   6.194 -		done
   6.195 -
   6.196 -		case "$output" in
   6.197 -			html)
   6.198 -				cat <<EOT
   6.199 -<table class="wide zebra">
   6.200 -	<thead>
   6.201 -		<tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr>
   6.202 -	</thead>
   6.203 -	<tbody>
   6.204 -EOT
   6.205 -				sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{
   6.206 -					if($4=="Main"){repoicon="slitaz"}else{repoicon="web"}
   6.207 -					if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"}
   6.208 -
   6.209 -					printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1;
   6.210 -					printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1;
   6.211 -					printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4;
   6.212 -					printf "<td>%s</td>", $2;
   6.213 -					printf "<td>%s</td></tr>\n", $5;
   6.214 -					}'
   6.215 -				echo '</tbody></table>' ;;
   6.216 -			*)
   6.217 -				emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->"
   6.218 -				sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \
   6.219 -					'{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';;
   6.220 -		esac
   6.221 -
   6.222 -		sed -i /^$/d $UP_LIST
   6.223 -		upnb=$(wc -l < $UP_LIST)
   6.224 -		pkgs=$(ls | wc -l)
   6.225 -		time=$(($(date +%s) - $time))
   6.226 -		if [ "$upnb" -eq 0 ]; then
   6.227 -			install="n"
   6.228 -			_ 'System is up-to-date...'
   6.229 -		fi
   6.230 -
   6.231 -		if [ "$upnb" -ne 0 ]; then
   6.232 -			blocked_count="$(wc -m < $blocked_counter)"
   6.233 -
   6.234 -			blocked="$(_p \
   6.235 -				'%s blocked' \
   6.236 -				'%s blocked' $blocked_count \
   6.237 -				$blocked_count)"
   6.238 -
   6.239 -			footer "$(_p \
   6.240 -				'You have %s available upgrade (%s)' \
   6.241 -				'You have %s available upgrades (%s)' $upnb \
   6.242 -				$upnb "$blocked")"
   6.243 -		fi
   6.244 -		emsg "$(_p \
   6.245 -			'%s installed package scanned in %ds' \
   6.246 -			'%s installed packages scanned in %ds' $pkgs \
   6.247 -			"<c 32>$pkgs</c>" $time)"
   6.248 -
   6.249 -
   6.250 -		# Clean
   6.251 -		rm $blocked_counter $tmp_up_list
   6.252 -
   6.253 -		# Pkgs to upgrade ? Skip, let install them all or ask user
   6.254 -		[ -n "$check" ] && exit 0
   6.255 -		if [ "$upnb" -gt 0 ]; then
   6.256 -			if [ -n "$install" ]; then
   6.257 -				answer=0
   6.258 -			else
   6.259 -				confirm "$(_ 'Do you wish to install them now? (y/N)')"
   6.260 -				answer=$?
   6.261 -			fi
   6.262 -			case "$answer" in
   6.263 -				0)
   6.264 -					for pkg in $(cat $UP_LIST); do
   6.265 -						echo 'y' | tazpkg -gi "$pkg" --forced		#--reason="upgrade"
   6.266 -					done
   6.267 -					# List is generated each time and must be cleaned so
   6.268 -					# tazpkg-notify doesn't find upgrades anymore.
   6.269 -					rm $UP_LIST; touch $UP_LIST ;;
   6.270 -				*)
   6.271 -					_ 'Leaving without any upgrades installed.'
   6.272 -					newline
   6.273 -					exit 0 ;;
   6.274 -			esac
   6.275 -		fi
   6.276 -		newline
   6.277 +		@@MODULES@@/upgrade
   6.278  		;;
   6.279  
   6.280  
   6.281 @@ -2694,20 +2565,34 @@
   6.282  
   6.283  	depends)
   6.284  		# Display dependencies tree
   6.285 -		cd $INSTALLED
   6.286 -		ALL_DEPS=''
   6.287 -		if [ -f "$2/receipt" ]; then
   6.288 -			dep_scan $2 ''
   6.289 -		fi ;;
   6.290 +		unset ALL_DEPS
   6.291 +		mkdir $TMP_DIR
   6.292 +		dep_scan $2 '' | tee "$TMP_DIR/depends"
   6.293 +		if [ -n "$total" ]; then
   6.294 +			separator
   6.295 +			NUM="$(wc -l < "$TMP_DIR/depends")"
   6.296 +			TOTAL="$(sed 's|.*(\([^)]*\))|\1|' "$TMP_DIR/depends" | hrsum)"
   6.297 +			_p 'Total: %s package (%s)' 'Total: %s packages (%s)' "$NUM" \
   6.298 +				"$NUM" "$TOTAL"
   6.299 +			newline
   6.300 +
   6.301 +			if [ -n "$mark" ]; then
   6.302 +				NUM="$(grep '^ *-' "$TMP_DIR/depends" | wc -l)"
   6.303 +				TOTAL="$(grep '^ *-' "$TMP_DIR/depends" | sed 's|.*(\([^)]*\))|\1|' | hrsum)"
   6.304 +				_p 'To install: %s package (%s)' 'To install: %s packages (%s)' "$NUM" \
   6.305 +					"$NUM" "$TOTAL"
   6.306 +				newline
   6.307 +			fi
   6.308 +		fi
   6.309 +		rm -rf "$TMP_DIR"
   6.310 +		;;
   6.311  
   6.312  
   6.313  	rdepends)
   6.314  		# Display reverse dependencies tree
   6.315  		cd $INSTALLED
   6.316 -		ALL_DEPS=''
   6.317 -		if [ -f "$2/receipt" ]; then
   6.318 -			rdep_scan $2
   6.319 -		fi
   6.320 +		unset ALL_DEPS
   6.321 +		rdep_scan "$2"
   6.322  		;;
   6.323  
   6.324