[pacman-dev] [PATCH v2] makepkg: make per-package files containing '$pkgname' consistently work

Eli Schwartz eschwartz at archlinux.org
Thu Jan 16 17:27:34 UTC 2020


Extracting function variables containing arbitrarily scoped variables of
arbitrary nature is a disaster, but let's at least cover the common case
of using the actual '$pkgname' in an install/changelog file. It's the
odd case of actually being basically justified use of disambiguating
between the same variable used in multiple different split packages...
and also, --printsrcinfo already uses and overwrites the variable
'pkgname' in pkgbuild_extract_to_srcinfo, so this "works" in .SRCINFO
but doesn't work in .src.tar.gz

It doesn't work in lint_pkgbuild either, but in that case the problem is
being too permissive, not too restrictive -- we might end up checking
the same file twice, and printing that it is missing twice.

Fixes FS#64932

Signed-off-by: Eli Schwartz <eschwartz at archlinux.org>
---

v2: add explanatory comments, and handle lint_pkgbuild as well

 scripts/libmakepkg/lint_pkgbuild/changelog.sh.in | 10 +++++++---
 scripts/libmakepkg/lint_pkgbuild/install.sh.in   | 10 +++++++---
 scripts/makepkg.sh.in                            | 10 +++++++---
 3 files changed, 21 insertions(+), 9 deletions(-)

diff --git a/scripts/libmakepkg/lint_pkgbuild/changelog.sh.in b/scripts/libmakepkg/lint_pkgbuild/changelog.sh.in
index 114298f9..be6501ef 100644
--- a/scripts/libmakepkg/lint_pkgbuild/changelog.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/changelog.sh.in
@@ -32,11 +32,15 @@ lint_pkgbuild_functions+=('lint_changelog')
 
 
 lint_changelog() {
-	local name file changelog_list
+	local file changelog_list
 
 	changelog_list=("${changelog[@]}")
-	for name in "${pkgname[@]}"; do
-		if extract_function_variable "package_$name" changelog 0 file; then
+	# set pkgname the same way we do for running package(), this way we get
+	# the right value in extract_function_variable
+	local pkgname_backup=(${pkgname[@]})
+	local pkgname
+	for pkgname in "${pkgname_backup[@]}"; do
+		if extract_function_variable "package_$pkgname" changelog 0 file; then
 			changelog_list+=("$file")
 		fi
 	done
diff --git a/scripts/libmakepkg/lint_pkgbuild/install.sh.in b/scripts/libmakepkg/lint_pkgbuild/install.sh.in
index 95076692..1bf5681d 100644
--- a/scripts/libmakepkg/lint_pkgbuild/install.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/install.sh.in
@@ -32,11 +32,15 @@ lint_pkgbuild_functions+=('lint_install')
 
 
 lint_install() {
-	local list file name install_list ret=0
+	local list file install_list ret=0
 
 	install_list=("${install[@]}")
-	for name in "${pkgname[@]}"; do
-		extract_function_variable "package_$name" install 0 file
+	# set pkgname the same way we do for running package(), this way we get
+	# the right value in extract_function_variable
+	local pkgname_backup=(${pkgname[@]})
+	local pkgname
+	for pkgname in "${pkgname_backup[@]}"; do
+		extract_function_variable "package_$pkgname" install 0 file
 		install_list+=("$file")
 	done
 
diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index 9f641d97..2e54b8aa 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -800,13 +800,16 @@ create_srcpackage() {
 		fi
 	done
 
-	local i
+	# set pkgname the same way we do for running package(), this way we get
+	# the right value in extract_function_variable
+	local pkgname_backup=(${pkgname[@]})
+	local i pkgname
 	for i in 'changelog' 'install'; do
 		local file files
 
 		[[ ${!i} ]] && files+=("${!i}")
-		for name in "${pkgname[@]}"; do
-			if extract_function_variable "package_$name" "$i" 0 file; then
+		for pkgname in "${pkgname_backup[@]}"; do
+			if extract_function_variable "package_$pkgname" "$i" 0 file; then
 				files+=("$file")
 			fi
 		done
@@ -818,6 +821,7 @@ create_srcpackage() {
 			fi
 		done
 	done
+	pkgname=(${pkgname_backup[@]})
 
 	local fullver=$(get_full_version)
 	local pkg_file="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
-- 
2.25.0


More information about the pacman-dev mailing list