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 <[email protected]>
> ---
> 

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
> 

Reply via email to