[pacman-dev] [PATCH 4/4] makepkg: use c-style for loops for integrity checks

Dave Reisner dreisner at archlinux.org
Tue Sep 3 23:19:08 EDT 2013


These loops already maintain an independent loop counter, so cut out
the middle man. An extra fix is needed to continue supporting sparse
arrays which, while weird, are valid.

Signed-off-by: Dave Reisner <dreisner at archlinux.org>
---
If we don't care about supporting sparse arrays, I can simply drop the final
hunk off of this patch and adjust the commit message. Keeping support was
simple enough that I felt compelled to offer it.

Note, however, that removing support then causes makepkg to fail in cryptic
ways when it does encounter a sparse array, e.g.:

  $ makepkg -g
  ...
  ==> Generating checksums for source files...
  md5sums=('SKIP'
           'e99e9189aa2f6084ac28b8ddf605aeb8'
           'fb37e34ea006c79be1c54cbb0f803414'
  ==> ERROR: Unable to find source file .
      Aborting...

And if you're still lost, a sparse array could be constructed like this:

  source=('git://anongit.freedesktop.org/systemd/systemd.git'
          'initcpio-hook-udev'
          'initcpio-install-udev')
  source[5]='initcpio-install-systemd'
  md5sums=('SKIP'
           'e99e9189aa2f6084ac28b8ddf605aeb8'
           'fb37e34ea006c79be1c54cbb0f803414')
  md5sums[5]='fbea6190413f5e54a4d0784ca4a340e4'

This is perhaps a contrived example, but it's valid, and today's makepkg
handles it just fine.

 scripts/makepkg.sh.in | 48 +++++++++++++++++++++---------------------------
 1 file changed, 21 insertions(+), 27 deletions(-)

diff --git a/scripts/makepkg.sh.in b/scripts/makepkg.sh.in
index f92f658..3197e62 100644
--- a/scripts/makepkg.sh.in
+++ b/scripts/makepkg.sh.in
@@ -1145,12 +1145,11 @@ generate_checksums() {
 			exit 1 # $E_CONFIG_ERROR
 		fi
 
-		local ct=0
-		local numsrc=${#source[@]}
+		local idx numsrc=${#source[@]}
 		printf "%s" "${integ}sums=("
 
-		local netfile
-		for netfile in "${source[@]}"; do
+		for (( idx = 0; idx < numsrc; i++ )); do
+			local netfile=${source[idx]}
 			local proto sum
 			proto="$(get_protocol "$netfile")"
 
@@ -1171,10 +1170,10 @@ generate_checksums() {
 			esac
 
 			# indent checksum on lines after the first
-			printf "%*s%s" $(( ct ? ${#integ} + 6 : 0 )) '' "'$sum'"
+			printf "%*s%s" $(( idx ? ${#integ} + 6 : 0 )) '' "'$sum'"
 
 			# print a newline on lines before the last
-			(( ++ct < numsrc )) && echo
+			(( ++idx < numsrc )) && echo
 		done
 
 		echo ")"
@@ -1193,39 +1192,31 @@ check_checksums() {
 		if (( ${#integrity_sums[@]} == ${#source[@]} )); then
 			msg "$(gettext "Validating source files with %s...")" "${integ}sums"
 			correlation=1
-			local errors=0
-			local idx=0
-			local file
-			for file in "${source[@]}"; do
-				local found=1
-				file="$(get_filename "$file")"
+			local idx errors=0
+			for (( idx = 0; idx < ${#source[*]}; idx++ )); do
+				local file="$(get_filename "${source[idx]}")"
 				printf '    %s ... ' "$file" >&2
 
-				if [[ ${integrity_sums[$idx]} = 'SKIP' ]]; then
+				if [[ ${integrity_sums[idx]} = 'SKIP' ]]; then
 					printf '%s\n' "$(gettext "Skipped")" >&2
-					idx=$((idx + 1))
 					continue
 				fi
 
 				if ! file="$(get_filepath "$file")"; then
 					printf '%s\n' "$(gettext "NOT FOUND")" >&2
 					errors=1
-					found=0
+					continue
 				fi
 
-				if (( $found )) ; then
-					local expectedsum="${integrity_sums[idx],,}"
-					local realsum="$(openssl dgst -${integ} "$file")"
-					realsum="${realsum##* }"
-					if [[ $expectedsum = "$realsum" ]]; then
-						printf '%s\n' "$(gettext "Passed")" >&2
-					else
-						printf '%s\n' "$(gettext "FAILED")" >&2
-						errors=1
-					fi
+				local expectedsum="${integrity_sums[idx],,}"
+				local realsum="$(openssl dgst -${integ} "$file")"
+				realsum="${realsum##* }"
+				if [[ $expectedsum = "$realsum" ]]; then
+					printf '%s\n' "$(gettext "Passed")" >&2
+				else
+					printf '%s\n' "$(gettext "FAILED")" >&2
+					errors=1
 				fi
-
-				idx=$((idx + 1))
 			done
 
 			if (( errors )); then
@@ -2798,6 +2789,9 @@ else
 		BUILDFILE="$startdir/$BUILDFILE"
 	fi
 	source_safe "$BUILDFILE"
+	# rebuild source array to avoid problems with sparse arrays during
+	# checksum verification.
+	source=("${source[@]}")
 fi
 
 # set defaults if they weren't specified in buildfile
-- 
1.8.4



More information about the pacman-dev mailing list