spk annotate spk-rm @ rev 40

Better modifiers and rdeps handler in spk-rm and fixes
author Christophe Lincoln <pankso@slitaz.org>
date Wed May 16 02:32:22 2012 +0200 (2012-05-16)
parents 8ed83db5a0be
children 4a7b284956e1
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@19 9 . /usr/lib/slitaz/libspk.sh
pankso@8 10
pankso@8 11 #
pankso@8 12 # Functions
pankso@8 13 #
pankso@8 14
pankso@8 15 # Help and usage
pankso@8 16 usage() {
pankso@8 17 name=$(basename $0)
pankso@8 18 cat << EOT
pankso@8 19
pankso@10 20 $(boldify $(gettext "Usage:")) $name [packages|--options]
pankso@8 21
pankso@15 22 $(gettext "Remove installed packages and ther dependencies")
pankso@15 23
pankso@8 24 $(boldify $(gettext "Options:"))
pankso@13 25 --confirm $(gettext "Ask before removing any packages")
pankso@30 26 --root= $(gettext "Set the root file system path")
pankso@13 27 --verbose $(gettext "Be more verbose when removing files")
pankso@8 28
pankso@8 29 $(boldify $(gettext "Examples:"))
pankso@13 30 $name package1 package2 packagesN
pankso@13 31 $name package1 --confirm --verbose
pankso@8 32
pankso@8 33 EOT
pankso@8 34 exit 0
pankso@8 35 }
pankso@8 36
pankso@13 37 # Avoid dirname errors by checking for argument anf then remove file and
pankso@13 38 # empty directory. Usage: remove_file file
pankso@13 39 remove_file() {
pankso@13 40 [ "$1" ] || return
pankso@13 41 local dir
pankso@13 42 rm -f $1 2>/dev/null
pankso@13 43 dir="$1"
pankso@13 44 while [ "$dir" != "/" ]; do
pankso@13 45 dir="$(dirname $dir)"
pankso@13 46 rmdir $dir 2> /dev/null || break
pankso@13 47 done
pankso@13 48 }
pankso@13 49
pankso@13 50 # Remove a single package
pankso@13 51 remove() {
pankso@13 52 altered=""
pankso@39 53 for i in $(ls $installed)
pankso@39 54 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@39 65 # Reverse dep.
pankso@39 66 if [ "$altered" ]; then
pankso@40 67 gettext "The following packages depend on"; colorize " $pkg" 31
pankso@13 68 for i in $altered; do
pankso@40 69 echo " $(colorize "$i" 32)"
pankso@13 70 done
pankso@13 71 fi
pankso@13 72
pankso@39 73 # Reverse deps are displayed, confirm uninstall.
pankso@39 74 if [ "$confirm" ]; then
pankso@39 75 gettext "Confirm uninstallation of:"; echo -n " $pkg"
pankso@39 76 if ! confirm; then
pankso@39 77 gettext "Uninstallation cancelled"
pankso@39 78 echo -e "\n" && continue
pankso@13 79 fi
pankso@13 80 fi
pankso@13 81
pankso@13 82 # Handle pre_remove
pankso@17 83 if grep -q ^pre_remove $installed/$PACKAGE/receipt; then
pankso@13 84 pre_remove $root
pankso@13 85 fi
pankso@13 86
pankso@13 87 # Remove all files
pankso@13 88 gettext "Removing all installed files..."
pankso@13 89 [ "$verbose" ] && newline
pankso@40 90 for file in $(cat $installed/$PACKAGE/files.list)
pankso@40 91 do
pankso@40 92 if [ "$verbose" ]; then
pankso@40 93 gettext "Removing:"; echo -n " ${root}${file}"
pankso@40 94 fi
pankso@40 95 remove_file ${root}${file}
pankso@40 96 [ "$verbose" ] && status
pankso@40 97 done
pankso@17 98 [ ! "$verbose" ] && status
pankso@13 99
pankso@13 100 # Handle post_remove
pankso@17 101 if grep -q ^post_remove $installed/$PACKAGE/receipt; then
pankso@13 102 post_remove $root
pankso@13 103 fi
pankso@13 104
pankso@13 105 # Remove package receipt.
pankso@13 106 gettext "Removing package receipt..."
pankso@17 107 rm -rf $installed/$PACKAGE
pankso@40 108 sed -i "/ $PACKAGE-${VERSION}${EXTRAVERSION}$/d" $pkgsmd5
pankso@13 109 status
pankso@13 110
pankso@39 111 separator && newline
pankso@39 112
pankso@39 113 # Do we have packages depending on $pkg to remove ?
pankso@39 114 if [ "$altered" ]; then
pankso@13 115 if [ "$confirm" ]; then
pankso@40 116 gettext "Remove packages depending on:"; echo -n " $pkg"
pankso@39 117 if ! confirm; then
pankso@40 118 gettext "Keeping packages..."; newline
pankso@39 119 newline && continue
pankso@39 120 fi
pankso@39 121 fi
pankso@39 122 for i in $altered; do
pankso@39 123 if [ -d "$installed/$i" ]; then
pankso@39 124 spk-rm $i --root=$root
pankso@39 125 fi
pankso@39 126 done
pankso@39 127 fi
pankso@39 128
pankso@40 129 # Handle modified packages
pankso@39 130 modified=$(cd $installed; grep -sl ^$pkg$ */modifiers)
pankso@39 131 if [ "$modified" ]; then
pankso@40 132 for i in $modified
pankso@40 133 do
pankso@40 134 gettext "Removed package :"; boldify " $pkg"
pankso@40 135 gettext "Modified package :"; colorize " ${i%/modifiers}" 31
pankso@39 136 # Remove package from the modifiers list
pankso@39 137 sed -i "/^${pkg}$/"d $installed/$i
pankso@40 138 # Reinstall modified packages
pankso@40 139 if [ "$confirm" ]; then
pankso@40 140 gettext "Confirm reinstallation of:"
pankso@40 141 echo -n " ${i%/modifiers}"
pankso@40 142 if ! confirm; then
pankso@40 143 gettext "Reinstallation cancelled"; newline
pankso@40 144 newline && continue
pankso@40 145 else
pankso@40 146 gettext "Reinsalling modified package..."; newline
pankso@40 147 fi
pankso@13 148 fi
pankso@32 149 spk-add ${i%/modifiers} --forced --root=$root
pankso@13 150 done
pankso@13 151 fi
pankso@13 152 }
pankso@13 153
pankso@8 154 #
pankso@10 155 # Commands and exit
pankso@8 156 #
pankso@8 157
pankso@8 158 case "$1" in
pankso@15 159 ""|*usage|*help) usage ;;
pankso@8 160 esac
pankso@10 161
pankso@10 162 #
pankso@10 163 # Handle packages
pankso@10 164 #
pankso@10 165
pankso@19 166 : ${count=0}
pankso@10 167 check_root
pankso@10 168
pankso@10 169 for pkg in $@
pankso@10 170 do
pankso@13 171 # Skip options
pankso@13 172 case "$pkg" in
pankso@13 173 --*) continue
pankso@13 174 esac
pankso@13 175 # Be sure package is installed
pankso@17 176 if [ ! -f "$installed/$pkg/receipt" ]; then
pankso@13 177 echo -n "$(boldify "$pkg") "
pankso@13 178 gettext "package is not installed"; newline
pankso@13 179 continue
pankso@13 180 fi
pankso@10 181 count=$(($count + 1))
pankso@13 182 [ "$count" == 1 ] && newline
pankso@13 183 boldify $(gettext "Removing"; echo " $pkg")
pankso@10 184 separator
pankso@17 185 [ "$verbose" ] && echo "DB: $installed"
pankso@13 186 remove
pankso@39 187 log "Removed package: $pkg"
pankso@10 188 done
pankso@8 189 exit 0