Re: [Outreachy][PATCH 2/2] Port helper/test-date.c to unit-tests/t-date.c
From: Patrick Steinhardt <hidden>
Date: 2024-05-28 13:20:20
On Thu, Mar 28, 2024 at 09:35:39AM -0700, Junio C Hamano wrote:
Ghanshyam Thakkar [off-list ref] writes:quoted
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 Attachments
- signature.asc [application/pgp-signature] 833 bytes