@@ -5137,7 +5137,7 @@ sub rmdirs {
5137
5137
}
5138
5138
5139
5139
sub open_or_add_dir {
5140
- my ($self , $full_path , $baton ) = @_ ;
5140
+ my ($self , $full_path , $baton , $deletions ) = @_ ;
5141
5141
my $t = $self -> {types }-> {$full_path };
5142
5142
if (!defined $t ) {
5143
5143
die " $full_path not known in r$self ->{r} or we have a bug!\n " ;
@@ -5146,7 +5146,7 @@ sub open_or_add_dir {
5146
5146
no warnings ' once' ;
5147
5147
# SVN::Node::none and SVN::Node::file are used only once,
5148
5148
# so we're shutting up Perl's warnings about them.
5149
- if ($t == $SVN::Node::none ) {
5149
+ if ($t == $SVN::Node::none || defined ( $deletions -> { $full_path }) ) {
5150
5150
return $self -> add_directory($full_path , $baton ,
5151
5151
undef , -1, $self -> {pool });
5152
5152
} elsif ($t == $SVN::Node::dir ) {
@@ -5161,17 +5161,18 @@ sub open_or_add_dir {
5161
5161
}
5162
5162
5163
5163
sub ensure_path {
5164
- my ($self , $path ) = @_ ;
5164
+ my ($self , $path , $deletions ) = @_ ;
5165
5165
my $bat = $self -> {bat };
5166
5166
my $repo_path = $self -> repo_path($path );
5167
5167
return $bat -> {' ' } unless (length $repo_path );
5168
+
5168
5169
my @p = split m # /+# , $repo_path ;
5169
5170
my $c = shift @p ;
5170
- $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {' ' });
5171
+ $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {' ' }, $deletions );
5171
5172
while (@p ) {
5172
5173
my $c0 = $c ;
5173
5174
$c .= ' /' . shift @p ;
5174
- $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {$c0 });
5175
+ $bat -> {$c } ||= $self -> open_or_add_dir($c , $bat -> {$c0 }, $deletions );
5175
5176
}
5176
5177
return $bat -> {$c };
5177
5178
}
@@ -5228,9 +5229,9 @@ sub apply_autoprops {
5228
5229
}
5229
5230
5230
5231
sub A {
5231
- my ($self , $m ) = @_ ;
5232
+ my ($self , $m , $deletions ) = @_ ;
5232
5233
my ($dir , $file ) = split_path($m -> {file_b });
5233
- my $pbat = $self -> ensure_path($dir );
5234
+ my $pbat = $self -> ensure_path($dir , $deletions );
5234
5235
my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
5235
5236
undef , -1);
5236
5237
print " \t A\t $m ->{file_b}\n " unless $: :_q;
@@ -5240,9 +5241,9 @@ sub A {
5240
5241
}
5241
5242
5242
5243
sub C {
5243
- my ($self , $m ) = @_ ;
5244
+ my ($self , $m , $deletions ) = @_ ;
5244
5245
my ($dir , $file ) = split_path($m -> {file_b });
5245
- my $pbat = $self -> ensure_path($dir );
5246
+ my $pbat = $self -> ensure_path($dir , $deletions );
5246
5247
my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
5247
5248
$self -> url_path($m -> {file_a }), $self -> {r });
5248
5249
print " \t C\t $m ->{file_a} => $m ->{file_b}\n " unless $: :_q;
@@ -5259,9 +5260,9 @@ sub delete_entry {
5259
5260
}
5260
5261
5261
5262
sub R {
5262
- my ($self , $m ) = @_ ;
5263
+ my ($self , $m , $deletions ) = @_ ;
5263
5264
my ($dir , $file ) = split_path($m -> {file_b });
5264
- my $pbat = $self -> ensure_path($dir );
5265
+ my $pbat = $self -> ensure_path($dir , $deletions );
5265
5266
my $fbat = $self -> add_file($self -> repo_path($m -> {file_b }), $pbat ,
5266
5267
$self -> url_path($m -> {file_a }), $self -> {r });
5267
5268
print " \t R\t $m ->{file_a} => $m ->{file_b}\n " unless $: :_q;
@@ -5270,14 +5271,14 @@ sub R {
5270
5271
$self -> close_file($fbat ,undef ,$self -> {pool });
5271
5272
5272
5273
($dir , $file ) = split_path($m -> {file_a });
5273
- $pbat = $self -> ensure_path($dir );
5274
+ $pbat = $self -> ensure_path($dir , $deletions );
5274
5275
$self -> delete_entry($m -> {file_a }, $pbat );
5275
5276
}
5276
5277
5277
5278
sub M {
5278
- my ($self , $m ) = @_ ;
5279
+ my ($self , $m , $deletions ) = @_ ;
5279
5280
my ($dir , $file ) = split_path($m -> {file_b });
5280
- my $pbat = $self -> ensure_path($dir );
5281
+ my $pbat = $self -> ensure_path($dir , $deletions );
5281
5282
my $fbat = $self -> open_file($self -> repo_path($m -> {file_b }),
5282
5283
$pbat ,$self -> {r },$self -> {pool });
5283
5284
print " \t $m ->{chg}\t $m ->{file_b}\n " unless $: :_q;
@@ -5347,9 +5348,9 @@ sub chg_file {
5347
5348
}
5348
5349
5349
5350
sub D {
5350
- my ($self , $m ) = @_ ;
5351
+ my ($self , $m , $deletions ) = @_ ;
5351
5352
my ($dir , $file ) = split_path($m -> {file_b });
5352
- my $pbat = $self -> ensure_path($dir );
5353
+ my $pbat = $self -> ensure_path($dir , $deletions );
5353
5354
print " \t D\t $m ->{file_b}\n " unless $: :_q;
5354
5355
$self -> delete_entry($m -> {file_b }, $pbat );
5355
5356
}
@@ -5382,10 +5383,18 @@ sub apply_diff {
5382
5383
my ($self ) = @_ ;
5383
5384
my $mods = $self -> {mods };
5384
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
+
5385
5394
foreach my $m (sort { $o {$a -> {chg }} <=> $o {$b -> {chg }} } @$mods ) {
5386
5395
my $f = $m -> {chg };
5387
5396
if (defined $o {$f }) {
5388
- $self -> $f ($m );
5397
+ $self -> $f ($m , \ %deletions );
5389
5398
} else {
5390
5399
fatal(" Invalid change type: $f " );
5391
5400
}
0 commit comments