From 5002227296b4de3c530690b38abab47dce83564d Mon Sep 17 00:00:00 2001 From: Andrew Gregory Date: Mon, 6 Oct 2014 04:16:36 -0400 Subject: 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 Signed-off-by: Allan McRae --- scripts/pacman-db-upgrade.sh.in | 29 ++++++++++++++++++++++------- 1 file 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 -- cgit v1.2.3-24-g4f1b