[pacman-dev] makepkg: make source tarballs work with per-package files containing '$pkgname'

Message ID 20191222155753.12736-1-eschwartz@archlinux.org
State Superseded, archived
Headers show
Series [pacman-dev] makepkg: make source tarballs work with per-package files containing '$pkgname' | expand

Commit Message

Eli Schwartz Dec. 22, 2019, 3:57 p.m. UTC
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
is even recommended in the PKGBUILD(5) documentation...

... 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

Fixes FS#64932

Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
---
 scripts/makepkg.sh.in | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

Comments

Allan McRae Jan. 7, 2020, 3:07 a.m. UTC | #1
On 23/12/19 1:57 am, Eli Schwartz wrote:
> 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
> is even recommended in the PKGBUILD(5) documentation...
> 
> ... 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
> 
> Fixes FS#64932
> 
> Signed-off-by: Eli Schwartz <eschwartz@archlinux.org>
> ---
>  scripts/makepkg.sh.in | 8 +++++---
>  1 file changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
> index ca3e7459..674e0d87 100644
> --- a/scripts/makepkg.sh.in
> +++ b/scripts/makepkg.sh.in
> @@ -784,13 +784,14 @@ create_srcpackage() {
>  		fi
>  	done
>  
> -	local i
> +	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

It took me a while to see what this change did...   We need $pkgname set
right for the eval in extract_function_variable to do its thing.

Can we get a brief comment in that regard above the place where you
backup ${pkgname[@]}?



Also note, this problem extends into checking files are present early in
makepkg. e.g. for a PKGBUILD with pkgname=('a' 'b'), and using
$pkgname.install in both package_*() functions we get:

$ makepkg
==> ERROR: install file (a.install) does not exist or is not a regular file.
==> ERROR: install file (a.install) does not exist or is not a regular file.


>  				files+=("$file")
>  			fi
>  		done
> @@ -802,6 +803,7 @@ create_srcpackage() {
>  			fi
>  		done
>  	done
> +	pkgname=(${pkgname_backup[@]})
>  
>  	local fullver=$(get_full_version)
>  	local pkg_file="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"
>

Patch

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index ca3e7459..674e0d87 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -784,13 +784,14 @@  create_srcpackage() {
 		fi
 	done
 
-	local i
+	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
@@ -802,6 +803,7 @@  create_srcpackage() {
 			fi
 		done
 	done
+	pkgname=(${pkgname_backup[@]})
 
 	local fullver=$(get_full_version)
 	local pkg_file="$SRCPKGDEST/${pkgbase}-${fullver}${SRCEXT}"