Thread (2 messages) 2 messages, 2 authors, 2024-05-28

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

Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help