-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
env--helper: new undocumented builtin wrapping git_env_*()
We have many GIT_TEST_* variables that accept a <boolean> because they"re implemented in C, and then some that take <non-empty?> because they"re implemented at least partially in shellscript. Add a helper that wraps git_env_bool() and git_env_ulong() as the first step in fixing this. This isn"t being added as a test-tool mode because some of these are used outside the test suite. Part of what this tool does can be done via a trick with "git config" added in 83d842d ("tests: turn on network daemon tests by default", 2014-02-10) for test_tristate(), i.e.: git -c magic.variable="$1" config --bool magic.variable 2>/dev/null But as subsequent changes will show being able to pass along the default value makes all the difference, and we"ll be able to replace test_tristate() itself with that. The --type=bool option will be used by subsequent patches, but not --type=ulong. I figured it was easy enough to add it & test for it so I left it in so we"d have wrappers for both git_env_*() functions, and to have a template to make it obvious how we"d add --type=int etc. if it"s needed in the future. Signed-off-by: Ævar Arnfjörð Bjarmason <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
- Loading branch information
Showing
6 changed files
with
182 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
#include "builtin.h" | ||
#include "config.h" | ||
#include "parse-options.h" | ||
|
||
static char const * const env__helper_usage[] = { | ||
N_("git env--helper --type=[bool|ulong] <options> <env-var>"), | ||
NULL | ||
}; | ||
|
||
enum { | ||
ENV_HELPER_TYPE_BOOL = 1, | ||
ENV_HELPER_TYPE_ULONG | ||
} cmdmode = 0; | ||
|
||
static int option_parse_type(const struct option *opt, const char *arg, | ||
int unset) | ||
{ | ||
if (!strcmp(arg, "bool")) | ||
cmdmode = ENV_HELPER_TYPE_BOOL; | ||
else if (!strcmp(arg, "ulong")) | ||
cmdmode = ENV_HELPER_TYPE_ULONG; | ||
else | ||
die(_("unrecognized --type argument, %s"), arg); | ||
|
||
return 0; | ||
} | ||
|
||
int cmd_env__helper(int argc, const char **argv, const char *prefix) | ||
{ | ||
int exit_code = 0; | ||
const char *env_variable = NULL; | ||
const char *env_default = NULL; | ||
int ret; | ||
int ret_int, default_int; | ||
unsigned long ret_ulong, default_ulong; | ||
struct option opts[] = { | ||
OPT_CALLBACK_F(0, "type", &cmdmode, N_("type"), | ||
N_("value is given this type"), PARSE_OPT_NONEG, | ||
option_parse_type), | ||
OPT_STRING(0, "default", &env_default, N_("value"), | ||
N_("default for git_env_*(...) to fall back on")), | ||
OPT_BOOL(0, "exit-code", &exit_code, | ||
N_("be quiet only use git_env_*() value as exit code")), | ||
OPT_END(), | ||
}; | ||
|
||
argc = parse_options(argc, argv, prefix, opts, env__helper_usage, | ||
PARSE_OPT_KEEP_UNKNOWN); | ||
if (env_default && !*env_default) | ||
usage_with_options(env__helper_usage, opts); | ||
if (!cmdmode) | ||
usage_with_options(env__helper_usage, opts); | ||
if (argc != 1) | ||
usage_with_options(env__helper_usage, opts); | ||
env_variable = argv[0]; | ||
|
||
switch (cmdmode) { | ||
case ENV_HELPER_TYPE_BOOL: | ||
if (env_default) { | ||
default_int = git_parse_maybe_bool(env_default); | ||
if (default_int == -1) { | ||
error(_("option `--default' expects a boolean value with `--type=bool`, not `%s`"), | ||
env_default); | ||
usage_with_options(env__helper_usage, opts); | ||
} | ||
} else { | ||
default_int = 0; | ||
} | ||
ret_int = git_env_bool(env_variable, default_int); | ||
if (!exit_code) | ||
puts(ret_int ? "true" : "false"); | ||
ret = ret_int; | ||
break; | ||
case ENV_HELPER_TYPE_ULONG: | ||
if (env_default) { | ||
if (!git_parse_ulong(env_default, &default_ulong)) { | ||
error(_("option `--default' expects an unsigned long value with `--type=ulong`, not `%s`"), | ||
env_default); | ||
usage_with_options(env__helper_usage, opts); | ||
} | ||
} else { | ||
default_ulong = 0; | ||
} | ||
ret_ulong = git_env_ulong(env_variable, default_ulong); | ||
if (!exit_code) | ||
printf("%lu\n", ret_ulong); | ||
ret = ret_ulong; | ||
break; | ||
default: | ||
BUG("unknown <type> value"); | ||
break; | ||
} | ||
|
||
return !ret; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,83 @@ | ||
#!/bin/sh | ||
|
||
test_description='test env--helper' | ||
|
||
. ./test-lib.sh | ||
|
||
|
||
test_expect_success 'env--helper usage' ' | ||
test_must_fail git env--helper && | ||
test_must_fail git env--helper --type=bool && | ||
test_must_fail git env--helper --type=ulong && | ||
test_must_fail git env--helper --type=bool && | ||
test_must_fail git env--helper --type=bool --default && | ||
test_must_fail git env--helper --type=bool --default= && | ||
test_must_fail git env--helper --defaultxyz | ||
' | ||
|
||
test_expect_success 'env--helper bad default values' ' | ||
test_must_fail git env--helper --type=bool --default=1xyz MISSING && | ||
test_must_fail git env--helper --type=ulong --default=1xyz MISSING | ||
' | ||
|
||
test_expect_success 'env--helper --type=bool' ' | ||
# Test various --default bool values | ||
echo true >expected && | ||
git env--helper --type=bool --default=1 MISSING >actual && | ||
test_cmp expected actual && | ||
git env--helper --type=bool --default=yes MISSING >actual && | ||
test_cmp expected actual && | ||
git env--helper --type=bool --default=true MISSING >actual && | ||
test_cmp expected actual && | ||
echo false >expected && | ||
test_must_fail git env--helper --type=bool --default=0 MISSING >actual && | ||
test_cmp expected actual && | ||
test_must_fail git env--helper --type=bool --default=no MISSING >actual && | ||
test_cmp expected actual && | ||
test_must_fail git env--helper --type=bool --default=false MISSING >actual && | ||
test_cmp expected actual && | ||
# No output with --exit-code | ||
git env--helper --type=bool --default=true --exit-code MISSING >actual.out 2>actual.err && | ||
test_must_be_empty actual.out && | ||
test_must_be_empty actual.err && | ||
test_must_fail git env--helper --type=bool --default=false --exit-code MISSING >actual.out 2>actual.err && | ||
test_must_be_empty actual.out && | ||
test_must_be_empty actual.err && | ||
# Existing variable | ||
EXISTS=true git env--helper --type=bool --default=false --exit-code EXISTS >actual.out 2>actual.err && | ||
test_must_be_empty actual.out && | ||
test_must_be_empty actual.err && | ||
test_must_fail \ | ||
env EXISTS=false \ | ||
git env--helper --type=bool --default=true --exit-code EXISTS >actual.out 2>actual.err && | ||
test_must_be_empty actual.out && | ||
test_must_be_empty actual.err | ||
' | ||
|
||
test_expect_success 'env--helper --type=ulong' ' | ||
echo 1234567890 >expected && | ||
git env--helper --type=ulong --default=1234567890 MISSING >actual.out 2>actual.err && | ||
test_cmp expected actual.out && | ||
test_must_be_empty actual.err && | ||
echo 0 >expected && | ||
test_must_fail git env--helper --type=ulong --default=0 MISSING >actual && | ||
test_cmp expected actual && | ||
git env--helper --type=ulong --default=1234567890 --exit-code MISSING >actual.out 2>actual.err && | ||
test_must_be_empty actual.out && | ||
test_must_be_empty actual.err && | ||
EXISTS=1234567890 git env--helper --type=ulong --default=0 EXISTS --exit-code >actual.out 2>actual.err && | ||
test_must_be_empty actual.out && | ||
test_must_be_empty actual.err && | ||
echo 1234567890 >expected && | ||
EXISTS=1234567890 git env--helper --type=ulong --default=0 EXISTS >actual.out 2>actual.err && | ||
test_cmp expected actual.out && | ||
test_must_be_empty actual.err | ||
' | ||
|
||
test_done |