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