[pacman-dev] [PATCH] makepkg: use the `declare` builtin when backing up variables to eval

Eli Schwartz eschwartz at archlinux.org
Thu Mar 15 00:56:13 UTC 2018


Rather than manually crafting foo_backup in a loop and eval'ing them
with a complicated escape pattern, store every splitpkg_overrides
element into a single variable via the eval-friendly `declare` builtin.

An alternative to eval would be using `printf -v` but this does not work
for arrays.

This has the additional benefit of reducing the number of
variables/arrays floating around in the environment.

Signed-off-by: Eli Schwartz <eschwartz at archlinux.org>
---
 scripts/makepkg.sh.in | 20 ++++----------------
 1 file changed, 4 insertions(+), 16 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index f0703d41..d6cb00da 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1111,34 +1111,22 @@ check_build_status() {
 backup_package_variables() {
 	local var
 	for var in ${splitpkg_overrides[@]}; do
-		local indirect="${var}_backup"
-		eval "${indirect}=(\"\${$var[@]}\")"
-	done
-}
-
-restore_package_variables() {
-	local var
-	for var in ${splitpkg_overrides[@]}; do
-		local indirect="${var}_backup"
-		if [[ -n ${!indirect} ]]; then
-			eval "${var}=(\"\${$indirect[@]}\")"
-		else
-			unset ${var}
-		fi
+		declare -p $var || printf '%s\n'  "unset $var"
 	done
 }
 
 run_split_packaging() {
 	local pkgname_backup=("${pkgname[@]}")
+	local restore_package_variables
 	for pkgname in ${pkgname_backup[@]}; do
 		pkgdir="$pkgdirbase/$pkgname"
 		mkdir "$pkgdir"
-		backup_package_variables
+		restore_package_variables="$(backup_package_variables)"
 		run_package $pkgname
 		tidy_install
 		lint_package || exit $E_PACKAGE_FAILED
 		create_package
-		restore_package_variables
+		eval "$restore_package_variables"
 	done
 	pkgname=("${pkgname_backup[@]}")
 	create_debug_package
-- 
2.16.2


More information about the pacman-dev mailing list