tazpkg diff tazpkg @ rev 845

install: rebuild fs/ tree respecting destination symlinks before installing files and folders to filesystem
author Aleksej Bobylev <al.bobylev@gmail.com>
date Tue Oct 06 15:46:41 2015 +0300 (2015-10-06)
parents 0560ba4306a1
children 8a73a58ed3cb
line diff
     1.1 --- a/tazpkg	Wed Sep 02 03:31:47 2015 +0300
     1.2 +++ b/tazpkg	Tue Oct 06 15:46:41 2015 +0300
     1.3 @@ -34,17 +34,6 @@
     1.4  	printf "$(ngettext "$S" "$P" "$N")" "$@"; }
     1.5  
     1.6  
     1.7 -# Translate category names (must be last in line)
     1.8 -
     1.9 -translate_category() {
    1.10 -	sed "s|base-system$|$(_ base-system)|; s|x-window$|$(_ x-window)|;
    1.11 -		s|utilities$|$(_ utilities)|; s|network$|$(_ network)|;
    1.12 -		s|graphics$|$(_ graphics)|; s|multimedia$|$(_ multimedia)|;
    1.13 -		s|office$|$(_ office)|; s|development$|$(_ development)|;
    1.14 -		s|system-tools$|$(_ system-tools)|; s|security$|$(_ security)|;
    1.15 -		s|games$|$(_ games)|; s|misc$|$(_ misc)|; s|meta$|$(_ meta)|;
    1.16 -		s|non-free$|$(_ non-free)|; s|all$|$(_ all)|; s|extra$|$(_ extra)|"
    1.17 -}
    1.18  
    1.19  
    1.20  # Remove all --parameters from cmdline
    1.21 @@ -83,11 +72,11 @@
    1.22  DEFAULT_MIRROR="$ONLINE_PKGS"
    1.23  
    1.24  # TazPkg version
    1.25 -export VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' $PKGS_DB/installed.info)
    1.26 +export VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' "$PKGS_DB/installed.info")
    1.27  # User Agent
    1.28  export UA="TazPkg-$VERSION"
    1.29  
    1.30 -#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.31 +
    1.32  
    1.33  
    1.34  ####################
    1.35 @@ -100,6 +89,10 @@
    1.36  im() { tty -s; }
    1.37  
    1.38  
    1.39 +# Show debug messages
    1.40 +debug() { if [ -n "$debug" ]; then colorize 036 "$@" >&2; fi; }
    1.41 +
    1.42 +
    1.43  # Check if dir exists
    1.44  
    1.45  check_dir() {
    1.46 @@ -129,277 +122,89 @@
    1.47  check_base_dir
    1.48  
    1.49  
    1.50 -# Check for a package name on cmdline.
    1.51  
    1.52 -check_for_package_on_cmdline() {
    1.53 -	if [ -z "$PACKAGE" ]; then
    1.54 -		newline
    1.55 -		_ 'Please specify a package name on the command line.'
    1.56 -		newline
    1.57 +
    1.58 +# Check commandline for tazpkg syntax
    1.59 +
    1.60 +check_cmd() {
    1.61 +	for i in $@; do
    1.62 +		case $i in
    1.63 +			su)
    1.64 +				check_root "$COMMAND"; continue;;
    1.65 +			pkg)
    1.66 +				[ -n "$PACKAGE" -o -n "$list" ] && continue
    1.67 +				newline; _ 'Please specify a package name on the command line.';;
    1.68 +			list)
    1.69 +				[ -n "$PACKAGE" ] && continue
    1.70 +				newline; _ 'Please specify a list name on the command line.';;
    1.71 +			flavor)
    1.72 +				[ -n "$PACKAGE" ] && continue
    1.73 +				newline; _ 'Please specify a flavor name on the command line.';;
    1.74 +			release)
    1.75 +				[ -n "$PACKAGE" ] && continue
    1.76 +				newline; _ 'Please specify a release name on the command line.';;
    1.77 +			file)
    1.78 +				[ -f "$PACKAGE_FILE" ] && continue
    1.79 +				newline; _ 'Unable to find file "%s"' "$PACKAGE_FILE";;
    1.80 +			dir)
    1.81 +				[ -d "$TARGET_DIR" ] && continue
    1.82 +				newline; _ 'Please specify an existing folder name on the command line.';;
    1.83 +			pattern)
    1.84 +				[ -n "$PACKAGE" ] && continue
    1.85 +				newline; _ 'Please specify a pattern to search for.';;
    1.86 +			receipt)
    1.87 +				[ -f "$INSTALLED/$PACKAGE/receipt" ] && continue
    1.88 +				newline; _ 'Unable to find the receipt "%s"' "$INSTALLED/$PACKAGE/receipt";;
    1.89 +		esac
    1.90 +		tazpkg -h "$COMMAND"
    1.91  		exit 1
    1.92 -	fi
    1.93 -}
    1.94 -
    1.95 -
    1.96 -# Check if the package (*.tazpkg) exists before installing or extracting.
    1.97 -
    1.98 -check_for_package_file() {
    1.99 -	if [ ! -f "$PACKAGE_FILE" ]; then
   1.100 -		newline
   1.101 -		_ 'Unable to find file "%s"' "$PACKAGE_FILE"
   1.102 -		newline
   1.103 -		exit 1
   1.104 -	fi
   1.105 -}
   1.106 -
   1.107 -
   1.108 -# Check for the receipt of an installed package.
   1.109 -
   1.110 -check_for_receipt() {
   1.111 -	if [ ! -f "$1$INSTALLED/$PACKAGE/receipt" ]; then
   1.112 -		newline
   1.113 -		_ 'Unable to find the receipt "%s"' "$1$INSTALLED/$PACKAGE/receipt"
   1.114 -		newline
   1.115 -		exit 1
   1.116 -	fi
   1.117 -}
   1.118 -
   1.119 -
   1.120 -# Get repositories priority using $PKGS_DB/priority.
   1.121 -# In this file undigest repos are called by their names and main mirror
   1.122 -# by 'main'. Sort order: priority
   1.123 -
   1.124 -look_for_priority() {
   1.125 -	[ -s "$PKGS_DB/priority" ] && priority=$(cat $PKGS_DB/priority)
   1.126 -
   1.127 -	for rep in main $(ls $PKGS_DB/undigest 2>/dev/null); do
   1.128 -		if [ ! -s "$PKGS_DB/priority" ] || ! grep -q ^$rep$ "$PKGS_DB/priority"; then
   1.129 -			priority=$(echo -e "$priority\n$rep")
   1.130 -		fi
   1.131 -	done
   1.132 -	echo "$priority" | sed '/^$/d' | \
   1.133 -	while read line; do
   1.134 -		case $line in
   1.135 -			main) echo "$PKGS_DB";;
   1.136 -			*)    echo "$PKGS_DB/undigest/$line";;
   1.137 -		esac
   1.138  	done
   1.139  }
   1.140  
   1.141  
   1.142 -# Get package name in a directory
   1.143 +# List support for getting/installing packages listed in the file
   1.144 +process_list() {
   1.145 +	debug "\nprocess_list()\n  list='$list'"
   1.146 +	local tmp_list pkg
   1.147  
   1.148 -package_fullname_in_dir() {
   1.149 -	[ ! -f "$1/receipt" ] && return
   1.150 -	EXTRAVERSION=''
   1.151 -	. $1/receipt
   1.152 -	echo "$PACKAGE-$VERSION$EXTRAVERSION"
   1.153 +	[ -z "$list" ] && return
   1.154 +
   1.155 +	tmp_list="$(mktemp)"
   1.156 +	cp "$list" "$tmp_list"
   1.157 +	debug "  tmp_list='$tmp_list'"
   1.158 +
   1.159 +	# Upgrade tazpkg first. It may handle new features/formats...
   1.160 +	# then upgrade essential packages early
   1.161 +	debug '  process important packages...'
   1.162 +	for pkg in busybox-pam busybox gcc-lib-base glibc-base slitaz-base-files tazpkg; do
   1.163 +		debug "  pkg='$pkg'"
   1.164 +		pkg=$(grep "^$pkg" "$tmp_list")
   1.165 +		[ -z "$pkg" ] && continue
   1.166 +		# Specify here empty list to prevent looping while recursive calls
   1.167 +		debug "  tazpkg $COMMAND '$pkg' --list=''"
   1.168 +		tazpkg $COMMAND "$pkg" --list=''
   1.169 +		sed -i "/^$pkg$/d" "$tmp_list"
   1.170 +	done
   1.171 +
   1.172 +	# Process the rest of the list
   1.173 +	debug '  process the rest...'
   1.174 +	for pkg in $(cat "$tmp_list"); do
   1.175 +		debug "tazpkg $COMMAND '$pkg' --list=''"
   1.176 +		tazpkg $COMMAND "$pkg" --list=''
   1.177 +	done
   1.178 +
   1.179 +	# Clean
   1.180 +	rm "$tmp_list"
   1.181 +	debug '  END: process_list()'
   1.182  }
   1.183  
   1.184  
   1.185 -# Get package name that is already installed.
   1.186  
   1.187 -get_installed_package_pathname() {
   1.188 -	for i in $2$INSTALLED/${1%%-*}*; do
   1.189 -		[ ! -d $i ] && continue
   1.190 -		if [ "$1" == "$(package_fullname_in_dir $i)" ]; then
   1.191 -			echo "$i"
   1.192 -			return
   1.193 -		fi
   1.194 -	done
   1.195 -}
   1.196  
   1.197 +# Shared functions
   1.198 +# ----------------
   1.199  
   1.200 -# Check if a package is already installed.
   1.201 -
   1.202 -check_for_installed_package() {
   1.203 -	if [ -n "$(get_installed_package_pathname "$PACKAGE" "$1")" ]; then
   1.204 -		newline
   1.205 -		_ '"%s" package is already installed.' "$(colorize 34 "$PACKAGE")"
   1.206 -		longline "$(_ 'You can use the --forced option to force installation.')"
   1.207 -		newline
   1.208 -		exit 0
   1.209 -	fi
   1.210 -}
   1.211 -
   1.212 -
   1.213 -# Check for packages.list to download and install packages.
   1.214 -
   1.215 -check_for_packages_list() {
   1.216 -	list_path="$PKGS_DB/packages.list"
   1.217 -	if [ ! -f "$list_path" ]; then
   1.218 -		if [ $(id -u) -eq 0 ]; then
   1.219 -			tazpkg recharge
   1.220 -		else
   1.221 -			newline
   1.222 -			_ 'Unable to find the list "%s"' "$list_path"
   1.223 -			longline "$(_ "You must probably run '%s' as root to get the \
   1.224 -latest list of packages available on the mirror." 'tazpkg recharge')"
   1.225 -			newline
   1.226 -			exit 0
   1.227 -		fi
   1.228 -	fi
   1.229 -}
   1.230 -
   1.231 -
   1.232 -# Check for installed.info - local file with format of packages.info
   1.233 -# "installed.info" is absent on not clean installs; check it and re-generate if needed.
   1.234 -
   1.235 -check_for_installed_info() {
   1.236 -	info_path="$ROOT$PKGS_DB/installed.info"
   1.237 -	if [ ! -f "$info_path" ]; then
   1.238 -		if [ $(id -u) -eq 0 ]; then
   1.239 -			_ 'File "%s" generated. Please wait...' 'installed.info'
   1.240 -			for pkg in $ROOT$PKGS_DB/installed/*/receipt; do
   1.241 -				unset_receipt
   1.242 -				. $pkg
   1.243 -				SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
   1.244 -				DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts
   1.245 -				MD5="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" \
   1.246 -					$ROOT$PKGS_DB/installed.md5 | awk '{print $1}')"
   1.247 -				cat >> $info_path << EOT
   1.248 -$PACKAGE	$VERSION$EXTRAVERSION	$CATEGORY	$SHORT_DESC	$WEB_SITE	$TAGS	$SIZES	$DEPENDS	$MD5
   1.249 -EOT
   1.250 -			done
   1.251 -		else
   1.252 -			_ 'Unable to find file "%s"' installed.info
   1.253 -			_ 'Please run tazpkg as root.'
   1.254 -			exit 1
   1.255 -		fi
   1.256 -	fi
   1.257 -
   1.258 -	# Check for md5 field (#9) in the installed.info
   1.259 -	if [ -n "$(awk -F$'\t' 'BEGIN{ n = "" } { if(NF != 9){ n = "o"; } } END{ print n }' $info_path)" ]; then
   1.260 -		_n 'File "%s" generated. Please wait...' 'installed.info.new'
   1.261 -		awk -F$'\t' -vm="$ROOT$PKGS_DB/installed.md5" 'BEGIN{OFS="\t"}
   1.262 -		{
   1.263 -			if (NF != 9) {
   1.264 -				pkg = $1 "-" $2 ".tazpkg";
   1.265 -				"fgrep " pkg " " m " | cut -c-32" | getline $9;
   1.266 -				$9 = ($9 == "") ? "00000000000000000000000000000000" : $9;
   1.267 -			}
   1.268 -			print;
   1.269 -		}' $info_path > $info_path.new
   1.270 -		mv -f $info_path.new $info_path
   1.271 -		status
   1.272 -	fi
   1.273 -}
   1.274 -
   1.275 -
   1.276 -get_cache_dir() {
   1.277 -	echo $rep > $tmp/rep
   1.278 -	if [ "$rep" == "$PKGS_DB" ]; then
   1.279 -		CACHE_DIR="$SAVE_CACHE_DIR/$SLITAZ_RELEASE/packages"
   1.280 -	elif [ "${rep%-incoming}" == "$rep" ]; then
   1.281 -		CACHE_DIR="$SAVE_CACHE_DIR/${rep##*/}/packages"
   1.282 -	else
   1.283 -		rep="${rep%-incoming}"
   1.284 -		CACHE_DIR="$SAVE_CACHE_DIR/${rep##*/}/packages-incoming"
   1.285 -	fi
   1.286 -	[ ! -d "$CACHE_DIR" ] && mkdir -p $CACHE_DIR
   1.287 -	echo $CACHE_DIR > $tmp/cachedir
   1.288 -}
   1.289 -
   1.290 -
   1.291 -# get an already installed package from packages.equiv
   1.292 -
   1.293 -equivalent_pkg() {
   1.294 -	for i in $(grep -hs "^$1=" $PKGS_DB/packages.equiv \
   1.295 -		   $PKGS_DB/undigest/*/packages.equiv | sed "s/^$1=//"); do
   1.296 -		if echo $i | fgrep -q : ; then
   1.297 -			# format 'alternative:newname'
   1.298 -			# if alternative is installed then substitute newname
   1.299 -			if [ -f "$2$INSTALLED/${i%:*}/receipt" ]; then
   1.300 -				# substitute package dependency
   1.301 -				echo "${i#*:}"
   1.302 -				return
   1.303 -			fi
   1.304 -		else
   1.305 -			# if alternative is installed then nothing to install
   1.306 -			if [ -f "$2$INSTALLED/$i/receipt" ]; then
   1.307 -				# substitute installed package
   1.308 -				echo "$i"
   1.309 -				return
   1.310 -			fi
   1.311 -		fi
   1.312 -	done
   1.313 -	# if not found in packages.equiv then no substitution
   1.314 -	echo "$1"
   1.315 -}
   1.316 -
   1.317 -
   1.318 -# get a virtual package from packages.equiv
   1.319 -
   1.320 -virtual_pkg() {
   1.321 -	for i in $(for rep in $priority; do
   1.322 -			grep -hs "^$1=" $rep/packages.equiv
   1.323 -		done | sed "s/^$1=//"); do
   1.324 -		if echo $i | fgrep -q : ; then
   1.325 -			# format 'alternative:newname'
   1.326 -			# if alternative is installed then substitute newname
   1.327 -			if [ -f "$2$INSTALLED/${i%:*}/receipt" ]; then
   1.328 -				# substitute package dependency
   1.329 -				echo "${i#*:}"
   1.330 -				return
   1.331 -			fi
   1.332 -		else
   1.333 -			# unconditional substitution
   1.334 -			echo "$i"
   1.335 -			return
   1.336 -		fi
   1.337 -	done
   1.338 -}
   1.339 -
   1.340 -
   1.341 -# Get package filename available on the mirror
   1.342 -
   1.343 -get_package_filename() {
   1.344 -	# input: "<package_name>" or "<package_name>-<version>" (ex. "nano" or "nano-2.4.0")
   1.345 -	local pkg equiv
   1.346 -	for rep in $priority; do
   1.347 -		pkg=$(awk -F$'\t' -vp="$1" 'p==$1||p==$1"-"$2{print $1"-"$2}' "$rep/packages.info")
   1.348 -
   1.349 -		if [ -n "$pkg" ]; then
   1.350 -			get_cache_dir; break
   1.351 -		fi
   1.352 -	done
   1.353 -	if [ -z "$pkg" ]; then
   1.354 -		# Check for virtual package
   1.355 -		equiv=$(virtual_pkg $1)
   1.356 -		if [ "$equiv" != "$1" ]; then
   1.357 -			PACKAGE="$equiv"
   1.358 -			get_package_filename "$PACKAGE"
   1.359 -			return
   1.360 -		fi
   1.361 -	fi
   1.362 -	echo "$pkg"
   1.363 -}
   1.364 -
   1.365 -
   1.366 -# Check for a package in packages DB. Used by get and get-install to grep
   1.367 -# package basename.
   1.368 -
   1.369 -check_for_package_in_list() {
   1.370 -	local filename check_only
   1.371 -	check_only="$1"
   1.372 -	filename="$(get_package_filename "$PACKAGE")"
   1.373 -	if [ -n "$filename" ]; then
   1.374 -		PACKAGE="$filename"
   1.375 -		CACHE_DIR="$(cat $tmp/cachedir)"
   1.376 -		rep="$(cat $tmp/rep)"
   1.377 -		rm -f $tmp/rep $tmp/cachedir
   1.378 -	else
   1.379 -		newline
   1.380 -		_ 'Unable to find package "%s" in the mirrored packages list.' "$PACKAGE"
   1.381 -		newline
   1.382 -		[ -n "$check_only" ] && return 1
   1.383 -		exit 0
   1.384 -	fi
   1.385 -}
   1.386 -
   1.387 -
   1.388 -# Log this activity
   1.389 -# (there's log_pkg because we have log() in libtaz.sh)
   1.390 +# Log TazPkg activity
   1.391  
   1.392  log_pkg() {
   1.393  	local extra
   1.394 @@ -414,62 +219,6 @@
   1.395  }
   1.396  
   1.397  
   1.398 -# Download a get-package script from this mirror
   1.399 -
   1.400 -download_get_script() {
   1.401 -	local p i
   1.402 -	for p in $priority ; do
   1.403 -		for i in $(cat $p/mirror) ; do
   1.404 -			case "$i" in
   1.405 -				http://*|https://*|ftp://*)
   1.406 -					busybox wget -q -T 30 -U $UA -O $2 \
   1.407 -						${i%packages/*}packages/get/$1 && return 0 ;;
   1.408 -			esac
   1.409 -		done
   1.410 -	done
   1.411 -	return 1
   1.412 -}
   1.413 -
   1.414 -
   1.415 -# Download a file from this mirror
   1.416 -
   1.417 -download_from() {
   1.418 -	# input: "<mirror_url>+" "<package_name>-<version>.tazpkg"
   1.419 -	local i
   1.420 -	for i in $1; do
   1.421 -		case "$i" in
   1.422 -			# Mirror URL can have a trailing slash or not.
   1.423 -			http://* | https://* | ftp://*)
   1.424 -				busybox wget -c -q -T 30 -U $UA ${i%/}/$2 2>/dev/null && break ;;
   1.425 -			*)
   1.426 -				ln -sf ${i%/}/$2 . && break ;;
   1.427 -		esac
   1.428 -	done
   1.429 -}
   1.430 -
   1.431 -
   1.432 -# Download a file trying all mirrors
   1.433 -
   1.434 -download() {
   1.435 -	# input: <package_name>-<version>.tazpkg
   1.436 -	local i
   1.437 -	case "$1" in
   1.438 -		*.tazpkg)
   1.439 -			for i in $priority; do
   1.440 -				if [ -n "$(awk -F$'\t' -vp="$1" 'p==$1"-"$2".tazpkg"{print $1}' \
   1.441 -					$i/packages.info)" ]; then
   1.442 -					download_from "$(cat $i/mirror)" "$@" && return
   1.443 -				fi
   1.444 -			done
   1.445 -			;;
   1.446 -	esac
   1.447 -
   1.448 -	for i in $(cat $(for rep in $priority; do echo $rep/mirror; done) 2>/dev/null); do
   1.449 -		download_from "$i" "$@" && break
   1.450 -	done
   1.451 -}
   1.452 -
   1.453 -
   1.454  # Extract a package with cpio and gzip/lzma.
   1.455  
   1.456  extract_package() {
   1.457 @@ -484,492 +233,29 @@
   1.458  }
   1.459  
   1.460  
   1.461 -remove_with_path() {
   1.462 -	# Avoid dirname errors by checking for argument.
   1.463 -	[ -n "$1" ] || return
   1.464 +# Translate category names (must be last in line)
   1.465  
   1.466 -	local dir
   1.467 -	rm -f $1 2>/dev/null
   1.468 -	dir="$1"
   1.469 -	while [ "$dir" != "/" ]; do
   1.470 -		dir="$(dirname "$dir")"
   1.471 -		rmdir "$dir" 2>/dev/null || break
   1.472 -	done
   1.473 +translate_category() {
   1.474 +	sed "s|base-system$|$(_ base-system)|g; s|x-window$|$(_ x-window)|g;
   1.475 +		s|utilities$|$(_ utilities)|g; s|network$|$(_ network)|g;
   1.476 +		s|graphics$|$(_ graphics)|g; s|multimedia$|$(_ multimedia)|g;
   1.477 +		s|office$|$(_ office)|g; s|development$|$(_ development)|g;
   1.478 +		s|system-tools$|$(_ system-tools)|g; s|security$|$(_ security)|g;
   1.479 +		s|games$|$(_ games)|g; s|misc$|$(_ misc)|g; s|meta$|$(_ meta)|g;
   1.480 +		s|non-free$|$(_ non-free)|g"
   1.481  }
   1.482  
   1.483  
   1.484 -grepesc() {
   1.485 -	sed 's/\[/\\[/g'
   1.486 +# If category is not one of those translated in native language, keep it
   1.487 +# untranslated. This allows both native and English language support.
   1.488 +# This also supports custom categories.
   1.489 +# And now we support spaces in translated categories
   1.490 +
   1.491 +reverse_translate_category() {
   1.492 +	echo "$cat_i18n" | awk "BEGIN{FS=\"	\"}{if (/^$@	/) a=\$2}END{if (a==\"\") a=\"$@\"; print a}"
   1.493  }
   1.494  
   1.495 -
   1.496 -# Print short package description
   1.497 -print_short_description() {
   1.498 -	local short_desc=''
   1.499 -	for LC in $LANG ${LANG%_*}; do
   1.500 -		if [ -e "$PKGS_DB/packages-desc.$LC" ]; then
   1.501 -			short_desc=$(grep -e "^$1	" $PKGS_DB/packages-desc.$LC | cut -d'	' -f2)
   1.502 -		fi
   1.503 -	done
   1.504 -	[ -z "$short_desc" -a -s $PKGS_DB/packages.info ] &&
   1.505 -		short_desc="$(awk -F$'\t' -vp="$PACKAGE" '{if($1==p){print $4;exit}}' $PKGS_DB/packages.info)"
   1.506 -	longline "$short_desc"
   1.507 -}
   1.508 -
   1.509 -
   1.510 -# This function installs a package in the rootfs.
   1.511 -
   1.512 -install_package() {
   1.513 -	ROOT=$1
   1.514 -	if [ -n "$ROOT" ]; then
   1.515 -		# Get absolute path
   1.516 -		ROOT=$(realpath $ROOT)
   1.517 -	fi
   1.518 -	{
   1.519 -		# Create package path early to avoid dependencies loop
   1.520 -		mkdir -p $TMP_DIR
   1.521 -		{ cd $TMP_DIR ; cpio --quiet -i receipt >/dev/null 2>&1; } < "$PACKAGE_FILE"
   1.522 -		. $TMP_DIR/receipt
   1.523 -		# FIXME: legacy?
   1.524 -		if grep -q ^pre_depends $TMP_DIR/receipt; then
   1.525 -			pre_depends $ROOT
   1.526 -		fi
   1.527 -
   1.528 -		# Keep modifiers and file list on upgrade
   1.529 -		cp "$ROOT$INSTALLED/$PACKAGE/modifiers" \
   1.530 -		   "$ROOT$INSTALLED/$PACKAGE/files.list" $TMP_DIR 2>/dev/null
   1.531 -		rm -rf "$ROOT$INSTALLED/$PACKAGE" 2>/dev/null
   1.532 -
   1.533 -		# Make the installed package data dir to store
   1.534 -		# the receipt and the files list.
   1.535 -		mkdir -p "$ROOT$INSTALLED/$PACKAGE"
   1.536 -		cp $TMP_DIR/modifiers  "$ROOT$INSTALLED/$PACKAGE" 2>/dev/null
   1.537 -		cp $TMP_DIR/files.list "$ROOT$INSTALLED/$PACKAGE" 2>/dev/null
   1.538 -		rm -rf $TMP_DIR 2> /dev/null
   1.539 -		sed -i "/ $(basename "$PACKAGE_FILE")$/d" $ROOT$PKGS_DB/installed.$SUM 2>/dev/null
   1.540 -		cd "$(dirname "$PACKAGE_FILE")"
   1.541 -		$CHECKSUM "$(basename "$PACKAGE_FILE")" >> $ROOT$PKGS_DB/installed.$SUM
   1.542 -	}
   1.543 -
   1.544 -	# Resolve package deps.
   1.545 -	check_for_deps $ROOT
   1.546 -	if [ -n "$MISSING_PACKAGE" ]; then
   1.547 -		install_deps $ROOT
   1.548 -	fi
   1.549 -	mkdir -p $TMP_DIR
   1.550 -	[ -n "$INSTALL_LIST" ] && echo "$PACKAGE_FILE" >> $ROOT$PKGS_DB/$INSTALL_LIST-processed
   1.551 -
   1.552 -	title 'Installation of package "%s"' "$PACKAGE"
   1.553 -
   1.554 -	short_desc="$(print_short_description "$PACKAGE")"
   1.555 -	[ -n "$short_desc" ] && echo "$short_desc" && separator '-'
   1.556 -
   1.557 -	action 'Copying package...'
   1.558 -	cp "$PACKAGE_FILE" "$TMP_DIR"
   1.559 -	status
   1.560 -
   1.561 -	cd "$TMP_DIR"
   1.562 -	extract_package
   1.563 -	SELF_INSTALL='0'
   1.564 -	EXTRAVERSION=''
   1.565 -	CONFIG_FILES=''
   1.566 -
   1.567 -	# Include temporary receipt to get the right variables.
   1.568 -	. $PWD/receipt
   1.569 -	cd $ROOT$INSTALLED
   1.570 -
   1.571 -	# FIXME: legacy?
   1.572 -	if [ $SELF_INSTALL -ne 0 -a -n "$ROOT" ]; then
   1.573 -		action "Checking post install dependencies..."
   1.574 -		[ -f "$INSTALLED/$PACKAGE/receipt" ]
   1.575 -		if ! status; then
   1.576 -			_ 'Please run "%s" in / and retry.' "tazpkg install $PACKAGE_FILE"
   1.577 -			rm -rf $TMP_DIR
   1.578 -			exit 1
   1.579 -		fi
   1.580 -	fi
   1.581 -
   1.582 -	# Get files to remove if upgrading
   1.583 -	if [ -f "$PACKAGE/files.list" ]; then
   1.584 -		while read file; do
   1.585 -			grep -q "^$(echo $file | grepesc)$" $TMP_DIR/files.list && continue
   1.586 -			for i in $(cat "$PACKAGE/modifiers" 2>/dev/null ;
   1.587 -			    fgrep -sl "$PACKAGE" */modifiers | cut -d/ -f1 ); do
   1.588 -				grep -qs "^$(echo $file | grepesc)$" $i/files.list && continue 2
   1.589 -			done
   1.590 -			echo $file
   1.591 -		done < "$PACKAGE/files.list" > $TMP_DIR/files2remove.list
   1.592 -	fi
   1.593 -
   1.594 -	# Remember modified packages
   1.595 -	{
   1.596 -		check=false
   1.597 -		for i in $(fgrep -v [ $TMP_DIR/files.list); do
   1.598 -			[ -e "$ROOT$i" ] || continue
   1.599 -			[ -d "$ROOT$i" ] && continue
   1.600 -			echo "- $i"
   1.601 -			check=true
   1.602 -		done ;
   1.603 -		$check && \
   1.604 -		for i in *; do
   1.605 -			[ "$i" == "$PACKAGE" ] && continue
   1.606 -			[ -s $i/files.list ] || continue
   1.607 -			awk "{ printf \"$i %s\\n\",\$1 }" < $i/files.list
   1.608 -		done;
   1.609 -	} | awk '
   1.610 -{
   1.611 -	if ($1 == "-" || file[$2] != "") {
   1.612 -		file[$2] = file[$2] " " $1
   1.613 -		if ($1 != "-") {
   1.614 -			if (pkg[$1] == "") all = all " " $1
   1.615 -			pkg[$1] = pkg[$1] " " $2
   1.616 -		}
   1.617 -	}
   1.618 -}
   1.619 -END {
   1.620 -	for (i = split(all, p, " "); i > 0; i--)
   1.621 -		for (j = split(pkg[p[i]], f, " "); j > 0; j--)
   1.622 -			printf "%s %s\n",p[i],f[j];
   1.623 -}
   1.624 -		' | while read dir file; do
   1.625 -		if grep -qs ^$dir$ "$PACKAGE/modifiers"; then
   1.626 -			# Do not overload an overloaded file !
   1.627 -			rm $TMP_DIR$file 2>/dev/null
   1.628 -			continue
   1.629 -		fi
   1.630 -		grep -qs "^$PACKAGE$" $dir/modifiers && continue
   1.631 -		if [ -s "$dir/volatile.cpio.gz" ]; then
   1.632 -			# We can modify backed up files without notice
   1.633 -			zcat $dir/volatile.cpio.gz | cpio -t --quiet | \
   1.634 -				grep -q "^${file#/}$" && continue
   1.635 -		fi
   1.636 -		echo "$PACKAGE" >> $dir/modifiers
   1.637 -	done
   1.638 -
   1.639 -	cd $TMP_DIR
   1.640 -	cp receipt files.list "$ROOT$INSTALLED/$PACKAGE"
   1.641 -
   1.642 -	# Copy the description if found.
   1.643 -	if [ -f "description.txt" ]; then
   1.644 -		cp description.txt "$ROOT$INSTALLED/$PACKAGE"
   1.645 -	fi
   1.646 -
   1.647 -	# Copy the md5sum if found.
   1.648 -	if [ -f "$CHECKSUM" ]; then
   1.649 -		cp $CHECKSUM "$ROOT$INSTALLED/$PACKAGE"
   1.650 -	fi
   1.651 -
   1.652 -	# Pre install commands.
   1.653 -	if grep -q ^pre_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
   1.654 -		pre_install $ROOT
   1.655 -	fi
   1.656 -
   1.657 -	if [ -n "$CONFIG_FILES" ]; then
   1.658 -		# save 'official' configuration files
   1.659 -		action 'Saving configuration files...'
   1.660 -		for i in $CONFIG_FILES; do
   1.661 -			{ cd fs ; find ${i#/} -type f 2> /dev/null; cd ..; }
   1.662 -		done | { cd fs ; cpio -o -H newc --quiet | gzip -9; cd ..; } > \
   1.663 -			"$ROOT$INSTALLED/$PACKAGE/volatile.cpio.gz"
   1.664 -
   1.665 -		if [ -z "$newconf" ]; then
   1.666 -			# keep user configuration files
   1.667 -			for i in $CONFIG_FILES; do
   1.668 -				{ cd fs ; find ${i#/} -type f 2> /dev/null; cd ..; }
   1.669 -			done | while read i; do
   1.670 -				[ -e $ROOT/$i ] || continue
   1.671 -				cp -a $ROOT/$i fs/$i
   1.672 -			done
   1.673 -		fi
   1.674 -		status
   1.675 -	fi
   1.676 -
   1.677 -	action 'Installing package...'
   1.678 -	[ "$(busybox ls fs/* 2>/dev/null)" ] && cp -af fs/* $ROOT/
   1.679 -	status
   1.680 -
   1.681 -	if [ -s files2remove.list ]; then
   1.682 -		action 'Removing old package...'
   1.683 -		while read file; do
   1.684 -			remove_with_path $ROOT$file
   1.685 -		done < files2remove.list
   1.686 -		true
   1.687 -		status
   1.688 -	fi
   1.689 -
   1.690 -	# Remove the temporary random directory.
   1.691 -	action "Removing all tmp files..."
   1.692 -	cd ..; rm -rf $TMP_DIR
   1.693 -	status
   1.694 -
   1.695 -	# Post install commands.
   1.696 -	if grep -q ^post_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
   1.697 -		action "Execute post-install commands..."
   1.698 -		post_install $ROOT
   1.699 -		status
   1.700 -	fi
   1.701 -
   1.702 -	# Update-desktop-database if needed.
   1.703 -	if [ "$(fgrep .desktop "$ROOT$INSTALLED/$PACKAGE/files.list" | fgrep /usr/share/applications/)" ]; then
   1.704 -		updatedesktopdb=yes
   1.705 -	fi
   1.706 -
   1.707 -	# Update-mime-database if needed.
   1.708 -	if [ "$(fgrep /usr/share/mime "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
   1.709 -		updatemimedb=yes
   1.710 -	fi
   1.711 -
   1.712 -	# Update-icon-database
   1.713 -	if [ "$(fgrep /usr/share/icon/hicolor "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
   1.714 -		updateicondb=yes
   1.715 -	fi
   1.716 -
   1.717 -	# Compile glib schemas if needed.
   1.718 -	if [ "$(fgrep /usr/share/glib-2.0/schemas "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
   1.719 -		compile_schemas=yes
   1.720 -	fi
   1.721 -
   1.722 -	# Update depmod list
   1.723 -	if [ "$(fgrep /lib/modules "$ROOT$INSTALLED/$PACKAGE/files.list")" ]; then
   1.724 -		updatedepmod=yes
   1.725 -	fi
   1.726 -
   1.727 -	# Update installed.info
   1.728 -	check_for_installed_info
   1.729 -	SIZES=$(echo $PACKED_SIZE $UNPACKED_SIZE | sed 's|\.0||g')
   1.730 -	DEPENDS=$(echo $DEPENDS) # remove newlines from some receipts
   1.731 -	PKG_SUM="$(fgrep " $PACKAGE-$VERSION$EXTRAVERSION.tazpkg" "$ROOT$PKGS_DB/installed.$SUM" | cut -d' ' -f1)"
   1.732 -	II=$ROOT$PKGS_DB/installed.info
   1.733 -	sed -i "/^$PACKAGE	/d" $II # remove old entry
   1.734 -	cat >> $II <<EOT
   1.735 -$PACKAGE	$VERSION$EXTRAVERSION	$CATEGORY	$SHORT_DESC	$WEB_SITE	$TAGS	$SIZES	$DEPENDS	$PKG_SUM
   1.736 -EOT
   1.737 -	#awk -F$'\t' -vp="$PACKAGE" '$1==p' $ROOT$PKGS_DB/packages.info > $II
   1.738 -	TEMP_FILE=$(mktemp)
   1.739 -	sort $II > $TEMP_FILE; mv -f $TEMP_FILE $II; chmod a+r $II; unset II
   1.740 -
   1.741 -	cd "$TOP_DIR"
   1.742 -	footer "$(_ 'Package "%s" (%s) is installed.' "$PACKAGE" "$VERSION$EXTRAVERSION")"
   1.743 -
   1.744 -	# Log this activity
   1.745 -	[ -n "$ROOT" ] || log_pkg Installed
   1.746 -
   1.747 -	# Remove package from upgrade list
   1.748 -	[ -s $UP_LIST ] && sed -i "/^$PACKAGE\$/d" $UP_LIST
   1.749 -}
   1.750 -
   1.751 -
   1.752 -# This function may be called by a get script.
   1.753 -
   1.754 -abort_package() {
   1.755 -	cd $CUR_DIR
   1.756 -	rm -rf $TMP_DIR
   1.757 -	echo "${1:-Abort $PACKAGE.}"
   1.758 -	exit 1
   1.759 -}
   1.760 -
   1.761 -
   1.762 -# This function installs a package from a get script in the rootfs.
   1.763 -
   1.764 -install_package_from_get_script() {
   1.765 -	SCRIPT="$1"
   1.766 -	ROOT="$2"
   1.767 -	[ -d "$ROOT$INSTALLED/$PACKAGE" ] && exit 1
   1.768 -
   1.769 -	grep -q no-check-certificate $SCRIPT &&
   1.770 -		[ ! -d "$INSTALLED/wget" ] && tazpkg get-install wget
   1.771 -
   1.772 -	mkdir -p $TMP_DIR && cd $TMP_DIR
   1.773 -	saved="$PACKAGE"
   1.774 -	unset_receipt
   1.775 -	PACKAGE="$saved"
   1.776 -
   1.777 -	set -e
   1.778 -	. $SCRIPT
   1.779 -	set +e
   1.780 -	[ -d "$PACKAGE-$VERSION" ] || cd $TMP_DIR
   1.781 -	[ -d "$PACKAGE-$VERSION" ] || abort_package \
   1.782 -		"$(_ 'Could not download "%s" from "%s". Exiting.' "${TARBALL:-$PACKAGE}" "${WGET_URL:-$WEB_SITE}")"
   1.783 -
   1.784 -	if [ ! -s "$PACKAGE-$VERSION/receipt" ]; then
   1.785 -		cat > "$PACKAGE-$VERSION/receipt" <<EOT
   1.786 -# SliTaz package receipt.
   1.787 -
   1.788 -PACKAGE="$PACKAGE"
   1.789 -VERSION="${VERSION:-unknown}"
   1.790 -CATEGORY="${CATEGORY:-non-free}"
   1.791 -WEB_SITE="$WEB_SITE"
   1.792 -SHORT_DESC="${SHORT_DESC:-$PACKAGE}"
   1.793 -MAINTAINER="${MAINTAINER:-nobody@slitaz.org}"
   1.794 -EOT
   1.795 -		for i in LICENSE TARBALL WGET_URL CONFIG_FILES SUGGESTED \
   1.796 -			 PROVIDE DEPENDS HOST_ARCH TAGS EXTRA_SOURCE_FILES ; do
   1.797 -			eval "[ -n \"\$$i\" ] && echo \"$i=\\\"\$$i\\\"\""
   1.798 -		done >> "$PACKAGE-$VERSION/receipt"
   1.799 -	fi
   1.800 -
   1.801 -	DEPENDS="$(unset DEPENDS; . "$PACKAGE-$VERSION/receipt"; echo $DEPENDS)"
   1.802 -	for i in $(find_depends "$PACKAGE-$VERSION/fs"); do
   1.803 -		case " $DEPENDS " in
   1.804 -			*\ $i\ *) continue;;
   1.805 -		esac
   1.806 -		grep -q '^DEPENDS="'         "$PACKAGE-$VERSION/receipt" ||
   1.807 -			echo 'DEPENDS=""' >>     "$PACKAGE-$VERSION/receipt"
   1.808 -		sed -i "s/^DEPENDS=\"/&$i /" "$PACKAGE-$VERSION/receipt"
   1.809 -	done
   1.810 -
   1.811 -	TAZPKG_PACK=gzip
   1.812 -	tazpkg pack "$PACKAGE-$VERSION"
   1.813 -
   1.814 -	# Clean to save RAM memory before installation
   1.815 -	rm -rf "$PACKAGE-$VERSION"
   1.816 -
   1.817 -	if [ -n "$get" ]; then
   1.818 -		mv "$PACKAGE-$VERSION.tazpkg" "$TOP_DIR"
   1.819 -	else
   1.820 -		# Install pseudo package
   1.821 -		tazpkg install "$PACKAGE-$VERSION.tazpkg" --root=$ROOT
   1.822 -		mv "$PACKAGE-$VERSION.tazpkg" $CACHE_DIR
   1.823 -	fi
   1.824 -
   1.825 -	# Clean
   1.826 -	cd "$TOP_DIR"
   1.827 -	rm -rf $TMP_DIR
   1.828 -}
   1.829 -
   1.830 -
   1.831 -# Check for missing deps listed in a receipt packages.
   1.832 -
   1.833 -check_for_deps() {
   1.834 -	local saved;
   1.835 -	saved="$PACKAGE"
   1.836 -	mkdir -p $TMP_DIR
   1.837 -	{ cd $TMP_DIR ; cpio --quiet -i receipt >/dev/null 2>&1; } < "$PACKAGE_FILE"
   1.838 -	. $TMP_DIR/receipt
   1.839 -	PACKAGE="$saved"
   1.840 -	rm -rf $TMP_DIR
   1.841 -
   1.842 -	num=0
   1.843 -	for pkgorg in $DEPENDS; do
   1.844 -		i=$(equivalent_pkg $pkgorg $1)
   1.845 -		if [ ! -d "$1$INSTALLED/$i" ]; then
   1.846 -			MISSING_PACKAGE=$i
   1.847 -			num=$(($num+1))
   1.848 -		elif [ ! -f "$1$INSTALLED/$i/receipt" ]; then
   1.849 -			_ 'WARNING! Dependency loop between "%s" and "%s".' "$PACKAGE" "$i"
   1.850 -		fi
   1.851 -	done
   1.852 -
   1.853 -	if [ -n "$MISSING_PACKAGE" ]; then
   1.854 -		title "$(_ 'Tracking dependencies for package "%s"' "$PACKAGE")"
   1.855 -		for pkgorg in $DEPENDS; do
   1.856 -			i=$(equivalent_pkg $pkgorg $1)
   1.857 -			if [ ! -d "$1$INSTALLED/$i" ]; then
   1.858 -				MISSING_PACKAGE="$i"
   1.859 -				_ 'Missing package "%s"' $MISSING_PACKAGE
   1.860 -			fi
   1.861 -		done
   1.862 -		footer "$(_p \
   1.863 -			'%s missing package to install.' \
   1.864 -			'%s missing packages to install.' $num \
   1.865 -			$num)"
   1.866 -	fi
   1.867 -}
   1.868 -
   1.869 -
   1.870 -# Install all missing deps. Auto install or ask user then install all missing
   1.871 -# deps from local dir, CD-ROM, media or from the mirror. In case we want to
   1.872 -# install packages from local, we need a packages.list to find the version.
   1.873 -
   1.874 -install_deps() {
   1.875 -	local root=''
   1.876 -	[ -n "$1" ] && root="--root=$1"
   1.877 -
   1.878 -	if [ "$AUTO_INSTALL_DEPS" == 'yes' ]; then
   1.879 -		answer=0
   1.880 -	else
   1.881 -		newline
   1.882 -		confirm "$(_ 'Install all missing dependencies? (y/N)')"
   1.883 -		answer=$?
   1.884 -		newline
   1.885 -	fi
   1.886 -
   1.887 -	if [ "$answer" -eq 0 ] && [ -z "$nodeps" ]; then
   1.888 -		for pkgorg in $DEPENDS; do
   1.889 -			pkg=$(equivalent_pkg $pkgorg $1)
   1.890 -			if [ ! -d "$1$INSTALLED/$pkg" ]; then
   1.891 -				local list="$INSTALL_LIST"
   1.892 -				[ -n "$list" ] || list="$TOP_DIR/packages.list"
   1.893 -				# We can install packages from a local dir by greping
   1.894 -				# the TAZPKG_BASENAME in the local packages.list.
   1.895 -				found='0'
   1.896 -				if [ -f "$list" ]; then
   1.897 -					_ 'Checking if package "%s" exists in local list...' $pkg
   1.898 -					mkdir $TMP_DIR
   1.899 -					for i in $pkg-*.tazpkg; do
   1.900 -						[ -f $i ] || continue
   1.901 -						{ cd $TMP_DIR ; cpio --quiet -i receipt > /dev/null 2>&1; } < $i
   1.902 -						[ "$(. $TMP_DIR/receipt; echo "$PACKAGE")" == "$pkg" ] || continue
   1.903 -						if grep -q ^$(package_fullname_in_dir $TMP_DIR).tazpkg$ $list
   1.904 -						then
   1.905 -							found='1'
   1.906 -							tazpkg install $i $root --list=$list
   1.907 -							break
   1.908 -						fi
   1.909 -					done
   1.910 -					rm -rf $TMP_DIR
   1.911 -				fi
   1.912 -				# Install deps from the mirror.
   1.913 -				if [ $found -eq 0 ]; then
   1.914 -					if [ ! -f "$PKGS_DB/packages.list" ]; then
   1.915 -						tazpkg recharge
   1.916 -					fi
   1.917 -					tazpkg get-install $pkg $root
   1.918 -				fi
   1.919 -			fi
   1.920 -		done
   1.921 -	else
   1.922 -		newline
   1.923 -		_ 'Leaving dependencies for package "%s" unresolved.' "$PACKAGE"
   1.924 -		_ 'The package is installed but will probably not work.'
   1.925 -		newline
   1.926 -	fi
   1.927 -}
   1.928 -
   1.929 -
   1.930 -update_desktop_database() {
   1.931 -	if [ -f "$1/usr/bin/update-desktop-database" ] && [ -n "$updatedesktopdb" ]; then
   1.932 -		chroot "$1/" /usr/bin/update-desktop-database /usr/share/applications 2>/dev/null
   1.933 -	fi
   1.934 -}
   1.935 -
   1.936 -
   1.937 -update_mime_database() {
   1.938 -	if [ -f "$1/usr/bin/update-mime-database" ] && [ -n "$updatemimedb" ]; then
   1.939 -		chroot "$1/" /usr/bin/update-mime-database /usr/share/mime
   1.940 -	fi
   1.941 -}
   1.942 -
   1.943 -
   1.944 -update_icon_database() {
   1.945 -	if [ -f "$1/usr/bin/gtk-update-icon-cache" ] && [ -n "$updateicondb" ]; then
   1.946 -		chroot "$1/" /usr/bin/gtk-update-icon-cache /usr/share/icons/hicolor
   1.947 -	fi
   1.948 -}
   1.949 -
   1.950 -
   1.951 -compile_glib_schemas() {
   1.952 -	if [ -f "$1/usr/bin/glib-compile-schemas" ] && [ -n "$compile_schemas" ]; then
   1.953 -		chroot "$1/" /usr/bin/glib-compile-schemas /usr/share/glib-2.0/schemas
   1.954 -	fi
   1.955 -}
   1.956 -
   1.957 -
   1.958 -update_kernel_modules() {
   1.959 -	if [ -f "$1/sbin/depmod" ] && [ -n "$updatedepmod" ]; then
   1.960 -		chroot "$1/" /sbin/depmod -a
   1.961 -	fi
   1.962 -}
   1.963 +# END: Shared functions
   1.964  
   1.965  
   1.966  
   1.967 @@ -992,48 +278,46 @@
   1.968  		# Various lists
   1.969  		shift
   1.970  		case $1 in
   1.971 -			b|blocked)			@@MODULES@@/list blocked   ;;
   1.972 +			b|blocked)			@@MODULES@@/list blocked;;
   1.973  			c|cat|categories)	@@MODULES@@/list categories;;
   1.974 -			l|linked)			@@MODULES@@/list linked    ;;
   1.975 -			'')					@@MODULES@@/list installed ;;
   1.976 +			l|linked)			@@MODULES@@/list linked;;
   1.977 +			'')					@@MODULES@@/list installed;;
   1.978  			*)					@@MODULES@@/list installed_of_category "$@";;
   1.979  		esac
   1.980  		;;
   1.981 -	-lb)	@@MODULES@@/list blocked   ;;
   1.982 +	-lb)	@@MODULES@@/list blocked;;
   1.983  	-lc)	@@MODULES@@/list categories;;
   1.984 -	-ll)	@@MODULES@@/list linked    ;;
   1.985 +	-ll)	@@MODULES@@/list linked;;
   1.986  
   1.987 -	-lm|list-mirror)	@@MODULES@@/list mirrored       ;;
   1.988 -	-lf|list-files)		check_for_package_on_cmdline
   1.989 -						@@MODULES@@/list installed_files $PACKAGE;;
   1.990 -	-a|activity|log)	@@MODULES@@/list activity       ;;
   1.991 -	list-config)		@@MODULES@@/list config_files $2;;
   1.992 -	list-suggested)		@@MODULES@@/list suggested      ;;
   1.993 +	-lm|list-mirror)	@@MODULES@@/list mirrored;;
   1.994 +	-lf|list-files)		check_cmd pkg; @@MODULES@@/list installed_files "$PACKAGE";;
   1.995 +	-a|activity|log)	@@MODULES@@/list activity;;
   1.996 +	list-config)		@@MODULES@@/list config_files "$2";;
   1.997 +	list-suggested)		@@MODULES@@/list suggested;;
   1.998  
   1.999  
  1.1000 +	# Information about package
  1.1001  	info)
  1.1002 -		# Information about package
  1.1003 -		check_for_package_on_cmdline
  1.1004 -		@@MODULES@@/info "$2"
  1.1005 -		;;
  1.1006 +		check_cmd pkg; @@MODULES@@/info "$2";;
  1.1007  
  1.1008  
  1.1009  	desc|-d)
  1.1010  		# Display package description
  1.1011 -		@@MODULES@@/description "$2"
  1.1012 -		;;
  1.1013 +		check_cmd pkg; @@MODULES@@/description "$2";;
  1.1014  
  1.1015  
  1.1016 -	search|-s)
  1.1017 +	search|-s|-si|-sl|-sm)
  1.1018  		# Search for a package by pattern or name.
  1.1019 -		if [ -z "$2" ]; then tazpkg -h search; exit 1; fi
  1.1020 +		check_cmd pattern
  1.1021  
  1.1022  		# Extend short options to long analogs
  1.1023 -		case "$3" in
  1.1024 -			-i) export installed='yes';;
  1.1025 -			-l) export list='yes';;
  1.1026 -			-m) export mirror='yes';;
  1.1027 -		esac
  1.1028 +		for i in $@; do
  1.1029 +			case "$i" in
  1.1030 +				-i|-si) export installed='yes';;
  1.1031 +				-l|-sl) export list='yes';;
  1.1032 +				-m|-sm) export mirror='yes';;
  1.1033 +			esac
  1.1034 +		done
  1.1035  
  1.1036  		@@MODULES@@/search pkg "$2"
  1.1037  		;;
  1.1038 @@ -1041,241 +325,58 @@
  1.1039  
  1.1040  	search-file|-sf)
  1.1041  		# Search for a file by pattern or name in all files.list.
  1.1042 -		if [ -z "$2" ]; then tazpkg -h search-file; exit 1; fi
  1.1043 -
  1.1044 -		@@MODULES@@/search file "$2"
  1.1045 -		;;
  1.1046 +		check_cmd pattern; @@MODULES@@/search file "$2";;
  1.1047  
  1.1048  
  1.1049  	search-pkgname|-sp)
  1.1050  		# Search for a package name
  1.1051 -		if [ -z "$2" ]; then tazpkg -h search-pkgname; exit 1; fi
  1.1052 -
  1.1053 -		@@MODULES@@/search file2 "$2"
  1.1054 -		;;
  1.1055 -
  1.1056 -
  1.1057 -	install|-i)
  1.1058 -		# Install .tazpkg packages.
  1.1059 -		check_root $1
  1.1060 -		check_for_package_on_cmdline
  1.1061 -		check_for_package_file
  1.1062 -		check_for_installed_info
  1.1063 -
  1.1064 -		if [ -n "$root" ]; then
  1.1065 -			ROOT="$root";
  1.1066 -			check_base_dir "$root"
  1.1067 -		fi
  1.1068 -
  1.1069 -		[ -n "$list" ] && INSTALL_LIST="$list"
  1.1070 -
  1.1071 -		# Get repositories priority list.
  1.1072 -		priority=$(look_for_priority)
  1.1073 -
  1.1074 -		# Check if forced install.
  1.1075 -		if [ -z "$forced" ]; then
  1.1076 -			check_for_installed_package $ROOT
  1.1077 -		fi
  1.1078 -		install_package $ROOT
  1.1079 -		update_desktop_database $ROOT
  1.1080 -		update_mime_database $ROOT
  1.1081 -		update_icon_database $ROOT
  1.1082 -		compile_glib_schemas $ROOT
  1.1083 -		;;
  1.1084 -
  1.1085 -
  1.1086 -	install-list|get-install-list)
  1.1087 -		# Install a set of packages from a list.
  1.1088 -		check_root $1
  1.1089 -
  1.1090 -		if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
  1.1091 -
  1.1092 -		# Check if the packages list exists.
  1.1093 -		if [ ! -f "$2" ]; then
  1.1094 -			_ 'Unable to find list "%s"' "$2"
  1.1095 -			exit 1
  1.1096 -		fi
  1.1097 -
  1.1098 -		LIST=$(cat $2)
  1.1099 -
  1.1100 -		# Remember processed list
  1.1101 -		export INSTALL_LIST="$2"
  1.1102 -
  1.1103 -		# Set $COMMAND and install all packages.
  1.1104 -		COMMAND=${1%-list}
  1.1105 -
  1.1106 -		touch $2-processed
  1.1107 -
  1.1108 -		# Upgrade tazpkg first. It may handle new features/formats...
  1.1109 -		# then upgrade essential packages early
  1.1110 -		for pkg in busybox-pam busybox gcc-lib-base glibc-base \
  1.1111 -				slitaz-base-files tazpkg ; do
  1.1112 -			pkg=$(egrep $pkg-[0-9] $INSTALL_LIST)
  1.1113 -			[ -z "$pkg" ] && continue
  1.1114 -			_ 'Adding implicit depends "%s"...' $pkg
  1.1115 -			LIST="$pkg"$'\n'"$LIST"
  1.1116 -		done
  1.1117 -
  1.1118 -		for pkg in $LIST; do
  1.1119 -			grep -qs ^$pkg$ $2-processed && continue
  1.1120 -			[ -d "$root/var/lib/tazpkg/installed" ] && 
  1.1121 -			tazpkg $COMMAND $pkg --list="$2" "$3" "$4" "$5"
  1.1122 -		done
  1.1123 -		rm -f $2-processed
  1.1124 -		;;
  1.1125 +		check_cmd pattern; @@MODULES@@/search file2 "$2";;
  1.1126  
  1.1127  
  1.1128  	add-flavor)
  1.1129  		# Install a set of packages from a flavor.
  1.1130 -		check_root $1
  1.1131 -		shift; @@MODULES@@/flavor $@
  1.1132 -		;;
  1.1133 +		check_cmd su flavor; shift; @@MODULES@@/flavor $@;;
  1.1134  	install-flavor)
  1.1135  		# Install a set of packages from a flavor and purge other ones.
  1.1136 -		check_root $1
  1.1137 -		shift; purge='yes' @@MODULES@@/flavor $@
  1.1138 -		;;
  1.1139 +		check_cmd su flavor; shift; purge='yes' @@MODULES@@/flavor $@;;
  1.1140  
  1.1141  
  1.1142  	set-release)
  1.1143  		# Change current release and upgrade packages.
  1.1144 -		check_root $1
  1.1145 -		if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
  1.1146 -		RELEASE="$2"
  1.1147 -		rm "$PKGS_DB/mirror"
  1.1148 -		echo "$RELEASE" > "$root/etc/slitaz-release"
  1.1149 -		tazpkg recharge && tazpkg upgrade
  1.1150 -
  1.1151 -		# Install missing depends
  1.1152 -		cd "$INSTALLED"
  1.1153 -		for i in * ; do
  1.1154 -			unset DEPENDS; . "$i/receipt"
  1.1155 -			for j in $DEPENDS; do
  1.1156 -				[ -d "$j" ] || tazpkg get-install "$j"
  1.1157 -			done
  1.1158 -		done
  1.1159 -		;;
  1.1160 +		check_cmd su release
  1.1161 +		@@MODULES@@/set-release "$2";;
  1.1162  
  1.1163  
  1.1164  	remove|-r)
  1.1165  		# Remove packages.
  1.1166 -		check_root $1
  1.1167 -		check_for_package_on_cmdline
  1.1168 -		shift; @@MODULES@@/remove $@
  1.1169 -		;;
  1.1170 +		check_cmd su pkg; shift; @@MODULES@@/remove $@;;
  1.1171 +		# TODO: remove multiple packages
  1.1172  
  1.1173  
  1.1174  	extract|-e)
  1.1175  		# Extract .tazpkg cpio archive into a directory.
  1.1176 -		check_for_package_on_cmdline
  1.1177 -		check_for_package_file
  1.1178 -		title 'Extracting package "%s"' "$PACKAGE"
  1.1179 -
  1.1180 -		# If no directory destination is found on the cmdline
  1.1181 -		# we create one in the current dir using the package name.
  1.1182 -		if [ -n "$TARGET_DIR" ]; then
  1.1183 -			DESTDIR="$TARGET_DIR/$PACKAGE"
  1.1184 -		else
  1.1185 -			DESTDIR="$PACKAGE"
  1.1186 -		fi
  1.1187 -		mkdir -p $DESTDIR
  1.1188 -
  1.1189 -		action 'Copying original package...'
  1.1190 -		cp "$PACKAGE_FILE" $DESTDIR
  1.1191 -		status
  1.1192 -
  1.1193 -		cd $DESTDIR
  1.1194 -		extract_package
  1.1195 -		[ -e "receipt" ] && \
  1.1196 -			footer "$(_ 'Package "%s" is extracted to "%s"' "$PACKAGE" "$DESTDIR")"
  1.1197 -		;;
  1.1198 +		check_cmd pkg file; shift; @@MODULES@@/extract $@;;
  1.1199  
  1.1200  
  1.1201  	recompress)
  1.1202  		# Recompress .tazpkg cpio archive with lzma.
  1.1203 -		check_for_package_on_cmdline
  1.1204 -		check_for_package_file
  1.1205 -		title 'Recompressing package "%s"' "$PACKAGE"
  1.1206 -		mkdir -p $TMP_DIR
  1.1207 -
  1.1208 -		action "Copying original package..."
  1.1209 -		cp "$PACKAGE_FILE" $TMP_DIR
  1.1210 -		status
  1.1211 -
  1.1212 -		cd $TMP_DIR
  1.1213 -		extract_package
  1.1214 -
  1.1215 -		action "Recompressing the FS..."
  1.1216 -		find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
  1.1217 -		rm -rf fs
  1.1218 -		status
  1.1219 -
  1.1220 -		action "Creating new package..."
  1.1221 -		find . -print | cpio -o -H newc --quiet > \
  1.1222 -			"$TOP_DIR/$(basename "$PACKAGE_FILE").$$" && mv -f \
  1.1223 -			"$TOP_DIR/$(basename "$PACKAGE_FILE").$$" \
  1.1224 -			"$TOP_DIR/$(basename "$PACKAGE_FILE")"
  1.1225 -		status
  1.1226 -
  1.1227 -		cd "$TOP_DIR"
  1.1228 -		rm -rf $TMP_DIR
  1.1229 -		separator; newline
  1.1230 -		;;
  1.1231 +		check_cmd su pkg file; @@MODULES@@/recompress "$PACKAGE_FILE";;
  1.1232  
  1.1233  
  1.1234  	repack-config)
  1.1235 -		check_root $@
  1.1236  		# Create SliTaz package archive from configuration files.
  1.1237 -		mkdir -p $TMP_DIR; cd $TMP_DIR
  1.1238 -		CONFIG_VERSION='1.0'
  1.1239 -		mkdir config-$CONFIG_VERSION
  1.1240 -		cd config-$CONFIG_VERSION
  1.1241 -		for i in $INSTALLED/*/volatile.cpio.gz; do
  1.1242 -			zcat $i | cpio -t --quiet
  1.1243 -		done > files.list
  1.1244 -		mkdir fs
  1.1245 -		cd fs
  1.1246 -		( cd / ; cpio -o -H newc --quiet ) < ../files.list | cpio -idm --quiet > /dev/null
  1.1247 -		mkdir -p etc/tazlito
  1.1248 -		for i in $INSTALLED/*/receipt; do
  1.1249 -			EXTRAVERSION=''
  1.1250 -			. $i
  1.1251 -			echo "$PACKAGE-$VERSION$EXTRAVERSION"
  1.1252 -		done > etc/tazlito/config-packages.list
  1.1253 -		cd ..
  1.1254 -		echo "etc/tazlito/config-packages.list" >> files.list
  1.1255 -		pkg_date=$(date +"%x %X")
  1.1256 -		cat > receipt <<EOT
  1.1257 -# SliTaz package receipt.
  1.1258 -
  1.1259 -PACKAGE="config"
  1.1260 -VERSION="$CONFIG_VERSION"
  1.1261 -CATEGORY="base-system"
  1.1262 -SHORT_DESC="$(_n 'User configuration backup on date %s' "$pkg_date")"
  1.1263 -DEPENDS="$(ls $INSTALLED)"
  1.1264 -EOT
  1.1265 -		cd ..
  1.1266 -		tazpkg pack config-$CONFIG_VERSION
  1.1267 -		cp config-$CONFIG_VERSION.tazpkg "$TOP_DIR"
  1.1268 -		cd "$TOP_DIR"
  1.1269 -		rm -rf $TMP_DIR
  1.1270 -		;;
  1.1271 +		check_cmd su; @@MODULES@@/repack-config;;
  1.1272  
  1.1273  
  1.1274  	repack)
  1.1275  		# Create SliTaz package archive from an installed package.
  1.1276 -		check_for_package_on_cmdline
  1.1277 -		check_for_receipt
  1.1278 -		shift; @@MODULES@@/repack $@
  1.1279 -		;;
  1.1280 +		check_cmd pkg receipt; shift; @@MODULES@@/repack $@;;
  1.1281  
  1.1282  
  1.1283  	pack)
  1.1284  		# Create SliTaz package archive using cpio and lzma.
  1.1285  		# TODO: Cook also pack packages, we should share code in libpkg.sh
  1.1286 -		check_for_package_on_cmdline
  1.1287 -		shift; @@MODULES@@/pack $@
  1.1288 -		;;
  1.1289 +		check_cmd pkg; shift; @@MODULES@@/pack $@;;
  1.1290  
  1.1291  
  1.1292  	recharge)
  1.1293 @@ -1284,19 +385,16 @@
  1.1294  		# WARNING: The 'mirrors' file has all SliTaz mirrors but 'mirror'
  1.1295  		# must have only the chosen main mirror.
  1.1296  		#
  1.1297 -		check_root $1
  1.1298 -		shift; @@MODULES@@/recharge $@
  1.1299 -		;;
  1.1300 +		check_cmd su; shift; @@MODULES@@/recharge $@;;
  1.1301  
  1.1302  
  1.1303  	up|upgrade)
  1.1304 -		check_root $1
  1.1305 -		#
  1.1306  		# This is the new way to upgrade packages making 'upgrade' and
  1.1307  		# upgradeable out-of-date. This new way is much, much more faster!
  1.1308  		# Look into installed packages and get data from receipt, it is fast
  1.1309  		# and easy to handle vars after using only md5sum to compare packages
  1.1310  		#
  1.1311 +		check_cmd su
  1.1312  		for opt in $@; do
  1.1313  			case "$opt" in
  1.1314  				-i) export install='yes';;
  1.1315 @@ -1310,222 +408,86 @@
  1.1316  
  1.1317  	bugs)
  1.1318  		# Show known bugs in package(s)
  1.1319 -		cd $INSTALLED
  1.1320 -		shift
  1.1321 -		LIST=$@
  1.1322 -		[ -z "$LIST" ] && LIST=$(ls)
  1.1323 -		MSG=$(_n 'No known bugs.')
  1.1324 -
  1.1325 -		title 'Known bugs in packages'
  1.1326 -		for PACKAGE in $LIST; do
  1.1327 -			BUGS=''
  1.1328 -			EXTRAVERSION=''
  1.1329 -			. "$PACKAGE/receipt"
  1.1330 -			if [ -n "$BUGS" ]; then
  1.1331 -				MSG=$(_n 'Bug list completed')
  1.1332 -				newline
  1.1333 -				_ 'Bugs in package "%s" version %s:' "$PACKAGE" "$VERSION$EXTRAVERSION"
  1.1334 -				cat <<EOT
  1.1335 -  $BUGS
  1.1336 -EOT
  1.1337 -			fi
  1.1338 -		done
  1.1339 -		footer "$MSG"
  1.1340 -		;;
  1.1341 +		shift; @@MODULES@@/bugs $@;;
  1.1342  
  1.1343  
  1.1344  	check)
  1.1345  		# Check installed packages set.
  1.1346 -		shift; @@MODULES@@/check $@
  1.1347 -		;;
  1.1348 +		shift; @@MODULES@@/check $@;;
  1.1349  
  1.1350  
  1.1351  	block|-b|unblock|-u|chblock)
  1.1352  		# Add/remove a pkg name to the list of blocked packages.
  1.1353 -		check_root $@
  1.1354 -		check_for_package_on_cmdline
  1.1355 -		@@MODULES@@/block $@
  1.1356 -		;;
  1.1357 +		check_cmd su pkg; @@MODULES@@/block $@;;
  1.1358  
  1.1359  
  1.1360  	get|-g)
  1.1361  		# Download a package with wget.
  1.1362 -		check_root $@
  1.1363 -		check_for_package_on_cmdline
  1.1364 -		check_for_packages_list
  1.1365 +		check_cmd pkg; shift
  1.1366 +		# Get all the packages given on command line
  1.1367 +		export nocache='yes'
  1.1368 +		for i in $@; do
  1.1369 +			pkg="$(@@MODULES@@/get $i)" && _ 'Done: %s' "${pkg##*/}"
  1.1370 +		done
  1.1371 +		# Get all the packages listed in the file
  1.1372 +		process_list
  1.1373 +		;;
  1.1374  
  1.1375 -		[ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
  1.1376 -		if [ -n "$rootconfig" ]; then
  1.1377 -			if [ -n "$root" ]; then
  1.1378 -				CACHE_DIR="$root/$CACHE_DIR"
  1.1379 -				SAVE_CACHE_DIR="$CACHE_DIR"
  1.1380 -				PKGS_DB="$root/$PKGS_DB"
  1.1381 -			else
  1.1382 -				_ 'rootconfig needs --root= option used.' >&2
  1.1383 -				exit 1
  1.1384 -			fi
  1.1385 -		fi
  1.1386  
  1.1387 -		# Get repositories priority list.
  1.1388 -		priority=$(look_for_priority)
  1.1389 -
  1.1390 -		CURRENT_DIR="$PWD"
  1.1391 -		cd "$CACHE_DIR"
  1.1392 -		if check_for_package_in_list check ; then
  1.1393 -			cd "$CACHE_DIR"
  1.1394 -			if [ -f "$PACKAGE.tazpkg" ]; then
  1.1395 -				_ 'Package "%s" already in the cache' "$PACKAGE"
  1.1396 -				# Check package download was finished
  1.1397 -				tail -c 2k "$PACKAGE.tazpkg" | fgrep -q '00000000TRAILER' || {
  1.1398 -					_ 'Continuing package "%s" download' "$PACKAGE"
  1.1399 -					download "$PACKAGE.tazpkg"
  1.1400 -				}
  1.1401 -				if [ "$($CHECKSUM "$PACKAGE.tazpkg")" != \
  1.1402 -					"$(fgrep "  $PACKAGE.tazpkg" "$rep/packages.$SUM")" ]; then
  1.1403 -					rm -f "$PACKAGE.tazpkg"
  1.1404 -					download "$PACKAGE.tazpkg"
  1.1405 -				fi
  1.1406 -			else
  1.1407 -				download "$PACKAGE.tazpkg"
  1.1408 -			fi
  1.1409 -			PACKAGE_FILE="$CACHE_DIR/$PACKAGE.tazpkg"
  1.1410 -		elif download_get_script "$PACKAGE" "/tmp/$PACKAGE.$$" ; then
  1.1411 -			install_package_from_get_script "/tmp/$PACKAGE.$$" "$ROOT" --get
  1.1412 -			PACKAGE_FILE="$(ls "$PWD/$PACKAGE-*.tazpkg")"
  1.1413 -		fi
  1.1414 -		[ "$PWD" != "$CURRENT_DIR" ] &&
  1.1415 -			cp -a "$PACKAGE_FILE" "$CURRENT_DIR"
  1.1416 +	install|-i)
  1.1417 +		# Install .tazpkg packages.
  1.1418 +		check_cmd su pkg file; shift
  1.1419 +		for i in $@; do
  1.1420 +			@@MODULES@@/install $i
  1.1421 +		done
  1.1422 +		# Install all the packages listed in the file
  1.1423 +		process_list
  1.1424  		;;
  1.1425  
  1.1426  
  1.1427  	get-install|-gi)
  1.1428  		# Download and install a package.
  1.1429 -		check_root $@
  1.1430 -		check_for_package_on_cmdline
  1.1431 -		check_for_packages_list
  1.1432 +		check_cmd su pkg; shift
  1.1433 +		# Get and install all the packages given on command line
  1.1434 +		for i in $@; do
  1.1435 +			pkg="$(@@MODULES@@/get $i)" && @@MODULES@@/install "$pkg"
  1.1436 +		done
  1.1437 +		# Get and install all the packages listed in the file
  1.1438 +		process_list
  1.1439 +		;;
  1.1440  
  1.1441 -		DO_CHECK=''
  1.1442 -		[ -n "$forced" ] && DO_CHECK='no'
  1.1443 -		[ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
  1.1444 -		[ -n "$list" ] && INSTALL_LIST="$list"					# internal option
  1.1445  
  1.1446 -		# Get repositories priority list.
  1.1447 -		priority=$(look_for_priority)
  1.1448 -
  1.1449 -		AUTOEXEC='no'
  1.1450 -		# Magic :)
  1.1451 -		# After testing this condition $PACKAGE become $PACKAGE-$VERSION$EXTRAVERSION
  1.1452 -		if ! check_for_package_in_list check; then
  1.1453 -			CACHE_DIR="${CACHE_DIR%/*}/get"
  1.1454 -			[ -d "$CACHE_DIR" ] || mkdir -p $CACHE_DIR
  1.1455 -			if download_get_script "$PACKAGE" "/tmp/$PACKAGE.$$" ; then
  1.1456 -				install_package_from_get_script "/tmp/$PACKAGE.$$" $ROOT
  1.1457 -				exit 0
  1.1458 -			else
  1.1459 -				PACKAGE="get-$PACKAGE"
  1.1460 -				AUTOEXEC="$PACKAGE"
  1.1461 -				# Here $PACKAGE become $PACKAGE-$VERSION$EXTRAVERSION
  1.1462 -				check_for_package_in_list
  1.1463 -				if [ -n "$(get_installed_package_pathname "$PACKAGE" "$ROOT")" ]; then
  1.1464 -					$AUTOEXEC $ROOT
  1.1465 -					exit 0
  1.1466 -				fi
  1.1467 -			fi
  1.1468 -		fi
  1.1469 -		# Check if no forced install.
  1.1470 -		if [ -z "$forced" ]; then
  1.1471 -			check_for_installed_package $ROOT
  1.1472 -		fi
  1.1473 -
  1.1474 -		cd $CACHE_DIR
  1.1475 -		# Here $PACKAGE is $PACKAGE-$VERSION$EXTRAVERSION
  1.1476 -		if [ -f "$PACKAGE.tazpkg" ]; then
  1.1477 -			_ 'Package "%s" already in the cache' "$PACKAGE"
  1.1478 -			# Check package download was finished
  1.1479 -			tail -c 2k "$PACKAGE.tazpkg" | fgrep -q '00000000TRAILER' || {
  1.1480 -				_ 'Continuing package "%s" download' "$PACKAGE"
  1.1481 -				download "$PACKAGE.tazpkg"
  1.1482 -			}
  1.1483 -			if [ "$($CHECKSUM "$PACKAGE.tazpkg")" != "$(fgrep "  $PACKAGE.tazpkg" $rep/packages.$SUM)" ]; then
  1.1484 -				rm -f "$PACKAGE.tazpkg"
  1.1485 -				download "$PACKAGE.tazpkg"
  1.1486 -			fi
  1.1487 -		else
  1.1488 -			newline
  1.1489 -			download "$PACKAGE.tazpkg"
  1.1490 -		fi
  1.1491 -		PACKAGE_FILE="$CACHE_DIR/$PACKAGE.tazpkg"
  1.1492 -		[ -n "$rootconfig" ] && PKGS_DB="${PKGS_DB#$root}"
  1.1493 -		install_package "$ROOT"
  1.1494 -		[ "$AUTOEXEC" != 'no' ] && "$PACKAGE" $ROOT
  1.1495 -		update_desktop_database $ROOT
  1.1496 -		update_mime_database    $ROOT ;;
  1.1497 +	get-list|install-list|get-install-list)
  1.1498 +		# Install a set of packages from a list.
  1.1499 +		check_cmd su list file
  1.1500 +		COMMAND=${COMMAND%-list}
  1.1501 +		export list="$2"
  1.1502 +		process_list
  1.1503 +		;;
  1.1504  
  1.1505  
  1.1506  	clean-cache|-cc)
  1.1507  		# Remove all downloaded packages.
  1.1508 -		check_root $@
  1.1509 -		files=$(find $CACHE_DIR -name *.tazpkg | wc -l)
  1.1510 -		size=$(du -hs $CACHE_DIR | cut -f1 | sed 's|\.0||'); [ "$files" -eq 0 ] && size="0K"
  1.1511 -
  1.1512 -		title 'Cleaning cache directory...'
  1.1513 -		action 'Path: %s' "$CACHE_DIR"
  1.1514 -		rm -rf $CACHE_DIR/*
  1.1515 -		status
  1.1516 -
  1.1517 -		footer "$(_p \
  1.1518 -			'%s file removed from cache (%s).' \
  1.1519 -			'%s files removed from cache (%s).' $files \
  1.1520 -			"$(colorize 32 "$files")" $size)"
  1.1521 -		;;
  1.1522 +		check_cmd su; @@MODULES@@/cache clean;;
  1.1523  
  1.1524  
  1.1525  	list-undigest)
  1.1526  		# List undigest mirrors
  1.1527 -		@@MODULES@@/mirror list
  1.1528 -		;;
  1.1529 +		@@MODULES@@/mirror list;;
  1.1530  	remove-undigest)
  1.1531  		# Remove undigest mirror
  1.1532 -		check_root $1
  1.1533 -		shift; @@MODULES@@/mirror remove $@
  1.1534 -		;;
  1.1535 +		check_cmd su; shift; @@MODULES@@/mirror remove $@;;
  1.1536  	add-undigest|setup-undigest)
  1.1537  		# Add undigest mirror
  1.1538 -		check_root $1
  1.1539 -		shift; @@MODULES@@/mirror add $@
  1.1540 -		;;
  1.1541 +		check_cmd su; shift; @@MODULES@@/mirror add $@;;
  1.1542  	setup-mirror|-sm)
  1.1543  		# Change main mirror
  1.1544 -		check_root $@
  1.1545 -		shift; @@MODULES@@/mirror setup $@
  1.1546 -		;;
  1.1547 +		check_cmd su; shift; @@MODULES@@/mirror setup $@;;
  1.1548  
  1.1549  
  1.1550  	reconfigure)
  1.1551  		# Replay post_install from receipt
  1.1552 -		check_for_package_on_cmdline
  1.1553 -		check_root $1
  1.1554 -
  1.1555 -		ROOT="$root"
  1.1556 -		if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
  1.1557 -			check_for_receipt $ROOT
  1.1558 -			# Check for post_install
  1.1559 -			if grep -q ^post_install "$ROOT$INSTALLED/$PACKAGE/receipt"; then
  1.1560 -				. "$ROOT$INSTALLED/$PACKAGE/receipt"
  1.1561 -				post_install $ROOT
  1.1562 -				# Log this activity
  1.1563 -				[ -z "$ROOT" ] && log_pkg Reconfigured
  1.1564 -			else
  1.1565 -				newline
  1.1566 -				_ 'Nothing to do for package "%s".' "$PACKAGE"
  1.1567 -			fi
  1.1568 -		else
  1.1569 -			newline
  1.1570 -			_ 'Package "%s" is not installed.' "$PACKAGE"
  1.1571 -			_ 'Install package with "%s" or "%s"' 'tazpkg install' 'tazpkg get-install'
  1.1572 -			newline
  1.1573 -		fi
  1.1574 -		;;
  1.1575 +		check_cmd su pkg receipt; @@MODULES@@/reconfigure "$2";;
  1.1576  
  1.1577  
  1.1578  	shell)
  1.1579 @@ -1560,78 +522,20 @@
  1.1580  
  1.1581  	depends)
  1.1582  		# Display dependencies tree
  1.1583 -		shift; @@MODULES@@/depends depends $@
  1.1584 -		;;
  1.1585 +		check_cmd pkg; shift; @@MODULES@@/depends depends $@;;
  1.1586  	rdepends)
  1.1587  		# Display reverse dependencies tree
  1.1588 -		shift; @@MODULES@@/depends rdepends $@
  1.1589 -		;;
  1.1590 +		check_cmd pkg; shift; @@MODULES@@/depends rdepends $@;;
  1.1591  
  1.1592  
  1.1593  	convert|-c)
  1.1594  		# convert misc package format to .tazpkg
  1.1595 -		check_for_package_file
  1.1596 -		shift; @@MODULES@@/convert $@
  1.1597 -		;;
  1.1598 +		check_cmd file; shift; @@MODULES@@/convert $@;;
  1.1599  
  1.1600  
  1.1601  	link)
  1.1602  		# link a package from another SliTaz installation
  1.1603 -		PACKAGE="$2"
  1.1604 -		if [ ! -d "$TARGET_DIR" -o \
  1.1605 -		     ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
  1.1606 -			_ 'Usage: tazpkg link package_name slitaz_root'
  1.1607 -			longline "$(
  1.1608 -				_n 'Example:'
  1.1609 -				echo -n ' '
  1.1610 -				_ '"%s" will use less than 100k in your running system RAM.' \
  1.1611 -				'tazpkg link openoffice /mnt')"
  1.1612 -			exit 1
  1.1613 -		fi
  1.1614 -		if [ -e "$INSTALLED/$PACKAGE" ]; then
  1.1615 -			_ 'Package "%s" is already installed.' "$PACKAGE"
  1.1616 -			exit 1
  1.1617 -		fi
  1.1618 -		ln -s "$TARGET_DIR$INSTALLED/$PACKAGE" $INSTALLED
  1.1619 -		DEPENDS="$(. "$INSTALLED/$PACKAGE/receipt"; echo $DEPENDS)"
  1.1620 -		MISSING=''
  1.1621 -		for i in $DEPENDS; do
  1.1622 -			[ -e $INSTALLED/$i ] && continue
  1.1623 -			MISSING="$MISSING$i "
  1.1624 -			_ 'Missing: %s' $i
  1.1625 -		done
  1.1626 -		if [ -n "$MISSING" ]; then
  1.1627 -			newline
  1.1628 -			confirm "$(_ 'Link all missing dependencies? (y/N)')"
  1.1629 -			answer=$?
  1.1630 -			newline
  1.1631 -			if [ "$answer" -eq 0 ]; then
  1.1632 -				for i in $MISSING; do
  1.1633 -					tazpkg link $i $TARGET_DIR
  1.1634 -				done
  1.1635 -			else
  1.1636 -				newline
  1.1637 -				_ 'Leaving dependencies unresolved for package "%s"' "$PACKAGE"
  1.1638 -				_ 'The package is installed but probably will not work.'
  1.1639 -				newline
  1.1640 -			fi
  1.1641 -		fi
  1.1642 -		. "$INSTALLED/$PACKAGE/receipt"
  1.1643 -		if grep -q ^pre_install "$INSTALLED/$PACKAGE/receipt"; then
  1.1644 -			pre_install
  1.1645 -		fi
  1.1646 -		while read path; do
  1.1647 -			[ -e "$path" ] && continue
  1.1648 -			while true; do
  1.1649 -				dir="$(dirname "$path")"
  1.1650 -				[ -e "$dir" ] && break
  1.1651 -				path="$dir"
  1.1652 -			done
  1.1653 -			ln -s "$TARGET_DIR$path" "$dir"
  1.1654 -		done < "$INSTALLED/$PACKAGE/files.list"
  1.1655 -		if grep -q ^post_install "$INSTALLED/$PACKAGE/receipt"; then
  1.1656 -			post_install
  1.1657 -		fi ;;
  1.1658 +		check_cmd su pkg dir; shift; @@MODULES@@/link $@;;
  1.1659  
  1.1660  
  1.1661  	help|-h)
  1.1662 @@ -1654,7 +558,8 @@
  1.1663  
  1.1664  	usage|*)
  1.1665  		# Print a short help or give usage for an unknown or empty command.
  1.1666 -		@@MODULES@@/help ;;
  1.1667 +		@@MODULES@@/help
  1.1668 +		;;
  1.1669  esac
  1.1670  
  1.1671  exit 0