[pacman-dev] [PATCH 5/5] Extend database upgrade script to handle alpm db version 9
lolilolicon
lolilolicon at gmail.com
Wed Aug 7 14:42:36 EDT 2013
On Tue, Jul 16, 2013 at 8:22 PM, Allan McRae <allan at archlinux.org> wrote:
> Signed-off-by: Allan McRae <allan at archlinux.org>
> ---
> scripts/pacman-db-upgrade.sh.in | 46 ++++++++++++++++++++++++++++++++---------
> 1 file changed, 36 insertions(+), 10 deletions(-)
>
> diff --git a/scripts/pacman-db-upgrade.sh.in b/scripts/pacman-db-upgrade.sh.in
> index a1630c5..d2cd78d 100644
> --- a/scripts/pacman-db-upgrade.sh.in
> +++ b/scripts/pacman-db-upgrade.sh.in
> @@ -109,18 +109,44 @@ 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))
Why is db_version an array?
> 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
missing quote, "${dirlist[@]}"
> + realdir=( $(cd $dir; pwd -P) )
missing quote, "$dir"; why is realdir an array?
> + sed -i "s#^${dir#/}/#${realdir#/}/#" "$dbroot"/local/*/files
If it's almost safe to assume paths don't include '\n', it's far less
so to assume they don't include '#'.
Also $dir is treated as a pattern, not a fixed string here.
This should be better:
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
}
}'
awk doesn't have the convenience of in place file editting though, so
we may have to wrap this inside a loop, and store the updated data in
a temp file (or just a var?)...
> + done
> + fi
> +fi
> +
> +echo "9" > "$dbroot"/local/.alpm_db_version
> +
> # remove the lock file
> rm -f "$lockfile"
>
> --
> 1.8.3.3
>
>
More information about the pacman-dev
mailing list