Even though we can load gettext.sh the gettext(1) and eval_gettext functions it provides might be completely broken. This reportedly happens on some Cygwin installations where we can load gettext.sh, but gettext and eval_gettext both return exit code 127 and no output. The reason we're trying to load gettext.sh (or the equivalent Solaris implementation) at all is so we don't have to provide our own fallback implementation if the OS already has one installed, but because we didn't test whether it actually worked under GNU gettext we might end up with broken functions. Change the detection in git-sh-i18n so that it tests that the output of "gettext test" produces "test", on Solaris we already test that "gettext -h" produces "-h", so we were already guarded against the same sort of failure there. Reported-by: Alex Riesen <raa.lkml@xxxxxxxxx> --- Here's a minimal patch to git-sh-i18n that should make things work on Cygwin and any other platforms with broken gettext functions while also using the OS-provided functions if they work. I've added a new t0201-gettext-fallbacks-broken-gettext.sh test that tests this. This required a small change in lib-gettext.sh so I wouldn't load test-lib.sh twice. Note that there's already a t0201* test in the repo. Maybe we want to increment all the gettext test numbers by one to make room for it? As an aside I'm really not a big fan of having hardcoded numbers in the test files like this. We don't care about the order of execution here. git-sh-i18n.sh | 2 +- t/lib-gettext.sh | 7 +++++- t/t0201-gettext-fallbacks-broken-gettext.sh | 28 +++++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 2 deletions(-) create mode 100755 t/t0201-gettext-fallbacks-broken-gettext.sh diff --git a/git-sh-i18n.sh b/git-sh-i18n.sh index b4575fb..26a57b0 100644 --- a/git-sh-i18n.sh +++ b/git-sh-i18n.sh @@ -18,7 +18,7 @@ export TEXTDOMAINDIR if test -z "$GIT_GETTEXT_POISON" then - if test -z "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS" && type gettext.sh >/dev/null 2>&1 + if test -z "$GIT_INTERNAL_GETTEXT_TEST_FALLBACKS" && type gettext.sh >/dev/null 2>&1 && test "$(gettext test 2>&1)" = "test" then # This is GNU libintl's gettext.sh, we don't need to do anything # else than setting up the environment and loading gettext.sh diff --git a/t/lib-gettext.sh b/t/lib-gettext.sh index 0f76f6c..2c5b758 100644 --- a/t/lib-gettext.sh +++ b/t/lib-gettext.sh @@ -3,7 +3,12 @@ # Copyright (c) 2010 Ævar Arnfjörð Bjarmason # -. ./test-lib.sh +if test -z "$TEST_DIRECTORY" +then + # In case the test loaded test-lib.sh by itself to do some tests + # prior to loading us. + . ./test-lib.sh +fi GIT_TEXTDOMAINDIR="$GIT_BUILD_DIR/po/build/locale" GIT_PO_PATH="$GIT_BUILD_DIR/po" diff --git a/t/t0201-gettext-fallbacks-broken-gettext.sh b/t/t0201-gettext-fallbacks-broken-gettext.sh new file mode 100755 index 0000000..92b95ae --- /dev/null +++ b/t/t0201-gettext-fallbacks-broken-gettext.sh @@ -0,0 +1,28 @@ +#!/bin/sh +# +# Copyright (c) 2012 Ævar Arnfjörð Bjarmason +# + +test_description='Gettext Shell fallbacks with broken gettext' + +. ./test-lib.sh + +test_expect_success 'set up a fake broken gettext(1)' ' + cat >gettext <<-\EOF && + #!/bin/sh + exit 1 + EOF + chmod +x gettext && + ! ./gettext +' + +PATH=.:$PATH +. "$TEST_DIRECTORY"/lib-gettext.sh + +test_expect_success C_LOCALE_OUTPUT '$GIT_INTERNAL_GETTEXT_SH_SCHEME" is fallthrough with broken gettext(1)' ' + echo fallthrough >expect && + echo $GIT_INTERNAL_GETTEXT_SH_SCHEME >actual && + test_cmp expect actual +' + +test_done -- 1.7.7.3 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html