Skip to content

Commit

Permalink
tests: remove support for GIT_TEST_GETTEXT_POISON
Browse files Browse the repository at this point in the history
This removes the ability to inject "poison" gettext() messages via the
GIT_TEST_GETTEXT_POISON special test setup.

I initially added this as a compile-time option in bb946bb (i18n:
add GETTEXT_POISON to simulate unfriendly translator, 2011-02-22), and
most recently modified to be toggleable at runtime in
6cdccfc (i18n: make GETTEXT_POISON a runtime option, 2018-11-08)..

The reason for its removal is that the trade-off of maintaining it
v.s. what it's getting us has long since flipped. When gettext was
integrated in 5e9637c (i18n: add infrastructure for translating
Git with gettext, 2011-11-18) there was understandable concern on the
Git ML that in marking messages for translation en-masse we'd
inadvertently mark plumbing messages. The GETTEXT_POISON facility was
a way to smoke those out via our test suite.

Nowadays however we're done (or almost entirely done) with any marking
of messages for translation. New messages are usually marked by their
authors, who'll know whether it makes sense to translate them or
not. If not any errors in marking the messages are much more likely to
be spotted in review than in the the initial deluge of i18n patches in
the 2011-2012 era.

So let's just remove this. This leaves the test suite in a state where
we still have a lot of test_i18n, C_LOCALE_OUTPUT
etc. uses. Subsequent commits will remove those too.

The change to t/lib-rebase.sh is a selective revert of the relevant
part of f2d1706 (i18n: rebase-interactive: mark comments of squash
for translation, 2016-06-17), and the comment in
t/t3406-rebase-message.sh is from c7108bf (i18n: rebase: mark
messages for translation, 2012-07-25).

Signed-off-by: Ævar Arnfjörð Bjarmason <[email protected]>
Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
avar authored and gitster committed Jan 21, 2021
1 parent 6c280b4 commit d162b25
Show file tree
Hide file tree
Showing 14 changed files with 21 additions and 160 deletions.
2 changes: 1 addition & 1 deletion Documentation/MyFirstContribution.txt
Original file line number Diff line number Diff line change
Expand Up @@ -664,7 +664,7 @@ mention the right animal somewhere:
----
test_expect_success 'runs correctly with no args and good output' '
git psuh >actual &&
test_i18ngrep Pony actual
grep Pony actual
'
----

Expand Down
9 changes: 0 additions & 9 deletions config.c
Original file line number Diff line number Diff line change
Expand Up @@ -996,15 +996,6 @@ 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));

Expand Down
10 changes: 0 additions & 10 deletions gettext.c
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,6 @@ const char *get_preferred_languages(void)
return NULL;
}

int use_gettext_poison(void)
{
static int poison_requested = -1;
if (poison_requested == -1)
poison_requested = git_env_bool("GIT_TEST_GETTEXT_POISON", 0);
return poison_requested;
}

#ifndef NO_GETTEXT
static int test_vsnprintf(const char *fmt, ...)
{
Expand Down Expand Up @@ -181,8 +173,6 @@ void git_setup_gettext(void)
if (!podir)
podir = p = system_path(GIT_LOCALE_PATH);

use_gettext_poison(); /* getenv() reentrancy paranoia */

if (!is_directory(podir)) {
free(p);
return;
Expand Down
7 changes: 1 addition & 6 deletions gettext.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,15 +28,12 @@

#define FORMAT_PRESERVING(n) __attribute__((format_arg(n)))

int use_gettext_poison(void);

#ifndef NO_GETTEXT
void git_setup_gettext(void);
int gettext_width(const char *s);
#else
static inline void git_setup_gettext(void)
{
use_gettext_poison(); /* getenv() reentrancy paranoia */
}
static inline int gettext_width(const char *s)
{
Expand All @@ -48,14 +45,12 @@ static inline FORMAT_PRESERVING(1) const char *_(const char *msgid)
{
if (!*msgid)
return "";
return use_gettext_poison() ? "# GETTEXT POISON #" : gettext(msgid);
return gettext(msgid);
}

static inline FORMAT_PRESERVING(1) FORMAT_PRESERVING(2)
const char *Q_(const char *msgid, const char *plu, unsigned long n)
{
if (use_gettext_poison())
return "# GETTEXT POISON #";
return ngettext(msgid, plu, n);
}

Expand Down
22 changes: 1 addition & 21 deletions git-sh-i18n.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,7 @@ export TEXTDOMAINDIR

# First decide what scheme to use...
GIT_INTERNAL_GETTEXT_SH_SCHEME=fallthrough
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@@"
if test -n "@@USE_GETTEXT_SCHEME@@"
then
GIT_INTERNAL_GETTEXT_SH_SCHEME="@@USE_GETTEXT_SCHEME@@"
elif test -n "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS"
Expand Down Expand Up @@ -63,21 +58,6 @@ gettext_without_eval_gettext)
)
}
;;
poison)
# Emit garbage so that tests that incorrectly rely on translatable
# strings will fail.
gettext () {
printf "%s" "# GETTEXT POISON #"
}

