tazpkg diff tazpkg @ rev 840

Add a bunch of modules with new-style support of 'root' (not all commands are modules yet); strip and compress resources.
author Aleksej Bobylev <al.bobylev@gmail.com>
date Fri Aug 28 16:10:34 2015 +0300 (2015-08-28)
parents b1da66280a9d
children 0560ba4306a1
line diff
     1.1 --- a/tazpkg	Sun Aug 16 19:29:19 2015 +0100
     1.2 +++ b/tazpkg	Fri Aug 28 16:10:34 2015 +0300
     1.3 @@ -71,19 +71,19 @@
     1.4  	PACKAGE="${PACKAGE%.tazpkg}"
     1.5  fi
     1.6  TARGET_DIR="$3"
     1.7 -TOP_DIR="$(pwd)"
     1.8 +export TOP_DIR="$(pwd)"
     1.9  TMP_DIR="/tmp/$RANDOM"
    1.10  INSTALL_LIST=''
    1.11  SAVE_CACHE_DIR="$CACHE_DIR"
    1.12  
    1.13  # Path to tazpkg used dir and configuration files
    1.14  MIRROR="$PKGS_DB/mirror"
    1.15 -export BLOCKED="$PKGS_DB/blocked-packages.list"
    1.16 -export UP_LIST="$PKGS_DB/packages.up"
    1.17 +BLOCKED="$PKGS_DB/blocked-packages.list"
    1.18 +UP_LIST="$PKGS_DB/packages.up"
    1.19  DEFAULT_MIRROR="$ONLINE_PKGS"
    1.20  
    1.21  # TazPkg version
    1.22 -VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' $PKGS_DB/installed.info)
    1.23 +export VERSION=$(awk -F$'\t' '$1=="tazpkg"{print $2}' $PKGS_DB/installed.info)
    1.24  # User Agent
    1.25  export UA="TazPkg-$VERSION"
    1.26  
    1.27 @@ -100,94 +100,6 @@
    1.28  im() { tty -s; }
    1.29  
    1.30  
    1.31 -# Print the usage.
    1.32 -
    1.33 -usage () {
    1.34 -	cat <<EOT
    1.35 -
    1.36 -$(_ 'SliTaz package manager - Version: %s' $(colorize 34 $VERSION))
    1.37 -
    1.38 -$(boldify "$(_ 'Usage:')")
    1.39 -  $(_ 'tazpkg [command] [package|dir|pattern|list|cat|--opt] [dir|--opt]')
    1.40 -
    1.41 -$(boldify "$(_ 'SHell:')") tazpkg shell
    1.42 -
    1.43 -$(boldify "$(_ 'Commands:')")
    1.44 -$(optlist "\
    1.45 -     usage				$(_ 'Print this short usage')
    1.46 --h   help				$(_ 'Show help on the TazPkg commands')
    1.47 --a   activity			$(_ 'Show TazPkg activity log')
    1.48 --cc  clean-cache		$(_ 'Clean all packages downloaded in cache directory')
    1.49 -     shell				$(_ 'Run interactive TazPkg shell')
    1.50 -
    1.51 --l   list				$(_ 'List installed packages on the system')
    1.52 --lm  list-mirror		$(_ 'List all available packages on the mirror')
    1.53 -     list-config		$(_ 'List the configuration files')
    1.54 -
    1.55 --s   search				$(_ 'Search for a package by pattern or name')
    1.56 --sp  search-pkgname		$(_ 'Search on mirror for package having a particular file')
    1.57 --sf  search-file		$(_ 'Search for file in all installed packages files')
    1.58 -
    1.59 --g   get				$(_ 'Download a package into the current directory')
    1.60 --i   install			$(_ 'Install a local package')
    1.61 --gi  get-install		$(_ 'Download and install a package from the mirror')
    1.62 -     install-list		$(_ 'Install all packages from a list of packages')
    1.63 -     get-install-list	$(_ 'Download and install a list of packages from the mirror')
    1.64 --r   remove				$(_ 'Remove the specified package and all installed files')
    1.65 -     reconfigure		$(_ 'Replay post install script from package')
    1.66 -     link				$(_ 'Link a package from another SliTaz installation')
    1.67 -     set-release		$(_ 'Change release and update packages')
    1.68 -     add-flavor			$(_ 'Install the flavor list of packages')
    1.69 -     install-flavor		$(_ 'Install the flavor list of packages and remove other ones')
    1.70 -
    1.71 -     info				$(_ 'Print information about a package')
    1.72 --d   desc				$(_ 'Print description of a package')
    1.73 --lf  list-files			$(_ 'List the files installed with a package')
    1.74 --b|u block|unblock		$(_ 'Block an installed package version or unblock it for upgrade')
    1.75 -     check				$(_ 'Verify consistency of installed packages')
    1.76 -     bugs				$(_ 'Show known bugs in packages')
    1.77 -     depends			$(_ 'Display dependencies tree')
    1.78 -     rdepends			$(_ 'Display reverse dependencies tree')
    1.79 --e   extract			$(_ 'Extract a (*.tazpkg) package into a directory')
    1.80 -     pack				$(_ 'Pack an unpacked or prepared package tree')
    1.81 -     repack				$(_ 'Create a package archive from an installed package')
    1.82 -     repack-config		$(_ 'Create a package archive with configuration files')
    1.83 -     recompress			$(_ 'Rebuild a package with a better compression ratio')
    1.84 -     convert			$(_ 'Convert alien package to tazpkg')
    1.85 -     list-suggested		$(_ 'Print list of suggested packages')
    1.86 -
    1.87 -     recharge			$(_ 'Recharge your packages.list from the mirror')
    1.88 -     up|help-up			$(_ 'Check packages %s to list and install latest upgrades' $CHECKSUM)
    1.89 --sm  setup-mirror		$(_ 'Change the mirror URL configuration')
    1.90 -     setup-undigest		$(_ 'Update an undigest mirror')
    1.91 -     list-undigest		$(_ 'List undigest mirrors')
    1.92 -     add-undigest		$(_ 'Add an undigest mirror')
    1.93 -     remove-undigest	$(_ 'Remove an undigest mirror')
    1.94 -")
    1.95 -EOT
    1.96 -}
    1.97 -
    1.98 -
    1.99 -usage_up() {
   1.100 -	cat <<EOT
   1.101 -$(emsg "<b>$(_ 'Usage for command up:')</b>") tazpkg up [$(_ 'option')]
   1.102 -
   1.103 - * $(longline "$(_ 'Without options run in interactive mode and ask before install')")
   1.104 -
   1.105 -$(boldify "$(_ 'Where options are:')")
   1.106 -$(optlist "\
   1.107 --c  --check		$(_ 'Check only for available upgrades')
   1.108 --r  --recharge	$(_ 'Force recharge of packages list and check')
   1.109 --i  --install	$(_ 'Check for upgrades and install them all')
   1.110 -")
   1.111 -
   1.112 -$(boldify "$(_ 'Example:')")
   1.113 -  tazpkg up --recharge --install
   1.114 -  tazpkg up -c -r
   1.115 -EOT
   1.116 -}
   1.117 -
   1.118 -
   1.119  # Check if dir exists
   1.120  
   1.121  check_dir() {
   1.122 @@ -320,10 +232,9 @@
   1.123  			tazpkg recharge
   1.124  		else
   1.125  			newline
   1.126 -			_ 'Unable to find the list "%s"' $list_path
   1.127 -			_ \
   1.128 -"You must probably run 'tazpkg recharge' as root to get the latest list of
   1.129 -packages available on the mirror."
   1.130 +			_ 'Unable to find the list "%s"' "$list_path"
   1.131 +			longline "$(_ "You must probably run '%s' as root to get the \
   1.132 +latest list of packages available on the mirror." 'tazpkg recharge')"
   1.133  			newline
   1.134  			exit 0
   1.135  		fi
   1.136 @@ -337,7 +248,7 @@
   1.137  check_for_installed_info() {
   1.138  	info_path="$ROOT$PKGS_DB/installed.info"
   1.139  	if [ ! -f "$info_path" ]; then
   1.140 -		if [ "$(id -u)" == '0' ]; then
   1.141 +		if [ $(id -u) -eq 0 ]; then
   1.142  			_ 'File "%s" generated. Please wait...' 'installed.info'
   1.143  			for pkg in $ROOT$PKGS_DB/installed/*/receipt; do
   1.144  				unset_receipt
   1.145 @@ -927,36 +838,6 @@
   1.146  }
   1.147  
   1.148  
   1.149 -# Check for loop in deps tree.
   1.150 -
   1.151 -check_for_deps_loop() {
   1.152 -	local list pkg="$1" deps
   1.153 -	shift
   1.154 -	[ -n "$1" ] || return
   1.155 -	list=''
   1.156 -
   1.157 -	# Filter out already processed deps
   1.158 -	for i in $@; do
   1.159 -		case " $ALL_DEPS" in
   1.160 -			*\ $i\ *) ;;
   1.161 -			*) list="$list $i";;
   1.162 -		esac
   1.163 -	done
   1.164 -	ALL_DEPS="$ALL_DEPS$list "
   1.165 -	for i in $list; do
   1.166 -		[ -f $i/receipt ] || continue
   1.167 -		deps="$(DEPENDS=""; . $i/receipt; echo $DEPENDS)"
   1.168 -		case " $deps " in
   1.169 -			*\ $pkg\ *)
   1.170 -				print_pkgname
   1.171 -				echo -e "$MSG  $i"; MSG='';;
   1.172 -			*)
   1.173 -				check_for_deps_loop $pkg $deps;;
   1.174 -		esac
   1.175 -	done
   1.176 -}
   1.177 -
   1.178 -
   1.179  # Check for missing deps listed in a receipt packages.
   1.180  
   1.181  check_for_deps() {
   1.182 @@ -1056,258 +937,6 @@
   1.183  }
   1.184  
   1.185  
   1.186 -# Search pattern in installed packages.
   1.187 -
   1.188 -search_in_installed_packages() {
   1.189 -	_ 'Installed packages'; separator '-'
   1.190 -	num='0'
   1.191 -	TMPLIST="$(mktemp)"
   1.192 -
   1.193 -	awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
   1.194 -		BEGIN { IGNORECASE = 1 }
   1.195 -		index($1 "-" $2, pattern) {
   1.196 -			printf "%-24s%-18s%s\n", $1, $2, $3;
   1.197 -			printf "1" >> t
   1.198 -		}' "$PKGS_DB/installed.info" | translate_category
   1.199 -	num="$(wc -m < $TMPLIST)"; rm $TMPLIST
   1.200 -
   1.201 -	footer "$(_p \
   1.202 -		'%s installed package found for "%s"' \
   1.203 -		'%s installed packages found for "%s"' $num \
   1.204 -		$num "$PATTERN")"
   1.205 -}
   1.206 -
   1.207 -
   1.208 -# Search in packages.list for available pkgs.
   1.209 -
   1.210 -search_in_packages_list() {
   1.211 -	_ 'Available packages'; separator '-'
   1.212 -	num='0'
   1.213 -	TMPLIST="$(mktemp)"
   1.214 -
   1.215 -	for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do
   1.216 -		[ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
   1.217 -		BEGIN { IGNORECASE = 1 }
   1.218 -		index($1 "-" $2, pattern) {
   1.219 -			printf "%-24s%-18s%s\n", $1, $2, $3;
   1.220 -			printf "1" >> t
   1.221 -		}' "$i" | translate_category
   1.222 -	done
   1.223 -
   1.224 -	for i in $PKGS_DB/extra.list $PKGS_DB/undigest/*/extra.list; do
   1.225 -		[ -e "$i" ] && awk -F'|' -vpattern="$PATTERN" -vt="$TMPLIST" '
   1.226 -		BEGIN { IGNORECASE = 1 }
   1.227 -		index($1 "-" $5, pattern) {
   1.228 -			printf "%-24s%-18s%s\n", $1 " (extra)", $5, $4;
   1.229 -			printf "1" >> t
   1.230 -		}' "$i" | translate_category
   1.231 -	done
   1.232 -
   1.233 -	if [ ! -f "$PKGS_DB/packages.info" ]; then
   1.234 -		newline
   1.235 -		longline "$(_ \
   1.236 -"No \"%s\" found to check for mirrored packages. For more results, please run \
   1.237 -\"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')"
   1.238 -		newline
   1.239 -	fi
   1.240 -
   1.241 -	num="$(wc -m < $TMPLIST)"; rm $TMPLIST
   1.242 -	footer "$(_p \
   1.243 -		'%s available package found for "%s"' \
   1.244 -		'%s available packages found for "%s"' $num \
   1.245 -		$num $PATTERN)"
   1.246 -}
   1.247 -
   1.248 -
   1.249 -# search --mirror: Search in packages.txt for available pkgs and give more
   1.250 -# info than --list or default.
   1.251 -
   1.252 -search_in_packages_txt() {
   1.253 -	_ 'Matching packages name with version and desc'; separator '-'
   1.254 -	num='0'
   1.255 -	TMPLIST="$(mktemp)"
   1.256 -
   1.257 -	for i in $PKGS_DB/packages.info $PKGS_DB/undigest/*/packages.info; do
   1.258 -		[ -e "$i" ] && awk -F$'\t' -vpattern="$PATTERN" -vt="$TMPLIST" '
   1.259 -		BEGIN { IGNORECASE = 1 }
   1.260 -		index($1 " " $2 " " $4, pattern) {
   1.261 -			split($7, s, " ");
   1.262 -			printf "%s\n%s\n%s\n%s (%s installed)\n\n", $1, $2, $4, s[1], s[2];
   1.263 -			printf "1" >> t;
   1.264 -		}' "$i"
   1.265 -	done
   1.266 -
   1.267 -	if [ ! -f "$PKGS_DB/packages.info" ]; then
   1.268 -		newline
   1.269 -		longline "$(_ \
   1.270 -"No \"%s\" found to check for mirrored packages. For more results, please run \
   1.271 -\"%s\" once as root before searching." 'packages.info' 'tazpkg recharge')"
   1.272 -		newline
   1.273 -	fi
   1.274 -
   1.275 -	num="$(wc -m < $TMPLIST)"; rm $TMPLIST
   1.276 -	footer "$(_p \
   1.277 -		'%s available package found for "%s"' \
   1.278 -		'%s available packages found for "%s"' $num \
   1.279 -		$num $PATTERN)"
   1.280 -}
   1.281 -
   1.282 -
   1.283 -# Install package-list from a flavor
   1.284 -
   1.285 -install_flavor() {
   1.286 -	check_root $@
   1.287 -
   1.288 -	# Get repositories priority list.
   1.289 -	look_for_priority
   1.290 -
   1.291 -	FLAVOR="$1"
   1.292 -	mkdir -p $TMP_DIR
   1.293 -	[ -f $FLAVOR.flavor ] && cp $FLAVOR.flavor $TMP_DIR
   1.294 -	cd $TMP_DIR
   1.295 -	if [ -f $FLAVOR.flavor ] || download $FLAVOR.flavor; then
   1.296 -		zcat < $FLAVOR.flavor | cpio --quiet -i >/dev/null
   1.297 -
   1.298 -		while read file; do
   1.299 -			for pkg in $(ls -d $INSTALLED/${file%%-*}*); do
   1.300 -				[ -f $pkg/receipt ] || continue
   1.301 -				EXTRAVERSION=''
   1.302 -				. $pkg/receipt
   1.303 -				[ "$PACKAGE-$VERSION$EXTRAVERSION" == "$file" ] && break
   1.304 -			done
   1.305 -			[ "$PACKAGE-$VERSION$EXTRAVERSION" == "$file" ] && continue
   1.306 -			cd $CACHE_DIR
   1.307 -			download $file.tazpkg
   1.308 -			cd $TMP_DIR
   1.309 -			tazpkg install $CACHE_DIR/$file.tazpkg --forced
   1.310 -		done < $FLAVOR.pkglist
   1.311 -
   1.312 -		[ -f $FLAVOR.nonfree ] && while read pkg; do
   1.313 -			[ -d $INSTALLED/$pkg ] || continue
   1.314 -			[ -d $INSTALLED/get-$pkg ] && tazpkg get-install get-$pkg
   1.315 -			get-$pkg
   1.316 -		done < $FLAVOR.nonfree
   1.317 -
   1.318 -		# option "--purge"
   1.319 -		[ -n "$purge" ] && for pkg in $(ls $INSTALLED); do
   1.320 -			[ -f $INSTALLED/$pkg/receipt ] || continue
   1.321 -			EXTRAVERSION=''
   1.322 -			. $INSTALLED/$pkg/receipt
   1.323 -			grep -q "^$PACKAGE-$VERSION$EXTRAVERSION$" $FLAVOR.pkglist && continue
   1.324 -			grep -qs "^$PACKAGE$" $FLAVOR.nonfree && continue
   1.325 -			tazpkg remove "$PACKAGE"
   1.326 -		done
   1.327 -	else
   1.328 -		_ "Can't find flavor \"%s\". Abort." $FLAVOR
   1.329 -	fi
   1.330 -	cd "$TOP_DIR"
   1.331 -	rm -rf $TMP_DIR
   1.332 -}
   1.333 -
   1.334 -
   1.335 -# Update mirror URLs
   1.336 -
   1.337 -setup_mirror() {
   1.338 -	# Backup old list.
   1.339 -	if [ -f "$1/mirror" ]; then
   1.340 -		cp -f $1/mirror $1/mirror.bak
   1.341 -	fi
   1.342 -	title 'Current mirror(s)'
   1.343 -	echo "  $(cat $1/mirror 2> /dev/null)"
   1.344 -	longline "$(_ \
   1.345 -"Please enter URL of the new mirror (http, ftp or local path). You must specify \
   1.346 -the complete address to the directory of the packages and packages.list file.")"
   1.347 -	newline
   1.348 -
   1.349 -	_n 'New mirror(s) URL: '
   1.350 -	NEW_MIRROR_URL="$2"
   1.351 -	if [ -n "$NEW_MIRROR_URL" ]; then
   1.352 -		echo $NEW_MIRROR_URL
   1.353 -	else
   1.354 -		read NEW_MIRROR_URL
   1.355 -	fi
   1.356 -
   1.357 -	if [ -z "$NEW_MIRROR_URL" ]; then
   1.358 -		_ 'Nothing has been changed.'
   1.359 -	else
   1.360 -		_ 'Setting mirror(s) to: "%s"' $NEW_MIRROR_URL
   1.361 -		rm -f $1/mirror
   1.362 -		for i in $NEW_MIRROR_URL; do
   1.363 -			echo "${i%/}/" >> $1/mirror
   1.364 -		done
   1.365 -	fi
   1.366 -	newline
   1.367 -}
   1.368 -
   1.369 -
   1.370 -# recursive dependencies scan
   1.371 -
   1.372 -dep_scan() {
   1.373 -	for i in $1; do
   1.374 -		case " $ALL_DEPS " in
   1.375 -			*\ $i\ *) continue;;
   1.376 -		esac
   1.377 -		ALL_DEPS="$ALL_DEPS $i"
   1.378 -
   1.379 -		if [ -z "$mark" ]; then
   1.380 -			ii="$i"
   1.381 -		else
   1.382 -			ii="- $i"; grep -q ^$i$'\t' "$PKGS_DB/installed.info" && ii="+ $i"
   1.383 -		fi
   1.384 -		[ -n "$2" ] && echo "$2$ii ($(awk -F$'\t' -vp="$i" '
   1.385 -			$1==p{split($7,s," ");print s[2]}' "$PKGS_DB/packages.info"))"
   1.386 -
   1.387 -		DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/installed.info")"
   1.388 -		[ -z "$DEPENDS" ] && \
   1.389 -		DEPENDS="$(awk -F$'\t' -vp="$i" '$1==p{print $8 " "}' "$PKGS_DB/packages.info")"
   1.390 -		[ -n "$DEPENDS" ] && dep_scan "$DEPENDS" "$2  "
   1.391 -	done
   1.392 -}
   1.393 -
   1.394 -
   1.395 -# recursive reverse dependencies scan
   1.396 -
   1.397 -rdep_scan() {
   1.398 -	SEARCH="$1"
   1.399 -
   1.400 -	DB='installed'; [ -n "$all" ] && DB='packages'
   1.401 -
   1.402 -	awk -F$'\t' '$8 {print $1 " " $8}' "$PKGS_DB/$DB.info" | \
   1.403 -	busybox awk -F' ' -v search="$SEARCH" '
   1.404 -function show_deps(pkg, space,   i, n, mydeps) {
   1.405 -	if (processed[pkg]) return
   1.406 -	processed[pkg] = 1;
   1.407 -
   1.408 -	if (space) printf "%s %s\n", space, pkg;
   1.409 -
   1.410 -	n = split(deps[pkg], mydeps, " ");
   1.411 -	for (i = 1; i <= n; i++)
   1.412 -		show_deps(mydeps[i], "==" space);
   1.413 -}
   1.414 -
   1.415 -{
   1.416 -	for (i = 2; i <= NF; i++)
   1.417 -		deps[$i] = deps[$i] " " $1;
   1.418 -}
   1.419 -
   1.420 -END {
   1.421 -	show_deps(search, "")
   1.422 -}
   1.423 -' | while read spc pkg; do
   1.424 -		if [ -z "$mark" ]; then
   1.425 -			pkgi="$pkg"
   1.426 -		else
   1.427 -			pkgi="- $pkg"; grep -q ^$pkg$'\t' "$PKGS_DB/installed.info" && pkgi="+ $pkg"
   1.428 -		fi
   1.429 -
   1.430 -		echo -n $spc | sed 's/=/ /g'
   1.431 -
   1.432 -		echo "$pkgi ($(awk -F$'\t' -vp="$pkg" '$1==p{split($7,s," ");print s[2]}' \
   1.433 -			"$PKGS_DB/$DB.info"))"
   1.434 -	done
   1.435 -}
   1.436 -
   1.437 -
   1.438  update_desktop_database() {
   1.439  	if [ -f "$1/usr/bin/update-desktop-database" ] && [ -n "$updatedesktopdb" ]; then
   1.440  		chroot "$1/" /usr/bin/update-desktop-database /usr/share/applications 2>/dev/null
   1.441 @@ -1343,15 +972,6 @@
   1.442  }
   1.443  
   1.444  
   1.445 -# Print package name if not printed yet
   1.446 -print_pkgname() {
   1.447 -	if [ "$PACKAGE" != "$PACKAGE_PRINTED" ]; then
   1.448 -		[ -n "$PACKAGE_PRINTED" ] && footer
   1.449 -		title 'Package %s' "$PACKAGE-$VERSION$EXTRAVERSION"
   1.450 -		PACKAGE_PRINTED="$PACKAGE"
   1.451 -	fi
   1.452 -}
   1.453 -
   1.454  
   1.455  
   1.456  ###################
   1.457 @@ -1366,10 +986,8 @@
   1.458  			b|blocked)			@@MODULES@@/list blocked   ;;
   1.459  			c|cat|categories)	@@MODULES@@/list categories;;
   1.460  			l|linked)			@@MODULES@@/list linked    ;;
   1.461 -			'')					check_for_installed_info
   1.462 -								@@MODULES@@/list installed ;;
   1.463 -			*)					check_for_installed_info
   1.464 -								@@MODULES@@/list installed_of_category "$@";;
   1.465 +			'')					@@MODULES@@/list installed ;;
   1.466 +			*)					@@MODULES@@/list installed_of_category "$@";;
   1.467  		esac
   1.468  		;;
   1.469  	-lb)	@@MODULES@@/list blocked   ;;
   1.470 @@ -1393,166 +1011,44 @@
   1.471  
   1.472  	desc|-d)
   1.473  		# Display package description
   1.474 -		unset desc
   1.475 -
   1.476 -		# 1) Localized description
   1.477 -		for LC in $LANG ${LANG%_*}; do
   1.478 -			[ -e "$PKGS_DB/descriptions.$LC.txt" ] &&
   1.479 -			desc="$(awk -vRS='' -vFS='\n' -vOFS='\n' -vp="$PACKAGE" '
   1.480 -				$1 == p { $1 = ""; print $0; exit; }
   1.481 -				' "$PKGS_DB/descriptions.$LC.txt" | sed '1d')"
   1.482 -		done
   1.483 -
   1.484 -		# 2) Installed description
   1.485 -		if [ -z "$desc" -a -s "$INSTALLED/$PACKAGE/description.txt" ]; then
   1.486 -			desc="$(cat "$INSTALLED/$PACKAGE/description.txt")"
   1.487 -		fi
   1.488 -
   1.489 -		# 3) Mirrored description
   1.490 -		if [ -z "$desc" -a -s "$PKGS_DB/descriptions.txt" ]; then
   1.491 -			desc="$(awk -vRS='' -vFS='\n' -vOFS='\n' -vp="$PACKAGE" '
   1.492 -				$1 == p { $1 = ""; print $0; exit; }
   1.493 -				' "$PKGS_DB/descriptions.txt" | sed '1d')"
   1.494 -		fi
   1.495 -
   1.496 -		# 4) Short description only in terminal
   1.497 -		if [ -z "$desc" ] && im; then
   1.498 -			desc="$(print_short_description "$PACKAGE")"
   1.499 -		fi
   1.500 -
   1.501 -		if [ -n "$desc" ]; then
   1.502 -			# Title and footer only in terminal
   1.503 -			im && title 'Description of package "%s"' "$PACKAGE"
   1.504 -			echo "$desc"
   1.505 -			im && footer
   1.506 -		else
   1.507 -			im && _ 'Description absent.'
   1.508 -		fi
   1.509 +		@@MODULES@@/description "$2"
   1.510  		;;
   1.511  
   1.512  
   1.513  	search|-s)
   1.514  		# Search for a package by pattern or name.
   1.515 -		PATTERN="$2"
   1.516 -		if [ -z "$PATTERN" ]; then tazpkg -h search; exit 1; fi
   1.517 +		if [ -z "$2" ]; then tazpkg -h search; exit 1; fi
   1.518  
   1.519 -		title 'Search result for "%s"' "$PATTERN"
   1.520 -		# Default is to search in installed pkgs and the raw list.
   1.521 +		# Extend short options to long analogs
   1.522  		case "$3" in
   1.523 -			-i) installed='yes';;
   1.524 -			-l) list='yes';;
   1.525 -			-m) mirror='yes';;
   1.526 +			-i) export installed='yes';;
   1.527 +			-l) export list='yes';;
   1.528 +			-m) export mirror='yes';;
   1.529  		esac
   1.530  
   1.531 -		[ -n "$installed" ] && search_in_installed_packages
   1.532 -		[ -n "$list"      ] && search_in_packages_list
   1.533 -		[ -n "$mirror"    ] && search_in_packages_txt
   1.534 -		if [ -z "$installed$list$mirror" ]; then
   1.535 -			search_in_installed_packages
   1.536 -			search_in_packages_list
   1.537 -		fi
   1.538 +		@@MODULES@@/search pkg "$2"
   1.539  		;;
   1.540  
   1.541  
   1.542  	search-file|-sf)
   1.543  		# Search for a file by pattern or name in all files.list.
   1.544 -		if [ -z "$2" ]; then
   1.545 -			newline
   1.546 -			_ 'Please specify a pattern or file name to search for.'
   1.547 -			echo "$(_ 'Example:') 'tazpkg search-file libnss'"
   1.548 -			newline
   1.549 -			exit 0
   1.550 -		fi
   1.551 -		title 'Search result for file "%s"' "$2"
   1.552 -		TMPLIST=$(mktemp)
   1.553 +		if [ -z "$2" ]; then tazpkg -h search-file; exit 1; fi
   1.554  
   1.555 -		if [ -n "$mirror" ]; then
   1.556 -			TMPDIR=$(mktemp -d)
   1.557 -			for i in $PKGS_DB/files.list.lzma $PKGS_DB/undigest/*/files.list.lzma; do
   1.558 -				[ -f $i ] || continue
   1.559 -				lzcat $i | awk -F: -vtmp="$TMPLIST" -vdir="$TMPDIR" \
   1.560 -					-vfile="$2" -vcfile="$(colorize 32 $2)" '
   1.561 -					BEGIN { efile = gensub("\+", "\\\+", "g", file); }
   1.562 -					index($2, file) {
   1.563 -						gsub(efile, cfile, $2);
   1.564 -						print $2 >> dir"/"$1;
   1.565 -						printf "1" >> tmp;
   1.566 -					}'
   1.567 -			done
   1.568 -
   1.569 -			for pkg in $(cd $TMPDIR; ls); do
   1.570 -				newline
   1.571 -				emsg "<c 33>$(_ 'Package %s:' $pkg)</c>"
   1.572 -				cat $TMPDIR/$pkg
   1.573 -			done
   1.574 -
   1.575 -			rm -r $TMPDIR
   1.576 -
   1.577 -		else
   1.578 -
   1.579 -			# Check all pkg files.list in search match which specify the package
   1.580 -			# name and the full path to the file(s).
   1.581 -			for pkg in $INSTALLED/*; do
   1.582 -				if grep -qs "$2" $pkg/files.list; then
   1.583 -					. $pkg/receipt
   1.584 -					newline
   1.585 -					emsg "<c 33>$(_ 'Package %s:' "$PACKAGE")</c>"
   1.586 -					awk -vtmp="$TMPLIST" -vfile="$2" -vcfile="$(colorize 32 $2)" '
   1.587 -						BEGIN { efile = gensub("\+", "\\\+", "g", file); }
   1.588 -						index($0, file) {
   1.589 -							gsub(efile, cfile);
   1.590 -							print " "$0;
   1.591 -							printf "1" >> tmp;
   1.592 -						}
   1.593 -					' $pkg/files.list
   1.594 -				fi
   1.595 -			done
   1.596 -
   1.597 -		fi
   1.598 -
   1.599 -		num=$(wc -m < $TMPLIST); rm $TMPLIST
   1.600 -		footer "$(_p '%s file' '%s files' "$num" \
   1.601 -			"$(colorize 32 $num)")"
   1.602 +		@@MODULES@@/search file "$2"
   1.603  		;;
   1.604  
   1.605  
   1.606  	search-pkgname|-sp)
   1.607  		# Search for a package name
   1.608 -		if [ -z "$2" ]; then
   1.609 -			newline
   1.610 -			_ 'Please specify a pattern or file name to search for.'
   1.611 -			echo "$(_ 'Example:') 'tazpkg search-pkgname libnss'"
   1.612 -			newline
   1.613 -			exit 0
   1.614 -		fi
   1.615 -		title 'Search result for package "%s"' "$2"
   1.616 +		if [ -z "$2" ]; then tazpkg -h search-pkgname; exit 1; fi
   1.617  
   1.618 -		# Search for a file on mirror and output only the package name
   1.619 -		TMPLIST=$(mktemp)
   1.620 -		for i in $PKGS_DB/files.list.lzma $PKGS_DB/undigest/*/files.list.lzma; do
   1.621 -				[ -f "$i" ] || continue
   1.622 -				lzcat $i | awk -F: -vT=$TMPLIST -vterm="$2" '
   1.623 -					BEGIN { P = "" }
   1.624 -					index($2, term) {
   1.625 -						if ($1 != P) {
   1.626 -							print $1;
   1.627 -							printf "1" >> T;
   1.628 -							P = $1
   1.629 -						}
   1.630 -					}'
   1.631 -		done
   1.632 -		match=$(wc -m < $TMPLIST)
   1.633 -		rm $TMPLIST
   1.634 -
   1.635 -		footer "$(emsg "$(_p \
   1.636 -			'%s package' '%s packages' $match \
   1.637 -			"<c 32>$match</c>")")"
   1.638 +		@@MODULES@@/search file2 "$2"
   1.639  		;;
   1.640  
   1.641  
   1.642  	install|-i)
   1.643  		# Install .tazpkg packages.
   1.644 -		check_root $@
   1.645 +		check_root $1
   1.646  		check_for_package_on_cmdline
   1.647  		check_for_package_file
   1.648  		check_for_installed_info
   1.649 @@ -1564,17 +1060,6 @@
   1.650  
   1.651  		[ -n "$list" ] && INSTALL_LIST="$list"
   1.652  
   1.653 -		if [ -n "$rootconfig" ]; then					# What about this parameter? Is it obsolete?
   1.654 -			if [ -n "$root" ]; then
   1.655 -				CACHE_DIR="$root/$CACHE_DIR"
   1.656 -				SAVE_CACHE_DIR="$CACHE_DIR"
   1.657 -				PKGS_DB="$root/$PKGS_DB"
   1.658 -			else
   1.659 -				echo "rootconfig needs --root= option used." >&2
   1.660 -				exit 1
   1.661 -			fi
   1.662 -		fi
   1.663 -
   1.664  		# Get repositories priority list.
   1.665  		look_for_priority
   1.666  
   1.667 @@ -1592,21 +1077,14 @@
   1.668  
   1.669  	install-list|get-install-list)
   1.670  		# Install a set of packages from a list.
   1.671 -		check_root $@
   1.672 +		check_root $1
   1.673  
   1.674 -		if [ -z "$2" ]; then
   1.675 -			newline
   1.676 -			longline "$(_ \
   1.677 -"Please change directory (cd) to the packages repository and specify the \
   1.678 -list of packages to install.")"
   1.679 -			echo "$(_ 'Example:') $(emsg '<b>tazpkg install-list</b> <c 33>packages.list</c>')"
   1.680 -			exit 0
   1.681 -		fi
   1.682 +		if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
   1.683  
   1.684  		# Check if the packages list exists.
   1.685  		if [ ! -f "$2" ]; then
   1.686  			_ 'Unable to find list "%s"' "$2"
   1.687 -			exit 0
   1.688 +			exit 1
   1.689  		fi
   1.690  
   1.691  		LIST=$(cat $2)
   1.692 @@ -1634,176 +1112,47 @@
   1.693  			[ -d "$root/var/lib/tazpkg/installed" ] && 
   1.694  			tazpkg $COMMAND $pkg --list="$2" "$3" "$4" "$5"
   1.695  		done
   1.696 -		rm -f $2-processed ;;
   1.697 +		rm -f $2-processed
   1.698 +		;;
   1.699  
   1.700  
   1.701  	add-flavor)
   1.702  		# Install a set of packages from a flavor.
   1.703 -		install_flavor $2 ;;
   1.704 -
   1.705 -
   1.706 +		check_root $1
   1.707 +		shift; @@MODULES@@/flavor $@
   1.708 +		;;
   1.709  	install-flavor)
   1.710  		# Install a set of packages from a flavor and purge other ones.
   1.711 -		install_flavor $2 --purge ;;
   1.712 +		check_root $1
   1.713 +		shift; purge='yes' @@MODULES@@/flavor $@
   1.714 +		;;
   1.715  
   1.716  
   1.717  	set-release)
   1.718  		# Change current release and upgrade packages.
   1.719 +		check_root $1
   1.720 +		if [ -z "$2" ]; then tazpkg -h "$1"; exit 1; fi
   1.721  		RELEASE="$2"
   1.722 -		if [ -z "$RELEASE" ]; then
   1.723 -			newline
   1.724 -			_ 'Please specify the release you want on the command line.'
   1.725 -			echo "$(_ 'Example:') tazpkg set-release cooking"
   1.726 -			newline
   1.727 -			exit 0
   1.728 -		fi
   1.729 -		rm $PKGS_DB/mirror
   1.730 -		echo "$RELEASE" > /etc/slitaz-release
   1.731 +		rm "$PKGS_DB/mirror"
   1.732 +		echo "$RELEASE" > "$root/etc/slitaz-release"
   1.733  		tazpkg recharge && tazpkg upgrade
   1.734  
   1.735  		# Install missing depends
   1.736 -		cd $INSTALLED
   1.737 +		cd "$INSTALLED"
   1.738  		for i in * ; do
   1.739 -			DEPENDS=''
   1.740 -			. $i/receipt
   1.741 -			for j in $DEPENDS ; do
   1.742 -				[ -d $j ] || tazpkg get-install $j
   1.743 +			unset DEPENDS; . "$i/receipt"
   1.744 +			for j in $DEPENDS; do
   1.745 +				[ -d "$j" ] || tazpkg get-install "$j"
   1.746  			done
   1.747 -		done ;;
   1.748 +		done
   1.749 +		;;
   1.750  
   1.751  
   1.752  	remove|-r)
   1.753  		# Remove packages.
   1.754 -		check_root $@
   1.755 +		check_root $1
   1.756  		check_for_package_on_cmdline
   1.757 -		check_for_installed_info
   1.758 -
   1.759 -		[ -n "$root" ] && ROOT="$root"
   1.760 -
   1.761 -		if [ ! -f "$ROOT$INSTALLED/$PACKAGE/receipt" ]; then
   1.762 -			newline; _ 'Package "%s" is not installed.' "$PACKAGE"
   1.763 -			exit 0
   1.764 -		fi
   1.765 -
   1.766 -		. "$ROOT$INSTALLED/$PACKAGE/receipt"
   1.767 -
   1.768 -		# Info #1: dependent packages (to be processed later)
   1.769 -		ALTERED="$(awk -F$'\t' -vp=" $PACKAGE " '
   1.770 -			index(" " $8 " ", p) { printf "  %s\n", $1 }
   1.771 -			' $ROOT/$PKGS_DB/installed.info)"
   1.772 -
   1.773 -		if [ -n "$ALTERED" ]; then
   1.774 -			_ 'The following packages depend on package "%s":' "$PACKAGE"
   1.775 -			echo "$ALTERED"
   1.776 -		fi
   1.777 -
   1.778 -		# Info #2: changed packages (to be processed later)
   1.779 -		REFRESH=$(cd $ROOT$INSTALLED ; grep -sl "^$PACKAGE$" */modifiers)
   1.780 -
   1.781 -		if [ -n "$REFRESH" ]; then
   1.782 -			_ 'The following packages have been modified by package "%s":' "$PACKAGE"
   1.783 -			for i in $REFRESH; do
   1.784 -				echo "  ${i%/modifiers}"
   1.785 -			done
   1.786 -		fi
   1.787 -
   1.788 -		# Confirmation
   1.789 -		if im && [ -z "$auto" ]; then
   1.790 -			confirm "$(_ 'Remove package "%s" (%s)? (y/N)' "$PACKAGE" "$VERSION$EXTRAVERSION")"
   1.791 -			if [ "$?" -ne 0 ]; then
   1.792 -				newline; _ 'Uninstallation of package "%s" cancelled.' "$PACKAGE"
   1.793 -				exit 0
   1.794 -			fi
   1.795 -		fi
   1.796 -		# We are here: non-interactive mode, or --auto, or answer 'y'
   1.797 -
   1.798 -		# Removing package
   1.799 -		title 'Removing package "%s"' "$PACKAGE"
   1.800 -
   1.801 -		# [1/4] Pre-remove commands
   1.802 -		if grep -q ^pre_remove "$ROOT$INSTALLED/$PACKAGE/receipt"; then
   1.803 -			action "Execution of pre-remove commands..."
   1.804 -			pre_remove $ROOT
   1.805 -			status
   1.806 -		fi
   1.807 -
   1.808 -		# [2/4] Removing files
   1.809 -		action "Removing all files installed..."
   1.810 -		if [ -f "$ROOT$INSTALLED/$PACKAGE/modifiers" ]; then
   1.811 -			for file in $(cat "$ROOT$INSTALLED/$PACKAGE/files.list"); do
   1.812 -				for mod in $(cat "$ROOT$INSTALLED/$PACKAGE/modifiers"); do
   1.813 -					[ -f "$ROOT$INSTALLED/$mod/files.list" ] && \
   1.814 -					[ $(grep "^$(echo $file | grepesc)$" $ROOT$INSTALLED/$mod/files.list | wc -l) -gt 1 ] && \
   1.815 -					continue 2
   1.816 -				done
   1.817 -				remove_with_path $ROOT$file
   1.818 -			done
   1.819 -		else
   1.820 -			for file in $(cat "$ROOT$INSTALLED/$PACKAGE/files.list"); do
   1.821 -				remove_with_path $ROOT$file
   1.822 -			done
   1.823 -		fi
   1.824 -		status
   1.825 -
   1.826 -		# [3/4] Post-remove commands
   1.827 -		if grep -q ^post_remove "$ROOT$INSTALLED/$PACKAGE/receipt"; then
   1.828 -			action 'Execution of post-remove commands...'
   1.829 -			post_remove $ROOT
   1.830 -			status
   1.831 -		fi
   1.832 -
   1.833 -		# [4/4] Remove package receipt and remove it from databases
   1.834 -		action 'Removing package receipt...'
   1.835 -		rm -rf "$ROOT$INSTALLED/$PACKAGE"
   1.836 -		sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION.tazpkg$/d" $PKGS_DB/installed.$SUM
   1.837 -		sed -i "/^$PACKAGE	/d" $PKGS_DB/installed.info
   1.838 -		status
   1.839 -
   1.840 -		footer "$(_ 'Package "%s" (%s) removed.' "$PACKAGE" "$VERSION$EXTRAVERSION")"
   1.841 -
   1.842 -		# Log this activity
   1.843 -		log_pkg Removed
   1.844 -
   1.845 -		# Stop if non-interactive mode and no --auto option
   1.846 -		if ! im && [ -z "$auto" ]; then exit 0; fi
   1.847 -
   1.848 -		# Process dependent packages
   1.849 -		if [ -n "$ALTERED" ]; then
   1.850 -			if [ -n "$auto" ]; then
   1.851 -				answer=0
   1.852 -			else
   1.853 -				confirm "$(_ 'Remove packages depending on package "%s"? (y/N)' "$PACKAGE")"
   1.854 -				answer=$?
   1.855 -			fi
   1.856 -			if [ "$answer" -eq 0 ]; then
   1.857 -				for i in $ALTERED; do
   1.858 -					if [ -d "$ROOT$INSTALLED/$i" ]; then
   1.859 -						echo "tazpkg remove $i $ROOTOPTS"
   1.860 -					fi
   1.861 -				done
   1.862 -			fi
   1.863 -		fi
   1.864 -
   1.865 -		# Process changed packages
   1.866 -		if [ -n "$REFRESH" ]; then
   1.867 -			if [ -n "$auto" ]; then
   1.868 -				answer=0
   1.869 -			else
   1.870 -				confirm "$(_ 'Reinstall packages modified by package "%s"? (y/N)' "$PACKAGE")"
   1.871 -				answer=$?
   1.872 -			fi
   1.873 -			if [ "$answer" -eq 0 ]; then
   1.874 -				for i in $REFRESH; do
   1.875 -					if [ "$(wc -l < $ROOT$INSTALLED/$i)" -gt 1 ]; then
   1.876 -						_ 'Check %s for reinstallation' "$INSTALLED/$i"
   1.877 -						continue
   1.878 -					fi
   1.879 -					rm -r $ROOT$INSTALLED/$i
   1.880 -					tazpkg get-install ${i%/modifiers} $ROOTOPTS --forced
   1.881 -				done
   1.882 -			fi
   1.883 -		fi
   1.884 -
   1.885 +		shift; @@MODULES@@/remove $@
   1.886  		;;
   1.887  
   1.888  
   1.889 @@ -1861,7 +1210,8 @@
   1.890  
   1.891  		cd "$TOP_DIR"
   1.892  		rm -rf $TMP_DIR
   1.893 -		separator; newline ;;
   1.894 +		separator; newline
   1.895 +		;;
   1.896  
   1.897  
   1.898  	repack-config)
   1.899 @@ -1907,77 +1257,7 @@
   1.900  		# Create SliTaz package archive from an installed package.
   1.901  		check_for_package_on_cmdline
   1.902  		check_for_receipt
   1.903 -		EXTRAVERSION=''
   1.904 -		. "$INSTALLED/$PACKAGE/receipt"
   1.905 -		title 'Repacking "%s"' "$PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
   1.906 -
   1.907 -		if grep -qs ^NO_REPACK= "$INSTALLED/$PACKAGE/receipt"; then
   1.908 -			_ "Can't repack package \"%s\"" "$PACKAGE"
   1.909 -			exit 1
   1.910 -		fi
   1.911 -
   1.912 -		if [ -s "$INSTALLED/$PACKAGE/modifiers" ]; then
   1.913 -			_ "Can't repack, \"%s\" files have been modified by:" "$PACKAGE"
   1.914 -			for i in $(cat "$INSTALLED/$PACKAGE/modifiers"); do
   1.915 -				echo "  $i"
   1.916 -			done
   1.917 -			exit 1
   1.918 -		fi
   1.919 -
   1.920 -		MISSING=''
   1.921 -		while read i; do
   1.922 -			[ -e "$i" ] && continue
   1.923 -			[ -L "$i" ] || MISSING="$MISSING\n  $i"
   1.924 -		done < "$INSTALLED/$PACKAGE/files.list"
   1.925 -		if [ -n "$MISSING" ]; then
   1.926 -			_n "Can't repack, the following files are lost:"
   1.927 -			echo -e "$MISSING"
   1.928 -			exit 1
   1.929 -		fi
   1.930 -
   1.931 -		mkdir -p $TMP_DIR; cd $TMP_DIR
   1.932 -		FILES="fs.cpio.lzma\n"
   1.933 -		for i in $(ls "$INSTALLED/$PACKAGE"); do
   1.934 -			case $i in
   1.935 -				volatile.cpio.gz|modifiers) ;;
   1.936 -				*) cp "$INSTALLED/$PACKAGE/$i" .; FILES="$FILES$i\n" ;;
   1.937 -			esac
   1.938 -		done
   1.939 -
   1.940 -		ln -s / rootfs
   1.941 -		mkdir tmp
   1.942 -		sed 's/^/rootfs/' < files.list | cpio -o -H newc --quiet | \
   1.943 -			{ cd tmp ; cpio -idm --quiet >/dev/null; cd ..; }
   1.944 -		mv tmp/rootfs fs
   1.945 -
   1.946 -		if [ -f  "$INSTALLED/$PACKAGE/volatile.cpio.gz" ]; then
   1.947 -			zcat "$INSTALLED/$PACKAGE/volatile.cpio.gz" | \
   1.948 -				{ cd fs; cpio -idm --quiet; cd ..; }
   1.949 -		fi
   1.950 -
   1.951 -		if fgrep -q repack_cleanup "$INSTALLED/$PACKAGE/receipt"; then
   1.952 -			. "$INSTALLED/$PACKAGE/receipt"
   1.953 -			repack_cleanup fs
   1.954 -		fi
   1.955 -
   1.956 -		if [ -f "$INSTALLED/$PACKAGE/$CHECKSUM" ]; then
   1.957 -			sed 's,  ,  fs,' < "$INSTALLED/$PACKAGE/$CHECKSUM" | \
   1.958 -			$CHECKSUM -s -c || {
   1.959 -				_ "Can't repack, %s error." "$CHECKSUM"
   1.960 -				cd "$TOP_DIR"
   1.961 -				rm -rf $TMP_DIR
   1.962 -				exit 1
   1.963 -			}
   1.964 -		fi
   1.965 -
   1.966 -		find fs | cpio -o -H newc --quiet | lzma e fs.cpio.lzma -si
   1.967 -		echo -e "$FILES" | cpio -o -H newc --quiet > \
   1.968 -			"$TOP_DIR/$PACKAGE-$VERSION$EXTRAVERSION.tazpkg"
   1.969 -		cd "$TOP_DIR"
   1.970 -		\rm -R $TMP_DIR
   1.971 -		_ 'Package "%s" repacked successfully.' "$PACKAGE"
   1.972 -		_ 'Size: %s' "$(du -sh "$PACKAGE-$VERSION$EXTRAVERSION.tazpkg")"
   1.973 -		newline
   1.974 +		shift; @@MODULES@@/repack $@
   1.975  		;;
   1.976  
   1.977  
   1.978 @@ -1985,65 +1265,7 @@
   1.979  		# Create SliTaz package archive using cpio and lzma.
   1.980  		# TODO: Cook also pack packages, we should share code in libpkg.sh
   1.981  		check_for_package_on_cmdline
   1.982 -		cd "$PACKAGE"
   1.983 -		if [ ! -f 'receipt' ]; then
   1.984 -			_ 'Receipt is missing. Please read the documentation.'
   1.985 -			exit 0
   1.986 -		fi
   1.987 -
   1.988 -		title 'Packing package "%s"' "$PACKAGE"
   1.989 -		# Create files.list with redirecting find outpout.
   1.990 -
   1.991 -		action 'Creating the list of files...'
   1.992 -		cd fs
   1.993 -		find . -type f -print > ../files.list
   1.994 -		find . -type l -print >> ../files.list
   1.995 -		cd ..; sed -i s/'^.'/''/ files.list
   1.996 -		status
   1.997 -
   1.998 -		action 'Creating %s of files...' "$CHECKSUM"
   1.999 -		while read file; do
  1.1000 -			[ -L "fs$file" ] && continue
  1.1001 -			[ -f "fs$file" ] || continue
  1.1002 -			case "$file" in
  1.1003 -				/lib/modules/*/modules.*|*.pyc) continue;;
  1.1004 -			esac
  1.1005 -			$CHECKSUM "fs$file" | sed 's/  fs/  /'
  1.1006 -		done < files.list > $CHECKSUM
  1.1007 -		status
  1.1008 -
  1.1009 -		UNPACKED_SIZE=$(du -chs fs receipt files.list $CHECKSUM \
  1.1010 -			description.txt 2>/dev/null | awk 'END { print $1 }')
  1.1011 -
  1.1012 -		# Build cpio archives.
  1.1013 -		action "Compressing the FS..."
  1.1014 -		find fs | cpio -o -H newc --quiet | case "$TAZPKG_PACK" in
  1.1015 -		gzip) gzip -9 > fs.cpio.gz ;;
  1.1016 -		*) lzma e fs.cpio.lzma -si ;;
  1.1017 -		esac
  1.1018 -		rm -rf fs
  1.1019 -		status
  1.1020 -
  1.1021 -		PACKED_SIZE=$(du -chs fs.cpio.lzma receipt files.list \
  1.1022 -			$CHECKSUM description.txt 2>/dev/null | awk 'END { print $1 }')
  1.1023 -
  1.1024 -		action "Updating receipt sizes..."
  1.1025 -		sed -i s/^PACKED_SIZE.*$// receipt
  1.1026 -		sed -i s/^UNPACKED_SIZE.*$// receipt
  1.1027 -		sed -i "s/^PACKAGE=/PACKED_SIZE=\"$PACKED_SIZE\"\nUNPACKED_SIZE=\"$UNPACKED_SIZE\"\nPACKAGE=/" receipt
  1.1028 -		status
  1.1029 -
  1.1030 -		action "Creating full cpio archive..."
  1.1031 -		find . -print | cpio -o -H newc --quiet > "../$PACKAGE.tazpkg"
  1.1032 -		status
  1.1033 -
  1.1034 -		action "Restoring original package tree..."
  1.1035 -		unlzma < fs.cpio.lzma | cpio -idm --quiet
  1.1036 -		status
  1.1037 -
  1.1038 -		rm fs.cpio.lzma && cd ..
  1.1039 -		footer "$(_ 'Package "%s" compressed successfully.' "$PACKAGE")"
  1.1040 -		_ 'Size: %s' "$(ls -lh "$PACKAGE.tazpkg" | awk '{print $5}')"
  1.1041 +		shift; @@MODULES@@/pack $@
  1.1042  		;;
  1.1043  
  1.1044  
  1.1045 @@ -2053,19 +1275,13 @@
  1.1046  		# WARNING: The 'mirrors' file has all SliTaz mirrors but 'mirror'
  1.1047  		# must have only the chosen main mirror.
  1.1048  		#
  1.1049 -		check_root $@
  1.1050 -		@@MODULES@@/recharge $2
  1.1051 +		check_root $1
  1.1052 +		shift; @@MODULES@@/recharge $@
  1.1053  		;;
  1.1054  
  1.1055  
  1.1056 -	help-up)
  1.1057 -		# Options available for the command: up
  1.1058 -		newline; usage_up; newline
  1.1059 -		exit 1 ;;
  1.1060 -
  1.1061 -
  1.1062  	up|upgrade)
  1.1063 -		check_root $@
  1.1064 +		check_root $1
  1.1065  		#
  1.1066  		# This is the new way to upgrade packages making 'upgrade' and
  1.1067  		# upgradeable out-of-date. This new way is much, much more faster!
  1.1068 @@ -2105,194 +1321,21 @@
  1.1069  EOT
  1.1070  			fi
  1.1071  		done
  1.1072 -		footer "$MSG" ;;
  1.1073 +		footer "$MSG"
  1.1074 +		;;
  1.1075  
  1.1076  
  1.1077  	check)
  1.1078  		# Check installed packages set.
  1.1079 -		#check_root $@
  1.1080 +		shift; @@MODULES@@/check $@
  1.1081 +		;;
  1.1082  
  1.1083 -		# Get repositories priority list.
  1.1084 -		look_for_priority
  1.1085  
  1.1086 -		cd $INSTALLED
  1.1087 -		if [ -z "$2" -o -n "$full" ]; then PACKAGES="$(ls)"; else PACKAGES="$2"; fi
  1.1088 -		PACKAGE_PRINTED=''
  1.1089 -
  1.1090 -		for PACKAGE in $PACKAGES; do
  1.1091 -
  1.1092 -			if [ ! -f "$PACKAGE/receipt" ]; then
  1.1093 -				print_pkgname
  1.1094 -				_ 'The package installation has not completed'
  1.1095 -				continue
  1.1096 -			fi
  1.1097 -
  1.1098 -			DEPENDS=''
  1.1099 -			EXTRAVERSION=''
  1.1100 -			. "$PACKAGE/receipt"
  1.1101 -			if [ -s "$PACKAGE/modifiers" ]; then
  1.1102 -				print_pkgname
  1.1103 -				_ 'The package has been modified by:'
  1.1104 -				awk '{print "  " $0}' "$PACKAGE/modifiers"
  1.1105 -			fi
  1.1106 -
  1.1107 -			MSG="$(_n 'Files lost from package:')\n"
  1.1108 -			while read file; do
  1.1109 -				[ -e "$file" ] && continue
  1.1110 -				if [ -L "$file" ]; then
  1.1111 -					MSG="$MSG  $(_n 'target of symlink')"
  1.1112 -				fi
  1.1113 -				print_pkgname
  1.1114 -				echo -e "$MSG  $file"
  1.1115 -				MSG=''
  1.1116 -			done < "$PACKAGE/files.list"
  1.1117 -
  1.1118 -			MSG="$(_n 'Missing dependencies for package:')\n"
  1.1119 -			for i in $DEPENDS; do
  1.1120 -				[ -d $i ] && continue
  1.1121 -				[ -d $(equivalent_pkg $i) ] && continue
  1.1122 -				print_pkgname
  1.1123 -				echo -e "$MSG  $i"
  1.1124 -				MSG=''
  1.1125 -			done
  1.1126 -
  1.1127 -			MSG="$(_n 'Dependencies loop between package and:')\n"
  1.1128 -			ALL_DEPS=''
  1.1129 -			check_for_deps_loop "$PACKAGE" "$DEPENDS"
  1.1130 -		done
  1.1131 -		[ -n "$PACKAGE_PRINTED" ] && footer
  1.1132 -
  1.1133 -		_ 'Looking for known bugs...'
  1.1134 -		if [ -z "$2" -o -n "$full" ]; then tazpkg bugs; else tazpkg bugs "$2"; fi
  1.1135 -
  1.1136 -
  1.1137 -		if [ -n "$full" ]; then
  1.1138 -			separator
  1.1139 -
  1.1140 -			title 'Mismatch checksum of installed files:'
  1.1141 -
  1.1142 -			for PACKAGE in $PACKAGES; do
  1.1143 -				file="$PACKAGE/$CHECKSUM"
  1.1144 -				CONFIG_FILES=''
  1.1145 -				. "$PACKAGE/receipt"
  1.1146 -				[ -s "$file" ] || continue
  1.1147 -				while read md5 f; do
  1.1148 -					[ -f $f ] || continue
  1.1149 -					for i in $CONFIG_FILES; do
  1.1150 -						case "$f" in
  1.1151 -							$i|$i/*) continue 2;;
  1.1152 -						esac
  1.1153 -					done
  1.1154 -					echo "$md5  $f"
  1.1155 -				done < "$file" | busybox $CHECKSUM -c - 2>/dev/null | \
  1.1156 -				  grep -v OK$ | sed "s/: FAILED$//"
  1.1157 -			done
  1.1158 -			footer
  1.1159 -
  1.1160 -			title 'Check file providers:'
  1.1161 -			FILES=' '
  1.1162 -			for PACKAGE in $PACKAGES; do
  1.1163 -				for file in $(cat "$PACKAGE/files.list"); do
  1.1164 -					[ -d "$file" ] && continue
  1.1165 -					case "$FILES" in
  1.1166 -						*\ $file\ *) continue;;
  1.1167 -					esac
  1.1168 -					[ $(grep "^$(echo $file | grepesc)$" */files.list 2> /dev/null | \
  1.1169 -						wc -l) -gt 1 ] || continue
  1.1170 -					FILES="$FILES$file "
  1.1171 -					newline
  1.1172 -					_ 'The following packages provide file "%s":' $file
  1.1173 -					grep -l "^$(echo $file | grepesc)$" */files.list | \
  1.1174 -					while read f; do
  1.1175 -						pkg=${f%/files.list}
  1.1176 -						if [ -f $pkg/modifiers ]; then
  1.1177 -							overriders=$(_n '(overridden by %s)' "$(tr '\n' ' ' < $pkg/modifiers | sed 's| $||')")
  1.1178 -						else
  1.1179 -							overriders=''
  1.1180 -						fi
  1.1181 -						echo -n "  * $pkg $overriders"
  1.1182 -						newline
  1.1183 -					done
  1.1184 -				done
  1.1185 -			done
  1.1186 -			footer
  1.1187 -
  1.1188 -			if [ -n "$full" ]; then
  1.1189 -				title 'Alien files:'
  1.1190 -				MSG="$(_n 'No package has installed the following files:')\n"
  1.1191 -				find /etc /bin /sbin /lib /usr /var/www -not -type d 2>/dev/null | \
  1.1192 -				while read file; do
  1.1193 -					case "$file" in *\[*) continue;; esac
  1.1194 -					grep -q "^$(echo $file | grepesc)$" */files.list && continue
  1.1195 -					echo -e "$MSG  $file"
  1.1196 -					MSG=''
  1.1197 -				done
  1.1198 -				footer
  1.1199 -			fi
  1.1200 -		fi
  1.1201 -		_ 'Check completed.'; newline ;;
  1.1202 -
  1.1203 -
  1.1204 -	block|-b)
  1.1205 -		# Add a pkg name to the list of blocked packages.
  1.1206 +	block|-b|unblock|-u|chblock)
  1.1207 +		# Add/remove a pkg name to the list of blocked packages.
  1.1208  		check_root $@
  1.1209  		check_for_package_on_cmdline
  1.1210 -		newline
  1.1211 -		if [ ! -d "$INSTALLED/$PACKAGE" ]; then
  1.1212 -			_ 'Package "%s" is not installed.' "$PACKAGE"; exit
  1.1213 -		fi
  1.1214 -		if grep -qs "^$PACKAGE" $BLOCKED; then
  1.1215 -			_ 'Package "%s" is already blocked.' "$PACKAGE"
  1.1216 -		else
  1.1217 -			echo "$PACKAGE" >> $BLOCKED
  1.1218 -			# Log this activity
  1.1219 -			. "$INSTALLED/$PACKAGE/receipt"; log_pkg Blocked
  1.1220 -			_ 'Package "%s" blocked.' "$PACKAGE"
  1.1221 -		fi
  1.1222 -		newline
  1.1223 -		;;
  1.1224 -
  1.1225 -
  1.1226 -	unblock|-u)
  1.1227 -		# Remove a pkg name from the list of blocked packages.
  1.1228 -		check_root $@
  1.1229 -		check_for_package_on_cmdline
  1.1230 -		newline
  1.1231 -		if [ ! -d "$INSTALLED/$PACKAGE" ]; then
  1.1232 -			_ 'Package "%s" is not installed.' "$PACKAGE"; exit
  1.1233 -		fi
  1.1234 -		if grep -qs "^$PACKAGE" $BLOCKED; then
  1.1235 -			sed -i "/^$PACKAGE\$/d" $BLOCKED
  1.1236 -			# Log this activity
  1.1237 -			. "$INSTALLED/$PACKAGE/receipt"; log_pkg Unblocked
  1.1238 -			_ 'Package "%s" unblocked.' "$PACKAGE"
  1.1239 -		else
  1.1240 -			_ 'Package "%s" is not blocked.' "$PACKAGE"
  1.1241 -		fi
  1.1242 -		newline
  1.1243 -		;;
  1.1244 -
  1.1245 -
  1.1246 -	chblock)
  1.1247 -		# Change package's blocked status.
  1.1248 -		check_root $@
  1.1249 -		check_for_package_on_cmdline
  1.1250 -		newline
  1.1251 -		if [ ! -d "$INSTALLED/$PACKAGE" ]; then
  1.1252 -			_ 'Package "%s" is not installed.' "$PACKAGE"; exit
  1.1253 -		fi
  1.1254 -		if grep -qs "^$PACKAGE" $BLOCKED; then
  1.1255 -			sed -i "/^$PACKAGE\$/d" $BLOCKED
  1.1256 -			# Log this activity
  1.1257 -			. "$INSTALLED/$PACKAGE/receipt"; log_pkg Unblocked
  1.1258 -			_ 'Package "%s" unblocked.' "$PACKAGE"
  1.1259 -		else
  1.1260 -			echo "$PACKAGE" >> $BLOCKED
  1.1261 -			# Log this activity
  1.1262 -			. "$INSTALLED/$PACKAGE/receipt"; log_pkg Blocked
  1.1263 -			_ 'Package "%s" blocked.' "$PACKAGE"
  1.1264 -		fi
  1.1265 -		newline
  1.1266 +		@@MODULES@@/block $@
  1.1267  		;;
  1.1268  
  1.1269  
  1.1270 @@ -2357,17 +1400,6 @@
  1.1271  		[ -n "$root" ] && ROOT="$root" && check_base_dir "$root"
  1.1272  		[ -n "$list" ] && INSTALL_LIST="$list"					# internal option
  1.1273  
  1.1274 -		if [ -n "$rootconfig" ]; then							# outdated?
  1.1275 -			if [ -n "$root" ]; then
  1.1276 -				CACHE_DIR="$root/$CACHE_DIR"
  1.1277 -				SAVE_CACHE_DIR="$CACHE_DIR"
  1.1278 -				PKGS_DB="$root/$PKGS_DB"
  1.1279 -			else
  1.1280 -				_ 'rootconfig needs --root= option used.' >&2
  1.1281 -				exit 1
  1.1282 -			fi
  1.1283 -		fi
  1.1284 -
  1.1285  		# Get repositories priority list.
  1.1286  		look_for_priority
  1.1287  
  1.1288 @@ -2440,76 +1472,30 @@
  1.1289  
  1.1290  
  1.1291  	list-undigest)
  1.1292 -		# list undigest URLs.
  1.1293 -		if [ -n "$box" ]; then
  1.1294 -			for i in $PKGS_DB/undigest/*/mirror; do
  1.1295 -				[ -f "$i" ] || continue
  1.1296 -				echo "$(basename "$(dirname "$i")")|$(cat "$i")"
  1.1297 -			done
  1.1298 -		else
  1.1299 -			title 'Current undigest(s)'
  1.1300 -			for i in $PKGS_DB/undigest/*/mirror; do
  1.1301 -				if [ ! -f "$i" ]; then
  1.1302 -					_ 'No undigest mirror found.'
  1.1303 -					exit 1
  1.1304 -				fi
  1.1305 -				echo "$(basename "$(dirname "$i")")"$'\t'"$(cat "$i")"
  1.1306 -			done
  1.1307 -			newline
  1.1308 -		fi
  1.1309 +		# List undigest mirrors
  1.1310 +		@@MODULES@@/mirror list
  1.1311  		;;
  1.1312 -
  1.1313 -
  1.1314  	remove-undigest)
  1.1315 -		# remove undigest URL.
  1.1316 +		# Remove undigest mirror
  1.1317 +		check_root $1
  1.1318 +		shift; @@MODULES@@/mirror remove $@
  1.1319 +		;;
  1.1320 +	add-undigest|setup-undigest)
  1.1321 +		# Add undigest mirror
  1.1322 +		check_root $1
  1.1323 +		shift; @@MODULES@@/mirror add $@
  1.1324 +		;;
  1.1325 +	setup-mirror|-sm)
  1.1326 +		# Change main mirror
  1.1327  		check_root $@
  1.1328 -		undigest="$2"
  1.1329 -		if [ -d "$PKGS_DB/undigest/$2" ]; then
  1.1330 -			confirm "$(_ 'Remove "%s" undigest? (y/N)' $undigest)"
  1.1331 -			if [ $? == 0 ]; then
  1.1332 -				action 'Removing "%s" undigest...' $undigest
  1.1333 -				rm -rf $PKGS_DB/undigest/$2
  1.1334 -				status
  1.1335 -				rmdir $PKGS_DB/undigest 2>/dev/null
  1.1336 -			fi
  1.1337 -		else
  1.1338 -			_ 'Undigest "%s" not found' $undigest
  1.1339 -		fi
  1.1340 +		shift; @@MODULES@@/mirror setup $@
  1.1341  		;;
  1.1342  
  1.1343  
  1.1344 -	add-undigest|setup-undigest)
  1.1345 -		# Add undigest URL.
  1.1346 -		check_root $@
  1.1347 -
  1.1348 -		[ ! -d "$PKGS_DB/undigest" ] && mkdir "$PKGS_DB/undigest"
  1.1349 -
  1.1350 -		undigest="$2"
  1.1351 -		if [ -z "$undigest" ]; then
  1.1352 -			i='1'
  1.1353 -			while [ -d "$PKGS_DB/undigest/$i" ]; do
  1.1354 -				i=$(($i+1))
  1.1355 -			done
  1.1356 -			undigest="$i"
  1.1357 -		fi
  1.1358 -		if [ ! -d "$PKGS_DB/undigest/$undigest" ]; then
  1.1359 -			_ 'Creating new undigest "%s".' "$undigest"
  1.1360 -			mkdir "$PKGS_DB/undigest/$undigest"
  1.1361 -		fi
  1.1362 -		setup_mirror "$PKGS_DB/undigest/$undigest" "$3"
  1.1363 -		;;
  1.1364 -
  1.1365 -
  1.1366 -	setup-mirror|-sm)
  1.1367 -		# Change mirror URL.
  1.1368 -		check_root $@
  1.1369 -		setup_mirror $PKGS_DB $2 ;;
  1.1370 -
  1.1371 -
  1.1372  	reconfigure)
  1.1373  		# Replay post_install from receipt
  1.1374  		check_for_package_on_cmdline
  1.1375 -		check_root $@
  1.1376 +		check_root $1
  1.1377  
  1.1378  		ROOT="$root"
  1.1379  		if [ -d "$ROOT$INSTALLED/$PACKAGE" ]; then
  1.1380 @@ -2565,34 +1551,11 @@
  1.1381  
  1.1382  	depends)
  1.1383  		# Display dependencies tree
  1.1384 -		unset ALL_DEPS
  1.1385 -		mkdir $TMP_DIR
  1.1386 -		dep_scan $2 '' | tee "$TMP_DIR/depends"
  1.1387 -		if [ -n "$total" ]; then
  1.1388 -			separator
  1.1389 -			NUM="$(wc -l < "$TMP_DIR/depends")"
  1.1390 -			TOTAL="$(sed 's|.*(\([^)]*\))|\1|' "$TMP_DIR/depends" | hrsum)"
  1.1391 -			_p 'Total: %s package (%s)' 'Total: %s packages (%s)' "$NUM" \
  1.1392 -				"$NUM" "$TOTAL"
  1.1393 -			newline
  1.1394 -
  1.1395 -			if [ -n "$mark" ]; then
  1.1396 -				NUM="$(grep '^ *-' "$TMP_DIR/depends" | wc -l)"
  1.1397 -				TOTAL="$(grep '^ *-' "$TMP_DIR/depends" | sed 's|.*(\([^)]*\))|\1|' | hrsum)"
  1.1398 -				_p 'To install: %s package (%s)' 'To install: %s packages (%s)' "$NUM" \
  1.1399 -					"$NUM" "$TOTAL"
  1.1400 -				newline
  1.1401 -			fi
  1.1402 -		fi
  1.1403 -		rm -rf "$TMP_DIR"
  1.1404 +		shift; @@MODULES@@/depends depends $@
  1.1405  		;;
  1.1406 -
  1.1407 -
  1.1408  	rdepends)
  1.1409  		# Display reverse dependencies tree
  1.1410 -		cd $INSTALLED
  1.1411 -		unset ALL_DEPS
  1.1412 -		rdep_scan "$2"
  1.1413 +		shift; @@MODULES@@/depends rdepends $@
  1.1414  		;;
  1.1415  
  1.1416  
  1.1417 @@ -2604,7 +1567,7 @@
  1.1418  
  1.1419  
  1.1420  	link)
  1.1421 -		# link a package from another slitaz installation
  1.1422 +		# link a package from another SliTaz installation
  1.1423  		PACKAGE="$2"
  1.1424  		if [ ! -d "$TARGET_DIR" -o \
  1.1425  		     ! -d "$TARGET_DIR$INSTALLED/$PACKAGE" ]; then
  1.1426 @@ -2664,82 +1627,25 @@
  1.1427  
  1.1428  	help|-h)
  1.1429  		# TazPkg help system
  1.1430 -		shift; @@MODULES@@/help $@ ;;
  1.1431 +		shift; @@MODULES@@/help $@
  1.1432 +		;;
  1.1433  
  1.1434  
  1.1435  	mkdb)
  1.1436  		# Make TazPkg database
  1.1437 -		shift; @@MODULES@@/mkdb $@ ;;
  1.1438 +		shift; @@MODULES@@/mkdb $@
  1.1439 +		;;
  1.1440  
  1.1441  
  1.1442  	'')
  1.1443  		# Default to summary
  1.1444 -		title "$(_ 'SliTaz package manager - Version: %s' $(colorize 34 $VERSION))"
  1.1445 -
  1.1446 -		optlist "\
  1.1447 -$(_ 'Installed packages:')		$(wc -l < $PKGS_DB/installed.info)
  1.1448 -$(_ 'Installed files:')			$(cat $INSTALLED/*/files.list | wc -l)
  1.1449 -$(_ 'Blocked packages:')		$( (wc -l < $PKGS_DB/blocked-packages.list) 2>/dev/null || echo 0)
  1.1450 -$(_ 'Upgradeable packages:')	$( (wc -l < $PKGS_DB/packages.up) 2>/dev/null || echo 0)
  1.1451 -$(
  1.1452 -	# Per-repository stuff
  1.1453 -
  1.1454 -	if [ -h "$PKGS_DB/fslink" ]; then
  1.1455 -		if [ -e "$PKGS_DB/fslink/etc/slitaz/slitaz.conf" ]; then
  1.1456 -			PKGS_DB_LINK="$PKGS_DB/fslink/$(. "$PKGS_DB/fslink/etc/slitaz/slitaz.conf"; echo "$PKGS_DB")"
  1.1457 -		fi
  1.1458 -	fi
  1.1459 -
  1.1460 -	for path in $PKGS_DB $PKGS_DB/undigest/* $PKGS_DB_LINK; do
  1.1461 -		[ ! -e "$path" ] && continue
  1.1462 -		case "$path" in
  1.1463 -			$PKGS_DB) repo_name='Main';;
  1.1464 -			*/fslink/*) repo_name=$(readlink $PKGS_DB/fslink);;
  1.1465 -			*) repo_name="$(_n 'Undigest %s' "$(basename "$path")")";;
  1.1466 -		esac
  1.1467 -
  1.1468 -		newline; colorize 33 "$(_n 'Repository:'; echo -e "\t$repo_name")"
  1.1469 -
  1.1470 -		_n 'Last recharge:'; echo -en '\t'
  1.1471 -		IDs="$path/IDs"
  1.1472 -		if [ -e "$IDs" ]; then
  1.1473 -			# Timezone offset as string, ex. '+0200' for EET (+2 hours)
  1.1474 -			ohhmm="$(date +%z)"
  1.1475 -			# Timezone offset in the seconds
  1.1476 -			offset=$(( 60 * (60 * ${ohhmm:0:3} + ${ohhmm:3:2}) ))
  1.1477 -			daynow=$(( ($(date         +%s) + $offset) / 86400 ))
  1.1478 -			dayupd=$(( ($(date -r $IDs +%s) + $offset) / 86400 ))
  1.1479 -			days=$(( $daynow - $dayupd ))
  1.1480 -			time=$(date -r $IDs +%R)
  1.1481 -			case $days in
  1.1482 -				0) _ 'Today at %s.' $time;;
  1.1483 -				1) _ 'Yesterday at %s.' $time;;
  1.1484 -				*) _p '%d day ago.' '%d days ago.' $days $days; newline;;
  1.1485 -			esac
  1.1486 -
  1.1487 -			_n 'Database timestamp:'; echo -en '\t'
  1.1488 -			date -d "@$(awk '{print $2}' "$IDs")" "+%x %R"
  1.1489 -		else
  1.1490 -			_ 'never.'
  1.1491 -		fi
  1.1492 -
  1.1493 -		if [ -e "$path/packages.info" ]; then
  1.1494 -			_n 'Mirrored packages:'; echo -en '\t'; wc -l < "$path/packages.info"
  1.1495 -		fi
  1.1496 -
  1.1497 -		if [ "${path/fslink/}" != "$path" ]; then
  1.1498 -			_n 'Linked packages:'; echo -en '\t'
  1.1499 -			find $INSTALLED -type l | wc -l
  1.1500 -		fi
  1.1501 -	done
  1.1502 -)"
  1.1503 -		footer
  1.1504 +		@@MODULES@@/summary
  1.1505  		;;
  1.1506  
  1.1507  
  1.1508  	usage|*)
  1.1509  		# Print a short help or give usage for an unknown or empty command.
  1.1510 -		usage ;;
  1.1511 +		@@MODULES@@/help ;;
  1.1512  esac
  1.1513  
  1.1514  exit 0