From: Eric Wong <normalperson@yhbt.net>
To: Junio C Hamano <gitster@pobox.com>
Cc: Pete Harlan <pgit@pcharlan.com>, Git mailing list <git@vger.kernel.org>
Subject: Re: [PATCH v2] git-svn: Add --localtime option to "fetch"
Date: Sun, 18 Jan 2009 16:43:18 -0800 [thread overview]
Message-ID: <20090119004318.GA5128@untitled> (raw)
In-Reply-To: <4972ABA6.7060207@pcharlan.com>
Pete Harlan <pgit@pcharlan.com> wrote:
> By default git-svn stores timestamps of fetched commits in
> Subversion's UTC format. Passing --localtime to fetch will convert
> them to the timezone of the server on which git-svn is run.
>
> This makes the timestamps of a resulting "git log" agree with what
> "svn log" shows for the same repository.
>
> Signed-off-by: Pete Harlan <pgit@pcharlan.com>
Thanks Peter,
Acked-by: Eric Wong <normalperson@yhbt.net>
> ---
>
> Changes to v2 after feedback from Eric Wong:
>
> 1. "--convert-timezones" renamed to "--localtime".
>
> 2. Removed warnings about breaking interoperability with Subversion,
> because the option doesn't do that. Instead warn about
> interoperability with other git-svn users cloning from the same
> repository if they don't all use or not use --localtime.
>
> 3. Move config variable into Git::SVN namespace.
>
> 4. Better conformance to coding guidelines.
>
> Documentation/git-svn.txt | 11 ++++++
> contrib/completion/git-completion.bash | 2 +-
> git-svn.perl | 54 ++++++++++++++++++++++++++++++-
> 3 files changed, 64 insertions(+), 3 deletions(-)
>
> diff --git a/Documentation/git-svn.txt b/Documentation/git-svn.txt
> index 8d0c421..63d2f5e 100644
> --- a/Documentation/git-svn.txt
> +++ b/Documentation/git-svn.txt
> @@ -92,6 +92,17 @@ COMMANDS
> .git/config file may be specified as an optional command-line
> argument.
>
> +--localtime;;
> + Store Git commit times in the local timezone instead of UTC. This
> + makes 'git-log' (even without --date=local) show the same times
> + that `svn log` would in the local timezone.
> +
> +This doesn't interfere with interoperating with the Subversion
> +repository you cloned from, but if you wish for your local Git
> +repository to be able to interoperate with someone else's local Git
> +repository, either don't use this option or you should both use it in
> +the same local timezone.
> +
> 'clone'::
> Runs 'init' and 'fetch'. It will automatically create a
> directory based on the basename of the URL passed to it;
> diff --git a/contrib/completion/git-completion.bash b/contrib/completion/git-completion.bash
> index f8b845a..c9d2c02 100755
> --- a/contrib/completion/git-completion.bash
> +++ b/contrib/completion/git-completion.bash
> @@ -1575,7 +1575,7 @@ _git_svn ()
> --follow-parent --authors-file= --repack=
> --no-metadata --use-svm-props --use-svnsync-props
> --log-window-size= --no-checkout --quiet
> - --repack-flags --user-log-author $remote_opts
> + --repack-flags --user-log-author --localtime $remote_opts
> "
> local init_opts="
> --template= --shared= --trunk= --tags=
> diff --git a/git-svn.perl b/git-svn.perl
> index ad01e18..0adc8db 100755
> --- a/git-svn.perl
> +++ b/git-svn.perl
> @@ -84,6 +84,7 @@ my %fc_opts = ( 'follow-parent|follow!' => \$Git::SVN::_follow_parent,
> \$Git::SVN::_repack_flags,
> 'use-log-author' => \$Git::SVN::_use_log_author,
> 'add-author-from' => \$Git::SVN::_add_author_from,
> + 'localtime' => \$Git::SVN::_localtime,
> %remote_opts );
>
> my ($_trunk, $_tags, $_branches, $_stdlayout);
> @@ -1364,7 +1365,7 @@ use constant rev_map_fmt => 'NH40';
> use vars qw/$default_repo_id $default_ref_id $_no_metadata $_follow_parent
> $_repack $_repack_flags $_use_svm_props $_head
> $_use_svnsync_props $no_reuse_existing $_minimize_url
> - $_use_log_author $_add_author_from/;
> + $_use_log_author $_add_author_from $_localtime/;
> use Carp qw/croak/;
> use File::Path qw/mkpath/;
> use File::Copy qw/copy/;
> @@ -2526,12 +2527,61 @@ sub get_untracked {
> \@out;
> }
>
> +# parse_svn_date(DATE)
> +# --------------------
> +# Given a date (in UTC) from Subversion, return a string in the format
> +# "<TZ Offset> <local date/time>" that Git will use.
> +#
> +# By default the parsed date will be in UTC; if $Git::SVN::_localtime
> +# is true we'll convert it to the local timezone instead.
> sub parse_svn_date {
> my $date = shift || return '+0000 1970-01-01 00:00:00';
> my ($Y,$m,$d,$H,$M,$S) = ($date =~ /^(\d{4})\-(\d\d)\-(\d\d)T
> (\d\d)\:(\d\d)\:(\d\d).\d+Z$/x) or
> croak "Unable to parse date: $date\n";
> - "+0000 $Y-$m-$d $H:$M:$S";
> + my $parsed_date; # Set next.
> +
> + if ($Git::SVN::_localtime) {
> + # Translate the Subversion datetime to an epoch time.
> + # Begin by switching ourselves to $date's timezone, UTC.
> + my $old_env_TZ = $ENV{TZ};
> + $ENV{TZ} = 'UTC';
> +
> + my $epoch_in_UTC =
> + POSIX::strftime('%s', $S, $M, $H, $d, $m - 1, $Y - 1900);
> +
> + # Determine our local timezone (including DST) at the
> + # time of $epoch_in_UTC. $Git::SVN::Log::TZ stored the
> + # value of TZ, if any, at the time we were run.
> + if (defined $Git::SVN::Log::TZ) {
> + $ENV{TZ} = $Git::SVN::Log::TZ;
> + } else {
> + delete $ENV{TZ};
> + }
> +
> + my $our_TZ =
> + POSIX::strftime('%Z', $S, $M, $H, $d, $m - 1, $Y - 1900);
> +
> + # This converts $epoch_in_UTC into our local timezone.
> + my ($sec, $min, $hour, $mday, $mon, $year,
> + $wday, $yday, $isdst) = localtime($epoch_in_UTC);
> +
> + $parsed_date = sprintf('%s %04d-%02d-%02d %02d:%02d:%02d',
> + $our_TZ, $year + 1900, $mon + 1,
> + $mday, $hour, $min, $sec);
> +
> + # Reset us to the timezone in effect when we entered
> + # this routine.
> + if (defined $old_env_TZ) {
> + $ENV{TZ} = $old_env_TZ;
> + } else {
> + delete $ENV{TZ};
> + }
> + } else {
> + $parsed_date = "+0000 $Y-$m-$d $H:$M:$S";
> + }
> +
> + return $parsed_date;
> }
>
> sub check_author {
> --
> 1.6.1.77.g953e7
next prev parent reply other threads:[~2009-01-19 0:44 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-01-14 0:45 [PATCH/RFC] git-svn: Add --convert-timezone option Pete Harlan
2009-01-17 10:37 ` Eric Wong
2009-01-18 3:57 ` Pete Harlan
2009-01-18 4:10 ` [PATCH v2] git-svn: Add --localtime option to "fetch" Pete Harlan
2009-01-19 0:43 ` Eric Wong [this message]
2009-01-19 3:46 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20090119004318.GA5128@untitled \
--to=normalperson@yhbt.net \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=pgit@pcharlan.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).