# [PATCH] git-cvsimport: support local timezone

4 messages from 2012-10-11 to 2012-10-12. Participants: Chris Rorvick, Michael Haggerty, Christopher Rorvick.
Thread: https://gitlist.dev/t/31792

## Chris Rorvick, 2012-10-11 20:48

Subject: [PATCH] git-cvsimport: support local timezone
Message-ID: <1349988497-6158-1-git-send-email-chris@rorvick.com>
URL: https://gitlist.dev/e/1349988497-6158-1-git-send-email-chris%40rorvick.com

```
CVS patches are unconditionally imported with a UTC timezone.  Allow
the local timezone by adding -l to the command line or specifying
cvsimport.l in the config.

This could be made the default behavior, as setting TZ=UTC in the
environment before doing the import is equivalent to the current
behavior.  But since a new default may be an unwelcome surprise to
some, make this new behavior available os an option.

Signed-off-by: Chris Rorvick <chris@rorvick.com>
---

I have tested this with various TZ values (including "UTC") and confirmed
that the <fuzz> + 5min timeout is observed correctly in each case.

Chris Rorvick

 Documentation/git-cvsimport.txt |   11 ++++++++---
 git-cvsimport.perl              |   13 +++++++------
 2 files changed, 15 insertions(+), 9 deletions(-)

diff --git a/Documentation/git-cvsimport.txt b/Documentation/git-cvsimport.txt
index 6695ab3..41cd289 100644
--- a/Documentation/git-cvsimport.txt
+++ b/Documentation/git-cvsimport.txt
@@ -11,9 +11,9 @@ SYNOPSIS
 [verse]
 'git cvsimport' [-o <branch-for-HEAD>] [-h] [-v] [-d <CVSROOT>]
 	      [-A <author-conv-file>] [-p <options-for-cvsps>] [-P <file>]
-	      [-C <git_repository>] [-z <fuzz>] [-i] [-k] [-u] [-s <subst>]
-	      [-a] [-m] [-M <regex>] [-S <regex>] [-L <commitlimit>]
-	      [-r <remote>] [-R] [<CVS_module>]
+	      [-C <git_repository>] [-z <fuzz>] [-i] [-k] [-l] [-u]
+	      [-s <subst>] [-a] [-m] [-M <regex>] [-S <regex>]
+	      [-L <commitlimit>] [-r <remote>] [-R] [<CVS_module>]
 
 
 DESCRIPTION
@@ -89,6 +89,11 @@ the old cvs2git tool.
 	to avoid noisy changesets. Highly recommended, but off by default
 	to preserve compatibility with early imported trees.
 
+-l::
+	Apply the local timezone to timestamps.  The `TZ` environment
+	variable can be used to override the default, possibly useful
+	if you are importing a non-local repository.
+
 -u::
 	Convert underscores in tag and branch names to dots.
 
diff --git a/git-cvsimport.perl b/git-cvsimport.perl
index 8032f23..927d75c 100755
--- a/git-cvsimport.perl
+++ b/git-cvsimport.perl
@@ -28,9 +28,8 @@ use POSIX qw(strftime dup2 ENOENT);
 use IPC::Open2;
 
 $SIG{'PIPE'}="IGNORE";
-$ENV{'TZ'}="UTC";
 
-our ($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $opt_s,$opt_m,@opt_M,$opt_A,$opt_S,$opt_L, $opt_a, $opt_r, $opt_R);
+our ($opt_h,$opt_o,$opt_v,$opt_k,$opt_u,$opt_l,$opt_d,$opt_p,$opt_C,$opt_z,$opt_i,$opt_P, $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);
 
 sub usage(;$) {
@@ -40,7 +39,7 @@ sub usage(;$) {
 Usage: git cvsimport     # fetch/update GIT from CVS
        [-o branch-for-HEAD] [-h] [-v] [-d CVSROOT] [-A author-conv-file]
        [-p opts-for-cvsps] [-P file] [-C GIT_repository] [-z fuzz] [-i] [-k]
-       [-u] [-s subst] [-a] [-m] [-M regex] [-S regex] [-L commitlimit]
+       [-l] [-u] [-s subst] [-a] [-m] [-M regex] [-S regex] [-L commitlimit]
        [-r remote] [-R] [CVS_module]
 END
 	exit(1);
@@ -128,7 +127,7 @@ sub read_repo_config {
 	}
 }
 
-my $opts = "haivmkuo:d:p:r:C:z:s:M:P:A:S:L:R";
+my $opts = "haivmkulo:d:p:r:C:z:s:M:P:A:S:L:R";
 read_repo_config($opts);
 Getopt::Long::Configure( 'no_ignore_case', 'bundling' );
 
@@ -138,6 +137,8 @@ GetOptions( map { s/:/=s/; /M/ ? "$_\@" : $_ } split( /(?!:)/, $opts ) )
     or usage();
 usage if $opt_h;
 
+$ENV{'TZ'}="UTC" unless $opt_l;
+
 if (@ARGV == 0) {
 		chomp(my $module = `git config --get cvsimport.module`);
 		push(@ARGV, $module) if $? == 0;
@@ -582,7 +583,7 @@ sub pdate($) {
 	m#(\d{2,4})/(\d\d)/(\d\d)\s(\d\d):(\d\d)(?::(\d\d))?#
 		or die "Unparseable date: $d\n";
 	my $y=$1; $y-=1900 if $y>1900;
-	return timegm($6||0,$5,$4,$3,$2-1,$y);
+	return timelocal($6||0,$5,$4,$3,$2-1,$y);
 }
 
 sub pmode($) {
@@ -844,7 +845,7 @@ sub commit {
 		}
 	}
 
-	my $commit_date = strftime("+0000 %Y-%m-%d %H:%M:%S",gmtime($date));
+	my $commit_date = strftime("%z %Y-%m-%d %H:%M:%S",localtime($date));
 	$ENV{GIT_AUTHOR_NAME} = $author_name;
 	$ENV{GIT_AUTHOR_EMAIL} = $author_email;
 	$ENV{GIT_AUTHOR_DATE} = $commit_date;
-- 
1.7.1

```

