зеркало из https://github.com/microsoft/git.git
Merge branch 'ab/test-env'
Many GIT_TEST_* environment variables control various aspects of how our tests are run, but a few followed "non-empty is true, empty or unset is false" while others followed the usual "there are a few ways to spell true, like yes, on, etc., and also ways to spell false, like no, off, etc." convention. * ab/test-env: env--helper: mark a file-local symbol as static tests: make GIT_TEST_FAIL_PREREQS a boolean tests: replace test_tristate with "git env--helper" tests README: re-flow a previously changed paragraph tests: make GIT_TEST_GETTEXT_POISON a boolean t6040 test: stop using global "script" variable config.c: refactor die_bad_number() to not call gettext() early env--helper: new undocumented builtin wrapping git_env_*() config tests: simplify include cycle test
This commit is contained in:
Коммит
023ff4cdf5
|
@ -58,6 +58,7 @@
|
|||
/git-difftool
|
||||
/git-difftool--helper
|
||||
/git-describe
|
||||
/git-env--helper
|
||||
/git-fast-export
|
||||
/git-fast-import
|
||||
/git-fetch
|
||||
|
|
1
Makefile
1
Makefile
|
@ -1062,6 +1062,7 @@ BUILTIN_OBJS += builtin/diff-index.o
|
|||
BUILTIN_OBJS += builtin/diff-tree.o
|
||||
BUILTIN_OBJS += builtin/diff.o
|
||||
BUILTIN_OBJS += builtin/difftool.o
|
||||
BUILTIN_OBJS += builtin/env--helper.o
|
||||
BUILTIN_OBJS += builtin/fast-export.o
|
||||
BUILTIN_OBJS += builtin/fetch-pack.o
|
||||
BUILTIN_OBJS += builtin/fetch.o
|
||||
|
|
|
@ -160,6 +160,7 @@ int cmd_diff_index(int argc, const char **argv, const char *prefix);
|
|||
int cmd_diff(int argc, const char **argv, const char *prefix);
|
||||
int cmd_diff_tree(int argc, const char **argv, const char *prefix);
|
||||
int cmd_difftool(int argc, const char **argv, const char *prefix);
|
||||
int cmd_env__helper(int argc, const char **argv, const char *prefix);
|
||||
int cmd_fast_export(int argc, const char **argv, const char *prefix);
|
||||
int cmd_fetch(int argc, const char **argv, const char *prefix);
|
||||
int cmd_fetch_pack(int argc, const char **argv, const char *prefix);
|
||||
|
|
|
@ -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
|
||||
};
|
||||
|
||||
static 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;
|
||||
}
|
|
@ -186,7 +186,7 @@ osx-clang|osx-gcc)
|
|||
export GIT_SKIP_TESTS="t9810 t9816"
|
||||
;;
|
||||
GIT_TEST_GETTEXT_POISON)
|
||||
export GIT_TEST_GETTEXT_POISON=YesPlease
|
||||
export GIT_TEST_GETTEXT_POISON=true
|
||||
;;
|
||||
esac
|
||||
|
||||
|
|
28
config.c
28
config.c
|
@ -973,34 +973,44 @@ int git_parse_ssize_t(const char *value, ssize_t *ret)
|
|||
NORETURN
|
||||
static void die_bad_number(const char *name, const char *value)
|
||||
{
|
||||
const char * error_type = (errno == ERANGE)? _("out of range"):_("invalid unit");
|
||||
const char *error_type = (errno == ERANGE) ?
|
||||
N_("out of range") : N_("invalid unit");
|
||||
const char *bad_numeric = N_("bad numeric config value '%s' for '%s': %s");
|
||||
|
||||
if (!value)
|
||||
value = "";
|
||||
|
||||
if (!strcmp(name, "GIT_TEST_GETTEXT_POISON"))
|
||||
/*
|
||||
* We explicitly *don't* use _() here since it would
|
||||
* cause an infinite loop with _() needing to call
|
||||
* use_gettext_poison(). This is why marked up
|
||||
* translations with N_() above.
|
||||
*/
|
||||
die(bad_numeric, value, name, error_type);
|
||||
|
||||
if (!(cf && cf->name))
|
||||
die(_("bad numeric config value '%s' for '%s': %s"),
|
||||
value, name, error_type);
|
||||
die(_(bad_numeric), value, name, _(error_type));
|
||||
|
||||
switch (cf->origin_type) {
|
||||
case CONFIG_ORIGIN_BLOB:
|
||||
die(_("bad numeric config value '%s' for '%s' in blob %s: %s"),
|
||||
value, name, cf->name, error_type);
|
||||
value, name, cf->name, _(error_type));
|
||||
case CONFIG_ORIGIN_FILE:
|
||||
die(_("bad numeric config value '%s' for '%s' in file %s: %s"),
|
||||
value, name, cf->name, error_type);
|
||||
value, name, cf->name, _(error_type));
|
||||
case CONFIG_ORIGIN_STDIN:
|
||||
die(_("bad numeric config value '%s' for '%s' in standard input: %s"),
|
||||
value, name, error_type);
|
||||
value, name, _(error_type));
|
||||
case CONFIG_ORIGIN_SUBMODULE_BLOB:
|
||||
die(_("bad numeric config value '%s' for '%s' in submodule-blob %s: %s"),
|
||||
value, name, cf->name, error_type);
|
||||
value, name, cf->name, _(error_type));
|
||||
case CONFIG_ORIGIN_CMDLINE:
|
||||
die(_("bad numeric config value '%s' for '%s' in command line %s: %s"),
|
||||
value, name, cf->name, error_type);
|
||||
value, name, cf->name, _(error_type));
|
||||
default:
|
||||
die(_("bad numeric config value '%s' for '%s' in %s: %s"),
|
||||
value, name, cf->name, error_type);
|
||||
value, name, cf->name, _(error_type));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -68,10 +68,8 @@ const char *get_preferred_languages(void)
|
|||
int use_gettext_poison(void)
|
||||
{
|
||||
static int poison_requested = -1;
|
||||
if (poison_requested == -1) {
|
||||
const char *v = getenv("GIT_TEST_GETTEXT_POISON");
|
||||
poison_requested = v && strlen(v) ? 1 : 0;
|
||||
}
|
||||
if (poison_requested == -1)
|
||||
poison_requested = git_env_bool("GIT_TEST_GETTEXT_POISON", 0);
|
||||
return poison_requested;
|
||||
}
|
||||
|
||||
|
|
|
@ -17,7 +17,9 @@ export TEXTDOMAINDIR
|
|||
|
||||
# First decide what scheme to use...
|
||||
GIT_INTERNAL_GETTEXT_SH_SCHEME=fallthrough
|
||||
if test -n "$GIT_TEST_GETTEXT_POISON"
|
||||
if test -n "$GIT_TEST_GETTEXT_POISON" &&
|
||||
git env--helper --type=bool --default=0 --exit-code \
|
||||
GIT_TEST_GETTEXT_POISON
|
||||
then
|
||||
GIT_INTERNAL_GETTEXT_SH_SCHEME=poison
|
||||
elif test -n "@@USE_GETTEXT_SCHEME@@"
|
||||
|
|
1
git.c
1
git.c
|
@ -500,6 +500,7 @@ static struct cmd_struct commands[] = {
|
|||
{ "diff-index", cmd_diff_index, RUN_SETUP | NO_PARSEOPT },
|
||||
{ "diff-tree", cmd_diff_tree, RUN_SETUP | NO_PARSEOPT },
|
||||
{ "difftool", cmd_difftool, RUN_SETUP_GENTLY },
|
||||
{ "env--helper", cmd_env__helper },
|
||||
{ "fast-export", cmd_fast_export, RUN_SETUP },
|
||||
{ "fetch", cmd_fetch, RUN_SETUP },
|
||||
{ "fetch-pack", cmd_fetch_pack, RUN_SETUP | NO_PARSEOPT },
|
||||
|
|
|
@ -293,7 +293,7 @@ To smoke out issues like these, Git tested with a translation mode that
|
|||
emits gibberish on every call to gettext. To use it run the test suite
|
||||
with it, e.g.:
|
||||
|
||||
cd t && GIT_TEST_GETTEXT_POISON=YesPlease prove -j 9 ./t[0-9]*.sh
|
||||
cd t && GIT_TEST_GETTEXT_POISON=true prove -j 9 ./t[0-9]*.sh
|
||||
|
||||
If tests break with it you should inspect them manually and see if
|
||||
what you're translating is sane, i.e. that you're not translating
|
||||
|
|
12
t/README
12
t/README
|
@ -334,7 +334,7 @@ that cannot be easily covered by a few specific test cases. These
|
|||
could be enabled by running the test suite with correct GIT_TEST_
|
||||
environment set.
|
||||
|
||||
GIT_TEST_FAIL_PREREQS<non-empty?> fails all prerequisites. This is
|
||||
GIT_TEST_FAIL_PREREQS=<boolean> fails all prerequisites. This is
|
||||
useful for discovering issues with the tests where say a later test
|
||||
implicitly depends on an optional earlier test.
|
||||
|
||||
|
@ -343,11 +343,11 @@ whether this mode is active, and e.g. skip some tests that are hard to
|
|||
refactor to deal with it. The "SYMLINKS" prerequisite is currently
|
||||
excluded as so much relies on it, but this might change in the future.
|
||||
|
||||
GIT_TEST_GETTEXT_POISON=<non-empty?> turns all strings marked for
|
||||
translation into gibberish if non-empty (think "test -n"). Used for
|
||||
spotting those tests that need to be marked with a C_LOCALE_OUTPUT
|
||||
prerequisite when adding more strings for translation. See "Testing
|
||||
marked strings" in po/README for details.
|
||||
GIT_TEST_GETTEXT_POISON=<boolean> turns all strings marked for
|
||||
translation into gibberish if true. Used for spotting those tests that
|
||||
need to be marked with a C_LOCALE_OUTPUT prerequisite when adding more
|
||||
strings for translation. See "Testing marked strings" in po/README for
|
||||
details.
|
||||
|
||||
GIT_TEST_SPLIT_INDEX=<boolean> forces split-index mode on the whole
|
||||
test suite. Accept any boolean values that are accepted by git-config.
|
||||
|
|
|
@ -15,8 +15,7 @@
|
|||
#
|
||||
# test_done
|
||||
|
||||
test_tristate GIT_TEST_GIT_DAEMON
|
||||
if test "$GIT_TEST_GIT_DAEMON" = false
|
||||
if ! git env--helper --type=bool --default=true --exit-code GIT_TEST_GIT_DAEMON
|
||||
then
|
||||
skip_all="git-daemon testing disabled (unset GIT_TEST_GIT_DAEMON to enable)"
|
||||
test_done
|
||||
|
@ -24,7 +23,7 @@ fi
|
|||
|
||||
if test_have_prereq !PIPE
|
||||
then
|
||||
test_skip_or_die $GIT_TEST_GIT_DAEMON "file system does not support FIFOs"
|
||||
test_skip_or_die GIT_TEST_GIT_DAEMON "file system does not support FIFOs"
|
||||
fi
|
||||
|
||||
test_set_port LIB_GIT_DAEMON_PORT
|
||||
|
@ -73,7 +72,7 @@ start_git_daemon() {
|
|||
kill "$GIT_DAEMON_PID"
|
||||
wait "$GIT_DAEMON_PID"
|
||||
unset GIT_DAEMON_PID
|
||||
test_skip_or_die $GIT_TEST_GIT_DAEMON \
|
||||
test_skip_or_die GIT_TEST_GIT_DAEMON \
|
||||
"git daemon failed to start"
|
||||
fi
|
||||
}
|
||||
|
|
|
@ -69,14 +69,12 @@ svn_cmd () {
|
|||
maybe_start_httpd () {
|
||||
loc=${1-svn}
|
||||
|
||||
test_tristate GIT_SVN_TEST_HTTPD
|
||||
case $GIT_SVN_TEST_HTTPD in
|
||||
true)
|
||||
if git env--helper --type=bool --default=false --exit-code GIT_TEST_HTTPD
|
||||
then
|
||||
. "$TEST_DIRECTORY"/lib-httpd.sh
|
||||
LIB_HTTPD_SVN="$loc"
|
||||
start_httpd
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
}
|
||||
|
||||
convert_to_rev_db () {
|
||||
|
@ -106,8 +104,7 @@ EOF
|
|||
}
|
||||
|
||||
require_svnserve () {
|
||||
test_tristate GIT_TEST_SVNSERVE
|
||||
if ! test "$GIT_TEST_SVNSERVE" = true
|
||||
if ! git env--helper --type=bool --default=false --exit-code GIT_TEST_SVNSERVE
|
||||
then
|
||||
skip_all='skipping svnserve test. (set $GIT_TEST_SVNSERVE to enable)'
|
||||
test_done
|
||||
|
|
|
@ -41,15 +41,14 @@ then
|
|||
test_done
|
||||
fi
|
||||
|
||||
test_tristate GIT_TEST_HTTPD
|
||||
if test "$GIT_TEST_HTTPD" = false
|
||||
if ! git env--helper --type=bool --default=true --exit-code GIT_TEST_HTTPD
|
||||
then
|
||||
skip_all="Network testing disabled (unset GIT_TEST_HTTPD to enable)"
|
||||
test_done
|
||||
fi
|
||||
|
||||
if ! test_have_prereq NOT_ROOT; then
|
||||
test_skip_or_die $GIT_TEST_HTTPD \
|
||||
test_skip_or_die GIT_TEST_HTTPD \
|
||||
"Cannot run httpd tests as root"
|
||||
fi
|
||||
|
||||
|
@ -95,7 +94,7 @@ GIT_TRACE=$GIT_TRACE; export GIT_TRACE
|
|||
|
||||
if ! test -x "$LIB_HTTPD_PATH"
|
||||
then
|
||||
test_skip_or_die $GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'"
|
||||
test_skip_or_die GIT_TEST_HTTPD "no web server found at '$LIB_HTTPD_PATH'"
|
||||
fi
|
||||
|
||||
HTTPD_VERSION=$($LIB_HTTPD_PATH -v | \
|
||||
|
@ -107,19 +106,19 @@ then
|
|||
then
|
||||
if ! test $HTTPD_VERSION -ge 2
|
||||
then
|
||||
test_skip_or_die $GIT_TEST_HTTPD \
|
||||
test_skip_or_die GIT_TEST_HTTPD \
|
||||
"at least Apache version 2 is required"
|
||||
fi
|
||||
if ! test -d "$DEFAULT_HTTPD_MODULE_PATH"
|
||||
then
|
||||
test_skip_or_die $GIT_TEST_HTTPD \
|
||||
test_skip_or_die GIT_TEST_HTTPD \
|
||||
"Apache module directory not found"
|
||||
fi
|
||||
|
||||
LIB_HTTPD_MODULE_PATH="$DEFAULT_HTTPD_MODULE_PATH"
|
||||
fi
|
||||
else
|
||||
test_skip_or_die $GIT_TEST_HTTPD \
|
||||
test_skip_or_die GIT_TEST_HTTPD \
|
||||
"Could not identify web server at '$LIB_HTTPD_PATH'"
|
||||
fi
|
||||
|
||||
|
@ -184,7 +183,7 @@ start_httpd() {
|
|||
if test $? -ne 0
|
||||
then
|
||||
cat "$HTTPD_ROOT_PATH"/error.log >&4 2>/dev/null
|
||||
test_skip_or_die $GIT_TEST_HTTPD "web server setup failed"
|
||||
test_skip_or_die GIT_TEST_HTTPD "web server setup failed"
|
||||
fi
|
||||
}
|
||||
|
||||
|
|
|
@ -726,7 +726,7 @@ donthaveit=yes
|
|||
test_expect_success DONTHAVEIT 'unmet prerequisite causes test to be skipped' '
|
||||
donthaveit=no
|
||||
'
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS" -a $haveit$donthaveit != yesyes
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $haveit$donthaveit != yesyes
|
||||
then
|
||||
say "bug in test framework: prerequisite tags do not work reliably"
|
||||
exit 1
|
||||
|
@ -747,7 +747,7 @@ donthaveiteither=yes
|
|||
test_expect_success DONTHAVEIT,HAVEIT 'unmet prerequisites causes test to be skipped' '
|
||||
donthaveiteither=no
|
||||
'
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS" -a $haveit$donthaveit$donthaveiteither != yesyesyes
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $haveit$donthaveit$donthaveiteither != yesyesyes
|
||||
then
|
||||
say "bug in test framework: multiple prerequisite tags do not work reliably"
|
||||
exit 1
|
||||
|
@ -763,7 +763,7 @@ test_expect_success !LAZY_TRUE 'missing lazy prereqs skip tests' '
|
|||
donthavetrue=no
|
||||
'
|
||||
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS" -a "$havetrue$donthavetrue" != yesyes
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a "$havetrue$donthavetrue" != yesyes
|
||||
then
|
||||
say 'bug in test framework: lazy prerequisites do not work'
|
||||
exit 1
|
||||
|
@ -779,7 +779,7 @@ test_expect_success LAZY_FALSE 'missing negative lazy prereqs will skip' '
|
|||
havefalse=no
|
||||
'
|
||||
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS" -a "$nothavefalse$havefalse" != yesyes
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a "$nothavefalse$havefalse" != yesyes
|
||||
then
|
||||
say 'bug in test framework: negative lazy prerequisites do not work'
|
||||
exit 1
|
||||
|
@ -790,7 +790,7 @@ test_expect_success 'tests clean up after themselves' '
|
|||
test_when_finished clean=yes
|
||||
'
|
||||
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS" -a $clean != yes
|
||||
if test -z "$GIT_TEST_FAIL_PREREQS_INTERNAL" -a $clean != yes
|
||||
then
|
||||
say "bug in test framework: basic cleanup command does not work reliably"
|
||||
exit 1
|
||||
|
|
|
@ -0,0 +1,99 @@
|
|||
#!/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_expect_success 'env--helper reads config thanks to trace2' '
|
||||
mkdir home &&
|
||||
git config -f home/.gitconfig include.path cycle &&
|
||||
git config -f home/cycle include.path .gitconfig &&
|
||||
|
||||
test_must_fail \
|
||||
env HOME="$(pwd)/home" GIT_TEST_GETTEXT_POISON=false \
|
||||
git config -l 2>err &&
|
||||
grep "exceeded maximum include depth" err &&
|
||||
|
||||
test_must_fail \
|
||||
env HOME="$(pwd)/home" GIT_TEST_GETTEXT_POISON=true \
|
||||
git -C cycle env--helper --type=bool --default=0 --exit-code GIT_TEST_GETTEXT_POISON 2>err &&
|
||||
grep "# GETTEXT POISON #" err
|
||||
'
|
||||
|
||||
test_done
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
test_description='Gettext Shell poison'
|
||||
|
||||
GIT_TEST_GETTEXT_POISON=YesPlease
|
||||
GIT_TEST_GETTEXT_POISON=true
|
||||
export GIT_TEST_GETTEXT_POISON
|
||||
. ./lib-gettext.sh
|
||||
|
||||
|
@ -31,4 +31,9 @@ test_expect_success 'eval_gettext: our eval_gettext() fallback has poison semant
|
|||
test_cmp expect actual
|
||||
'
|
||||
|
||||
test_expect_success "gettext: invalid GIT_TEST_GETTEXT_POISON value doesn't infinitely loop" "
|
||||
test_must_fail env GIT_TEST_GETTEXT_POISON=xyz git version 2>error &&
|
||||
grep \"fatal: bad numeric config value 'xyz' for 'GIT_TEST_GETTEXT_POISON': invalid unit\" error
|
||||
"
|
||||
|
||||
test_done
|
||||
|
|
|
@ -349,20 +349,13 @@ test_expect_success 'conditional include, onbranch, implicit /** for /' '
|
|||
'
|
||||
|
||||
test_expect_success 'include cycles are detected' '
|
||||
cat >.gitconfig <<-\EOF &&
|
||||
[test]value = gitconfig
|
||||
[include]path = cycle
|
||||
EOF
|
||||
cat >cycle <<-\EOF &&
|
||||
[test]value = cycle
|
||||
[include]path = .gitconfig
|
||||
EOF
|
||||
cat >expect <<-\EOF &&
|
||||
gitconfig
|
||||
cycle
|
||||
EOF
|
||||
test_must_fail git config --get-all test.value 2>stderr &&
|
||||
test_i18ngrep "exceeded maximum include depth" stderr
|
||||
git init --bare cycle &&
|
||||
git -C cycle config include.path cycle &&
|
||||
git config -f cycle/cycle include.path config &&
|
||||
test_must_fail \
|
||||
env GIT_TEST_GETTEXT_POISON=false \
|
||||
git -C cycle config --get-all test.value 2>stderr &&
|
||||
grep "exceeded maximum include depth" stderr
|
||||
'
|
||||
|
||||
test_done
|
||||
|
|
|
@ -267,8 +267,7 @@ test_expect_success 'ls-remote --symref omits filtered-out matches' '
|
|||
'
|
||||
|
||||
test_lazy_prereq GIT_DAEMON '
|
||||
test_tristate GIT_TEST_GIT_DAEMON &&
|
||||
test "$GIT_TEST_GIT_DAEMON" != false
|
||||
git env--helper --type=bool --default=true --exit-code GIT_TEST_GIT_DAEMON
|
||||
'
|
||||
|
||||
# This test spawns a daemon, so run it only if the user would be OK with
|
||||
|
|
|
@ -38,7 +38,7 @@ test_expect_success setup '
|
|||
advance h
|
||||
'
|
||||
|
||||
script='s/^..\(b.\) *[0-9a-f]* \(.*\)$/\1 \2/p'
|
||||
t6040_script='s/^..\(b.\) *[0-9a-f]* \(.*\)$/\1 \2/p'
|
||||
cat >expect <<\EOF
|
||||
b1 [ahead 1, behind 1] d
|
||||
b2 [ahead 1, behind 1] d
|
||||
|
@ -53,7 +53,7 @@ test_expect_success 'branch -v' '
|
|||
cd test &&
|
||||
git branch -v
|
||||
) |
|
||||
sed -n -e "$script" >actual &&
|
||||
sed -n -e "$t6040_script" >actual &&
|
||||
test_i18ncmp expect actual
|
||||
'
|
||||
|
||||
|
@ -71,7 +71,7 @@ test_expect_success 'branch -vv' '
|
|||
cd test &&
|
||||
git branch -vv
|
||||
) |
|
||||
sed -n -e "$script" >actual &&
|
||||
sed -n -e "$t6040_script" >actual &&
|
||||
test_i18ncmp expect actual
|
||||
'
|
||||
|
||||
|
|
|
@ -249,7 +249,7 @@ test_expect_success 'checkout to detach HEAD (with advice declined)' '
|
|||
test_expect_success 'checkout to detach HEAD' '
|
||||
git config advice.detachedHead true &&
|
||||
git checkout -f renamer && git clean -f &&
|
||||
GIT_TEST_GETTEXT_POISON= git checkout renamer^ 2>messages &&
|
||||
GIT_TEST_GETTEXT_POISON=false git checkout renamer^ 2>messages &&
|
||||
grep "HEAD is now at 7329388" messages &&
|
||||
test_line_count -gt 1 messages &&
|
||||
H=$(git rev-parse --verify HEAD) &&
|
||||
|
|
|
@ -1706,7 +1706,7 @@ test_expect_success 'sourcing the completion script clears cached commands' '
|
|||
'
|
||||
|
||||
test_expect_success 'sourcing the completion script clears cached merge strategies' '
|
||||
GIT_TEST_GETTEXT_POISON= &&
|
||||
GIT_TEST_GETTEXT_POISON=false &&
|
||||
__git_compute_merge_strategies &&
|
||||
verbose test -n "$__git_merge_strategies" &&
|
||||
. "$GIT_BUILD_DIR/contrib/completion/git-completion.bash" &&
|
||||
|
|
|
@ -309,7 +309,7 @@ test_unset_prereq () {
|
|||
}
|
||||
|
||||
test_set_prereq () {
|
||||
if test -n "$GIT_TEST_FAIL_PREREQS"
|
||||
if test -n "$GIT_TEST_FAIL_PREREQS_INTERNAL"
|
||||
then
|
||||
case "$1" in
|
||||
# The "!" case is handled below with
|
||||
|
@ -1050,62 +1050,20 @@ perl () {
|
|||
command "$PERL_PATH" "$@" 2>&7
|
||||
} 7>&2 2>&4
|
||||
|
||||
# Is the value one of the various ways to spell a boolean true/false?
|
||||
test_normalize_bool () {
|
||||
git -c magic.variable="$1" config --bool magic.variable 2>/dev/null
|
||||
}
|
||||
|
||||
# Given a variable $1, normalize the value of it to one of "true",
|
||||
# "false", or "auto" and store the result to it.
|
||||
#
|
||||
# test_tristate GIT_TEST_HTTPD
|
||||
#
|
||||
# A variable set to an empty string is set to 'false'.
|
||||
# A variable set to 'false' or 'auto' keeps its value.
|
||||
# Anything else is set to 'true'.
|
||||
# An unset variable defaults to 'auto'.
|
||||
#
|
||||
# The last rule is to allow people to set the variable to an empty
|
||||
# string and export it to decline testing the particular feature
|
||||
# for versions both before and after this change. We used to treat
|
||||
# both unset and empty variable as a signal for "do not test" and
|
||||
# took any non-empty string as "please test".
|
||||
|
||||
test_tristate () {
|
||||
if eval "test x\"\${$1+isset}\" = xisset"
|
||||
then
|
||||
# explicitly set
|
||||
eval "
|
||||
case \"\$$1\" in
|
||||
'') $1=false ;;
|
||||
auto) ;;
|
||||
*) $1=\$(test_normalize_bool \$$1 || echo true) ;;
|
||||
esac
|
||||
"
|
||||
else
|
||||
eval "$1=auto"
|
||||
fi
|
||||
}
|
||||
|
||||
# Exit the test suite, either by skipping all remaining tests or by
|
||||
# exiting with an error. If "$1" is "auto", we then we assume we were
|
||||
# opportunistically trying to set up some tests and we skip. If it is
|
||||
# "true", then we report a failure.
|
||||
# exiting with an error. If our prerequisite variable $1 falls back
|
||||
# on a default assume we were opportunistically trying to set up some
|
||||
# tests and we skip. If it is explicitly "true", then we report a failure.
|
||||
#
|
||||
# The error/skip message should be given by $2.
|
||||
#
|
||||
test_skip_or_die () {
|
||||
case "$1" in
|
||||
auto)
|
||||
if ! git env--helper --type=bool --default=false --exit-code $1
|
||||
then
|
||||
skip_all=$2
|
||||
test_done
|
||||
;;
|
||||
true)
|
||||
error "$2"
|
||||
;;
|
||||
*)
|
||||
error "BUG: test tristate is '$1' (real error: $2)"
|
||||
esac
|
||||
fi
|
||||
error "$2"
|
||||
}
|
||||
|
||||
# The following mingw_* functions obey POSIX shell syntax, but are actually
|
||||
|
|
|
@ -1388,6 +1388,25 @@ yes () {
|
|||
done
|
||||
}
|
||||
|
||||
# The GIT_TEST_FAIL_PREREQS code hooks into test_set_prereq(), and
|
||||
# thus needs to be set up really early, and set an internal variable
|
||||
# for convenience so the hot test_set_prereq() codepath doesn't need
|
||||
# to call "git env--helper". Only do that work if needed by seeing if
|
||||
# GIT_TEST_FAIL_PREREQS is set at all.
|
||||
GIT_TEST_FAIL_PREREQS_INTERNAL=
|
||||
if test -n "$GIT_TEST_FAIL_PREREQS"
|
||||
then
|
||||
if git env--helper --type=bool --default=0 --exit-code GIT_TEST_FAIL_PREREQS
|
||||
then
|
||||
GIT_TEST_FAIL_PREREQS_INTERNAL=true
|
||||
test_set_prereq FAIL_PREREQS
|
||||
fi
|
||||
else
|
||||
test_lazy_prereq FAIL_PREREQS '
|
||||
git env--helper --type=bool --default=0 --exit-code GIT_TEST_FAIL_PREREQS
|
||||
'
|
||||
fi
|
||||
|
||||
# Fix some commands on Windows
|
||||
uname_s=$(uname -s)
|
||||
case $uname_s in
|
||||
|
@ -1442,11 +1461,9 @@ then
|
|||
unset GIT_TEST_GETTEXT_POISON_ORIG
|
||||
fi
|
||||
|
||||
# Can we rely on git's output in the C locale?
|
||||
if test -z "$GIT_TEST_GETTEXT_POISON"
|
||||
then
|
||||
test_set_prereq C_LOCALE_OUTPUT
|
||||
fi
|
||||
test_lazy_prereq C_LOCALE_OUTPUT '
|
||||
! git env--helper --type=bool --default=0 --exit-code GIT_TEST_GETTEXT_POISON
|
||||
'
|
||||
|
||||
if test -z "$GIT_TEST_CHECK_CACHE_TREE"
|
||||
then
|
||||
|
@ -1606,7 +1623,3 @@ test_lazy_prereq SHA1 '
|
|||
test_lazy_prereq REBASE_P '
|
||||
test -z "$GIT_TEST_SKIP_REBASE_P"
|
||||
'
|
||||
|
||||
test_lazy_prereq FAIL_PREREQS '
|
||||
test -n "$GIT_TEST_FAIL_PREREQS"
|
||||
'
|
||||
|
|
Загрузка…
Ссылка в новой задаче