On Fri, Nov 02, 2012 at 09:33:14PM +0000, Ramsay Jones wrote:

> >> I wonder if Ramsay has an older perl that does not do this special
> >> hackery right. I'll see if I can dig up where it first appeared.
> Hmm, sorry for not specifying this upfront, but this failure is on Linux. ;-)

Ah, that's helpful to know.

> (Linux is my main platform, but I like to keep cygwin working because it has
> kept me sane on Windows ever since (about) 1995 ...)
> "Stranger in a strange land" ;-)

I used a different trick around the same time to keep me sane from
Windows, but I think it involved "dd" and "/dev/zero"...

> I'm using perl v5.8.8 on Linux.

Yeah, that is the problem. Calling localtime_r repeatedly while changing
the timezone does not work on some platforms:


The fix (to call tzset each time) went into perl 5.10.0.

> > Ramsay, what happens with this patch on top?
> This patch fixes the test for me.

Great. I was guessing blindly when I wrote it, but having seen the perl
bug above, it all makes sense.

We should probably wrap it. I'm planning to queue this on top of Chris's

-- >8 --
Subject: [PATCH] cvsimport: work around perl tzset issue

On many platforms, the first invocation of localtime_r will
check $TZ in the environment, but subsequent invocations
will use a cache value. That means that setting $ENV{TZ} in
the middle of the program may or may not have an effect on
later calls to localtime.  Perl 5.10.0 and later handles
this automatically for us, but we try to remain portable
back to 5.8. Work around it by calling tzset ourselves.

Signed-off-by: Jeff King <p...@peff.net>
 git-cvsimport.perl | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index ceb119d..0a31ebd 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -24,11 +24,11 @@ use File::Basename qw(basename dirname);
 use Time::Local;
 use IO::Socket;
 use IO::Pipe;
-use POSIX qw(strftime dup2 ENOENT);
+use POSIX qw(strftime tzset dup2 ENOENT);
 use IPC::Open2;
$opt_s,$opt_m,@opt_M,$opt_A,$opt_S,$opt_L, $opt_a, $opt_r, $opt_R);
 my (%conv_author_name, %conv_author_email, %conv_author_tz);
@@ -99,6 +99,15 @@ sub write_author_info($) {
        close ($f);
+# Versions of perl before 5.10.0 may not automatically check $TZ each
+# time localtime is run (most platforms will do so only the first time).
+# We can work around this by using tzset() to update the internal
+# variable whenever we change the environment.
+sub set_timezone {
+       $ENV{TZ} = shift;
+       tzset();
 # convert getopts specs for use by git config
 my %longmap = (
        'A:' => 'authors-file',
@@ -854,9 +863,9 @@ sub commit {
-       $ENV{'TZ'}=$author_tz;
+       set_timezone($author_tz);
        my $commit_date = strftime("%s %z", localtime($date));
-       $ENV{'TZ'}="UTC";
+       set_timezone('UTC');
        $ENV{GIT_AUTHOR_NAME} = $author_name;
        $ENV{GIT_AUTHOR_EMAIL} = $author_email;
        $ENV{GIT_AUTHOR_DATE} = $commit_date;

To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to