[pacman-dev,v2,1/2] libmakepkg/lint_pkgbuild: fix regression in linting depends=(foo=$epoch:$pkgver-$pkgrel)

Message ID 20180510195128.11176-1-eschwartz@archlinux.org
State Superseded, archived
Headers show
Series [pacman-dev,v2,1/2] libmakepkg/lint_pkgbuild: fix regression in linting depends=(foo=$epoch:$pkgver-$pkgrel) | expand

Commit Message

Eli Schwartz May 10, 2018, 7:51 p.m. UTC
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 <eschwartz@archlinux.org>
---

v2: this applies equally to epoch

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

--
2.17.0

Patch

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..2cf636ad 100644
--- a/scripts/libmakepkg/lint_pkgbuild/checkdepends.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/checkdepends.sh.in
@@ -42,11 +42,13 @@  lint_checkdepends() {
 	shopt -s extglob

 	for checkdepend in "${checkdepends_list[@]}"; do
-		name=${checkdepend%%@(<|>|=|>=|<=)*}
-		ver=${checkdepend#*@(<|>|=|>=|<=)}
+		name=${checkdepend%@(<|>|=|>=|<=)*}
+		# remove optional epoch in version specifier
+		ver=${checkdepend##*@(<|>|=|>=|<=)?(+([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..e83ae643 100644
--- a/scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/conflicts.sh.in
@@ -42,11 +42,13 @@  lint_conflicts() {
 	shopt -s extglob

 	for conflict in "${conflicts_list[@]}"; do
-		name=${conflict%%@(<|>|=|>=|<=)*}
-		ver=${conflict#*@(<|>|=|>=|<=)}
+		name=${conflict%@(<|>|=|>=|<=)*}
+		# remove optional epoch in version specifier
+		ver=${conflict##*@(<|>|=|>=|<=)?(+([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..c16a3c1d 100644
--- a/scripts/libmakepkg/lint_pkgbuild/depends.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/depends.sh.in
@@ -42,11 +42,13 @@  lint_depends() {
 	shopt -s extglob

 	for depend in "${depends_list[@]}"; do
-		name=${depend%%@(<|>|=|>=|<=)*}
-		ver=${depend#*@(<|>|=|>=|<=)}
+		name=${depend%@(<|>|=|>=|<=)*}
+		# remove optional epoch in version specifier
+		ver=${depend##*@(<|>|=|>=|<=)?(+([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..a0a8739b 100644
--- a/scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/makedepends.sh.in
@@ -42,11 +42,13 @@  lint_makedepends() {
 	shopt -s extglob

 	for makedepend in "${makedepends_list[@]}"; do
-		name=${makedepend%%@(<|>|=|>=|<=)*}
-		ver=${makedepend#*@(<|>|=|>=|<=)}
+		name=${makedepend%@(<|>|=|>=|<=)*}
+		# remove optional epoch in version specifier
+		ver=${makedepend##*@(<|>|=|>=|<=)?(+([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..ca0b74d3 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##*=?(+([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
 }