@@ -1878,8 +1878,7 @@ sub cmt_sha2rev_batch {
18781878
18791879sub working_head_info {
18801880 my ($head , $refs ) = @_ ;
1881- my @args = qw/ log --no-color --no-decorate --first-parent
1882- --pretty=medium/ ;
1881+ my @args = qw/ rev-list --first-parent --pretty=medium/ ;
18831882 my ($fh , $ctx ) = command_output_pipe(@args , $head );
18841883 my $hash ;
18851884 my %max ;
@@ -2029,6 +2028,7 @@ package Git::SVN;
20292028use File::Path qw/ mkpath/ ;
20302029use File::Copy qw/ copy/ ;
20312030use IPC::Open3;
2031+ use Time::Local;
20322032use Memoize; # core since 5.8.0, Jul 2002
20332033use Memoize::Storable;
20342034
@@ -3287,6 +3287,14 @@ sub get_untracked {
32873287 \@out ;
32883288}
32893289
3290+ sub get_tz {
3291+ # some systmes don't handle or mishandle %z, so be creative.
3292+ my $t = shift || time ;
3293+ my $gm = timelocal(gmtime ($t ));
3294+ my $sign = qw( + + - ) [ $t <=> $gm ];
3295+ return sprintf (" %s %02d%02d" , $sign , (gmtime (abs($t - $gm )))[2,1]);
3296+ }
3297+
32903298# parse_svn_date(DATE)
32913299# --------------------
32923300# Given a date (in UTC) from Subversion, return a string in the format
@@ -3319,8 +3327,7 @@ sub parse_svn_date {
33193327 delete $ENV {TZ };
33203328 }
33213329
3322- my $our_TZ =
3323- POSIX::strftime(' %Z' , $S , $M , $H , $d , $m - 1, $Y - 1900);
3330+ my $our_TZ = get_tz();
33243331
33253332 # This converts $epoch_in_UTC into our local timezone.
33263333 my ($sec , $min , $hour , $mday , $mon , $year ,
@@ -3920,7 +3927,7 @@ sub rebuild {
39203927 my ($base_rev , $head ) = ($partial ? $self -> rev_map_max_norebuild(1) :
39213928 (undef , undef ));
39223929 my ($log , $ctx ) =
3923- command_output_pipe(qw/ rev-list --pretty=raw --no-color -- reverse/ ,
3930+ command_output_pipe(qw/ rev-list --pretty=raw --reverse/ ,
39243931 ($head ? " $head .." : " " ) . $self -> refname,
39253932 ' --' );
39263933 my $metadata_url = $self -> metadata_url;
@@ -5130,7 +5137,7 @@ sub rmdirs {
51305137}
51315138
51325139sub open_or_add_dir {
5133- my ($self , $full_path , $baton ) = @_ ;
5140+ my ($self , $full_path , $baton , $deletions ) = @_ ;
51345141 my $t = $self -> {types }-> {$full_path };
51355142 if (!defined $t ) {
51365143 die " $full_path not known in r$self ->{r} or we have a bug!\n " ;
@@ -5139,7 +5146,7 @@ sub open_or_add_dir {
51395146 no warnings ' once' ;
51405147 # SVN::Node::none and SVN::Node::file are used only once,
51415148 # so we're shutting up Perl's warnings about them.
5142- if ($t == $SVN::Node::none ) {
5149+ if ($t == $SVN::Node::none || defined ( $deletions -> { $full_path }) ) {
51435150 return $self -> add_directory($full_path , $baton ,
51445151 undef , -1, $self -> {pool });
51455152 } elsif ($t == $SVN::Node::dir ) {
@@ -5154,17 +5161,18 @@ sub open_or_add_dir {
51545161}
51555162
51565163sub ensure_path {
5157- my ($self , $path ) = @_ ;
5164+ my ($self , $path , $deletions ) = @_ ;
51585165 my $bat = $self -> {bat };
51595166 my $repo_path = $self -> repo_path($path );
51605167 return $bat -> {' ' } unless (length $repo_path );
5168+
51615169 my @p = split m # /+# , $repo_path ;
51625170 my $c = shift @p ;
5163- $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {' ' });
5171+ $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {' ' }, $deletions );
51645172 while (@p ) {
51655173 my $c0 = $c ;
51665174 $c .= ' /' . shift @p ;
5167- $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {$c0 });
5175+ $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {$c0 }, $deletions );
51685176 }
51695177 return $bat -> {$c };
51705178}
@@ -5221,9 +5229,9 @@ sub apply_autoprops {
52215229}
52225230
52235231sub A {
5224- my ($self , $m ) = @_ ;
5232+ my ($self , $m , $deletions ) = @_ ;
52255233 my ($dir , $file ) = split_path($m -> {file_b });
5226- my $pbat = $self -> ensure_path($dir );
5234+ my $pbat = $self -> ensure_path($dir , $deletions );
52275235 my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
52285236 undef , -1);
52295237 print " \t A\t $m ->{file_b}\n " unless $: :_q;
@@ -5233,9 +5241,9 @@ sub A {
52335241}
52345242
52355243sub C {
5236- my ($self , $m ) = @_ ;
5244+ my ($self , $m , $deletions ) = @_ ;
52375245 my ($dir , $file ) = split_path($m -> {file_b });
5238- my $pbat = $self -> ensure_path($dir );
5246+ my $pbat = $self -> ensure_path($dir , $deletions );
52395247 my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
52405248 $self -> url_path($m -> {file_a }), $self -> {r });
52415249 print " \t C\t $m ->{file_a} => $m ->{file_b}\n " unless $: :_q;
@@ -5252,9 +5260,9 @@ sub delete_entry {
52525260}
52535261
52545262sub R {
5255- my ($self , $m ) = @_ ;
5263+ my ($self , $m , $deletions ) = @_ ;
52565264 my ($dir , $file ) = split_path($m -> {file_b });
5257- my $pbat = $self -> ensure_path($dir );
5265+ my $pbat = $self -> ensure_path($dir , $deletions );
52585266 my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
52595267 $self -> url_path($m -> {file_a }), $self -> {r });
52605268 print " \t R\t $m ->{file_a} => $m ->{file_b}\n " unless $: :_q;
@@ -5263,14 +5271,14 @@ sub R {
52635271 $self -> close_file($fbat ,undef ,$self -> {pool });
52645272
52655273 ($dir , $file ) = split_path($m -> {file_a });
5266- $pbat = $self -> ensure_path($dir );
5274+ $pbat = $self -> ensure_path($dir , $deletions );
52675275 $self -> delete_entry($m -> {file_a }, $pbat );
52685276}
52695277
52705278sub M {
5271- my ($self , $m ) = @_ ;
5279+ my ($self , $m , $deletions ) = @_ ;
52725280 my ($dir , $file ) = split_path($m -> {file_b });
5273- my $pbat = $self -> ensure_path($dir );
5281+ my $pbat = $self -> ensure_path($dir , $deletions );
52745282 my $fbat = $self -> open_file($self -> repo_path($m -> {file_b }),
52755283 $pbat ,$self -> {r },$self -> {pool });
52765284 print " \t $m ->{chg}\t $m ->{file_b}\n " unless $: :_q;
@@ -5340,9 +5348,9 @@ sub chg_file {
53405348}
53415349
53425350sub D {
5343- my ($self , $m ) = @_ ;
5351+ my ($self , $m , $deletions ) = @_ ;
53445352 my ($dir , $file ) = split_path($m -> {file_b });
5345- my $pbat = $self -> ensure_path($dir );
5353+ my $pbat = $self -> ensure_path($dir , $deletions );
53465354 print " \t D\t $m ->{file_b}\n " unless $: :_q;
53475355 $self -> delete_entry($m -> {file_b }, $pbat );
53485356}
@@ -5374,11 +5382,19 @@ sub DESTROY {
53745382sub apply_diff {
53755383 my ($self ) = @_ ;
53765384 my $mods = $self -> {mods };
5377- my %o = ( D => 1, R => 0, C => -1, A => 3, M => 3, T => 3 );
5385+ my %o = ( D => 0, C => 1, R => 2, A => 3, M => 4, T => 5 );
5386+ my %deletions ;
5387+
5388+ foreach my $m (@$mods ) {
5389+ if ($m -> {chg } eq " D" ) {
5390+ $deletions {$m -> {file_b }} = 1;
5391+ }
5392+ }
5393+
53785394 foreach my $m (sort { $o {$a -> {chg }} <=> $o {$b -> {chg }} } @$mods ) {
53795395 my $f = $m -> {chg };
53805396 if (defined $o {$f }) {
5381- $self -> $f ($m );
5397+ $self -> $f ($m , \ %deletions );
53825398 } else {
53835399 fatal(" Invalid change type: $f " );
53845400 }
@@ -5994,7 +6010,6 @@ package Git::SVN::Log;
59946010use strict;
59956011use warnings;
59966012use POSIX qw/ strftime/ ;
5997- use Time::Local;
59986013use constant commit_log_separator => (' -' x 72 ) . " \n " ;
59996014use vars qw/ $TZ $limit $color $pager $non_recursive $verbose $oneline
60006015 %rusers $show_commit $incremental/ ;
@@ -6104,11 +6119,8 @@ sub run_pager {
61046119}
61056120
61066121sub format_svn_date {
6107- # some systmes don't handle or mishandle %z, so be creative.
61086122 my $t = shift || time ;
6109- my $gm = timelocal(gmtime ($t ));
6110- my $sign = qw( + + - ) [ $t <=> $gm ];
6111- my $gmoff = sprintf (" %s %02d%02d" , $sign , (gmtime (abs($t - $gm )))[2,1]);
6123+ my $gmoff = Git::SVN::get_tz($t );
61126124 return strftime(" %Y -%m -%d %H :%M :%S $gmoff (%a , %d %b %Y )" , localtime ($t ));
61136125}
61146126
0 commit comments