spk annotate spk-rm @ rev 17

libspk.sh: set $root for all files/DB path, spk-rm: work with --root=
author Christophe Lincoln <pankso@slitaz.org>
date Tue May 15 12:29:41 2012 +0200 (2012-05-15)
parents 57ae420bd1c2
children b9ca2ddbafa1
rev   line source
pankso@8 1 #!/bin/sh
pankso@8 2 #
pankso@8 3 # Spk-rm - Remove SliTaz packages. Read the README before adding or
pankso@8 4 # modifing any code in spk!
pankso@8 5 #
pankso@8 6 # Copyright (C) SliTaz GNU/Linux - BSD License
pankso@8 7 # Author: See AUTHORS files
pankso@8 8 #
pankso@17 9 #. /usr/lib/slitaz/libspk.sh
pankso@17 10 . lib/libspk.sh
pankso@8 11
pankso@8 12 #
pankso@8 13 # Functions
pankso@8 14 #
pankso@8 15
pankso@8 16 # Help and usage
pankso@8 17 usage() {
pankso@8 18 name=$(basename $0)
pankso@8 19 cat << EOT
pankso@8 20
pankso@10 21 $(boldify $(gettext "Usage:")) $name [packages|--options]
pankso@8 22
pankso@15 23 $(gettext "Remove installed packages and ther dependencies")
pankso@15 24
pankso@8 25 $(boldify $(gettext "Options:"))
pankso@13 26 --confirm $(gettext "Ask before removing any packages")
pankso@17 27 --root $(gettext "Set the root file system path")
pankso@13 28 --verbose $(gettext "Be more verbose when removing files")
pankso@8 29
pankso@8 30 $(boldify $(gettext "Examples:"))
pankso@13 31 $name package1 package2 packagesN
pankso@13 32 $name package1 --confirm --verbose
pankso@8 33
pankso@8 34 EOT
pankso@8 35 exit 0
pankso@8 36 }
pankso@8 37
pankso@13 38 # Avoid dirname errors by checking for argument anf then remove file and
pankso@13 39 # empty directory. Usage: remove_file file
pankso@13 40 remove_file() {
pankso@13 41 [ "$1" ] || return
pankso@13 42 local dir
pankso@13 43 rm -f $1 2>/dev/null
pankso@13 44 dir="$1"
pankso@13 45 while [ "$dir" != "/" ]; do
pankso@13 46 dir="$(dirname $dir)"
pankso@13 47 rmdir $dir 2> /dev/null || break
pankso@13 48 done
pankso@13 49 }
pankso@13 50
pankso@13 51 # Remove a single package
pankso@13 52 remove() {
pankso@13 53 altered=""
pankso@17 54 for i in $(cd $installed ; ls); do
pankso@17 55 [ -f $installed/$i/receipt ] || continue
pankso@13 56 unset_receipt
pankso@17 57 . $installed/$i/receipt
pankso@13 58 case " $(echo $DEPENDS) " in
pankso@13 59 *\ $pkg\ *) altered="$altered $i" ;;
pankso@13 60 esac
pankso@13 61 done
pankso@13 62 unset_receipt
pankso@17 63 . $installed/$pkg/receipt
pankso@13 64
pankso@13 65 if [ -n "$altered" ]; then
pankso@13 66 eval_gettext "The following packages depend on \$PACKAGE:"; echo
pankso@13 67 for i in $altered; do
pankso@13 68 echo " $i"
pankso@13 69 done
pankso@13 70 fi
pankso@17 71 refresh=$(cd $installed ; grep -sl ^$PACKAGE$ */modifiers)
pankso@13 72 if [ -n "$refresh" ]; then
pankso@13 73 eval_gettext "The following packages have been modified by \$PACKAGE:"; echo
pankso@13 74 for i in $refresh; do
pankso@13 75 echo " ${i%/modifiers}"
pankso@13 76 done
pankso@13 77 fi
pankso@13 78
pankso@13 79 # Do we have packages depending on $pkg ?
pankso@13 80 if [ "$altered" ]; then
pankso@13 81 if [ "$confirm" ]; then
pankso@13 82 gettext "Remove packages depending on:"; echo -n " $PACKAGE"
pankso@13 83 if ! confirm; then
pankso@13 84 gettext "Keeping packages depending on:"; echo " $PACKAGE"
pankso@13 85 echo -e "\n" && continue
pankso@13 86 fi
pankso@13 87 fi
pankso@13 88 for i in $altered; do
pankso@17 89 if [ -d "$installed/$i" ]; then
pankso@13 90 # TODO: use spk-rm
pankso@13 91 echo "tazpkg remove $i --root=$root"
pankso@13 92 fi
pankso@13 93 done
pankso@13 94 fi
pankso@13 95
pankso@13 96 # Handle pre_remove
pankso@17 97 if grep -q ^pre_remove $installed/$PACKAGE/receipt; then
pankso@13 98 pre_remove $root
pankso@13 99 fi
pankso@13 100
pankso@13 101 # Remove all files
pankso@13 102 gettext "Removing all installed files..."
pankso@13 103 [ "$verbose" ] && newline
pankso@17 104 if [ -f $installed/$PACKAGE/modifiers ]; then
pankso@17 105 for file in `cat $installed/$PACKAGE/files.list`
pankso@13 106 do
pankso@17 107 for mod in `cat $installed/$PACKAGE/modifiers`
pankso@13 108 do
pankso@17 109 [ -f $installed/$mod/files.list ] && \
pankso@17 110 [ $(grep "^$(echo $file | grepesc)$" $installed/$mod/files.list | wc -l) -gt 1 ] \
pankso@13 111 && continue 2
pankso@13 112 done
pankso@17 113 [ "$verbose" ] && (gettext "Removing:"; echo -n " ${root}${file}")
pankso@13 114 remove_file ${root}${file}
pankso@13 115 done
pankso@13 116 else
pankso@17 117 for file in $(cat $installed/$PACKAGE/files.list)
pankso@13 118 do
pankso@17 119 [ "$verbose" ] && (gettext "Removing:"; echo -n " ${root}${file}")
pankso@13 120 remove_file ${root}${file}
pankso@13 121 [ "$verbose" ] && status
pankso@13 122 done
pankso@13 123 fi
pankso@17 124 [ ! "$verbose" ] && status
pankso@13 125
pankso@13 126 # Handle post_remove
pankso@17 127 if grep -q ^post_remove $installed/$PACKAGE/receipt; then
pankso@13 128 post_remove $root
pankso@13 129 fi
pankso@13 130
pankso@13 131 # Remove package receipt.
pankso@13 132 gettext "Removing package receipt..."
pankso@17 133 rm -rf $installed/$PACKAGE
pankso@13 134 status
pankso@13 135 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION$/d" \
pankso@13 136 ${root}${PKGS_DB}/installed.$SUM 2> /dev/null
pankso@13 137
pankso@13 138 # Mofified ?
pankso@13 139 if [ "$refresh" ]; then
pankso@13 140 if [ "$confirm" ]; then
pankso@13 141 gettext "Reinstall packages modified by:"; echo " $PACKAGE"
pankso@13 142 if ! confirm; then
pankso@13 143 gettext "Keeping packages modified by:"; echo " $PACKAGE"
pankso@13 144 echo -e "\n" && continue
pankso@13 145 fi
pankso@13 146 fi
pankso@13 147 for i in $refresh; do
pankso@17 148 if [ $(wc -l < $installed/$i) -gt 1 ]; then
pankso@13 149 gettext "For reinstallation check:"; echo " $installed/$i"
pankso@13 150 continue
pankso@13 151 fi
pankso@13 152 # TODO: use spk-add
pankso@17 153 rm -r $installed/$i
pankso@13 154 tazpkg -gi ${i%/modifiers} --forced --root=$root
pankso@13 155 done
pankso@13 156 fi
pankso@13 157 }
pankso@13 158
pankso@8 159 #
pankso@10 160 # Commands and exit
pankso@8 161 #
pankso@8 162
pankso@8 163 case "$1" in
pankso@15 164 ""|*usage|*help) usage ;;
pankso@8 165 esac
pankso@10 166
pankso@10 167 #
pankso@10 168 # Handle packages
pankso@10 169 #
pankso@10 170
pankso@10 171 count=0
pankso@10 172 check_root
pankso@10 173
pankso@10 174 for pkg in $@
pankso@10 175 do
pankso@13 176 # Skip options
pankso@13 177 case "$pkg" in
pankso@13 178 --*) continue
pankso@13 179 esac
pankso@13 180 # Be sure package is installed
pankso@17 181 if [ ! -f "$installed/$pkg/receipt" ]; then
pankso@13 182 echo -n "$(boldify "$pkg") "
pankso@13 183 gettext "package is not installed"; newline
pankso@13 184 continue
pankso@13 185 fi
pankso@10 186 count=$(($count + 1))
pankso@13 187 [ "$count" == 1 ] && newline
pankso@13 188 boldify $(gettext "Removing"; echo " $pkg")
pankso@10 189 separator
pankso@17 190 [ "$verbose" ] && echo "DB: $installed"
pankso@10 191 # Handle --confirm
pankso@10 192 if [ "$confirm" ]; then
pankso@10 193 gettext "Confirm uninstallation of"; echo -n " $pkg:"
pankso@10 194 if ! confirm; then
paul@12 195 gettext "Uninstallation cancelled"
pankso@13 196 echo -e "\n" && continue
pankso@10 197 fi
pankso@10 198 fi
pankso@13 199 remove
pankso@13 200 separator
pankso@13 201 echo "" && log "Removed package: $pkg"
pankso@10 202 done
pankso@8 203 exit 0