spk annotate spk-rm @ rev 39
spk-rm handle modifiers, small changes and fixes
author | Christophe Lincoln <pankso@slitaz.org> |
---|---|
date | Wed May 16 01:19:38 2012 +0200 (2012-05-16) |
parents | 70c2d1ac2887 |
children | 0a61f00e2373 |
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@39 | 67 gettext "The following packages depend on"; boldify " $PACKAGE" |
pankso@13 | 68 for i in $altered; do |
pankso@39 | 69 echo " $i" |
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@17 | 90 if [ -f $installed/$PACKAGE/modifiers ]; then |
pankso@32 | 91 for file in $(cat $installed/$PACKAGE/files.list) |
pankso@13 | 92 do |
pankso@32 | 93 for mod in $(cat $installed/$PACKAGE/modifiers) |
pankso@13 | 94 do |
pankso@17 | 95 [ -f $installed/$mod/files.list ] && \ |
pankso@17 | 96 [ $(grep "^$(echo $file | grepesc)$" $installed/$mod/files.list | wc -l) -gt 1 ] \ |
pankso@13 | 97 && continue 2 |
pankso@13 | 98 done |
pankso@17 | 99 [ "$verbose" ] && (gettext "Removing:"; echo -n " ${root}${file}") |
pankso@13 | 100 remove_file ${root}${file} |
pankso@13 | 101 done |
pankso@13 | 102 else |
pankso@17 | 103 for file in $(cat $installed/$PACKAGE/files.list) |
pankso@13 | 104 do |
pankso@32 | 105 if [ "$verbose" ]; then |
pankso@32 | 106 gettext "Removing:"; echo -n " ${root}${file}" |
pankso@32 | 107 fi |
pankso@13 | 108 remove_file ${root}${file} |
pankso@13 | 109 [ "$verbose" ] && status |
pankso@13 | 110 done |
pankso@13 | 111 fi |
pankso@17 | 112 [ ! "$verbose" ] && status |
pankso@13 | 113 |
pankso@13 | 114 # Handle post_remove |
pankso@17 | 115 if grep -q ^post_remove $installed/$PACKAGE/receipt; then |
pankso@13 | 116 post_remove $root |
pankso@13 | 117 fi |
pankso@13 | 118 |
pankso@13 | 119 # Remove package receipt. |
pankso@13 | 120 gettext "Removing package receipt..." |
pankso@17 | 121 rm -rf $installed/$PACKAGE |
pankso@13 | 122 status |
pankso@32 | 123 sed -i "/ $PACKAGE-${VERSION}${EXTRAVERSION}$/d" $pkgsmd5 2> /dev/null |
pankso@13 | 124 |
pankso@39 | 125 separator && newline |
pankso@39 | 126 |
pankso@39 | 127 # Do we have packages depending on $pkg to remove ? |
pankso@39 | 128 if [ "$altered" ]; then |
pankso@13 | 129 if [ "$confirm" ]; then |
pankso@39 | 130 gettext "Remove packages depending on:"; echo -n " $PACKAGE" |
pankso@39 | 131 if ! confirm; then |
pankso@39 | 132 gettext "Keeping packages depending on:"; echo " $PACKAGE" |
pankso@39 | 133 newline && continue |
pankso@39 | 134 fi |
pankso@39 | 135 fi |
pankso@39 | 136 for i in $altered; do |
pankso@39 | 137 if [ -d "$installed/$i" ]; then |
pankso@39 | 138 spk-rm $i --root=$root |
pankso@39 | 139 fi |
pankso@39 | 140 done |
pankso@39 | 141 fi |
pankso@39 | 142 |
pankso@39 | 143 # Handle mofified packages |
pankso@39 | 144 modified=$(cd $installed; grep -sl ^$pkg$ */modifiers) |
pankso@39 | 145 if [ "$modified" ]; then |
pankso@39 | 146 gettext "Following packages was modified by"; boldify " $pkg" |
pankso@39 | 147 for i in $modified; do |
pankso@39 | 148 echo " ${i%/modifiers}" |
pankso@39 | 149 # Remove package from the modifiers list |
pankso@39 | 150 sed -i "/^${pkg}$/"d $installed/$i |
pankso@39 | 151 done |
pankso@39 | 152 if [ "$confirm" ]; then |
pankso@39 | 153 gettext "Reinstall packages modified by:"; echo -n " $PACKAGE" |
pankso@13 | 154 if ! confirm; then |
pankso@13 | 155 gettext "Keeping packages modified by:"; echo " $PACKAGE" |
pankso@39 | 156 newline && continue |
pankso@13 | 157 fi |
pankso@13 | 158 fi |
pankso@39 | 159 # Reinstall modified packages |
pankso@39 | 160 for i in $modified; do |
pankso@32 | 161 spk-add ${i%/modifiers} --forced --root=$root |
pankso@13 | 162 done |
pankso@13 | 163 fi |
pankso@13 | 164 } |
pankso@13 | 165 |
pankso@8 | 166 # |
pankso@10 | 167 # Commands and exit |
pankso@8 | 168 # |
pankso@8 | 169 |
pankso@8 | 170 case "$1" in |
pankso@15 | 171 ""|*usage|*help) usage ;; |
pankso@8 | 172 esac |
pankso@10 | 173 |
pankso@10 | 174 # |
pankso@10 | 175 # Handle packages |
pankso@10 | 176 # |
pankso@10 | 177 |
pankso@19 | 178 : ${count=0} |
pankso@10 | 179 check_root |
pankso@10 | 180 |
pankso@10 | 181 for pkg in $@ |
pankso@10 | 182 do |
pankso@13 | 183 # Skip options |
pankso@13 | 184 case "$pkg" in |
pankso@13 | 185 --*) continue |
pankso@13 | 186 esac |
pankso@13 | 187 # Be sure package is installed |
pankso@17 | 188 if [ ! -f "$installed/$pkg/receipt" ]; then |
pankso@13 | 189 echo -n "$(boldify "$pkg") " |
pankso@13 | 190 gettext "package is not installed"; newline |
pankso@13 | 191 continue |
pankso@13 | 192 fi |
pankso@10 | 193 count=$(($count + 1)) |
pankso@13 | 194 [ "$count" == 1 ] && newline |
pankso@13 | 195 boldify $(gettext "Removing"; echo " $pkg") |
pankso@10 | 196 separator |
pankso@17 | 197 [ "$verbose" ] && echo "DB: $installed" |
pankso@13 | 198 remove |
pankso@39 | 199 log "Removed package: $pkg" |
pankso@10 | 200 done |
pankso@8 | 201 exit 0 |