From: "Matthias Aßhauer via GitGitGadget" <gitgitgadget@gmail.com>
To: git@vger.kernel.org
Cc: "Jeff King" <peff@peff.net>,
"Johannes Schindelin" <johannes.schindelin@gmx.de>,
"Matthias Aßhauer" <mha1993@live.de>,
"Matthias Aßhauer" <mha1993@live.de>
Subject: [PATCH] set LC_TIME even if locale dir is not present
Date: Sun, 27 Mar 2022 08:58:09 +0000 [thread overview]
Message-ID: <pull.1189.git.1648371489398.gitgitgadget@gmail.com> (raw)
From: =?UTF-8?q?Matthias=20A=C3=9Fhauer?= <mha1993@live.de>
Since Commit aa1462c (introduce "format" date-mode, 2015-06-25) git log can
pass user specified format strings directly to strftime(). One special
format string we explicitly mention in our documentation is %c, which
depends on the system locale. To accommodate for %c we added a call to
setlocale() in git_setup_gettext().
In Commit cc5e1bf (gettext: avoid initialization if the locale dir is not
present, 2018-04-21) we added an early exit to git_setup_gettext() in case
no textdomain directory is present. This early exit is so early, that we
don't even set the locale for %c in that case, despite strftime() not
needing the textdomain directory at all.
This leads to a subtle bug where `git log --date=format:%c` will use C
locale instead of the system locale on systems without a valid textdomain
directory.
This fixes https://github.com/git-for-windows/git/issues/2959
Signed-off-by: Matthias Aßhauer <mha1993@live.de>
---
[RFC] set LC_TIME even if locale dir is not present
This is a small bug fix with a large and unwieldy regression test. The
whole prepare_time_locale() bit and and the Makefile change is obviously
based on prepare_utf8_locale(), but I'm not really happy with it. I'm
not even sure how to fully put the issues I have with the test in words.
* I feel like it's not really testing anything on builds without
gettext, but adding a GETTEXT prerequisite to a test that something
works without gettext is very counter intuitive.
* I'm also not exactly happy about how I choose a locale, but can't
think of a better way. It's a reasonable assumption that C locale
uses a US date format on most, if not all supported systems, but I
have no good way to make sure that the selected locale actually
formats dates differently. Defining a custom locale would solve this,
but seems like a convoluted way to go about things.
* I'm not entirely happy with testing the output of git log
-format=date:%c against the output of the exact same command. I've
tried a version of the test based on date(1) and got it working with
the GNU version, but looking at the BSD version for our OS X based CI
builds and the POSIX spec for that command, they share barely more
than their name.
So, looking at the points above, I expect this to take a few re-rolls to
get into a reasonable shape.
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1189%2Frimrul%2Fdate-format-without-gettext-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1189/rimrul/date-format-without-gettext-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1189
Makefile | 7 +++++++
gettext.c | 3 ++-
t/t4205-log-pretty-formats.sh | 31 +++++++++++++++++++++++++++++++
3 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
index e8aba291d7f..ddca29b550b 100644
--- a/Makefile
+++ b/Makefile
@@ -410,6 +410,10 @@ include shared.mak
# If it isn't set, fallback to $LC_ALL, $LANG or use the first utf-8
# locale returned by "locale -a".
#
+# Define GIT_TEST_TIME_LOCALE to preferred non-us locale for testing.
+# If it isn't set, fallback to $LC_ALL, $LANG or use the first non-us
+# locale returned by "locale -a".
+#
# Define HAVE_CLOCK_GETTIME if your platform has clock_gettime.
#
# Define HAVE_CLOCK_MONOTONIC if your platform has CLOCK_MONOTONIC.
@@ -2862,6 +2866,9 @@ ifdef GIT_TEST_CMP_USE_COPIED_CONTEXT
endif
ifdef GIT_TEST_UTF8_LOCALE
@echo GIT_TEST_UTF8_LOCALE=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_UTF8_LOCALE)))'\' >>$@+
+endif
+ifdef GIT_TEST_TIME_LOCALE
+ @echo GIT_TEST_TIME_LOCALE=\''$(subst ','\'',$(subst ','\'',$(GIT_TEST_TIME_LOCALE)))'\' >>$@+
endif
@echo NO_GETTEXT=\''$(subst ','\'',$(subst ','\'',$(NO_GETTEXT)))'\' >>$@+
ifdef GIT_PERF_REPEAT_COUNT
diff --git a/gettext.c b/gettext.c
index bb5ba1fe7cc..2b614c2b8c6 100644
--- a/gettext.c
+++ b/gettext.c
@@ -107,6 +107,8 @@ void git_setup_gettext(void)
const char *podir = getenv(GIT_TEXT_DOMAIN_DIR_ENVIRONMENT);
char *p = NULL;
+ setlocale(LC_TIME, "");
+
if (!podir)
podir = p = system_path(GIT_LOCALE_PATH);
@@ -117,7 +119,6 @@ void git_setup_gettext(void)
bindtextdomain("git", podir);
setlocale(LC_MESSAGES, "");
- setlocale(LC_TIME, "");
init_gettext_charset("git");
textdomain("git");
diff --git a/t/t4205-log-pretty-formats.sh b/t/t4205-log-pretty-formats.sh
index e448ef2928a..01a1e61ecea 100755
--- a/t/t4205-log-pretty-formats.sh
+++ b/t/t4205-log-pretty-formats.sh
@@ -25,6 +25,29 @@ commit_msg () {
fi
}
+prepare_time_locale () {
+ if test -z "$GIT_TEST_TIME_LOCALE"
+ then
+ case "${LC_ALL:-$LANG}" in
+ C | C.* | POSIX | POSIX.* | en_US | en_US.* )
+ GIT_TEST_TIME_LOCALE=$(locale -a | sed -n '/^\(C\|POSIX\|en_US\)/I !{
+ p
+ q
+ }')
+ ;;
+ *)
+ GIT_TEST_TIME_LOCALE="${LC_ALL:-$LANG}"
+ ;;
+ esac
+ fi
+ if test -n "$GIT_TEST_TIME_LOCALE"
+ then
+ test_set_prereq TIME_LOCALE
+ else
+ say "# No non-us locale available, some tests are skipped"
+ fi
+}
+
test_expect_success 'set up basic repos' '
>foo &&
>bar &&
@@ -544,6 +567,14 @@ test_expect_success '--date=human %ad%cd is the same as %ah%ch' '
test_cmp expected actual
'
+prepare_time_locale
+test_expect_success TIME_LOCALE '--date=format:%c does not need gettext' '
+ rm -fr no-such-dir &&
+ LC_ALL=$GIT_TEST_TIME_LOCALE git log --date=format:%c HEAD^1..HEAD >expected &&
+ GIT_TEXTDOMAINDIR=no-such-dir LC_ALL=$GIT_TEST_TIME_LOCALE git log --date=format:%c HEAD^1..HEAD >actual &&
+ test_cmp expected actual
+'
+
# get new digests (with no abbreviations)
test_expect_success 'set up log decoration tests' '
head1=$(git rev-parse --verify HEAD~0) &&
base-commit: abf474a5dd901f28013c52155411a48fd4c09922
--
gitgitgadget
next reply other threads:[~2022-03-27 8:58 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-03-27 8:58 Matthias Aßhauer via GitGitGadget [this message]
2022-03-27 10:13 ` [PATCH] set LC_TIME even if locale dir is not present Ævar Arnfjörð Bjarmason
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=pull.1189.git.1648371489398.gitgitgadget@gmail.com \
--to=gitgitgadget@gmail.com \
--cc=git@vger.kernel.org \
--cc=johannes.schindelin@gmx.de \
--cc=mha1993@live.de \
--cc=peff@peff.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).