## Michael Haggerty, 2012-10-11 22:43

Subject: Re: [PATCH] git-cvsimport: support local timezone
Message-ID: <50774BA9.40609@alum.mit.edu>
URL: https://gitlist.dev/e/50774BA9.40609%40alum.mit.edu
In-Reply-To: <1349988497-6158-1-git-send-email-chris@rorvick.com>

```
On 10/11/2012 10:48 PM, Chris Rorvick wrote:
> CVS patches are unconditionally imported with a UTC timezone.  Allow
> the local timezone by adding -l to the command line or specifying
> cvsimport.l in the config.
> 
> This could be made the default behavior, as setting TZ=UTC in the
> environment before doing the import is equivalent to the current
> behavior.  But since a new default may be an unwelcome surprise to
> some, make this new behavior available os an option.

According to rcsfile(7), all times in RCS/CVS files are recorded in UTC.
 So why do you need this feature?

Michael

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

```

## Christopher Rorvick, 2012-10-12 00:14

Subject: Re: [PATCH] git-cvsimport: support local timezone
Message-ID: <CAEUsAPYaYGDHWkixf9U27_Hsa7QqCWq3csKtBH7MrjnMD6kKJQ@mail.gmail.com>
URL: https://gitlist.dev/e/CAEUsAPYaYGDHWkixf9U27_Hsa7QqCWq3csKtBH7MrjnMD6kKJQ%40mail.gmail.com
In-Reply-To: <50774BA9.40609@alum.mit.edu>

```
On Thu, Oct 11, 2012 at 5:43 PM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
> On 10/11/2012 10:48 PM, Chris Rorvick wrote:
>> CVS patches are unconditionally imported with a UTC timezone.  Allow
>> the local timezone by adding -l to the command line or specifying
>> cvsimport.l in the config.
>>
>> This could be made the default behavior, as setting TZ=UTC in the
>> environment before doing the import is equivalent to the current
>> behavior.  But since a new default may be an unwelcome surprise to
>> some, make this new behavior available os an option.
>
> According to rcsfile(7), all times in RCS/CVS files are recorded in UTC.
>  So why do you need this feature?
>
> Michael

Hi Michael,

Precisely because of this limitation.  RCS files are not as expressive
as a Git commit so I need a way to fill in the blanks.

This is analogous to the cvs-authors file.  The RCS files in a CVS
repository say the author of my commits is "crorvick" but that is
neither my name nor email.  cvsimport allows me to overcome this
limitation by specifying a mapping from author username to full name
and email.

Likewise, just because the RCS file has a UTC timestamp does not mean
the commit originated in Greenwich, UK.  Git includes the timezone
offset in its timestamps, so it is reasonable to allow me to specify
what is appropriate.

This is not a big deal for a one-time import as a simple filter-branch
run can fix this pretty quickly.  But this feature would be nice when
running cvsimport incrementally.

Thanks!

Chris Rorvick

```

## Michael Haggerty, 2012-10-12 07:57

Subject: Re: [PATCH] git-cvsimport: support local timezone
Message-ID: <5077CD82.6000405@alum.mit.edu>
URL: https://gitlist.dev/e/5077CD82.6000405%40alum.mit.edu
In-Reply-To: <CAEUsAPYaYGDHWkixf9U27_Hsa7QqCWq3csKtBH7MrjnMD6kKJQ@mail.gmail.com>

```
On 10/12/2012 02:14 AM, Christopher Rorvick wrote:
> On Thu, Oct 11, 2012 at 5:43 PM, Michael Haggerty <mhagger@alum.mit.edu> wrote:
>> On 10/11/2012 10:48 PM, Chris Rorvick wrote:
>>> CVS patches are unconditionally imported with a UTC timezone.  Allow
>>> the local timezone by adding -l to the command line or specifying
>>> cvsimport.l in the config.
>>>
>>> This could be made the default behavior, as setting TZ=UTC in the
>>> environment before doing the import is equivalent to the current
>>> behavior.  But since a new default may be an unwelcome surprise to
>>> some, make this new behavior available os an option.
>>
>> According to rcsfile(7), all times in RCS/CVS files are recorded in UTC.
>>  So why do you need this feature?
> 
> [...]
> Likewise, just because the RCS file has a UTC timestamp does not mean
> the commit originated in Greenwich, UK.  Git includes the timezone
> offset in its timestamps, so it is reasonable to allow me to specify
> what is appropriate.

Ahh, OK, I hadn't realized that git stores (UTC time + time zone).  I
mistakenly thought you wanted to use a time zone to transform CVS-time
to git-time, i.e., as if the CVS time were recorded in local time.  Your
actual goal makes sense.

[And it is something I should consider building into cvs2git.]

Michael

-- 
Michael Haggerty
mhagger@alum.mit.edu
http://softwareswirl.blogspot.com/

```
