Merge branch 'bw/get-tz-offset-perl' into maint

* bw/get-tz-offset-perl:
  cvsimport: format commit timestamp ourselves without using strftime
  perl/Git.pm: fix get_tz_offset to properly handle DST boundary cases
  Move Git::SVN::get_tz to Git::get_tz_offset
This commit is contained in:
Junio C Hamano 2013-02-25 08:04:03 -08:00
commit 8552e2e590
4 changed files with 35 additions and 13 deletions

View File

@ -26,6 +26,7 @@ use IO::Socket;
use IO::Pipe; use IO::Pipe;
use POSIX qw(strftime tzset dup2 ENOENT); use POSIX qw(strftime tzset dup2 ENOENT);
use IPC::Open2; use IPC::Open2;
use Git qw(get_tz_offset);
$SIG{'PIPE'}="IGNORE"; $SIG{'PIPE'}="IGNORE";
set_timezone('UTC'); set_timezone('UTC');
@ -864,7 +865,9 @@ sub commit {
} }
set_timezone($author_tz); set_timezone($author_tz);
my $commit_date = strftime("%s %z", localtime($date)); # $date is in the seconds since epoch format
my $tz_offset = get_tz_offset($date);
my $commit_date = "$date $tz_offset";
set_timezone('UTC'); set_timezone('UTC');
$ENV{GIT_AUTHOR_NAME} = $author_name; $ENV{GIT_AUTHOR_NAME} = $author_name;
$ENV{GIT_AUTHOR_EMAIL} = $author_email; $ENV{GIT_AUTHOR_EMAIL} = $author_email;

View File

@ -59,6 +59,7 @@ require Exporter;
command_bidi_pipe command_close_bidi_pipe command_bidi_pipe command_close_bidi_pipe
version exec_path html_path hash_object git_cmd_try version exec_path html_path hash_object git_cmd_try
remote_refs prompt remote_refs prompt
get_tz_offset
temp_acquire temp_release temp_reset temp_path); temp_acquire temp_release temp_reset temp_path);
@ -102,6 +103,7 @@ use Error qw(:try);
use Cwd qw(abs_path cwd); use Cwd qw(abs_path cwd);
use IPC::Open2 qw(open2); use IPC::Open2 qw(open2);
use Fcntl qw(SEEK_SET SEEK_CUR); use Fcntl qw(SEEK_SET SEEK_CUR);
use Time::Local qw(timegm);
} }
@ -511,6 +513,27 @@ C<git --html-path>). Useful mostly only internally.
sub html_path { command_oneline('--html-path') } sub html_path { command_oneline('--html-path') }
=item get_tz_offset ( TIME )
Return the time zone offset from GMT in the form +/-HHMM where HH is
the number of hours from GMT and MM is the number of minutes. This is
the equivalent of what strftime("%z", ...) would provide on a GNU
platform.
If TIME is not supplied, the current local time is used.
=cut
sub get_tz_offset {
# some systmes don't handle or mishandle %z, so be creative.
my $t = shift || time;
my $gm = timegm(localtime($t));
my $sign = qw( + + - )[ $gm <=> $t ];
return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
}
=item prompt ( PROMPT , ISPASSWORD ) =item prompt ( PROMPT , ISPASSWORD )
Query user C<PROMPT> and return answer from user. Query user C<PROMPT> and return answer from user.

View File

@ -11,7 +11,6 @@ use Carp qw/croak/;
use File::Path qw/mkpath/; use File::Path qw/mkpath/;
use File::Copy qw/copy/; use File::Copy qw/copy/;
use IPC::Open3; use IPC::Open3;
use Time::Local;
use Memoize; # core since 5.8.0, Jul 2002 use Memoize; # core since 5.8.0, Jul 2002
use Memoize::Storable; use Memoize::Storable;
use POSIX qw(:signal_h); use POSIX qw(:signal_h);
@ -22,6 +21,7 @@ use Git qw(
command_noisy command_noisy
command_output_pipe command_output_pipe
command_close_pipe command_close_pipe
get_tz_offset
); );
use Git::SVN::Utils qw( use Git::SVN::Utils qw(
fatal fatal
@ -1311,14 +1311,6 @@ sub get_untracked {
\@out; \@out;
} }
sub get_tz {
# some systmes don't handle or mishandle %z, so be creative.
my $t = shift || time;
my $gm = timelocal(gmtime($t));
my $sign = qw( + + - )[ $t <=> $gm ];
return sprintf("%s%02d%02d", $sign, (gmtime(abs($t - $gm)))[2,1]);
}
# parse_svn_date(DATE) # parse_svn_date(DATE)
# -------------------- # --------------------
# Given a date (in UTC) from Subversion, return a string in the format # Given a date (in UTC) from Subversion, return a string in the format
@ -1351,7 +1343,7 @@ sub parse_svn_date {
delete $ENV{TZ}; delete $ENV{TZ};
} }
my $our_TZ = get_tz(); my $our_TZ = get_tz_offset();
# This converts $epoch_in_UTC into our local timezone. # This converts $epoch_in_UTC into our local timezone.
my ($sec, $min, $hour, $mday, $mon, $year, my ($sec, $min, $hour, $mday, $mon, $year,

View File

@ -2,7 +2,11 @@ package Git::SVN::Log;
use strict; use strict;
use warnings; use warnings;
use Git::SVN::Utils qw(fatal); use Git::SVN::Utils qw(fatal);
use Git qw(command command_oneline command_output_pipe command_close_pipe); use Git qw(command
command_oneline
command_output_pipe
command_close_pipe
get_tz_offset);
use POSIX qw/strftime/; use POSIX qw/strftime/;
use constant commit_log_separator => ('-' x 72) . "\n"; use constant commit_log_separator => ('-' x 72) . "\n";
use vars qw/$TZ $limit $color $pager $non_recursive $verbose $oneline use vars qw/$TZ $limit $color $pager $non_recursive $verbose $oneline
@ -119,7 +123,7 @@ sub run_pager {
sub format_svn_date { sub format_svn_date {
my $t = shift || time; my $t = shift || time;
require Git::SVN; require Git::SVN;
my $gmoff = Git::SVN::get_tz($t); my $gmoff = get_tz_offset($t);
return strftime("%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)", localtime($t)); return strftime("%Y-%m-%d %H:%M:%S $gmoff (%a, %d %b %Y)", localtime($t));
} }