In commit 91b72cc386ca03241791748da5da2b150c724ace support was added for
linting depends/etc. to ensure they contain only valid dependency
specifiers. However it did not properly take into account the
possibility of dependencies linked to a specific pkgrel or epoch, which
promptly failed to build because "-" and ":" is not allowed in a pkgver.

pkgrel is something supported by pacman and useful for e.g. split packages
which cannot be mismatched even if the pkgver is the same. Fix by
removing an optional suffixed "-$decimal" when checking for a valid
pkgver.

epoch is kind of difficult to do without :D so likewise fix by removing
an optional prefixed "$integer:"

Signed-off-by: Eli Schwartz <[email protected]>
---

v3: ugh, that wasn't right at all. names must be greedily trimmed,
because otherwise, given >=, we end up with name="foo>"

 scripts/libmakepkg/lint_pkgbuild/3                 |  0
 .../libmakepkg/lint_pkgbuild/checkdepends.sh.in    |  6 ++++--
 scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in   |  6 ++++--
 scripts/libmakepkg/lint_pkgbuild/depends.sh.in     |  6 ++++--
 scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in |  6 ++++--
 scripts/libmakepkg/lint_pkgbuild/provides.sh.in    | 14 +++++++++++---
 6 files changed, 27 insertions(+), 11 deletions(-)
 create mode 100644 scripts/libmakepkg/lint_pkgbuild/3

diff --git a/scripts/libmakepkg/lint_pkgbuild/3 
b/scripts/libmakepkg/lint_pkgbuild/3
new file mode 100644
index 00000000..e69de29b
diff --git a/scripts/libmakepkg/lint_pkgbuild/checkdepends.sh.in 
b/scripts/libmakepkg/lint_pkgbuild/checkdepends.sh.in
index 5d15bfb2..fb289a67 100644
--- a/scripts/libmakepkg/lint_pkgbuild/checkdepends.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/checkdepends.sh.in
@@ -43,10 +43,12 @@ lint_checkdepends() {
 
        for checkdepend in "${checkdepends_list[@]}"; do
                name=${checkdepend%%@(<|>|=|>=|<=)*}
-               ver=${checkdepend#*@(<|>|=|>=|<=)}
+               # remove optional epoch in version specifier
+               ver=${checkdepend##$name@(<|>|=|>=|<=)?(+([0-9]):)}
                lint_one_pkgname checkdepends "$name" || ret=1
                if [[ $ver != $checkdepend ]]; then
-                       check_pkgver "$ver" checkdepends || ret=1
+                       # remove optional pkgrel in version specifier
+                       check_pkgver "${ver%-+([0-9])?(.+([0-9]))}" 
checkdepends || ret=1
                fi
        done
 
diff --git a/scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in 
b/scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in
index d81e9784..8abad0b0 100644
--- a/scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in
@@ -43,10 +43,12 @@ lint_conflicts() {
 
        for conflict in "${conflicts_list[@]}"; do
                name=${conflict%%@(<|>|=|>=|<=)*}
-               ver=${conflict#*@(<|>|=|>=|<=)}
+               # remove optional epoch in version specifier
+               ver=${conflict##$name@(<|>|=|>=|<=)?(+([0-9]):)}
                lint_one_pkgname conflicts "$name" || ret=1
                if [[ $ver != $conflict ]]; then
-                       check_pkgver "$ver" conflicts || ret=1
+                       # remove optional pkgrel in version specifier
+                       check_pkgver "${ver%-+([0-9])?(.+([0-9]))}" conflicts 
|| ret=1
                fi
        done
 
diff --git a/scripts/libmakepkg/lint_pkgbuild/depends.sh.in 
b/scripts/libmakepkg/lint_pkgbuild/depends.sh.in
index f17bc545..d90a15f8 100644
--- a/scripts/libmakepkg/lint_pkgbuild/depends.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/depends.sh.in
@@ -43,10 +43,12 @@ lint_depends() {
 
        for depend in "${depends_list[@]}"; do
                name=${depend%%@(<|>|=|>=|<=)*}
-               ver=${depend#*@(<|>|=|>=|<=)}
+               # remove optional epoch in version specifier
+               ver=${depend##$name@(<|>|=|>=|<=)?(+([0-9]):)}
                lint_one_pkgname depends "$name" || ret=1
                if [[ $ver != $depend ]]; then
-                       check_pkgver "$ver" depends || ret=1
+                       # remove optional pkgrel in version specifier
+                       check_pkgver "${ver%-+([0-9])?(.+([0-9]))}" depends || 
ret=1
                fi
        done
 
diff --git a/scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in 
b/scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in
index 1d0762fb..55ca4e28 100644
--- a/scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in
@@ -43,10 +43,12 @@ lint_makedepends() {
 
        for makedepend in "${makedepends_list[@]}"; do
                name=${makedepend%%@(<|>|=|>=|<=)*}
-               ver=${makedepend#*@(<|>|=|>=|<=)}
+               # remove optional epoch in version specifier
+               ver=${makedepend##$name@(<|>|=|>=|<=)?(+([0-9]):)}
                lint_one_pkgname makedepends "$name" || ret=1
                if [[ $ver != $makedepend ]]; then
-                       check_pkgver "$ver" makedepends || ret=1
+                       # remove optional pkgrel in version specifier
+                       check_pkgver "${ver%-+([0-9])?(.+([0-9]))}" makedepends 
|| ret=1
                fi
        done
 
diff --git a/scripts/libmakepkg/lint_pkgbuild/provides.sh.in 
b/scripts/libmakepkg/lint_pkgbuild/provides.sh.in
index 7500a88a..102be08e 100644
--- a/scripts/libmakepkg/lint_pkgbuild/provides.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/provides.sh.in
@@ -37,19 +37,27 @@ lint_provides() {
 
        get_pkgbuild_all_split_attributes provides provides_list
 
+       # this function requires extglob - save current status to restore later
+       local shellopts=$(shopt -p extglob)
+       shopt -s extglob
+
        for provide in "${provides_list[@]}"; do
                if [[ $provide == *['<>']* ]]; then
                        error "$(gettext "%s array cannot contain comparison (< 
or >) operators.")" "provides"
                        ret=1
                        continue
                fi
-               name=${provide%%=*}
-               ver=${provide#*=}
+               name=${provide%=*}
+               # remove optional epoch in version specifier
+               ver=${provide##$name=?(+([0-9]):)}
                lint_one_pkgname provides "$name" || ret=1
                if [[ $ver != $provide ]]; then
-                       check_pkgver "$ver" provides || ret=1
+                       # remove optional pkgrel in version specifier
+                       check_pkgver "${ver%-+([0-9])?(.+([0-9]))}" provides || 
ret=1
                fi
        done
 
+       eval "$shellopts"
+
        return $ret
 }
-- 
2.17.0

Reply via email to