On 10/05/14 at 02:25pm, Allan McRae wrote:
On 03/10/14 06:35, 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.
Signed-off-by: Andrew Gregory <andrew.gregory.8@gmail.com> ---
Anybody who has replaced an owned directory with a symlink and run pacman-db-upgrade has mangled the file list for all packages with backup files. To check for broken file lists run: `grep -xA1 %BACKUP% /var/lib/pacman/local/*/files | grep -B1 %FILES%` Any file lists with output are broken. Broken file lists can be repaired by reinstalling the affected packages with --dbonly. After repairing, users should remove /var/lib/pacman/local/ALPM_DB_VERSION and run the fixed version of pacman-db-upgrade.
scripts/pacman-db-upgrade.sh.in | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in index d2d317b..d7e34bd 100644 --- a/scripts/pacman-db-upgrade.sh.in +++ b/scripts/pacman-db-upgrade.sh.in @@ -211,9 +211,9 @@ if [[ -z "$db_version" ]]; then { if ($0 == olddir) { # replace symlink with its target, including parents - printf("%s", parents) - printf("%s\n", newdir) - } else if ($0 == file) { + if (parents) printf("%s", parents) + if (newdir) printf("%s\n", newdir) + } else if (file && $0 == file) {
Are these changes are unrelated to the issue? Or am I missing something?
These prevent printing blank lines (if the symlink being replaced pointed to the root) since we can't grep them out later.
# newdir already existed as a file, skip it } else if (index($0, olddir) == 1) { # update paths that were under olddir @@ -222,7 +222,7 @@ if [[ -z "$db_version" ]]; then # print everything else as-is print } - }' "$f" | grep . | LC_ALL=C sort -u > "$f.tmp" + }' "$f" > "$f.tmp"
So we get duplicate directories in our file list now? I know we sort within pacman, so the order is not an issue.
Can we detect when parents/newdir is printed and avoid printing it again?
That should be doable; parents will have to be split back into individual paths for each file list.
mv "$f.tmp" "$f" done done