tazpkg rev 834

Remove all --options from positional parameters; make "recharge" module; re-make "up" and "search" commands.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Aug 14 16:55:14 2015 +0300 (2015-08-14)
parents 56df537ccd1b
children c45468fb179e
files Makefile doc/tazpkg.en.html doc/tazpkg.ru.html modules/recharge tazpkg
line diff
     1.1 --- a/Makefile	Fri Aug 14 09:52:08 2015 +0200
     1.2 +++ b/Makefile	Fri Aug 14 16:55:14 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 \
     1.8 +		./modules/list ./modules/mkdb ./modules/recharge \
     1.9  		./tazpkg-box ./tazpkg-notify ./tazpanel/pkgs.cgi
    1.10  
    1.11  msgmerge:
     2.1 --- a/doc/tazpkg.en.html	Fri Aug 14 09:52:08 2015 +0200
     2.2 +++ b/doc/tazpkg.en.html	Fri Aug 14 16:55:14 2015 +0300
     2.3 @@ -238,15 +238,15 @@
     2.4  
     2.5  <p>The first <tt>tazpkg</tt> parameter is a command followed by other mandatory
     2.6  and optional parameters as will be described hereinafter. Options begin with
     2.7 -double dashes.<!-- , you can arrange them in any order and in any place, even before
     2.8 +double dashes, you can arrange them in any order and in any place, even before
     2.9  the command. Unknown and inappropriate options are ignored. The following
    2.10 -commands are equivalent: --></p>
    2.11 +commands are equivalent:</p>
    2.12  
    2.13 -<!-- pre>
    2.14 +<pre>
    2.15  $ tazpkg info nano --root=<em>/mnt/sda6</em>
    2.16  $ tazpkg --root=<em>/mnt/sda6</em> info nano
    2.17  $ tazpkg info --root=<em>/mnt/sda6</em> nano <em>--color</em>
    2.18 -</pre -->
    2.19 +</pre>
    2.20  
    2.21  <!-- p>You can add global option <tt>--root=…</tt> to any TazPkg command. This
    2.22  option allows to work with other SliTaz installations. Option points to the root
     3.1 --- a/doc/tazpkg.ru.html	Fri Aug 14 09:52:08 2015 +0200
     3.2 +++ b/doc/tazpkg.ru.html	Fri Aug 14 16:55:14 2015 +0300
     3.3 @@ -210,15 +210,15 @@
     3.4  <h2>Команды</h2>
     3.5  
     3.6  <p>Первый параметр <tt>tazpkg</tt> — это команда, за которой следуют обязательные и необязательные
     3.7 -параметры как будет описано далее. Опции начинаются с двух дефисов.<!-- , вы можете располагать в любом
     3.8 +параметры как будет описано далее. Опции начинаются с двух дефисов, вы можете располагать в любом
     3.9  порядке и в любом месте, даже перед командой. Неизвестные и неподходящие опции игнорируются.
    3.10 -Следующие команды идентичны: --></p>
    3.11 +Следующие команды идентичны:</p>
    3.12  
    3.13 -<!-- pre>
    3.14 +<pre>
    3.15  $ tazpkg info nano --root=<em>/mnt/sda6</em>
    3.16  $ tazpkg --root=<em>/mnt/sda6</em> info nano
    3.17  $ tazpkg info --root=<em>/mnt/sda6</em> nano <em>--color</em>
    3.18 -</pre -->
    3.19 +</pre>
    3.20  
    3.21  <!-- p>Вы можете добавить глобальную опцию <tt>--root=…</tt> к любой команде TazPkg. Эта опция позволяет
    3.22  работать с другими установками SliTaz. Опция указывает на корень примонтированной файловой системы
     4.1 --- /dev/null	Thu Jan 01 00:00:00 1970 +0000
     4.2 +++ b/modules/recharge	Fri Aug 14 16:55:14 2015 +0300
     4.3 @@ -0,0 +1,192 @@
     4.4 +#!/bin/sh
     4.5 +# TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg
     4.6 +# recharge - TazPkg module
     4.7 +# Recharge packages databases from a mirror
     4.8 +
     4.9 +
    4.10 +# Options:
    4.11 +#   [main|<repository>]				Repository name to recharge (all if empty)
    4.12 +
    4.13 +# Environment variables:
    4.14 +#   root							Root of the packages DB
    4.15 +#   UA								User Agent string ("TazPkg-<version>")
    4.16 +
    4.17 +
    4.18 +# Connect function libraries
    4.19 +. /lib/libtaz.sh
    4.20 +# Get TazPkg configuration variables
    4.21 +. "$root/etc/slitaz/slitaz.conf"
    4.22 +. "$root/etc/slitaz/tazpkg.conf"
    4.23 +PKGS_DB="$root$PKGS_DB"
    4.24 +
    4.25 +# Fallback actions
    4.26 +mkdir -p "$PKGS_DB"
    4.27 +[ ! -e "$PKGS_DB/mirror" ] && echo "$ONLINE_PKGS" > "$PKGS_DB/mirror"
    4.28 +
    4.29 +
    4.30 +# Functions
    4.31 +# ---------
    4.32 +
    4.33 +# Download a file from specified mirror
    4.34 +
    4.35 +download_from() {
    4.36 +	# input: "<mirror_url>+" "file_name"
    4.37 +	local i
    4.38 +	for i in $1; do
    4.39 +		case "$i" in
    4.40 +			# Mirror URL can have a trailing slash or not.
    4.41 +			http://* | https://* | ftp://*)
    4.42 +				busybox wget -c -q -T 30 -U $UA ${i%/}/$2 2>/dev/null && break ;;
    4.43 +			*)
    4.44 +				ln -sf ${i%/}/$2 . && break ;;
    4.45 +		esac
    4.46 +	done
    4.47 +}
    4.48 +
    4.49 +
    4.50 +# When recharging errors occur
    4.51 +
    4.52 +recharging_failed() {
    4.53 +	# Restore database from bak files
    4.54 +	action 'Restoring database files...'
    4.55 +	[ -e 'ID'  -a ! -e 'ID.bak' ]  && rm ID
    4.56 +	[ -e 'IDs' -a ! -e 'IDs.bak' ] && rm IDs
    4.57 +	for file in $(ls $1/*.bak); do
    4.58 +		mv -f $file ${file%.bak}
    4.59 +	done
    4.60 +	status
    4.61 +
    4.62 +	footer "$(colorize 31 "$(_ 'Recharging failed')")"
    4.63 +}
    4.64 +
    4.65 +
    4.66 +
    4.67 +
    4.68 +REPO="$1"
    4.69 +
    4.70 +# What to recharge: main, or all, or selected undigest
    4.71 +case "$REPO" in
    4.72 +	main) repo_to_recharge="$PKGS_DB";;
    4.73 +	'')   repo_to_recharge="$PKGS_DB $PKGS_DB/undigest/*";;
    4.74 +	*)    repo_to_recharge="$PKGS_DB/undigest/$REPO"
    4.75 +		if [ ! -d "$repo_to_recharge" ]; then
    4.76 +			_ "Repository \"%s\" doesn't exist." "$repo_to_recharge" >&2
    4.77 +			exit 1
    4.78 +		fi
    4.79 +		;;
    4.80 +esac
    4.81 +
    4.82 +for path in $repo_to_recharge; do
    4.83 +	[ ! -f $path/mirror ] && continue	# skip
    4.84 +	cd $path
    4.85 +	mirror="$(cat mirror)"
    4.86 +
    4.87 +	# Repository name
    4.88 +	if [ "$path" == "$PKGS_DB" ]; then
    4.89 +		repo_name='Main'
    4.90 +	else
    4.91 +		repo_name="$(_n 'Undigest %s' "$(basename "$path")")"
    4.92 +	fi
    4.93 +
    4.94 +	title 'Recharging repository "%s"' "$repo_name"
    4.95 +
    4.96 +	# Don't let ID be a symlink when using local repository.
    4.97 +	if [ -h ID  ]; then mv -f ID  ID.lnk;  cat ID.lnk  > ID;  rm ID.lnk;  fi
    4.98 +	if [ -h IDs ]; then mv -f IDs IDs.lnk; cat IDs.lnk > IDs; rm IDs.lnk; fi
    4.99 +
   4.100 +	[ -f ID ]  && mv ID  ID.bak					# Compatibility with "old" ID
   4.101 +	[ -f IDs ] && mv IDs IDs.bak
   4.102 +	download_from "$mirror" IDs
   4.103 +	[ -e 'IDs' ] && awk '{print $1}' IDs > ID	# Compatibility with "old" ID
   4.104 +
   4.105 +	# Check if recharging is needed
   4.106 +	if [ -f 'IDs' ] && cmp -s IDs IDs.bak; then
   4.107 +		action 'Checking...'; status			# "Fake" message
   4.108 +		footer "$(_ 'Repository "%s" is up to date.' "$repo_name")"
   4.109 +		rm IDs.bak ID.bak
   4.110 +		continue
   4.111 +	fi
   4.112 +	rm IDs.bak ID.bak 2>/dev/null
   4.113 +
   4.114 +	[ -e 'IDs' ] && _ 'Database timestamp: %s' "$(date -d "@$(awk '{print $2}' IDs)" "+%x %R")"
   4.115 +
   4.116 +	action 'Creating backup of the last packages list...'
   4.117 +	for i in packages.desc packages.$SUM packages.txt packages.list \
   4.118 +		packages.equiv files.list.lzma extra.list mirrors packages.info; do
   4.119 +		[ -f "$i" ] && mv -f $i $i.bak 2>/dev/null
   4.120 +	done
   4.121 +	:; status
   4.122 +
   4.123 +	# Download and extract bundle: extra.list, mirrors, files-list.md5,
   4.124 +	#   packages.{info,desc,md5,txt,list,equiv}
   4.125 +	bundle='bundle.tar.lzma'
   4.126 +	action 'Getting "%s"...' $bundle
   4.127 +	download_from "$mirror" $bundle
   4.128 +	status
   4.129 +	if [ -f "$bundle" ]; then
   4.130 +		busybox tar -xaf $bundle; rm $bundle
   4.131 +	else
   4.132 +		recharging_failed $path; continue
   4.133 +	fi
   4.134 +
   4.135 +	# Download files.list.lzma
   4.136 +	files_local='files.list.lzma'; files_remote='files-list.lzma'
   4.137 +	if [ -e "$files_local.bak" ]; then
   4.138 +		md5sum $files_local.bak | awk '{printf $1}' > files-list.md5.bak
   4.139 +		if cmp -s files-list.md5 files-list.md5.bak; then
   4.140 +			mv $files_local.bak $files_remote
   4.141 +		else
   4.142 +			action 'Getting "%s"...' $files_remote
   4.143 +			download_from "$mirror" $files_remote
   4.144 +			status
   4.145 +		fi
   4.146 +	else
   4.147 +		action 'Getting "%s"...' $files_remote
   4.148 +		download_from "$mirror" $files_remote
   4.149 +		status
   4.150 +	fi
   4.151 +
   4.152 +	if [ ! -e "$files_remote" ]; then
   4.153 +		recharging_failed $path; continue
   4.154 +	fi
   4.155 +	mv -f $files_remote $files_local
   4.156 +
   4.157 +	# Remove old database files (but packages.list.bak, extra.list.bak)
   4.158 +	for i in packages.desc packages.$SUM packages.txt packages.equiv \
   4.159 +		files.list.lzma mirrors packages.info files-list.md5; do
   4.160 +		[ -f "$i.bak" ] && rm $i.bak 2>/dev/null
   4.161 +	done
   4.162 +
   4.163 +	footer "$(_ 'Last database is ready to use.')"
   4.164 +
   4.165 +	# Check diff
   4.166 +	if [ -f 'packages.list.bak' ]; then
   4.167 +		diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
   4.168 +		rm packages.list.bak
   4.169 +		if [ -f 'extra.list.bak' ]; then
   4.170 +			if [ -f 'extra.list' ]; then
   4.171 +				awk -F'|' '{print $1 " (extra)"}' extra.list > extra.list1
   4.172 +				awk -F'|' '{print $1 " (extra)"}' extra.list.bak > extra.list1.bak
   4.173 +				diff -u extra.list1.bak extra.list1 | grep ^+[a-z] >> packages.diff
   4.174 +				rm extra.list.bak extra.list1 extra.list1.bak
   4.175 +			else
   4.176 +				mv extra.list.bak extra.list
   4.177 +			fi
   4.178 +		fi
   4.179 +		sed -i s/+// packages.diff
   4.180 +
   4.181 +		new_pkgs=$(wc -l < packages.diff)
   4.182 +		if [ "$new_pkgs" -gt 0 ]; then
   4.183 +			title 'Mirrored packages diff'
   4.184 +			cat packages.diff
   4.185 +			footer "$(emsg "$(_p \
   4.186 +			'%s new package on the mirror.' \
   4.187 +			'%s new packages on the mirror.' $new_pkgs \
   4.188 +			"<c 32>$new_pkgs</c>")")"
   4.189 +		fi
   4.190 +	else
   4.191 +		longline "$(_ "Note that next time you recharge the list, a list of \
   4.192 +differences will be displayed to show new and upgradeable packages.")"
   4.193 +	fi
   4.194 +done
   4.195 +newline
     5.1 --- a/tazpkg	Fri Aug 14 09:52:08 2015 +0200
     5.2 +++ b/tazpkg	Fri Aug 14 16:55:14 2015 +0300
     5.3 @@ -34,6 +34,28 @@
     5.4  	printf "$(ngettext "$S" "$P" "$N")" "$@"; }
     5.5  
     5.6  
     5.7 +# Translate category names (must be last in line)
     5.8 +
     5.9 +translate_category() {
    5.10 +	sed "s|base-system$|$(_ base-system)|; s|x-window$|$(_ x-window)|;
    5.11 +		s|utilities$|$(_ utilities)|; s|network$|$(_ network)|;
    5.12 +		s|graphics$|$(_ graphics)|; s|multimedia$|$(_ multimedia)|;
    5.13 +		s|office$|$(_ office)|; s|development$|$(_ development)|;
    5.14 +		s|system-tools$|$(_ system-tools)|; s|security$|$(_ security)|;
    5.15 +		s|games$|$(_ games)|; s|misc$|$(_ misc)|; s|meta$|$(_ meta)|;
    5.16 +		s|non-free$|$(_ non-free)|; s|all$|$(_ all)|; s|extra$|$(_ extra)|"
    5.17 +}
    5.18 +
    5.19 +
    5.20 +# Remove all --parameters from cmdline
    5.21 +#-------------------------------------
    5.22 +# (thanks to libtaz.sh all --parameters are already set to variables)
    5.23 +
    5.24 +IFS=$'\n'
    5.25 +set -- $(echo "$*" | sed '/^--/d')
    5.26 +unset IFS
    5.27 +
    5.28 +
    5.29  # Initialize some variables to use words rather than numbers for functions
    5.30  # and actions.
    5.31  
    5.32 @@ -891,7 +913,7 @@
    5.33  	# Clean to save RAM memory before installation
    5.34  	rm -rf "$PACKAGE-$VERSION"
    5.35  
    5.36 -	if [ "$3" == '--get' ]; then
    5.37 +	if [ -n "$get" ]; then
    5.38  		mv "$PACKAGE-$VERSION.tazpkg" "$TOP_DIR"
    5.39  	else
    5.40  		# Install pseudo package
    5.41 @@ -1037,16 +1059,17 @@
    5.42  # Search pattern in installed packages.
    5.43  
    5.44  search_in_installed_packages() {
    5.45 -	_ 'Installed packages'
    5.46 -	separator '-'
    5.47 +	_ 'Installed packages'; separator '-'
    5.48  	num='0'
    5.49 -	for pkg in $(ls -1 $INSTALLED | grep -i "$PATTERN"); do
    5.50 -		EXTRAVERSION=''
    5.51 -		[ -f $INSTALLED/$pkg/receipt ] || continue
    5.52 -		. $INSTALLED/$pkg/receipt
    5.53 -		emsg "$PACKAGE<i 24> $VERSION$EXTRAVERSION<i 42> $(_n $CATEGORY)"
    5.54 -		num=$(($num+1))
    5.55 -	done
    5.56 +	TMPLIST="$(mktemp)"
    5.57 +
    5.58 +	awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
    5.59 +		BEGIN { IGNORECASE = 1 }
    5.60 +		index($1 "-" $2, pattern) {
    5.61 +			printf "%-24s%-18s%s\n", $1, $2, $3;
    5.62 +			printf "1" >> t
    5.63 +		}' "$PKGS_DB/installed.info" | translate_category
    5.64 +	num="$(wc -m < $TMPLIST)"; rm $TMPLIST
    5.65  
    5.66  	footer "$(_p \
    5.67  		'%s installed package found for "%s"' \
    5.68 @@ -1061,27 +1084,23 @@
    5.69  	_ 'Available packages'; separator '-'
    5.70  	num='0'
    5.71  	TMPLIST="$(mktemp)"
    5.72 -	BPATTERN="$(emsg "<b>$PATTERN</b>")"
    5.73  
    5.74  	for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do
    5.75 -		[ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vbpattern="$BPATTERN" \
    5.76 -		-vt="$TMPLIST" '
    5.77 +		[ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
    5.78  		BEGIN { IGNORECASE = 1 }
    5.79  		index($1 "-" $2, pattern) {
    5.80 -			pv = $1 "-" $2; gsub(pattern, bpattern, pv); print pv;
    5.81 +			printf "%-24s%-18s%s\n", $1, $2, $3;
    5.82  			printf "1" >> t
    5.83 -		}' $i
    5.84 +		}' "$i" | translate_category
    5.85  	done
    5.86  
    5.87  	for i in $PKGS_DB/extra.list $PKGS_DB/undigest/*/extra.list; do
    5.88 -		[ -e "$i" ] && awk -F'|' -vpattern="$PATTERN" -vbpattern="$BPATTERN" \
    5.89 -		-vt="$TMPLIST" '
    5.90 +		[ -e "$i" ] && awk -F'|' -vpattern="$PATTERN" -vt="$TMPLIST" '
    5.91  		BEGIN { IGNORECASE = 1 }
    5.92  		index($1 "-" $5, pattern) {
    5.93 -			if ($5) pv = $1 "-" $5; else pv = $1;
    5.94 -			gsub(pattern, bpattern, pv); print pv " (extra)";
    5.95 +			printf "%-24s%-18s%s\n", $1 " (extra)", $5, $4;
    5.96  			printf "1" >> t
    5.97 -		}' $i
    5.98 +		}' "$i" | translate_category
    5.99  	done
   5.100  
   5.101  	if [ ! -f "$PKGS_DB/packages.info" ]; then
   5.102 @@ -1104,25 +1123,29 @@
   5.103  # info than --list or default.
   5.104  
   5.105  search_in_packages_txt() {
   5.106 -	_ 'Matching packages name with version and desc'
   5.107 -	separator
   5.108 +	_ 'Matching packages name with version and desc'; separator '-'
   5.109  	num='0'
   5.110 -	for i in \
   5.111 -		$PKGS_DB/packages.txt \
   5.112 -		$PKGS_DB/undigest/*/packages.txt; do
   5.113 -
   5.114 -		grep -is -A 2 "^$PATTERN" $i
   5.115 -		num=$(($num + $(grep -is "^$PATTERN" $i | wc -l)))
   5.116 +	TMPLIST="$(mktemp)"
   5.117 +
   5.118 +	for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do
   5.119 +		[ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
   5.120 +		BEGIN { IGNORECASE = 1 }
   5.121 +		index($1 " " $2 " " $4, pattern) {
   5.122 +			split($7, s, " ");
   5.123 +			printf "%s\n%s\n%s\n%s (%s installed)\n\n", $1, $2, $4, s[1], s[2];
   5.124 +			printf "1" >> t;
   5.125 +		}' "$i"
   5.126  	done
   5.127  
   5.128 -	if [ ! -f "$PKGS_DB/packages.txt" ]; then
   5.129 +	if [ ! -f "$PKGS_DB/packages.info" ]; then
   5.130  		newline
   5.131  		longline "$(_ \
   5.132  "No \"%s\" found to check for mirrored packages. For more results, please run \
   5.133 -\"%s\" once as root before searching." 'packages.txt' 'tazpkg recharge')"
   5.134 +\"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')"
   5.135  		newline
   5.136  	fi
   5.137  
   5.138 +	num="$(wc -m < $TMPLIST)"; rm $TMPLIST
   5.139  	footer "$(_p \
   5.140  		'%s available package found for "%s"' \
   5.141  		'%s available packages found for "%s"' $num \
   5.142 @@ -1309,22 +1332,6 @@
   5.143  }
   5.144  
   5.145  
   5.146 -# When recharging errors occur
   5.147 -
   5.148 -recharging_failed() {
   5.149 -	# Restore database from bak files
   5.150 -	action 'Restoring database files...'
   5.151 -	[ -e 'ID'  -a ! -e 'ID.bak' ]  && rm ID
   5.152 -	[ -e 'IDs' -a ! -e 'IDs.bak' ] && rm IDs
   5.153 -	for file in $(ls $1/*.bak); do
   5.154 -		mv -f $file ${file%.bak}
   5.155 -	done
   5.156 -	status
   5.157 -
   5.158 -	footer "$(colorize 31 "$(_ 'Recharging failed')")"
   5.159 -}
   5.160 -
   5.161 -
   5.162  # Print package name if not printed yet
   5.163  print_pkgname() {
   5.164  	if [ "$PACKAGE" != "$PACKAGE_PRINTED" ]; then
   5.165 @@ -1416,23 +1423,24 @@
   5.166  	search|-s)
   5.167  		# Search for a package by pattern or name.
   5.168  		PATTERN="$2"
   5.169 -		if [ -z "$PATTERN" ]; then
   5.170 -			newline
   5.171 -			_ 'Please specify a pattern or package name to search for.'
   5.172 -			echo "$(_ 'Example:') 'tazpkg search paint'"
   5.173 -			newline
   5.174 -			exit 0
   5.175 -		fi
   5.176 +		if [ -z "$PATTERN" ]; then tazpkg -h search; exit 1; fi
   5.177 +
   5.178  		title 'Search result for "%s"' "$PATTERN"
   5.179  		# Default is to search in installed pkgs and the raw list.
   5.180  		case "$3" in
   5.181 -			-i|--installed) search_in_installed_packages ;;
   5.182 -			-l|--list)      search_in_packages_list ;;
   5.183 -#buggy			-m|--mirror)    search_in_packages_txt ;;
   5.184 -			*)
   5.185 -				search_in_installed_packages
   5.186 -				search_in_packages_list ;;
   5.187 -		esac ;;
   5.188 +			-i) installed='yes';;
   5.189 +			-l) list='yes';;
   5.190 +			-m) mirror='yes';;
   5.191 +		esac
   5.192 +
   5.193 +		[ -n "$installed" ] && search_in_installed_packages
   5.194 +		[ -n "$list"      ] && search_in_packages_list
   5.195 +		[ -n "$mirror"    ] && search_in_packages_txt
   5.196 +		if [ -z "$installed$list$mirror" ]; then
   5.197 +			search_in_installed_packages
   5.198 +			search_in_packages_list
   5.199 +		fi
   5.200 +		;;
   5.201  
   5.202  
   5.203  	search-file|-sf)
   5.204 @@ -2035,141 +2043,9 @@
   5.205  		# must have only the chosen main mirror.
   5.206  		#
   5.207  		check_root $@
   5.208 -
   5.209 -		# usage: tazpkg recharge [--root=path] [main|<repository>]
   5.210 -
   5.211 -		ARG="$2"
   5.212 -		if [ -n "$root" ]; then
   5.213 -			PKGS_DB="$root$PKGS_DB"
   5.214 -			[ "${2#--}" != "$2" ] && ARG="$3"
   5.215 -		fi
   5.216 -
   5.217 -		case "$ARG" in
   5.218 -			main) repo_to_recharge="$PKGS_DB";;
   5.219 -			'')   repo_to_recharge="$PKGS_DB $PKGS_DB/undigest/*";;
   5.220 -			*)    repo_to_recharge="$PKGS_DB/undigest/$ARG"
   5.221 -				if [ ! -d "$repo_to_recharge" ]; then
   5.222 -					_ "Repository \"%s\" doesn't exist." "$repo_to_recharge" >&2
   5.223 -					exit 1
   5.224 -				fi
   5.225 -				;;
   5.226 -		esac
   5.227 -
   5.228 -		for path in $repo_to_recharge; do
   5.229 -			[ ! -f $path/mirror ] && continue	# skip
   5.230 -			cd $path
   5.231 -			mirror="$(cat mirror)"
   5.232 -
   5.233 -			# Repository name
   5.234 -			if [ "$path" == "$PKGS_DB" ]; then
   5.235 -				repo_name='Main'
   5.236 -			else
   5.237 -				repo_name="$(_n 'Undigest %s' "$(basename "$path")")"
   5.238 -			fi
   5.239 -
   5.240 -			title 'Recharging repository "%s"' "$repo_name"
   5.241 -
   5.242 -			# Don't let ID be a symlink when using local repository.
   5.243 -			if [ -h ID  ]; then mv -f ID  ID.lnk;  cat ID.lnk  > ID;  rm ID.lnk;  fi
   5.244 -			if [ -h IDs ]; then mv -f IDs IDs.lnk; cat IDs.lnk > IDs; rm IDs.lnk; fi
   5.245 -
   5.246 -			[ -f ID ]  && mv ID  ID.bak					# Compatibility with "old" ID
   5.247 -			[ -f IDs ] && mv IDs IDs.bak
   5.248 -			download_from "$mirror" IDs
   5.249 -			[ -e 'IDs' ] && awk '{print $1}' IDs > ID	# Compatibility with "old" ID
   5.250 -
   5.251 -			# Check if recharging is needed
   5.252 -			if [ -f 'IDs' ] && cmp -s IDs IDs.bak; then
   5.253 -				action 'Checking...'; status			# "Fake" message
   5.254 -				footer "$(_ 'Repository "%s" is up to date.' "$repo_name")"
   5.255 -				rm IDs.bak ID.bak
   5.256 -				continue
   5.257 -			fi
   5.258 -			rm IDs.bak ID.bak 2>/dev/null
   5.259 -
   5.260 -			[ -e 'IDs' ] && _ 'Database timestamp: %s' "$(date -d "@$(awk '{print $2}' IDs)" "+%x %R")"
   5.261 -
   5.262 -			action 'Creating backup of the last packages list...'
   5.263 -			for i in packages.desc packages.$SUM packages.txt packages.list \
   5.264 -				packages.equiv files.list.lzma extra.list mirrors packages.info; do
   5.265 -				[ -f "$i" ] && mv -f $i $i.bak 2>/dev/null
   5.266 -			done
   5.267 -			status
   5.268 -
   5.269 -			# Download and extract bundle: extra.list, mirrors, files-list.md5,
   5.270 -			#   packages.{info,desc,md5,txt,list,equiv}
   5.271 -			bundle='bundle.tar.lzma'
   5.272 -			action 'Getting "%s"...' $bundle
   5.273 -			download_from "$mirror" $bundle
   5.274 -			status
   5.275 -			if [ -f "$bundle" ]; then
   5.276 -				busybox tar -xaf $bundle; rm $bundle
   5.277 -			else
   5.278 -				recharging_failed $path; continue
   5.279 -			fi
   5.280 -
   5.281 -			# Download files.list.lzma
   5.282 -			files_local='files.list.lzma'; files_remote='files-list.lzma'
   5.283 -			if [ -e "$files_local.bak" ]; then
   5.284 -				md5sum $files_local.bak | awk '{printf $1}' > files-list.md5.bak
   5.285 -				if cmp -s files-list.md5 files-list.md5.bak; then
   5.286 -					mv $files_local.bak $files_remote
   5.287 -				else
   5.288 -					action 'Getting "%s"...' $files_remote
   5.289 -					download_from "$mirror" $files_remote
   5.290 -					status
   5.291 -				fi
   5.292 -			else
   5.293 -				action 'Getting "%s"...' $files_remote
   5.294 -				download_from "$mirror" $files_remote
   5.295 -				status
   5.296 -			fi
   5.297 -
   5.298 -			if [ ! -e "$files_remote" ]; then
   5.299 -				recharging_failed $path; continue
   5.300 -			fi
   5.301 -			mv -f $files_remote $files_local
   5.302 -
   5.303 -			# Remove old database files (but packages.list.bak, extra.list.bak)
   5.304 -			for i in packages.desc packages.$SUM packages.txt packages.equiv \
   5.305 -				files.list.lzma mirrors packages.info files-list.md5; do
   5.306 -				[ -f "$i.bak" ] && rm $i.bak 2>/dev/null
   5.307 -			done
   5.308 -
   5.309 -			footer "$(_ 'Last database is ready to use.')"
   5.310 -
   5.311 -			# Check diff
   5.312 -			if [ -f 'packages.list.bak' ]; then
   5.313 -				diff -u packages.list.bak packages.list | grep ^+[a-z] > packages.diff
   5.314 -				rm packages.list.bak
   5.315 -				if [ -f 'extra.list.bak' ]; then
   5.316 -					if [ -f 'extra.list' ]; then
   5.317 -						awk -F'|' '{print $1 " (extra)"}' extra.list > extra.list1
   5.318 -						awk -F'|' '{print $1 " (extra)"}' extra.list.bak > extra.list1.bak
   5.319 -						diff -u extra.list1.bak extra.list1 | grep ^+[a-z] >> packages.diff
   5.320 -						rm extra.list.bak extra.list1 extra.list1.bak
   5.321 -					else
   5.322 -						mv extra.list.bak extra.list
   5.323 -					fi
   5.324 -				fi
   5.325 -				sed -i s/+// packages.diff
   5.326 -
   5.327 -				new_pkgs=$(wc -l < packages.diff)
   5.328 -				if [ "$new_pkgs" -gt 0 ]; then
   5.329 -					title 'Mirrored packages diff'
   5.330 -					cat packages.diff
   5.331 -					footer "$(emsg "$(_p \
   5.332 -					'%s new package on the mirror.' \
   5.333 -					'%s new packages on the mirror.' $new_pkgs \
   5.334 -					"<c 32>$new_pkgs</c>")")"
   5.335 -				fi
   5.336 -			else
   5.337 -				longline "$(_ "Note that next time you recharge the \
   5.338 -list, a list of differences will be displayed to show new and upgradeable \
   5.339 -packages.")"
   5.340 -			fi
   5.341 -		done
   5.342 -		newline ;;
   5.343 +		export UA
   5.344 +		@@MODULES@@/recharge $2
   5.345 +		;;
   5.346  
   5.347  
   5.348  	help-up)
   5.349 @@ -2188,103 +2064,131 @@
   5.350  		#
   5.351  		for opt in $@; do
   5.352  			case "$opt" in
   5.353 -				--recharge|-r)	tazpkg recharge ;;
   5.354 -				--install|-i)	install="y" ;;
   5.355 -				--check|-c) 	install="n" ;;
   5.356 +				-i) install='yes';;
   5.357 +				-c) check='yes';;
   5.358  			esac
   5.359  		done
   5.360 +
   5.361  		time="$(date +%s)"
   5.362  
   5.363 -		look_for_priority
   5.364 -		for repo in $priority; do
   5.365 -			pkg_list="$repo/packages.list"
   5.366 -			mtime=$(find $pkg_list -mtime +7)
   5.367 -			if [ -n "$mtime" ]; then
   5.368 -				if [ "$repo" == "$PKGS_DB" ]; then
   5.369 -					repo_name='main'
   5.370 -				else
   5.371 -					repo_name="${repo##*/}"
   5.372 -				fi
   5.373 -				_ 'List "%s" is older than one week... Recharging.' $pkg_list
   5.374 -				tazpkg recharge $repo_name
   5.375 -			fi
   5.376 -		done
   5.377 -
   5.378 -		emsg "<n>$(_ 'Package')<i 28> $(_ 'Version')<i 48> $(_ 'Status')<->"
   5.379 +		# Recharge packages databases (if necessary)
   5.380 +		tazpkg recharge >/dev/null
   5.381  
   5.382  		cd $INSTALLED
   5.383  		echo -n > $UP_LIST
   5.384 -		blocked_count=0
   5.385 -		installed_sum="$PKGS_DB/installed.$SUM"
   5.386 -
   5.387 -		for pkg in *; do
   5.388 -			[ ! -d $pkg ] && continue
   5.389 -			unset VERSION EXTRAVERSION
   5.390 -			. $pkg/receipt
   5.391 -			md5=$(fgrep "  $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" \
   5.392 -				$installed_sum | awk '{print $1}')
   5.393 -			for repo in $priority; do
   5.394 -				pkg_desc="$repo/packages.desc"
   5.395 -				pkg_list="$repo/packages.list"
   5.396 -				pkg_sum="$repo/packages.$SUM"
   5.397 -
   5.398 -				if ! fgrep -q "$md5  $PACKAGE-" $pkg_sum; then
   5.399 -					# Jump to next repository in priority if pkg doesn't exist
   5.400 -					# in this one.
   5.401 -					grep -q "^$PACKAGE-" $pkg_list || continue
   5.402 -
   5.403 -					emsg -n "$PACKAGE<i 28> $VERSION"
   5.404 -
   5.405 -					# Skip pkgs listed in $PKGS_DB/blocked-packages.list
   5.406 -					if $(grep -qs "^$PACKAGE" $BLOCKED); then
   5.407 -						blocked_count=$(($blocked_count + 1))
   5.408 -						emsg "<i 48><c 31> $(_ 'Blocked')</c>"
   5.409 -						break
   5.410 -					fi
   5.411 -
   5.412 -					new=$(grep "^$PACKAGE |" $pkg_desc | awk '{print $3}')
   5.413 -
   5.414 -					if [ "$VERSION" == "$new" ]; then
   5.415 -						emsg "<i 48><c 34> $(_ 'New build')</c>"
   5.416 -					else
   5.417 -						emsg "<i 48><c 32> $(_ 'New version %s' "$new")</c>"
   5.418 -					fi
   5.419 -					echo "$PACKAGE" >> $UP_LIST
   5.420 -					break
   5.421 -				fi
   5.422 -			done
   5.423 +		blocked_counter=$(mktemp)
   5.424 +		tmp_up_list=$(mktemp)
   5.425 +
   5.426 +		look_for_priority
   5.427 +		repo_number=1
   5.428 +		for repo in $priority; do
   5.429 +			if [ "$repo" == "$PKGS_DB" ]; then
   5.430 +				repo_name='Main'
   5.431 +			else
   5.432 +				repo_name="$(basename "$repo")"
   5.433 +			fi
   5.434 +
   5.435 +			[ ! -f "$repo/packages.info" ] && continue
   5.436 +			{
   5.437 +				cat $PKGS_DB/blocked-packages.list | awk '{printf "%s\t%s\n", $1, "b"}';
   5.438 +				cat $PKGS_DB/installed.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "i", $2, $9}';
   5.439 +				cat $repo/packages.info | awk -F$'\t' '{printf "%s\t%s\t%s\t%s\n", $1, "p", $2, $9}'
   5.440 +			} | sort -t$'\t' -k1,1 | awk -F$'\t' \
   5.441 +			-vnewbuild="$(_ 'New build')" -vcolornewbuild="$(emsg '<c 34>')" \
   5.442 +			-vnewver='→ ' -vcolornewver="$(emsg '<c 32>')" \
   5.443 +			-vblocked=" ($(_ 'Blocked'))" -vcolorblocked="$(emsg '<c 31>')" \
   5.444 +			-vcolor0="$(emsg '</c>')" \
   5.445 +			-vreponum=$repo_number -vreponame=$repo_name \
   5.446 +			-vuplist="$UP_LIST" -vblocked_counter="$blocked_counter" \
   5.447 +'{
   5.448 +
   5.449 +	if ($1 != p) {
   5.450 +		if (vi && vp) {
   5.451 +			bb = (b=="") ? "i" : "b"
   5.452 +			if ("" vi != vp) { # important: compare as strings
   5.453 +				startc = (b=="") ? colornewver : colorblocked;
   5.454 +				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;
   5.455 +				print p >> uplist;
   5.456 +				if (b!="") printf 1 >> blocked_counter;
   5.457 +			} else if (mi != mp) {
   5.458 +				startc = (b=="") ? colornewbuild : colorblocked;
   5.459 +				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;
   5.460 +				print p >> uplist;
   5.461 +				if (b!="") printf 1 >> blocked_counter;
   5.462 +			}
   5.463 +		}
   5.464 +		p = $1; b = b1 = b2 = vi = mi = vp = mp = "";
   5.465 +	}
   5.466 +	if ($2 == "b") { b = blocked; b1 = bl1; b2 = bl2; }
   5.467 +	if ($2 == "i") { vi = $3; mi = $4; }
   5.468 +	if ($2 == "p") { vp = $3; mp = $4; }
   5.469 +}' >> $tmp_up_list
   5.470 +
   5.471 +			repo_number=$((repo_number + 1))
   5.472 +
   5.473  		done
   5.474 +
   5.475 +		case "$output" in
   5.476 +			html)
   5.477 +				cat <<EOT
   5.478 +<table class="wide zebra">
   5.479 +	<thead>
   5.480 +		<tr><td>$(_ 'Package')</td><td>$(_ 'Repository')</td><td>$(_ 'Version')</td><td>$(_ 'Status')</td></tr>
   5.481 +	</thead>
   5.482 +	<tbody>
   5.483 +EOT
   5.484 +				sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' '{
   5.485 +					if($4=="Main"){repoicon="slitaz"}else{repoicon="web"}
   5.486 +					if($6=="b"){pkgicon="pkgib"}else{pkgicon="pkgi"}
   5.487 +
   5.488 +					printf "<tr><td><input type=\"checkbox\" name=\"pkg\" value=\"%s\"/>", $1;
   5.489 +					printf "<a data-icon=\"%s\" href=\"?info=%s\">%s</a></td>", pkgicon, $1, $1;
   5.490 +					printf "<td><span data-icon=\"%s\">%s</span></td>", repoicon, $4;
   5.491 +					printf "<td>%s</td>", $2;
   5.492 +					printf "<td>%s</td></tr>\n", $5;
   5.493 +					}'
   5.494 +				echo '</tbody></table>' ;;
   5.495 +			*)
   5.496 +				emsg "<n>$(_ 'Package')<i 26>$(_ 'Repository')<i 38>$(_ 'Version')<i 49>$(_ 'Status')<->"
   5.497 +				sort -t$'\t' -k1,3 $tmp_up_list | awk -F$'\t' \
   5.498 +					'{printf "%-24s %-11s %-10s %s\n", $1, $4, $2, $5}';;
   5.499 +		esac
   5.500 +
   5.501  		sed -i /^$/d $UP_LIST
   5.502  		upnb=$(wc -l < $UP_LIST)
   5.503  		pkgs=$(ls | wc -l)
   5.504  		time=$(($(date +%s) - $time))
   5.505 -		if [ "$upnb" == 0 ]; then
   5.506 +		if [ "$upnb" -eq 0 ]; then
   5.507  			install="n"
   5.508  			_ 'System is up-to-date...'
   5.509  		fi
   5.510  
   5.511 -		footer "$(emsg "$(_p \
   5.512 -			'%s installed package scanned in %ds' \
   5.513 -			'%s installed packages scanned in %ds' $pkgs \
   5.514 -			"<c 32>$pkgs</c>" $time)")"
   5.515 -
   5.516 -		if [ "$upnb" != 0 ]; then
   5.517 +		if [ "$upnb" -ne 0 ]; then
   5.518 +			blocked_count="$(wc -m < $blocked_counter)"
   5.519 +
   5.520  			blocked="$(_p \
   5.521  				'%s blocked' \
   5.522  				'%s blocked' $blocked_count \
   5.523  				$blocked_count)"
   5.524  
   5.525 -			boldify "$(_p \
   5.526 +			footer "$(_p \
   5.527  				'You have %s available upgrade (%s)' \
   5.528  				'You have %s available upgrades (%s)' $upnb \
   5.529  				$upnb "$blocked")"
   5.530 -			newline
   5.531  		fi
   5.532 +		emsg "$(_p \
   5.533 +			'%s installed package scanned in %ds' \
   5.534 +			'%s installed packages scanned in %ds' $pkgs \
   5.535 +			"<c 32>$pkgs</c>" $time)"
   5.536 +
   5.537 +
   5.538 +		# Clean
   5.539 +		rm $blocked_counter $tmp_up_list
   5.540  
   5.541  		# Pkgs to upgrade ? Skip, let install them all or ask user
   5.542 -		[ "$install" == 'n' ] && exit 0
   5.543 +		[ -n "$check" ] && exit 0
   5.544  		if [ "$upnb" -gt 0 ]; then
   5.545 -			if [ "$install" == 'y' ]; then
   5.546 +			if [ -n "$install" ]; then
   5.547  				answer=0
   5.548  			else
   5.549  				confirm "$(_ 'Do you wish to install them now? (y/N)')"
   5.550 @@ -2293,7 +2197,7 @@
   5.551  			case "$answer" in
   5.552  				0)
   5.553  					for pkg in $(cat $UP_LIST); do
   5.554 -						echo 'y' | tazpkg get-install $pkg --forced
   5.555 +						echo 'y' | tazpkg -gi "$pkg" --forced		#--reason="upgrade"
   5.556  					done
   5.557  					# List is generated each time and must be cleaned so
   5.558  					# tazpkg-notify doesn't find upgrades anymore.
   5.559 @@ -2304,7 +2208,8 @@
   5.560  					exit 0 ;;
   5.561  			esac
   5.562  		fi
   5.563 -		newline ;;
   5.564 +		newline
   5.565 +		;;
   5.566  
   5.567  
   5.568  	bugs)
   5.569 @@ -2340,7 +2245,7 @@
   5.570  		look_for_priority
   5.571  
   5.572  		cd $INSTALLED
   5.573 -		if [ -z "$2" -o "$2" == '--full' ]; then PACKAGES="$(ls)"; else PACKAGES="$2"; fi
   5.574 +		if [ -z "$2" -o -n "$full" ]; then PACKAGES="$(ls)"; else PACKAGES="$2"; fi
   5.575  		PACKAGE_PRINTED=''
   5.576  
   5.577  		for PACKAGE in $PACKAGES; do
   5.578 @@ -2387,7 +2292,7 @@
   5.579  		[ -n "$PACKAGE_PRINTED" ] && footer
   5.580  
   5.581  		_ 'Looking for known bugs...'
   5.582 -		if [ -z "$2" -o "$2" == '--full' ]; then tazpkg bugs; else tazpkg bugs "$2"; fi
   5.583 +		if [ -z "$2" -o -n "$full" ]; then tazpkg bugs; else tazpkg bugs "$2"; fi
   5.584  
   5.585  
   5.586  		if [ -n "$full" ]; then
   5.587 @@ -2441,7 +2346,7 @@
   5.588  			done
   5.589  			footer
   5.590  
   5.591 -			if [ "$2" == '--full' ]; then
   5.592 +			if [ -n "$full" ]; then
   5.593  				title 'Alien files:'
   5.594  				MSG="$(_n 'No package has installed the following files:')\n"
   5.595  				find /etc /bin /sbin /lib /usr /var/www -not -type d 2>/dev/null | \
   5.596 @@ -2764,7 +2669,7 @@
   5.597  		else
   5.598  			PROMPT="\\033[1;33mtazpkg\\033[0;39m> "
   5.599  		fi
   5.600 -		if [ "$2" != "--noheader" ]; then
   5.601 +		if [ -z "$noheader" ]; then
   5.602  			clear
   5.603  			title 'TazPkg SHell.'
   5.604  			_ "Type 'usage' to list all available commands or 'quit' or 'q' to exit."