Message ID | pull.753.git.git.1586368729890.gitgitgadget@gmail.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | mingw: use modern strftime implementation if possible | expand |
"Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> writes: > From: =?UTF-8?q?Matthias=20A=C3=9Fhauer?= <mha1993@live.de> > > Microsoft introduced a new "Universal C Runtime Library" (UCRT) with > Visual Studio 2015. The UCRT comes with a new strftime() implementation > that supports more date formats. We link git against the older > "Microsoft Visual C Runtime Library" (MSVCRT), so to use the UCRT > strftime() we need to load it from ucrtbase.dll using > DECLARE_PROC_ADDR()/INIT_PROC_ADDR(). > > Most supported Windows systems should have recieved the UCRT via Windows > update, but in some cases only MSVCRT might be available. In that case > we fall back to using that implementation. > > With this change, it is possible to use e.g. the `%g` and `%V` date > format specifiers, e.g. > > git show -s --format=%cd --date=format:‘%g.%V’ HEAD > > Without this change, the user would see this error message on Windows: > > fatal: invalid strftime format: '‘%g.%V’' > > This fixes https://github.com/git-for-windows/git/issues/2495 > > Signed-off-by: Matthias Aßhauer <mha1993@live.de> > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > --- > Use a modern strftime() on Windows when available > > This is another contribution that came in via Git for Windows. Sure. It would be very surprising if contribution to compat/mingw.c came in via Git on Macintosh ;-) Will apply, together with the other one. Thanks.
Hi Junio, On Wed, 8 Apr 2020, Junio C Hamano wrote: > "Johannes Schindelin via GitGitGadget" <gitgitgadget@gmail.com> > writes: > > > From: =?UTF-8?q?Matthias=20A=C3=9Fhauer?= <mha1993@live.de> > > > > Microsoft introduced a new "Universal C Runtime Library" (UCRT) with > > Visual Studio 2015. The UCRT comes with a new strftime() implementation > > that supports more date formats. We link git against the older > > "Microsoft Visual C Runtime Library" (MSVCRT), so to use the UCRT > > strftime() we need to load it from ucrtbase.dll using > > DECLARE_PROC_ADDR()/INIT_PROC_ADDR(). > > > > Most supported Windows systems should have recieved the UCRT via Windows > > update, but in some cases only MSVCRT might be available. In that case > > we fall back to using that implementation. > > > > With this change, it is possible to use e.g. the `%g` and `%V` date > > format specifiers, e.g. > > > > git show -s --format=%cd --date=format:‘%g.%V’ HEAD > > > > Without this change, the user would see this error message on Windows: > > > > fatal: invalid strftime format: '‘%g.%V’' > > > > This fixes https://github.com/git-for-windows/git/issues/2495 > > > > Signed-off-by: Matthias Aßhauer <mha1993@live.de> > > Signed-off-by: Johannes Schindelin <johannes.schindelin@gmx.de> > > --- > > Use a modern strftime() on Windows when available > > > > This is another contribution that came in via Git for Windows. > > Sure. It would be very surprising if contribution to compat/mingw.c > came in via Git on Macintosh ;-) What I mean to say with this is that the patches have seen some real-life testing. > Will apply, together with the other one. Thanks. Thanks, Dscho
diff --git a/compat/mingw.c b/compat/mingw.c index d14065d60ec..2136744af35 100644 --- a/compat/mingw.c +++ b/compat/mingw.c @@ -964,7 +964,16 @@ int mingw_utime (const char *file_name, const struct utimbuf *times) size_t mingw_strftime(char *s, size_t max, const char *format, const struct tm *tm) { - size_t ret = strftime(s, max, format, tm); + /* a pointer to the original strftime in case we can't find the UCRT version */ + static size_t (*fallback)(char *, size_t, const char *, const struct tm *) = strftime; + size_t ret; + DECLARE_PROC_ADDR(ucrtbase.dll, size_t, strftime, char *, size_t, + const char *, const struct tm *); + + if (INIT_PROC_ADDR(strftime)) + ret = strftime(s, max, format, tm); + else + ret = fallback(s, max, format, tm); if (!ret && errno == EINVAL) die("invalid strftime format: '%s'", format);