spk view spk-rm @ rev 37

spk-add: handle modifiers faster
author Christophe Lincoln <pankso@slitaz.org>
date Tue May 15 23:32:17 2012 +0200 (2012-05-15)
parents becb0314c7e1
children 8ed83db5a0be
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 $(cd $installed ; ls); do
54 [ -f $installed/$i/receipt ] || continue
55 unset_receipt
56 . $installed/$i/receipt
57 case " $(echo $DEPENDS) " in
58 *\ $pkg\ *) altered="$altered $i" ;;
59 esac
60 done
61 unset_receipt
62 . $installed/$pkg/receipt
64 if [ -n "$altered" ]; then
65 gettext "The following packages depend on"; boldify " $PACKAGE:"
66 for i in $altered; do
67 echo " $i"
68 done
69 fi
70 refresh=$(cd $installed ; grep -sl ^$PACKAGE$ */modifiers)
71 if [ -n "$refresh" ]; then
72 gettext "The following packages have been modified by"
73 boldify " $PACKAGE:"
74 for i in $refresh; do
75 echo " ${i%/modifiers}"
76 done
77 fi
79 # Do we have packages depending on $pkg ?
80 if [ "$altered" ]; then
81 if [ "$confirm" ]; then
82 gettext "Remove packages depending on:"; echo -n " $PACKAGE"
83 if ! confirm; then
84 gettext "Keeping packages depending on:"; echo " $PACKAGE"
85 echo -e "\n" && continue
86 fi
87 fi
88 for i in $altered; do
89 if [ -d "$installed/$i" ]; then
90 spk-rm $i --root=$root
91 fi
92 done
93 fi
95 # Handle pre_remove
96 if grep -q ^pre_remove $installed/$PACKAGE/receipt; then
97 pre_remove $root
98 fi
100 # Remove all files
101 gettext "Removing all installed files..."
102 [ "$verbose" ] && newline
103 if [ -f $installed/$PACKAGE/modifiers ]; then
104 for file in $(cat $installed/$PACKAGE/files.list)
105 do
106 for mod in $(cat $installed/$PACKAGE/modifiers)
107 do
108 [ -f $installed/$mod/files.list ] && \
109 [ $(grep "^$(echo $file | grepesc)$" $installed/$mod/files.list | wc -l) -gt 1 ] \
110 && continue 2
111 done
112 [ "$verbose" ] && (gettext "Removing:"; echo -n " ${root}${file}")
113 remove_file ${root}${file}
114 done
115 else
116 for file in $(cat $installed/$PACKAGE/files.list)
117 do
118 if [ "$verbose" ]; then
119 gettext "Removing:"; echo -n " ${root}${file}"
120 fi
121 remove_file ${root}${file}
122 [ "$verbose" ] && status
123 done
124 fi
125 [ ! "$verbose" ] && status
127 # Handle post_remove
128 if grep -q ^post_remove $installed/$PACKAGE/receipt; then
129 post_remove $root
130 fi
132 # Remove package receipt.
133 gettext "Removing package receipt..."
134 rm -rf $installed/$PACKAGE
135 status
136 sed -i "/ $PACKAGE-${VERSION}${EXTRAVERSION}$/d" $pkgsmd5 2> /dev/null
138 # Mofified ?
139 if [ "$refresh" ]; then
140 if [ "$confirm" ]; then
141 gettext "Reinstall packages modified by:"; echo " $PACKAGE"
142 if ! confirm; then
143 gettext "Keeping packages modified by:"; echo " $PACKAGE"
144 echo -e "\n" && continue
145 fi
146 fi
147 for i in $refresh; do
148 if [ $(wc -l < $installed/$i) -gt 1 ]; then
149 gettext "For reinstallation check:"; echo " $installed/$i"
150 continue
151 fi
152 rm -r $installed/$i
153 spk-add ${i%/modifiers} --forced --root=$root
154 done
155 fi
156 }
158 #
159 # Commands and exit
160 #
162 case "$1" in
163 ""|*usage|*help) usage ;;
164 esac
166 #
167 # Handle packages
168 #
170 : ${count=0}
171 check_root
173 for pkg in $@
174 do
175 # Skip options
176 case "$pkg" in
177 --*) continue
178 esac
179 # Be sure package is installed
180 if [ ! -f "$installed/$pkg/receipt" ]; then
181 echo -n "$(boldify "$pkg") "
182 gettext "package is not installed"; newline
183 continue
184 fi
185 count=$(($count + 1))
186 [ "$count" == 1 ] && newline
187 boldify $(gettext "Removing"; echo " $pkg")
188 separator
189 [ "$verbose" ] && echo "DB: $installed"
190 # Handle --confirm
191 if [ "$confirm" ]; then
192 gettext "Confirm uninstallation of"; echo -n " $pkg:"
193 if ! confirm; then
194 gettext "Uninstallation cancelled"
195 echo -e "\n" && continue
196 fi
197 fi
198 remove
199 separator
200 echo "" && log "Removed package: $pkg"
201 done
202 exit 0