From 6ebe375a3e397d5092f907cb07568386f6f53e11 Mon Sep 17 00:00:00 2001
From: Natanael Copa <ncopa@alpinelinux.org>
Date: Thu, 10 Oct 2024 13:58:49 +0200
Subject: [PATCH] abuild: validate versioned dependencies

---
 abuild.in         | 39 ++++++++++++++++++++++++++++++---------
 tests/abuild_test |  6 ++++++
 2 files changed, 36 insertions(+), 9 deletions(-)

diff --git a/abuild.in b/abuild.in
index a4bc3e5e..e594d167 100644
--- a/abuild.in
+++ b/abuild.in
@@ -227,6 +227,11 @@ default_validate() {
 		verify_pkgname "${i%%:*}" || die "${i%%:*} is not a valid package name"
 	done
 
+	# check dependencies
+	for i in $depends $makedepends; do
+		check_depver "$i" || return 1
+	done
+
 	for i in $install; do
 		local n=${i%.*}
 		local suff=${i##*.}
@@ -1069,15 +1074,31 @@ check_provides() {
 }
 
 check_depver() {
-	case "$1" in
-		*=*)
-			if ! $APK version --check --quiet "${1#*=}"; then
-				error "Invalid version: ${i#*=}"
-				return 1
-			fi
-			;;
-	esac
-	return 0
+	local name="${1%%[<>=~]*}"
+	if [ "$name" = "$1" ]; then
+		# no version constraint
+		return 0
+	fi
+
+	local ver="${1##*[<>=~]}"
+
+	if ! $APK version --check --quiet "$ver"; then
+		error "Invalid version: $ver in $1"
+		return 1
+	fi
+
+	local sep=${1#$name}
+	sep=${sep%$ver}
+
+	local i
+	for i in "<" ">" "=" "~" ">=" "<=" ">~" "<~"; do
+		if [ "$sep" = "$i" ]; then
+			return 0
+		fi
+	done
+
+	error "Invalid version separator '$sep' in $1"
+	return 1
 }
 
 prepare_metafiles() {
diff --git a/tests/abuild_test b/tests/abuild_test
index a2120ece..e6de1930 100755
--- a/tests/abuild_test
+++ b/tests/abuild_test
@@ -490,6 +490,12 @@ abuild_validate_depends_body() {
 		atf_check -s exit:0 \
 		-e match:"Validating" \
 		abuild validate
+
+	for i in "foo=bar" "foo=~1.0" "foo>1.0_invalid"; do \
+		TESTDEPENDS="$i" atf_check -s exit:1 \
+			-e match:"Validating" \
+			abuild validate
+	done
 }
 
 abuild_subpackage_arch_body() {
-- 
GitLab