#!/bin/sh
#
# Spk-rm - Remove SliTaz packages. Read the README before adding or
# modifying any code in spk!
#
# Copyright (C) SliTaz GNU/Linux - BSD License
# Author: See AUTHORS files
#
. /usr/lib/slitaz/libspk.sh

#
# Functions
#

# Help and usage
usage() {
	name=$(basename $0)
	cat << EOT

$(boldify $(gettext "Usage:")) $name [packages|--options]

$(gettext "Remove installed packages and their dependencies")

$(boldify $(gettext "Options:"))
  --confirm   $(gettext "Ask before removing any packages")
  --root=     $(gettext "Set the root file system path")
  --verbose   $(gettext "Be more verbose when removing files")

$(boldify $(gettext "Examples:"))
  $name package1 package2 packagesN
  $name package1 --confirm --verbose

EOT
	exit 0
}

# Remove a single package
remove() {
	local altered
	boldify $(gettext "Removing") $pkg
	separator
	[ "$verbose" ] && echo "DB: $installed"

	# Reverse deps
	for i in $(ls $installed); do
		is_package_installed $i || continue
		unset_receipt
		source_receipt $installed/$i/receipt
		case " $DEPENDS " in
			*\ $pkg\ *) altered="$altered $i" ;;
		esac
	done
	unset_receipt
	source_receipt $installed/$pkg/receipt

	if [ "$altered" ]; then
		gettext "The following packages depend on"; colorize 31 " $pkg"
		for i in $altered; do
			echo "    $(colorize 32 $i)"
		done
	fi

	# Reverse deps are displayed, confirm uninstall.
	if [ "$confirm" ]; then
		echo $(gettext "Confirm uninstallation of:") " $pkg"
		if ! confirm; then
			gettext "Uninstallation cancelled"
			newline && continue
		fi
	fi

	# Handle pre_remove
	if grep -q ^pre_remove $installed/$PACKAGE/receipt; then
		pre_remove $root
	fi

	# Remove all files
	fileslist=$installed/$PACKAGE/files.list
	gettext "Installed files:"
	echo -n " $(wc -l $fileslist | cut -d " " -f 1)"
	[ "$verbose" ] && newline
	for file in $(cat $fileslist)
	do
		if [ "$verbose" ]; then
			gettext "Removing:"; echo -n " ${root}${file}"
		fi
		remove_file ${root}${file}
		[ "$verbose" ] && status
	done
	[ ! "$verbose" ] && status

	# Handle post_remove
	if grep -q ^post_remove $installed/$PACKAGE/receipt; then
		post_remove $root
	fi

	# Remove package receipt.
	gettext "Removing package receipt..."
	rm -rf $installed/$PACKAGE
	sed -i "/$PACKAGE-${VERSION}${EXTRAVERSION}.tazpkg/"d $installed.$SUM
	status

	separator

	# Do we have packages depending on $pkg to remove ?
	if [ "$altered" ]; then
		if [ "$confirm" ]; then
			echo $(gettext "Removing packages depending on:") $pkg
			if ! confirm; then
				gettext "Keeping packages..."; newline
				newline && continue
			fi
		fi
		for i in $altered; do
			if [ -d "$installed/$i" ]; then
				spk-rm $i --root=$root
			fi
		done
	else
		newline
	fi
}

#
# Commands and exit
#

case "$1" in
	""|*usage|*help) usage ;;
esac

#
# Handle packages
#

: ${count=0}
check_root

for pkg in $@
do
	# Skip options
	case "$pkg" in
		--*) continue
	esac
	# Be sure package is installed
	if ! is_package_installed $pkg; then
		echo -n "$(boldify $pkg) "
		gettext "package is not installed"; newline
		continue
	fi
	count=$(($count + 1))
	[ "$count" == 1 ] && newline
	remove
	log "Removed package: $pkg"
done

# Show all new counted packages in verbose mode
if [ "$verbose" ]; then
	gettext "Removed packages:"; colorize 34 " $count"
fi

exit 0
