Return-Path: X-Original-To: notmuch@notmuchmail.org Delivered-To: notmuch@notmuchmail.org Received: from localhost (localhost [127.0.0.1]) by olra.theworths.org (Postfix) with ESMTP id 80B47431FAF for ; Tue, 27 Nov 2012 20:54:07 -0800 (PST) X-Virus-Scanned: Debian amavisd-new at olra.theworths.org X-Spam-Flag: NO X-Spam-Score: -0.7 X-Spam-Level: X-Spam-Status: No, score=-0.7 tagged_above=-999 required=5 tests=[RCVD_IN_DNSWL_LOW=-0.7] autolearn=disabled Received: from olra.theworths.org ([127.0.0.1]) by localhost (olra.theworths.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 7rvna3POiVqy for ; Tue, 27 Nov 2012 20:54:07 -0800 (PST) Received: from dmz-mailsec-scanner-8.mit.edu (DMZ-MAILSEC-SCANNER-8.MIT.EDU [18.7.68.37]) by olra.theworths.org (Postfix) with ESMTP id CDE8C431FAE for ; Tue, 27 Nov 2012 20:54:06 -0800 (PST) X-AuditID: 12074425-b7f526d000002c4d-be-50b598ed2429 Received: from mailhub-auth-2.mit.edu ( [18.7.62.36]) by dmz-mailsec-scanner-8.mit.edu (Symantec Messaging Gateway) with SMTP id CF.62.11341.DE895B05; Tue, 27 Nov 2012 23:54:05 -0500 (EST) Received: from outgoing.mit.edu (OUTGOING-AUTH.MIT.EDU [18.7.22.103]) by mailhub-auth-2.mit.edu (8.13.8/8.9.2) with ESMTP id qAS4s48O023495; Tue, 27 Nov 2012 23:54:04 -0500 Received: from drake.dyndns.org (209-6-116-242.c3-0.arl-ubr1.sbo-arl.ma.cable.rcn.com [209.6.116.242]) (authenticated bits=0) (User authenticated as amdragon@ATHENA.MIT.EDU) by outgoing.mit.edu (8.13.6/8.12.4) with ESMTP id qAS4s22p011546 (version=TLSv1/SSLv3 cipher=AES256-SHA bits=256 verify=NOT); Tue, 27 Nov 2012 23:54:04 -0500 (EST) Received: from amthrax by drake.dyndns.org with local (Exim 4.77) (envelope-from ) id 1TdZes-0005R1-CE; Tue, 27 Nov 2012 23:54:02 -0500 From: Austin Clements To: notmuch@notmuchmail.org Subject: [PATCH] test: Use associative arrays to track external prereqs Date: Tue, 27 Nov 2012 23:54:01 -0500 Message-Id: <1354078441-20788-1-git-send-email-amdragon@mit.edu> X-Mailer: git-send-email 1.7.10.4 X-Brightmail-Tracker: H4sIAAAAAAAAA+NgFprJIsWRmVeSWpSXmKPExsUixG6novt2xtYAg5XvhC2u35zJ7MDo8WzV LeYAxigum5TUnMyy1CJ9uwSujFcH6gsuSFQ0HPZtYNwm0sXIySEhYCJx4fw1dghbTOLCvfVs XYxcHEIC+xglrnUeZYRwNjBKXDl9nRnCecQkMfl0N5Qzl1HizYRTbCD9bAIaEtv2L2cEsUUE pCV23p3N2sXIwcEsoCbxp0sFJCws4C7x8OFnsBIWAVWJJbOWsILYvAIOEmsuPYE6Q1Gi+9kE tgmMvAsYGVYxyqbkVunmJmbmFKcm6xYnJ+blpRbpWujlZpbopaaUbmIEh4CL6g7GCYeUDjEK cDAq8fA+MN8aIMSaWFZcmXuIUZKDSUmU980koBBfUn5KZUZicUZ8UWlOavEhRgkOZiURXp42 oBxvSmJlVWpRPkxKmoNFSZz3RspNfyGB9MSS1OzU1ILUIpisDAeHkgTvmulAjYJFqempFWmZ OSUIaSYOTpDhPEDDW0BqeIsLEnOLM9Mh8qcYFaXEebeBJARAEhmleXC9sBh9xSgO9Iowbw9I FQ8wvuG6XwENZgIanHx9I8jgkkSElFQDo94PIe3Dn3+fvSp+TV/0k9l/vouFyeEHjuz5uyb6 XYX82dpLux/WT3wtujB/3a+zdm37/QObT9/+G6LFMW16pN7Z1efKl88Vvqia8nje+6zLgrtv NdzyVkpbycqePId36ecVnGb8Vyc1Lor6zxY/6+ibtQ/Xli+5quLP5c/36eEmlQ2Ms0tig1Yo sRRnJBpqMRcVJwIAX+SCQKwCAAA= X-BeenThere: notmuch@notmuchmail.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: "Use and development of the notmuch mail system." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 28 Nov 2012 04:54:07 -0000 Previously, the test framework generated a variable name for each external prereq as a poor man's associative array. Unfortunately, prereqs names may not be legal variable names, leading to unintelligible bash errors like test_missing_external_prereq_emacsclient.emacs24_=t: command not found Using proper associative arrays to track prereqs, in addition to being much cleaner than generating variable names and using grep to carefully construct unique string lists, removes restrictions on prereq names. --- test/test-lib.sh | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/test/test-lib.sh b/test/test-lib.sh index 77063a4..f169785 100644 --- a/test/test-lib.sh +++ b/test/test-lib.sh @@ -625,18 +625,22 @@ test_have_prereq () { esac } +declare -A test_missing_external_prereq_ +declare -A test_subtest_missing_external_prereq_ + # declare prerequisite for the given external binary test_declare_external_prereq () { binary="$1" test "$#" = 2 && name=$2 || name="$binary(1)" - hash $binary 2>/dev/null || eval " - test_missing_external_prereq_${binary}_=t + if ! hash $binary 2>/dev/null; then + test_missing_external_prereq_["${binary}"]=t + eval " $binary () { - echo -n \"\$test_subtest_missing_external_prereqs_ \" | grep -qe \" $name \" || - test_subtest_missing_external_prereqs_=\"\$test_subtest_missing_external_prereqs_ $name\" + test_subtest_missing_external_prereq_[\"${name}\"]=t false }" + fi } # Explicitly require external prerequisite. Useful when binary is @@ -644,7 +648,7 @@ $binary () { # Returns success if dependency is available, failure otherwise. test_require_external_prereq () { binary="$1" - if [ "$(eval echo -n \$test_missing_external_prereq_${binary}_)" = t ]; then + if [[ ${test_missing_external_prereq_["${binary}"]} == t ]]; then # dependency is missing, call the replacement function to note it eval "$binary" else @@ -737,9 +741,9 @@ test_skip () { } test_check_missing_external_prereqs_ () { - if test -n "$test_subtest_missing_external_prereqs_"; then - say_color skip >&1 "missing prerequisites:" - echo "$test_subtest_missing_external_prereqs_" >&1 + if [[ ${#test_subtest_missing_external_prereq_[@]} != 0 ]]; then + say_color skip >&1 "missing prerequisites: " + echo ${!test_subtest_missing_external_prereq_[@]} >&1 test_report_skip_ "$@" else false @@ -1022,7 +1026,7 @@ test_python() { # most others as /usr/bin/python. So first try python2, and fallback to # python if python2 doesn't exist. cmd=python2 - [[ "$test_missing_external_prereq_python2_" = t ]] && cmd=python + [[ ${test_missing_external_prereq_[python2]} == t ]] && cmd=python (echo "import sys; _orig_stdout=sys.stdout; sys.stdout=open('OUTPUT', 'w')"; cat) \ | $cmd - @@ -1064,7 +1068,7 @@ test_reset_state_ () { test -z "$test_init_done_" && test_init_ test_subtest_known_broken_= - test_subtest_missing_external_prereqs_= + test_subtest_missing_external_prereq_=() } # called once before the first subtest -- 1.7.10.4