mirror of
https://github.com/git/git.git
synced 2024-11-23 18:05:29 +08:00
tests: make GIT_TEST_GETTEXT_POISON a boolean
Change the GIT_TEST_GETTEXT_POISON variable from being "non-empty?" to
being a more standard boolean variable.
Since it needed to be checked in both C code and shellscript (via test
-n) it was one of the remaining shellscript-like variables. Now that
we have "env--helper" we can change that.
There's a couple of tricky edge cases that arise because we're using
git_env_bool() early, and the config-reading "env--helper".
If GIT_TEST_GETTEXT_POISON is set to an invalid value die_bad_number()
will die, but to do so it would usually call gettext(). Let's detect
the special case of GIT_TEST_GETTEXT_POISON and always emit that
message in the C locale, lest we infinitely loop.
As seen in the updated tests in t0017-env-helper.sh there's also a
caveat related to "env--helper" needing to read the config for trace2
purposes.
Since the C_LOCALE_OUTPUT prerequisite is lazy and relies on
"env--helper" we could get invalid results if we failed to read the
config (e.g. because we'd loop on includes) when combined with
e.g. "test_i18ngrep" wanting to check with "env--helper" if
GIT_TEST_GETTEXT_POISON was true or not.
I'm crossing my fingers and hoping that a test similar to the one I
removed in the earlier "config tests: simplify include cycle test"
change in this series won't happen again, and testing for this
explicitly in "env--helper"'s own tests.
This change breaks existing uses of
e.g. GIT_TEST_GETTEXT_POISON=YesPlease, which we've documented in
po/README and other places. As noted in [1] we might want to consider
also accepting "YesPlease" in "env--helper" as a special-case.
But as the lack of uproar over 6cdccfce1e
("i18n: make GETTEXT_POISON
a runtime option", 2018-11-08) demonstrates the audience for this
option is a really narrow set of git developers, who shouldn't have
much trouble modifying their test scripts, so I think it's better to
deal with that minor headache now and make all the relevant GIT_TEST_*
variables boolean in the same way than carry the "YesPlease"
special-case forward.
1. https://public-inbox.org/git/xmqqtvckm3h8.fsf@gitster-ct.c.googlers.com/
Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
e3d5e4bd5a
commit
1ff750b128
@ -184,7 +184,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
|
||||
|
||||
|
9
config.c
9
config.c
@ -956,6 +956,15 @@ static void die_bad_number(const char *name, const char *value)
|
||||
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), value, name, _(error_type));
|
||||
|
||||
|
@ -50,10 +50,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@@"
|
||||
|
@ -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
|
||||
|
4
t/README
4
t/README
@ -343,8 +343,8 @@ 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
|
||||
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.
|
||||
|
@ -80,4 +80,20 @@ test_expect_success 'env--helper --type=ulong' '
|
||||
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
|
||||
|
@ -314,7 +314,7 @@ test_expect_success 'include cycles are detected' '
|
||||
git -C cycle config include.path cycle &&
|
||||
git config -f cycle/cycle include.path config &&
|
||||
test_must_fail \
|
||||
env GIT_TEST_GETTEXT_POISON= \
|
||||
env GIT_TEST_GETTEXT_POISON=false \
|
||||
git -C cycle config --get-all test.value 2>stderr &&
|
||||
grep "exceeded maximum include depth" stderr
|
||||
'
|
||||
|
@ -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" &&
|
||||
|
@ -1443,11 +1443,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
|
||||
|
Loading…
Reference in New Issue
Block a user