@@ -1878,8 +1878,7 @@ sub cmt_sha2rev_batch {
1878
1878
1879
1879
sub working_head_info {
1880
1880
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/ ;
1883
1882
my ($fh , $ctx ) = command_output_pipe(@args , $head );
1884
1883
my $hash ;
1885
1884
my %max ;
@@ -2029,6 +2028,7 @@ package Git::SVN;
2029
2028
use File::Path qw/ mkpath/ ;
2030
2029
use File::Copy qw/ copy/ ;
2031
2030
use IPC::Open3;
2031
+ use Time::Local;
2032
2032
use Memoize; # core since 5.8.0, Jul 2002
2033
2033
use Memoize::Storable;
2034
2034
@@ -3287,6 +3287,14 @@ sub get_untracked {
3287
3287
\@out ;
3288
3288
}
3289
3289
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
+
3290
3298
# parse_svn_date(DATE)
3291
3299
# --------------------
3292
3300
# Given a date (in UTC) from Subversion, return a string in the format
@@ -3319,8 +3327,7 @@ sub parse_svn_date {
3319
3327
delete $ENV {TZ };
3320
3328
}
3321
3329
3322
- my $our_TZ =
3323
- POSIX::strftime(' %Z' , $S , $M , $H , $d , $m - 1, $Y - 1900);
3330
+ my $our_TZ = get_tz();
3324
3331
3325
3332
# This converts $epoch_in_UTC into our local timezone.
3326
3333
my ($sec , $min , $hour , $mday , $mon , $year ,
@@ -3920,7 +3927,7 @@ sub rebuild {
3920
3927
my ($base_rev , $head ) = ($partial ? $self -> rev_map_max_norebuild(1) :
3921
3928
(undef , undef ));
3922
3929
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/ ,
3924
3931
($head ? " $head .." : " " ) . $self -> refname,
3925
3932
' --' );
3926
3933
my $metadata_url = $self -> metadata_url;
@@ -5130,7 +5137,7 @@ sub rmdirs {
5130
5137
}
5131
5138
5132
5139
sub open_or_add_dir {
5133
- my ($self , $full_path , $baton ) = @_ ;
5140
+ my ($self , $full_path , $baton , $deletions ) = @_ ;
5134
5141
my $t = $self -> {types }-> {$full_path };
5135
5142
if (!defined $t ) {
5136
5143
die " $full_path not known in r$self ->{r} or we have a bug!\n " ;
@@ -5139,7 +5146,7 @@ sub open_or_add_dir {
5139
5146
no warnings ' once' ;
5140
5147
# SVN::Node::none and SVN::Node::file are used only once,
5141
5148
# 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 }) ) {
5143
5150
return $self -> add_directory($full_path , $baton ,
5144
5151
undef , -1, $self -> {pool });
5145
5152
} elsif ($t == $SVN::Node::dir ) {
@@ -5154,17 +5161,18 @@ sub open_or_add_dir {
5154
5161
}
5155
5162
5156
5163
sub ensure_path {
5157
- my ($self , $path ) = @_ ;
5164
+ my ($self , $path , $deletions ) = @_ ;
5158
5165
my $bat = $self -> {bat };
5159
5166
my $repo_path = $self -> repo_path($path );
5160
5167
return $bat -> {' ' } unless (length $repo_path );
5168
+
5161
5169
my @p = split m # /+# , $repo_path ;
5162
5170
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 );
5164
5172
while (@p ) {
5165
5173
my $c0 = $c ;
5166
5174
$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 );
5168
5176
}
5169
5177
return $bat -> {$c };
5170
5178
}
@@ -5221,9 +5229,9 @@ sub apply_autoprops {
5221
5229
}
5222
5230
5223
5231
sub A {
5224
- my ($self , $m ) = @_ ;
5232
+ my ($self , $m , $deletions ) = @_ ;
5225
5233
my ($dir , $file ) = split_path($m -> {file_b });
5226
- my $pbat = $self -> ensure_path($dir );
5234
+ my $pbat = $self -> ensure_path($dir , $deletions );
5227
5235
my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
5228
5236
undef , -1);
5229
5237
print " \t A\t $m ->{file_b}\n " unless $: :_q;
@@ -5233,9 +5241,9 @@ sub A {
5233
5241
}
5234
5242
5235
5243
sub C {
5236
- my ($self , $m ) = @_ ;
5244
+ my ($self , $m , $deletions ) = @_ ;
5237
5245
my ($dir , $file ) = split_path($m -> {file_b });
5238
- my $pbat = $self -> ensure_path($dir );
5246
+ my $pbat = $self -> ensure_path($dir , $deletions );
5239
5247
my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
5240
5248
$self -> url_path($m -> {file_a }), $self -> {r });
5241
5249
print " \t C\t $m ->{file_a} => $m ->{file_b}\n " unless $: :_q;
@@ -5252,9 +5260,9 @@ sub delete_entry {
5252
5260
}
5253
5261
5254
5262
sub R {
5255
- my ($self , $m ) = @_ ;
5263
+ my ($self , $m , $deletions ) = @_ ;
5256
5264
my ($dir , $file ) = split_path($m -> {file_b });
5257
- my $pbat = $self -> ensure_path($dir );
5265
+ my $pbat = $self -> ensure_path($dir , $deletions );
5258
5266
my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
5259
5267
$self -> url_path($m -> {file_a }), $self -> {r });
5260
5268
print " \t R\t $m ->{file_a} => $m ->{file_b}\n " unless $: :_q;
@@ -5263,14 +5271,14 @@ sub R {
5263
5271
$self -> close_file($fbat ,undef ,$self -> {pool });
5264
5272
5265
5273
($dir , $file ) = split_path($m -> {file_a });
5266
- $pbat = $self -> ensure_path($dir );
5274
+ $pbat = $self -> ensure_path($dir , $deletions );
5267
5275
$self -> delete_entry($m -> {file_a }, $pbat );
5268
5276
}
5269
5277
5270
5278
sub M {
5271
- my ($self , $m ) = @_ ;
5279
+ my ($self , $m , $deletions ) = @_ ;
5272
5280
my ($dir , $file ) = split_path($m -> {file_b });
5273
- my $pbat = $self -> ensure_path($dir );
5281
+ my $pbat = $self -> ensure_path($dir , $deletions );
5274
5282
my $fbat = $self -> open_file($self -> repo_path($m -> {file_b }),
5275
5283
$pbat ,$self -> {r },$self -> {pool });
5276
5284
print " \t $m ->{chg}\t $m ->{file_b}\n " unless $: :_q;
@@ -5340,9 +5348,9 @@ sub chg_file {
5340
5348
}
5341
5349
5342
5350
sub D {
5343
- my ($self , $m ) = @_ ;
5351
+ my ($self , $m , $deletions ) = @_ ;
5344
5352
my ($dir , $file ) = split_path($m -> {file_b });
5345
- my $pbat = $self -> ensure_path($dir );
5353
+ my $pbat = $self -> ensure_path($dir , $deletions );
5346
5354
print " \t D\t $m ->{file_b}\n " unless $: :_q;
5347
5355
$self -> delete_entry($m -> {file_b }, $pbat );
5348
5356
}
@@ -5374,11 +5382,19 @@ sub DESTROY {
5374
5382
sub apply_diff {
5375
5383
my ($self ) = @_ ;
5376
5384
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
+
5378
5394
foreach my $m (sort { $o {$a -> {chg }} <=> $o {$b -> {chg }} } @$mods ) {
5379
5395
my $f = $m -> {chg };
5380
5396
if (defined $o {$f }) {
5381
- $self -> $f ($m );
5397
+ $self -> $f ($m , \ %deletions );
5382
5398
} else {
5383
5399
fatal(" Invalid change type: $f " );
5384
5400
}
@@ -5994,7 +6010,6 @@ package Git::SVN::Log;
5994
6010
use strict;
5995
6011
use warnings;
5996
6012
use POSIX qw/ strftime/ ;
5997
- use Time::Local;
5998
6013
use constant commit_log_separator => (' -' x 72 ) . " \n " ;
5999
6014
use vars qw/ $TZ $limit $color $pager $non_recursive $verbose $oneline
6000
6015
%rusers $show_commit $incremental/ ;
@@ -6104,11 +6119,8 @@ sub run_pager {
6104
6119
}
6105
6120
6106
6121
sub format_svn_date {
6107
- # some systmes don't handle or mishandle %z, so be creative.
6108
6122
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 );
6112
6124
return strftime(" %Y -%m -%d %H :%M :%S $gmoff (%a , %d %b %Y )" , localtime ($t ));
6113
6125
}
6114
6126
0 commit comments