[pacman-dev,v2] libmakepkg: lint all arrays for empty values

Message ID 20201028013904.63736-1-morganamilo@archlinux.org
State Under Review
Headers show
Series [pacman-dev,v2] libmakepkg: lint all arrays for empty values | expand

Commit Message

morganamilo Oct. 28, 2020, 1:39 a.m. UTC
Empty values break pacman's db format, as an empty line indicates an end
of section.

---

I've seen this out in the wild:
https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=vim-coc-highlight-git&id=3063e1a6d3e72a35528

Comments

Allan McRae Nov. 26, 2020, 5:55 a.m. UTC | #1
On 28/10/20 11:39 am, morganamilo wrote:
> Empty values break pacman's db format, as an empty line indicates an end
> of section.
> 
> ---
> 
> I've seen this out in the wild:
> https://aur.archlinux.org/cgit/aur.git/tree/PKGBUILD?h=vim-coc-highlight-git&id=3063e1a6d3e72a35528
> 
> diff --git a/scripts/libmakepkg/lint_pkgbuild/variable.sh.in b/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
> index 1bc49722..22f5fbbb 100644
> --- a/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
> +++ b/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
> @@ -31,7 +31,7 @@ lint_pkgbuild_functions+=('lint_variable')
>  
>  
>  lint_variable() {
> -	local i a pkg out bad ret=0
> +	local i a pkg out bad array var ret=0
>  
>  	# global variables
>  	for i in ${pkgbuild_schema_arrays[@]}; do
> @@ -93,5 +93,62 @@ lint_variable() {
>  		done
>  	done
>  
> +	# ensure lists don't contain empty values
> +	for i in ${pkgbuild_schema_arrays[@]}; do
> +		if declare -p $i > /dev/null 2>&1; then
> +			array_build "array" "$i"
> +			for var in "${array[@]}"; do
> +				if [[ -z "$var" ]]; then
> +					error "$(gettext "%s is not allowed to be empty")" "$i"

The array here is not empty, but a value in the array.  I think this
would be a better error message.

"$(gettext "%s is not allowed to contain empty values")" "$i"

> +					ret=1
> +				fi
> +			done
> +		fi
> +	done
> +
> +	for a in ${arch[@]}; do
> +		[[ $a == "any" ]] && continue
> +
> +		for i in ${pkgbuild_schema_arch_arrays[@]}; do
> +			if declare -p "${i}_${a}" > /dev/null 2>&1; then
> +				array_build "array" "${i}_${a}"
> +				for var in "${array[@]}"; do
> +					if [[ -z "$var" ]]; then
> +						error "$(gettext "%s is not allowed to be empty")" "${i}_${a}"
> +						ret=1
> +					fi
> +				done
> +			fi
> +		done
> +	done
> +
> +	for pkg in ${pkgname[@]}; do
> +		for i in ${pkgbuild_schema_arrays[@]}; do
> +			if extract_function_variable "package_$pkg" $i 1 out; then
> +				for val in "${out[@]}" ;do

Switched from var to val here.

> +					if [[ -z "$val" ]]; then
> +						error "$(gettext "%s is not allowed to be empty")" "$i"
> +						ret=1
> +					fi
> +				done
> +			fi
> +		done
> +
> +		for a in ${arch[@]}; do
> +			[[ $a == "any" ]] && continue
> +
> +			for i in ${pkgbuild_schema_arch_arrays[@]}; do
> +				if extract_function_variable "package_$pkg" "${i}_${a}" 1 out; then
> +					for val in "${out[@]}" ;do
> +						if [[ -z "$val" ]]; then
> +							error "$(gettext "%s is not allowed to be empty")" "${i}_${a}"
> +							ret=1
> +						fi
> +					done
> +				fi
> +			done
> +		done
> +	done
> +
>  	return $ret
>  }
>

Patch

diff --git a/scripts/libmakepkg/lint_pkgbuild/variable.sh.in b/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
index 1bc49722..22f5fbbb 100644
--- a/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
+++ b/scripts/libmakepkg/lint_pkgbuild/variable.sh.in
@@ -31,7 +31,7 @@  lint_pkgbuild_functions+=('lint_variable')
 
 
 lint_variable() {
-	local i a pkg out bad ret=0
+	local i a pkg out bad array var ret=0
 
 	# global variables
 	for i in ${pkgbuild_schema_arrays[@]}; do
@@ -93,5 +93,62 @@  lint_variable() {
 		done
 	done
 
+	# ensure lists don't contain empty values
+	for i in ${pkgbuild_schema_arrays[@]}; do
+		if declare -p $i > /dev/null 2>&1; then
+			array_build "array" "$i"
+			for var in "${array[@]}"; do
+				if [[ -z "$var" ]]; then
+					error "$(gettext "%s is not allowed to be empty")" "$i"
+					ret=1
+				fi
+			done
+		fi
+	done
+
+	for a in ${arch[@]}; do
+		[[ $a == "any" ]] && continue
+
+		for i in ${pkgbuild_schema_arch_arrays[@]}; do
+			if declare -p "${i}_${a}" > /dev/null 2>&1; then
+				array_build "array" "${i}_${a}"
+				for var in "${array[@]}"; do
+					if [[ -z "$var" ]]; then
+						error "$(gettext "%s is not allowed to be empty")" "${i}_${a}"
+						ret=1
+					fi
+				done
+			fi
+		done
+	done
+
+	for pkg in ${pkgname[@]}; do
+		for i in ${pkgbuild_schema_arrays[@]}; do
+			if extract_function_variable "package_$pkg" $i 1 out; then
+				for val in "${out[@]}" ;do
+					if [[ -z "$val" ]]; then
+						error "$(gettext "%s is not allowed to be empty")" "$i"
+						ret=1
+					fi
+				done
+			fi
+		done
+
+		for a in ${arch[@]}; do
+			[[ $a == "any" ]] && continue
+
+			for i in ${pkgbuild_schema_arch_arrays[@]}; do
+				if extract_function_variable "package_$pkg" "${i}_${a}" 1 out; then
+					for val in "${out[@]}" ;do
+						if [[ -z "$val" ]]; then
+							error "$(gettext "%s is not allowed to be empty")" "${i}_${a}"
+							ret=1
+						fi
+					done
+				fi
+			done
+		done
+	done
+
 	return $ret
 }