tazpkg rev 857
remove: speed up to a hundred times
author | Aleksej Bobylev <al.bobylev@gmail.com> |
---|---|
date | Thu Nov 12 20:13:00 2015 +0200 (2015-11-12) |
parents | 64537d742a00 |
children | b069086a45a4 |
files | modules/recharge modules/remove |
line diff
1.1 --- a/modules/recharge Mon Nov 09 13:26:53 2015 +0200 1.2 +++ b/modules/recharge Thu Nov 12 20:13:00 2015 +0200 1.3 @@ -27,10 +27,14 @@ 1.4 # Download a file from specified mirror 1.5 1.6 get_from_mirror() { 1.7 + debug "get_from_mirror($1)" 1.8 + debug " mirror='$mirror'" 1.9 case "$mirror" in 1.10 http://* | https://* | ftp://*) 1.11 + debug " wget -c -q -T 30 -U '$UA' '$mirror$1'" 1.12 wget -c -q -T 30 -U "$UA" "$mirror$1" 2>/dev/null;; 1.13 *) 1.14 + debug " ln -sf '$mirror$1' ." 1.15 ln -sf "$mirror$1" .;; 1.16 esac 1.17 status
2.1 --- a/modules/remove Mon Nov 09 13:26:53 2015 +0200 2.2 +++ b/modules/remove Thu Nov 12 20:13:00 2015 +0200 2.3 @@ -13,25 +13,6 @@ 2.4 2.5 2.6 2.7 -remove_with_path() { 2.8 - # Avoid dirname errors by checking for argument. 2.9 - [ -n "$1" ] || return 2.10 - 2.11 - local dir 2.12 - rm -f $1 2>/dev/null 2.13 - dir="$1" 2.14 - while [ "$dir" != "/" ]; do 2.15 - dir="$(dirname "$dir")" 2.16 - rmdir "$dir" 2>/dev/null || break 2.17 - done 2.18 -} 2.19 - 2.20 - 2.21 -grepesc() { 2.22 - sed 's/\[/\\[/g' 2.23 -} 2.24 - 2.25 - 2.26 # Log activity 2.27 2.28 log_pkg() { 2.29 @@ -126,22 +107,74 @@ 2.30 2.31 # [2/4] Removing files 2.32 action 'Removing all files installed...' 2.33 + 2.34 +# NOTE: package 'faenza-icon-theme' install time: 12s; removing time ~ 11min on my system o_O 2.35 +# After optimization: 6s! (Long) for-loops are (big) evil ;) 2.36 + 2.37 +# NOTE: many packages contains filenames with spaces: 2.38 +# lzcat /var/lib/tazpkg/files.list.lzma | awk -F" " '{if(NF>2)print $1}' | sed 's|:$||' | uniq 2.39 +# Redefine IFS to only-new-line field separator: 2.40 +IFS=$'\n' 2.41 + 2.42 +files2remove="$(mktemp)" 2.43 +dirs2remove="$(mktemp)" 2.44 + 2.45 +debug '\nDetermine which files to remove...' 2.46 if [ -f "$INSTALLED/$PACKAGE/modifiers" ]; then 2.47 - for file in $(cat "$INSTALLED/$PACKAGE/files.list"); do 2.48 - for mod in $(cat "$INSTALLED/$PACKAGE/modifiers"); do 2.49 - [ -f "$INSTALLED/$mod/files.list" ] && \ 2.50 - [ $(grep "^$(echo $file | grepesc)$" "$INSTALLED/$mod/files.list" | wc -l) -gt 1 ] && \ 2.51 - continue 2 2.52 - done 2.53 - debug "remove_with_path ($root$file)" 2.54 - remove_with_path "$root$file" 2.55 + debug ' (modifiers detected)' 2.56 + 2.57 + mods="$(mktemp)" 2.58 + for mod in $(cat "$INSTALLED/$PACKAGE/modifiers"); do 2.59 + cat "$INSTALLED/$mod/files.list" >> "$mods" 2>/dev/null 2.60 done 2.61 + 2.62 + awk -vroot="$root" -vfl="$INSTALLED/$PACKAGE/files.list" ' 2.63 + { 2.64 + if (FILENAME == fl) 2.65 + f[$0] = 1; 2.66 + else 2.67 + f[$0] = ""; 2.68 + } 2.69 + END { 2.70 + for (i in f) { 2.71 + if (f[i] == 1) printf "%s%s\n", root, i; 2.72 + } 2.73 + }' "$INSTALLED/$PACKAGE/files.list" "$mods" > "$files2remove" 2.74 + rm "$mods" 2.75 else 2.76 - for file in $(cat "$INSTALLED/$PACKAGE/files.list"); do 2.77 - debug "remove_with_path ($root$file)" 2.78 - remove_with_path "$root$file" 2.79 + debug ' (modifiers not detected)' 2.80 + 2.81 + awk -vroot="$root" '{ printf "%s%s\n", root, $0; }' \ 2.82 + "$INSTALLED/$PACKAGE/files.list" > "$files2remove" 2.83 +fi 2.84 + 2.85 +debug 'Removing files...' 2.86 +xargs rm -f < "$files2remove" 2.87 + 2.88 +debug 'Determine which folders to remove...' 2.89 +awk ' 2.90 +BEGIN { 2.91 + FS = "/"; OFS = "/"; 2.92 +} 2.93 +{ 2.94 + # removing filename beyond the last "/" 2.95 + $NF = ""; 2.96 + if (! a[$0]) { 2.97 + a[$0] = 1; print; 2.98 + } 2.99 +}' "$files2remove" | sed 's|/$||' > "$dirs2remove" 2.100 + 2.101 +debug 'Removing folders...' 2.102 +for dir2r in $(cat "$dirs2remove"); do 2.103 + dir="$dir2r" 2.104 + while [ -n "$dir" ]; do 2.105 + rmdir "$dir" 2>/dev/null || break 2.106 + dir="${dir%/*}" 2.107 done 2.108 -fi 2.109 +done 2.110 +rm "$files2remove" "$dirs2remove" 2.111 +unset IFS 2.112 + 2.113 status 2.114 2.115 # [3/4] Post-remove commands