tazpkg annotate modules/remove @ rev 846
Remove "busybox" "prefixes" (thanks llev)
We used "busybox wget", etc. to be sure we called Busybox's "wget", not any other "wget". Workaround already done in "getenv" module.
We used "busybox wget", etc. to be sure we called Busybox's "wget", not any other "wget". Workaround already done in "getenv" module.
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Fri Oct 09 13:14:01 2015 +0300 (2015-10-09) |
parents | a02e36d44d06 |
children | b6daeaa95431 |
rev | line source |
---|---|
al@840 | 1 #!/bin/sh |
al@840 | 2 # TazPkg - Tiny autonomous zone packages manager, hg.slitaz.org/tazpkg |
al@840 | 3 # remove - TazPkg module |
al@840 | 4 # Remove packages |
al@840 | 5 |
al@840 | 6 |
al@840 | 7 # Connect function libraries |
al@840 | 8 . /lib/libtaz.sh |
al@840 | 9 |
al@840 | 10 # Get TazPkg working environment |
al@840 | 11 . @@MODULES@@/getenv |
al@840 | 12 |
al@840 | 13 |
al@840 | 14 |
al@840 | 15 |
al@840 | 16 remove_with_path() { |
al@840 | 17 # Avoid dirname errors by checking for argument. |
al@840 | 18 [ -n "$1" ] || return |
al@840 | 19 |
al@840 | 20 local dir |
al@840 | 21 rm -f $1 2>/dev/null |
al@840 | 22 dir="$1" |
al@840 | 23 while [ "$dir" != "/" ]; do |
al@840 | 24 dir="$(dirname "$dir")" |
al@840 | 25 rmdir "$dir" 2>/dev/null || break |
al@840 | 26 done |
al@840 | 27 } |
al@840 | 28 |
al@840 | 29 |
al@840 | 30 grepesc() { |
al@840 | 31 sed 's/\[/\\[/g' |
al@840 | 32 } |
al@840 | 33 |
al@840 | 34 |
al@840 | 35 # Log activity |
al@840 | 36 |
al@840 | 37 log_pkg() { |
al@840 | 38 [ -w "$LOG" ] && |
al@840 | 39 echo "$(date +'%F %T') - $1 - $PACKAGE ($VERSION$EXTRAVERSION)" >> "$LOG" |
al@840 | 40 } |
al@840 | 41 |
al@840 | 42 |
al@840 | 43 # Interactive mode |
al@840 | 44 |
al@840 | 45 im() { tty -s; } |
al@840 | 46 |
al@840 | 47 |
al@844 | 48 # Block of receipt function callers |
al@844 | 49 # Why? "Bad" receipt sourcing can redefine some vital TazPkg variables. |
al@844 | 50 # Few receipts function should be patched now. |
al@844 | 51 |
al@844 | 52 # Input: $1 = path to the receipt to be processed |
al@844 | 53 |
al@844 | 54 call_pre_remove() { |
al@844 | 55 local tmp |
al@844 | 56 if grep -q '^pre_remove()' "$1"; then |
al@844 | 57 action 'Execute pre-remove commands...' |
al@844 | 58 tmp="$(mktemp)" |
al@844 | 59 cp "$1" "$tmp" |
al@844 | 60 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp" |
al@844 | 61 ( . "$tmp"; pre_remove "$root" ) |
al@844 | 62 status |
al@844 | 63 rm "$tmp" |
al@844 | 64 fi |
al@844 | 65 } |
al@844 | 66 |
al@844 | 67 call_post_remove() { |
al@844 | 68 local tmp |
al@844 | 69 if grep -q '^post_remove()' "$1"; then |
al@844 | 70 action 'Execute post-remove commands...' |
al@844 | 71 tmp="$(mktemp)" |
al@844 | 72 cp "$1" "$tmp" |
al@844 | 73 sed -i 's|$1/*$INSTALLED|$INSTALLED|g' "$tmp" |
al@844 | 74 ( . "$tmp"; post_remove "$root" ) |
al@844 | 75 status |
al@844 | 76 rm "$tmp" |
al@844 | 77 fi |
al@844 | 78 } |
al@844 | 79 |
al@844 | 80 |
al@840 | 81 |
al@840 | 82 |
al@840 | 83 PACKAGE="$1" |
al@840 | 84 |
al@840 | 85 if [ ! -f "$INSTALLED/$PACKAGE/receipt" ]; then |
al@840 | 86 newline; _ 'Package "%s" is not installed.' "$PACKAGE" |
al@840 | 87 exit 1 |
al@840 | 88 fi |
al@840 | 89 |
al@840 | 90 . "$INSTALLED/$PACKAGE/receipt" |
al@840 | 91 |
al@840 | 92 # Info #1: dependent packages (to be processed later) |
al@840 | 93 ALTERED="$(awk -F$'\t' -vp=" $PACKAGE " 'index(" " $8 " ", p) { printf " %s\n", $1 }' "$PKGS_DB/installed.info")" |
al@840 | 94 |
al@840 | 95 if [ -n "$ALTERED" ]; then |
al@840 | 96 _ 'The following packages depend on package "%s":' "$PACKAGE" |
al@840 | 97 echo "$ALTERED" |
al@840 | 98 fi |
al@840 | 99 |
al@840 | 100 # Info #2: changed packages (to be processed later) |
al@840 | 101 REFRESH=$(cd "$INSTALLED"; grep -sl "^$PACKAGE$" */modifiers) |
al@840 | 102 |
al@840 | 103 if [ -n "$REFRESH" ]; then |
al@840 | 104 _ 'The following packages have been modified by package "%s":' "$PACKAGE" |
al@840 | 105 for i in $REFRESH; do |
al@840 | 106 echo " ${i%/modifiers}" |
al@840 | 107 done |
al@840 | 108 fi |
al@840 | 109 |
al@840 | 110 # Confirmation |
al@840 | 111 if im && [ -z "$auto" ]; then |
al@840 | 112 confirm "$(_ 'Remove package "%s" (%s)? (y/N)' "$PACKAGE" "$VERSION$EXTRAVERSION")" |
al@840 | 113 if [ "$?" -ne 0 ]; then |
al@840 | 114 newline; _ 'Uninstallation of package "%s" cancelled.' "$PACKAGE" |
al@840 | 115 exit 0 |
al@840 | 116 fi |
al@840 | 117 fi |
al@840 | 118 # We are here: non-interactive mode, or --auto, or answer 'y' |
al@840 | 119 |
al@840 | 120 # Removing package |
al@840 | 121 title 'Removing package "%s"' "$PACKAGE" |
al@840 | 122 |
al@840 | 123 # [1/4] Pre-remove commands |
al@844 | 124 call_pre_remove "$INSTALLED/$PACKAGE/receipt" |
al@844 | 125 |
al@840 | 126 |
al@840 | 127 # [2/4] Removing files |
al@840 | 128 action 'Removing all files installed...' |
al@840 | 129 if [ -f "$INSTALLED/$PACKAGE/modifiers" ]; then |
al@840 | 130 for file in $(cat "$INSTALLED/$PACKAGE/files.list"); do |
al@840 | 131 for mod in $(cat "$INSTALLED/$PACKAGE/modifiers"); do |
al@840 | 132 [ -f "$INSTALLED/$mod/files.list" ] && \ |
al@840 | 133 [ $(grep "^$(echo $file | grepesc)$" "$INSTALLED/$mod/files.list" | wc -l) -gt 1 ] && \ |
al@840 | 134 continue 2 |
al@840 | 135 done |
al@840 | 136 [ -n "$debug" ] && echo "remove_with_path $root$file" |
al@840 | 137 remove_with_path $root$file |
al@840 | 138 done |
al@840 | 139 else |
al@840 | 140 for file in $(cat "$INSTALLED/$PACKAGE/files.list"); do |
al@840 | 141 [ -n "$debug" ] && echo "remove_with_path $root$file" |
al@840 | 142 remove_with_path $root$file |
al@840 | 143 done |
al@840 | 144 fi |
al@840 | 145 status |
al@840 | 146 |
al@840 | 147 # [3/4] Post-remove commands |
al@844 | 148 call_post_remove "$INSTALLED/$PACKAGE/receipt" |
al@840 | 149 |
al@840 | 150 # [4/4] Remove package receipt and remove it from databases |
al@840 | 151 action 'Removing package receipt...' |
al@840 | 152 rm -rf "$INSTALLED/$PACKAGE" |
al@840 | 153 sed -i "/ $PACKAGE-$VERSION$EXTRAVERSION.tazpkg$/d" "$PKGS_DB/installed.$SUM" |
al@840 | 154 sed -i "/^$PACKAGE /d" "$PKGS_DB/installed.info" |
al@840 | 155 status |
al@840 | 156 |
al@840 | 157 footer "$(_ 'Package "%s" (%s) removed.' "$PACKAGE" "$VERSION$EXTRAVERSION")" |
al@840 | 158 |
al@840 | 159 # Log this activity |
al@840 | 160 log_pkg Removed |
al@840 | 161 |
al@840 | 162 # Stop if non-interactive mode and no --auto option |
al@840 | 163 if ! im && [ -z "$auto" ]; then exit 0; fi |
al@840 | 164 |
al@840 | 165 # Process dependent packages |
al@840 | 166 if [ -n "$ALTERED" ]; then |
al@840 | 167 if [ -n "$auto" ]; then |
al@840 | 168 answer=0 |
al@840 | 169 else |
al@840 | 170 confirm "$(_ 'Remove packages depending on package "%s"? (y/N)' "$PACKAGE")" |
al@840 | 171 answer=$? |
al@840 | 172 fi |
al@840 | 173 if [ "$answer" -eq 0 ]; then |
al@840 | 174 for i in $ALTERED; do |
al@840 | 175 if [ -d "$INSTALLED/$i" ]; then |
al@840 | 176 tazpkg remove $i |
al@840 | 177 fi |
al@840 | 178 done |
al@840 | 179 fi |
al@840 | 180 fi |
al@840 | 181 |
al@840 | 182 # Process changed packages |
al@840 | 183 if [ -n "$REFRESH" ]; then |
al@840 | 184 if [ -n "$auto" ]; then |
al@840 | 185 answer=0 |
al@840 | 186 else |
al@840 | 187 confirm "$(_ 'Reinstall packages modified by package "%s"? (y/N)' "$PACKAGE")" |
al@840 | 188 answer=$? |
al@840 | 189 fi |
al@840 | 190 if [ "$answer" -eq 0 ]; then |
al@840 | 191 for i in $REFRESH; do |
al@840 | 192 if [ "$(wc -l < "$INSTALLED/$i")" -gt 1 ]; then |
al@840 | 193 _ 'Check %s for reinstallation' "$INSTALLED/$i" |
al@840 | 194 continue |
al@840 | 195 fi |
al@840 | 196 rm -r "$INSTALLED/$i" |
al@840 | 197 tazpkg get-install ${i%/modifiers} --forced |
al@840 | 198 done |
al@840 | 199 fi |
al@840 | 200 fi |
al@840 | 201 |