Re: [Outreachy][PATCH 2/2] Port helper/test-date.c to unit-tests/t-date.c
- From
Patrick Steinhardt <ps@pks.im>
- Date
- May 28, 2024, 13:20 UTC
- Message-ID
- <ZlXaDWy0lQA1FM7d@tanuki>
- In-Reply-To
- <xmqqttkquxes.fsf@gitster.g>
On Thu, Mar 28, 2024 at 09:35:39AM -0700, Junio C Hamano wrote:
Show 26 quoted lines
> Ghanshyam Thakkar <shyamthakkar001@gmail.com> writes: > > > I believe the issue might not be related to the setenv function, but rather > > with tzset(). As you can see here[1], when we set TZ before we call the > > unit-testing binaries, the tests which were failing (EST5 ones that I > > separated with t-datetest) pass on 'win test (0)', and the ones which > > were passing (UTC ones, t-date) fail. (Although some tests on linux are also > > failing, but that can be explained by the fact that t-date runs first > > and sets the TZ to UTC, afterwhich t-datetest runs and fails, although > > this is not conclusive). Therefore, I am almost certain that the issue > > is with changing the timezone during runtime on windows and not with setting > > TZ variable with setenv(). CC'ing Johannes to see if he has any insights > > on this. > > Interesting. Sometime before I started working on Git, I learned > that no program did tzset() after it started running to switch > multiple timezones and worked correctly on many different variants > of UNIXes (there were many of them back then), and because I never > got interested in writing a world-clock program, I didn't know, and > kind of surprised to learn that it works on some platforms (like > Linux and macOS) to switch zones with tzset() these days ;-). > > So, if Windows runtime is unhappy with the program calling tzset() > more than once, I wouldn't be too surprised. > > Thanks.
As I was debugging other Windows-specific issues in a VM already, Chris asked me to also have a look at this issue. And indeed, most of the tests fail deterministically. I also found a fix:
diff --git a/t/unit-tests/t-date.c b/t/unit-tests/t-date.c
index dd5dbbb2e0..2d7b1f085a 100644
--- a/t/unit-tests/t-date.c
+++ b/t/unit-tests/t-date.c
@@ -31,7 +31,7 @@ static int check_prereqs(unsigned int prereqs) {
}
static void set_TZ_env(const char *zone) {
- setenv("TZ", zone, 1);
+ _putenv_s("TZ", zone);
tzset();
}I have no idea why that works though, and the fix is of course not portable. But with this change, the timezones do get picked up by `tzset()` and related date functions as expected.
I'm quite dumb when it comes to the Windows API, so I don't have much of a clue why this works. The documentation also didn't point out anything obvious. Dscho, do you happen to have an explanation for this?
Patrick