summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2016-05-05 13:30:10 -0700
committerJunio C Hamano <gitster@pobox.com>2016-05-10 12:57:48 -0700
commitaccac4199c1d28dfd6c860b32d7111c3de8df7a6 (patch)
tree1fae2f990cd808c9517a78b3cacff485469534e4
parentaaab84203b9654fb73df41d3cb71a6aad3a091fa (diff)
downloadgit-accac4199c1d28dfd6c860b32d7111c3de8df7a6.tar.gz
test-parse-options: fix output when callback option fails
When test-parse-options detects an error on the command line, it gives the usage string just like any parse-options API users do, without showing any "variable dump". An exception is the callback test, where a "variable dump" for the option is done before the command line options are fully parsed. Do not expose this implementation detail by separating the handling of callback test into two phases, one to capture the fact that an option was given during the option parsing phase, and the other to show that fact as a part of normal "variable dump". The effect of this fix is seen in the patch to t/t0040 where it tried "test-parse-options --no-length" where "--length" is a callback that does not take a negative form. Signed-off-by: Junio C Hamano <gitster@pobox.com>
-rwxr-xr-xt/t0040-parse-options.sh4
-rw-r--r--test-parse-options.c18
2 files changed, 17 insertions, 5 deletions
diff --git a/t/t0040-parse-options.sh b/t/t0040-parse-options.sh
index fec3fef9a1..dbaee5526a 100755
--- a/t/t0040-parse-options.sh
+++ b/t/t0040-parse-options.sh
@@ -356,9 +356,7 @@ test_expect_success 'OPT_CALLBACK() and OPT_BIT() work' '
test_cmp expect output
'
-cat >expect <<\EOF
-Callback: "not set", 1
-EOF
+>expect
test_expect_success 'OPT_CALLBACK() and callback errors work' '
test_must_fail test-parse-options --no-length >output 2>output.err &&
diff --git a/test-parse-options.c b/test-parse-options.c
index f02c275f33..b5f4e900ba 100644
--- a/test-parse-options.c
+++ b/test-parse-options.c
@@ -14,10 +14,18 @@ static char *file = NULL;
static int ambiguous;
static struct string_list list;
+static struct {
+ int called;
+ const char *arg;
+ int unset;
+} length_cb;
+
static int length_callback(const struct option *opt, const char *arg, int unset)
{
- printf("Callback: \"%s\", %d\n",
- (arg ? arg : "not set"), unset);
+ length_cb.called = 1;
+ length_cb.arg = arg;
+ length_cb.unset = unset;
+
if (unset)
return 1; /* do not support unset */
@@ -84,6 +92,12 @@ int main(int argc, char **argv)
argc = parse_options(argc, (const char **)argv, prefix, options, usage, 0);
+ if (length_cb.called) {
+ const char *arg = length_cb.arg;
+ int unset = length_cb.unset;
+ printf("Callback: \"%s\", %d\n",
+ (arg ? arg : "not set"), unset);
+ }
printf("boolean: %d\n", boolean);
printf("integer: %d\n", integer);
printf("magnitude: %lu\n", magnitude);