From 19e3780258ea143ec82b25773c810d693b93949d Mon Sep 17 00:00:00 2001 From: Austin Clements Date: Wed, 28 Nov 2012 23:54:01 +1900 Subject: [PATCH] [PATCH] test: Use associative arrays to track external prereqs --- f3/cdef99abe09e9f8b2a47ba7d4bc01518044781 | 158 ++++++++++++++++++++++ 1 file changed, 158 insertions(+) create mode 100644 f3/cdef99abe09e9f8b2a47ba7d4bc01518044781 diff --git a/f3/cdef99abe09e9f8b2a47ba7d4bc01518044781 b/f3/cdef99abe09e9f8b2a47ba7d4bc01518044781 new file mode 100644 index 000000000..b90168c4d --- /dev/null +++ b/f3/cdef99abe09e9f8b2a47ba7d4bc01518044781 @@ -0,0 +1,158 @@ +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 + -- 2.26.2