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

Allan McRae allan at archlinux.org
Mon Oct 6 09:08:39 UTC 2014


On 06/10/14 18:16, Andrew Gregory wrote:
> 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>
> ---
> 

This is great - pulled to my patchqueue branch

Allan

> 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
> 


More information about the pacman-dev mailing list