makepkg: properly correlate checksums for multiple sources

Previously, we used a single boolean value to determine correlation of
sources to checksums. Since the introduction of arch-specific sources,
this is no longer sufficient, as we must ensure that we have checksums
for (potentially) multiple source arrays.

This change inlines the logic of have_sources to build an associative
array of source array names, unsetting them as we discover their
checksums. The error condition then becomes a non-empty correlation
array.

Fixes: https://bugs.archlinux.org/task/43192

Signed-off-by: Allan McRae <allan@archlinux.org>
This commit is contained in:
Dave Reisner 2014-12-23 10:57:29 -05:00 committed by Allan McRae
parent c07593c64c
commit d2d00e4543
1 changed files with 13 additions and 19 deletions

View File

@ -1317,47 +1317,41 @@ verify_integrity_sums() {
fi
}
have_sources() {
local a
(( ${#source[*]} )) && return 0
check_checksums() {
local integ a
declare -A correlation
(( SKIPCHECKSUMS )) && return 0
# Initialize a map which we'll use to verify that every source array has at
# least some kind of checksum array associated with it.
(( ${#source[*]} )) && correlation['source']=1
case $1 in
all)
for a in "${arch[@]}"; do
array_build _ source_"$a" && return 0
array_build _ source_"$a" && correlation["source_$a"]=1
done
;;
*)
array_build _ source_"$CARCH" && return 0
array_build _ source_"$CARCH" && correlation["source_$CARCH"]=1
;;
esac
return 1
}
check_checksums() {
(( SKIPCHECKSUMS )) && return 0
have_sources "$1" || return 0
local correlation=0
local integ a
for integ in "${known_hash_algos[@]}"; do
verify_integrity_sums "$integ" && correlation=1
verify_integrity_sums "$integ" && unset "correlation[source]"
case $1 in
all)
for a in "${arch[@]}"; do
verify_integrity_sums "$integ" "$a" && correlation=1
verify_integrity_sums "$integ" "$a" && unset "correlation[source_$a]"
done
;;
*)
verify_integrity_sums "$integ" "$CARCH" && correlation=1
verify_integrity_sums "$integ" "$CARCH" && unset "correlation[source_$CARCH]"
;;
esac
done
if (( ! correlation )); then
if (( ${#correlation[*]} )); then
error "$(gettext "Integrity checks are missing.")"
exit 1 # TODO: error code
fi