[pacman-dev] [PATCH] pacman-db-upgrade: do not mangle file lists

Andrew Gregory andrew.gregory.8 at gmail.com
Mon Oct 6 08:16:36 UTC 2014


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 at gmail.com>
---

My dbupgrade branch includes a pactest case for this.

 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 d2d317b..f9bd101 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
-- 
2.1.2


More information about the pacman-dev mailing list