Signed-off-by: Allan McRae <[email protected]>
---

v2: Use awk to do symlink to actual directory replacement

As an example of what changes get made:

diff -Naur local.tmp/glibc-2.18-4/files local/glibc-2.18-4/files
--- local.tmp/glibc-2.18-4/files        2013-09-18 18:45:35.747068765 +1000
+++ local/glibc-2.18-4/files    2013-09-18 18:51:29.633643945 +1000
@@ -4,8 +4,8 @@
 etc/locale.gen
 etc/nscd.conf
 etc/rpc
-lib/
-lib/libc.a
+usr/lib/
+usr/lib/libc.a
 usr/
 usr/bin/
 usr/bin/catchsegv


Note that now usr/lib/ is present twice in the file (may not always be the case)
and these entries are out of alphabetical order.  Both these are cosmetic to
pacman.

 scripts/pacman-db-upgrade.sh.in | 59 ++++++++++++++++++++++++++++++++++-------
 1 file changed, 49 insertions(+), 10 deletions(-)

diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in
index a1630c5..d6f4169 100644
--- a/scripts/pacman-db-upgrade.sh.in
+++ b/scripts/pacman-db-upgrade.sh.in
@@ -109,18 +109,57 @@ fi
 # do not let pacman run while we do this
 touch "$lockfile"
 
-# pacman-3.4 to 3.5 upgrade - merge depends into desc
-if [[ $(find "$dbroot"/local -name depends) ]]; then
-       msg "$(gettext "Pre-3.5 database format detected - upgrading...")"
-       for i in "$dbroot"/local/*; do
-               if [[ -f "$i"/depends ]]; then
-                       cat "$i"/depends >> "$i"/desc
-                       rm "$i"/depends
-               fi
-       done
-       msg "$(gettext "Done.")"
+if [[ -f "${dbroot}"/local/.alpm_db_version ]]; then
+       db_version=$(cat "${dbroot}"/local/.alpm_db_version)
 fi
 
+if [[ -z "$db_version" ]]; then
+       # pacman-3.4 to 3.5 upgrade - merge depends into desc
+       if [[ $(find "$dbroot"/local -name depends) ]]; then
+               msg "$(gettext "Pre-3.5 database format detected - 
upgrading...")"
+               for i in "$dbroot"/local/*; do
+                       if [[ -f "$i"/depends ]]; then
+                               cat "$i"/depends >> "$i"/desc
+                               rm "$i"/depends
+                       fi
+               done
+               msg "$(gettext "Done.")"
+       fi
+
+       # pacman 4.1 to 4.2 upgrade - remove directory symlink support
+       dirlist=()
+
+       unset GREP_OPTIONS
+       while IFS= read -r dir; do
+               dirlist+=("/${dir%/}")
+       done < <(grep -h '/$' "$dbroot"/local/*/files | sort -u)
+
+       mapfile -t dirlist < <(find "${dirlist[@]}" -maxdepth 0 -type l)
+
+       if [[ ${#dirlist[@]} != 0 ]]; then
+               msg "$(gettext "Pre-4.2 database format detected - 
upgrading...")"
+               for dir in "${dirlist[@]}"; do
+                       realdir="$(cd $dir; pwd -P)"
+                       for f in "$dbroot"/local/*/files; do
+                               awk -v "dir=${dir#/}/" -v 
"realdir=${realdir#/}/" '
+                                       BEGIN {
+                                               i = length(dir) + 1
+                                       }
+                                       {
+                                               if (index($0, dir) == 1) {
+                                                       printf("%s%s\n", 
realdir, substr($0, i))
+                                               } else {
+                                                       print
+                                               }
+                                       }' $f > $f.tmp
+                               mv $f.tmp $f
+                       done
+               done
+       fi
+fi
+
+echo "9" > "$dbroot"/local/.alpm_db_version
+
 # remove the lock file
 rm -f "$lockfile"
 
-- 
1.8.4


Reply via email to