diff options
author | Andrew Gregory <andrew.gregory.8@gmail.com> | 2014-10-06 10:16:36 +0200 |
---|---|---|
committer | Allan McRae <allan@archlinux.org> | 2014-10-06 11:00:34 +0200 |
commit | 5002227296b4de3c530690b38abab47dce83564d (patch) | |
tree | d033d556fed1f02a5eb1ae4f48106c0c4c4dfa89 | |
parent | 1e3c088c2e14c7211e77ad73201458418fd34091 (diff) | |
download | pacman-5002227296b4de3c530690b38abab47dce83564d.tar.gz pacman-5002227296b4de3c530690b38abab47dce83564d.tar.xz |
pacman-db-upgrade: do not mangle file lists
grep'ing out blank lines and sorting output thoroughly breaks any file
lists with %BACKUP% entries which must be separated from the file list
by a blank line. Adds a custom function to ensure that all paths
printed are non-empty and unique.
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com>
Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r-- | scripts/pacman-db-upgrade.sh.in | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in index d2d317bf..f9bd101c 100644 --- a/scripts/pacman-db-upgrade.sh.in +++ b/scripts/pacman-db-upgrade.sh.in @@ -204,25 +204,40 @@ if [[ -z "$db_version" ]]; then for f in "$dbroot"/local/*/files; do awk -v "olddir=$olddir" -v "newdir=$newdir" -v "parents=$parents" ' + function print_path(path) { + if (path != "" && !(path in seen)) { + seen[path] = 1 + print path + } + } BEGIN { - i = length(olddir) + 1 + oldlen = length(olddir) + 1 file = substr(newdir, 0, length(newdir) - 1) } { - if ($0 == olddir) { + if ($0 == "") { + # end of section, clear seen paths and print as-is + for ( i in seen ) { + delete seen[i] + } + print + } else if ($0 == olddir) { # replace symlink with its target, including parents - printf("%s", parents) - printf("%s\n", newdir) + split(parents, paths, "\n") + for (i in paths) { + print_path(paths[i]) + } + print_path(newdir) } else if ($0 == file) { # newdir already existed as a file, skip it } else if (index($0, olddir) == 1) { # update paths that were under olddir - printf("%s%s\n", newdir, substr($0, i)) + print_path(newdir substr($0, oldlen)) } else { # print everything else as-is - print + print_path($0) } - }' "$f" | grep . | LC_ALL=C sort -u > "$f.tmp" + }' "$f" > "$f.tmp" mv "$f.tmp" "$f" done done |