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

Reply via email to