spk annotate spk-rm @ rev 13

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