eval_gettext () {
printf "%s" "# GETTEXT POISON #"
}

eval_ngettext () {
printf "%s" "# GETTEXT POISON #"
}
;;
*)
gettext () {
printf "%s" "$1"
Expand Down
22 changes: 2 additions & 20 deletions po/README
Original file line number Diff line number Diff line change
Expand Up @@ -284,23 +284,5 @@ Perl:
Testing marked strings
----------------------

Even if you've correctly marked porcelain strings for translation
something in the test suite might still depend on the US English
version of the strings, e.g. to grep some error message or other
output.

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=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
plumbing output.

If not you should replace calls to grep with test_i18ngrep, or
test_cmp calls with test_i18ncmp. If that's not enough you can skip
the whole test by making it depend on the C_LOCALE_OUTPUT
prerequisite. See existing test files with this prerequisite for
examples.
Git's tests are run under LANG=C LC_ALL=C. So the tests do not need be
changed to account for translations as they're added.
6 changes: 0 additions & 6 deletions t/README
Original file line number Diff line number Diff line change
Expand Up @@ -358,12 +358,6 @@ 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=<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.

Expand Down
2 changes: 1 addition & 1 deletion t/lib-gettext.sh
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ else
. "$GIT_BUILD_DIR"/git-sh-i18n
fi

if test_have_prereq GETTEXT && test_have_prereq C_LOCALE_OUTPUT
if test_have_prereq GETTEXT
then
# is_IS.UTF-8 on Solaris and FreeBSD, is_IS.utf8 on Debian
is_IS_locale=$(locale -a 2>/dev/null |
Expand Down
1 change: 0 additions & 1 deletion t/lib-rebase.sh
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ set_fake_editor () {
*/COMMIT_EDITMSG)
test -z "$EXPECT_HEADER_COUNT" ||
test "$EXPECT_HEADER_COUNT" = "$(sed -n '1s/^# This is a combination of \(.*\) commits\./\1/p' < "$1")" ||
test "# # GETTEXT POISON #" = "$(sed -n '1p' < "$1")" ||
exit
test -z "$FAKE_COMMIT_MESSAGE" || echo "$FAKE_COMMIT_MESSAGE" > "$1"
test -z "$FAKE_COMMIT_AMEND" || echo "$FAKE_COMMIT_AMEND" >> "$1"
Expand Down
8 changes: 4 additions & 4 deletions t/t0017-env-helper.sh
Original file line number Diff line number Diff line change
Expand Up @@ -86,14 +86,14 @@ test_expect_success 'env--helper reads config thanks to trace2' '
git config -f home/cycle include.path .gitconfig &&
test_must_fail \
env HOME="$(pwd)/home" GIT_TEST_GETTEXT_POISON=false \
env HOME="$(pwd)/home" \
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
env HOME="$(pwd)/home" GIT_TEST_ENV_HELPER=true \
git -C cycle env--helper --type=bool --default=0 --exit-code GIT_TEST_ENV_HELPER 2>err &&
grep "exceeded maximum include depth" err
'

test_done
39 changes: 0 additions & 39 deletions t/t0205-gettext-poison.sh

This file was deleted.

7 changes: 0 additions & 7 deletions t/t3406-rebase-message.sh
Original file line number Diff line number Diff line change
Expand Up @@ -64,13 +64,6 @@ test_expect_success 'rebase -n overrides config rebase.stat config' '
! grep "^ fileX | *1 +$" diffstat.txt
'

# Output to stderr:
#
# "Does not point to a valid commit: invalid-ref"
#
# NEEDSWORK: This "grep" is fine in real non-C locales, but
# GIT_TEST_GETTEXT_POISON poisons the refname along with the enclosing
# error message.
test_expect_success 'rebase --onto outputs the invalid ref' '
test_must_fail git rebase --onto invalid-ref HEAD HEAD 2>err &&
test_i18ngrep "invalid-ref" err
Expand Down
23 changes: 7 additions & 16 deletions t/test-lib-functions.sh
Original file line number Diff line number Diff line change
Expand Up @@ -988,19 +988,16 @@ test_cmp_bin () {
cmp "$@"
}

# Use this instead of test_cmp to compare files that contain expected and
# actual output from git commands that can be translated. When running
# under GIT_TEST_GETTEXT_POISON this pretends that the command produced expected
# results.
# Wrapper for test_cmp which used to be used for
# GIT_TEST_GETTEXT_POISON=false. Only here as a shim for other
# in-flight changes. Should not be used and will be removed soon.
test_i18ncmp () {
! test_have_prereq C_LOCALE_OUTPUT || test_cmp "$@"
test_cmp "$@"
}

# Use this instead of "grep expected-string actual" to see if the
# output from a git command that can be translated either contains an
# expected string, or does not contain an unwanted one. When running
# under GIT_TEST_GETTEXT_POISON this pretends that the command produced expected
# results.
# Wrapper for grep which used to be used for
# GIT_TEST_GETTEXT_POISON=false. Only here as a shim for other
# in-flight changes. Should not be used and will be removed soon.
test_i18ngrep () {
eval "last_arg=\${$#}"

Expand All @@ -1013,12 +1010,6 @@ test_i18ngrep () {
BUG "too few parameters to test_i18ngrep"
fi

if test_have_prereq !C_LOCALE_OUTPUT
then
# pretend success
return 0
fi

if test "x!" = "x$1"
then
shift
Expand Down
23 changes: 4 additions & 19 deletions t/test-lib.sh
Original file line number Diff line number Diff line change
Expand Up @@ -404,15 +404,6 @@ TZ=UTC
export LANG LC_ALL PAGER TZ
EDITOR=:

# GIT_TEST_GETTEXT_POISON should not influence git commands executed
# during initialization of test-lib and the test repo. Back it up,
# unset and then restore after initialization is finished.
if test -n "$GIT_TEST_GETTEXT_POISON"
then
GIT_TEST_GETTEXT_POISON_ORIG=$GIT_TEST_GETTEXT_POISON
unset GIT_TEST_GETTEXT_POISON
fi

# A call to "unset" with no arguments causes at least Solaris 10
# /usr/xpg4/bin/sh and /bin/ksh to bail out. So keep the unsets
# deriving from the command substitution clustered with the other
Expand Down Expand Up @@ -1529,16 +1520,10 @@ test -n "$USE_LIBPCRE1" && test_set_prereq LIBPCRE1
test -n "$USE_LIBPCRE2" && test_set_prereq LIBPCRE2
test -z "$NO_GETTEXT" && test_set_prereq GETTEXT

if test -n "$GIT_TEST_GETTEXT_POISON_ORIG"
then
GIT_TEST_GETTEXT_POISON=$GIT_TEST_GETTEXT_POISON_ORIG
export GIT_TEST_GETTEXT_POISON
unset GIT_TEST_GETTEXT_POISON_ORIG
fi

test_lazy_prereq C_LOCALE_OUTPUT '
! test_bool_env GIT_TEST_GETTEXT_POISON false
'
# Used to be used for GIT_TEST_GETTEXT_POISON=false. Only here as a
# shim for other in-flight changes. Should not be used and will be
# removed soon.
test_set_prereq C_LOCALE_OUTPUT

if test -z "$GIT_TEST_CHECK_CACHE_TREE"
then
Expand Down

0 comments on commit d162b25

Please sign in to comment.