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>
This commit is contained in:
Andrew Gregory 2014-10-06 04:16:36 -04:00 committed by Allan McRae
parent 1e3c088c2e
commit 5002227296

View file

@ -204,25 +204,40 @@ if [[ -z "$db_version" ]]; then
for f in "$dbroot"/local/*/files; do for f in "$dbroot"/local/*/files; do
awk -v "olddir=$olddir" -v "newdir=$newdir" -v "parents=$parents" ' 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 { BEGIN {
i = length(olddir) + 1 oldlen = length(olddir) + 1
file = substr(newdir, 0, length(newdir) - 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 # replace symlink with its target, including parents
printf("%s", parents) split(parents, paths, "\n")
printf("%s\n", newdir) for (i in paths) {
print_path(paths[i])
}
print_path(newdir)
} else if ($0 == file) { } else if ($0 == file) {
# newdir already existed as a file, skip it # newdir already existed as a file, skip it
} else if (index($0, olddir) == 1) { } else if (index($0, olddir) == 1) {
# update paths that were under olddir # update paths that were under olddir
printf("%s%s\n", newdir, substr($0, i)) print_path(newdir substr($0, oldlen))
} else { } else {
# print everything else as-is # 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" mv "$f.tmp" "$f"
done done
done done