copy_dir becomes copy_path and handles both files and directories
The A (Add) and R (Replace) actions handling are unified. Signed-off-by: Yaacov Akiba Slama <ya@slamail.org> Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
c2c07a5c2a
commit
8168373fe7
@ -348,21 +348,42 @@ sub split_path($$) {
|
|||||||
return ($branch,$path);
|
return ($branch,$path);
|
||||||
}
|
}
|
||||||
|
|
||||||
sub copy_subdir($$$$$$) {
|
sub branch_rev($$) {
|
||||||
|
|
||||||
|
my ($srcbranch,$uptorev) = @_;
|
||||||
|
|
||||||
|
my $bbranches = $branches{$srcbranch};
|
||||||
|
my @revs = reverse sort { ($a eq 'LAST' ? 0 : $a) <=> ($b eq 'LAST' ? 0 : $b) } keys %$bbranches;
|
||||||
|
my $therev;
|
||||||
|
foreach my $arev(@revs) {
|
||||||
|
next if ($arev eq 'LAST');
|
||||||
|
if ($arev <= $uptorev) {
|
||||||
|
$therev = $arev;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $therev;
|
||||||
|
}
|
||||||
|
|
||||||
|
sub copy_path($$$$$$$) {
|
||||||
# Somebody copied a whole subdirectory.
|
# Somebody copied a whole subdirectory.
|
||||||
# We need to find the index entries from the old version which the
|
# We need to find the index entries from the old version which the
|
||||||
# SVN log entry points to, and add them to the new place.
|
# SVN log entry points to, and add them to the new place.
|
||||||
|
|
||||||
my($newrev,$newbranch,$path,$oldpath,$rev,$new) = @_;
|
my($newrev,$newbranch,$path,$oldpath,$rev,$node_kind,$new) = @_;
|
||||||
my($branch,$srcpath) = split_path($rev,$oldpath);
|
|
||||||
|
|
||||||
my $gitrev = $branches{$branch}{$rev};
|
my($srcbranch,$srcpath) = split_path($rev,$oldpath);
|
||||||
|
my $therev = branch_rev($srcbranch, $rev);
|
||||||
|
my $gitrev = $branches{$srcbranch}{$therev};
|
||||||
unless($gitrev) {
|
unless($gitrev) {
|
||||||
print STDERR "$newrev:$newbranch: could not find $oldpath \@ $rev\n";
|
print STDERR "$newrev:$newbranch: could not find $oldpath \@ $rev\n";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
print "$newrev:$newbranch:$path: copying from $branch:$srcpath @ $rev\n" if $opt_v;
|
print "$newrev:$newbranch:$path: copying from $srcbranch:$srcpath @ $rev\n" if $opt_v;
|
||||||
$srcpath =~ s#/*$#/#;
|
if ($node_kind eq $SVN::Node::dir) {
|
||||||
|
$srcpath =~ s#/*$#/#;
|
||||||
|
}
|
||||||
|
|
||||||
open my $f,"-|","git-ls-tree","-r","-z",$gitrev,$srcpath;
|
open my $f,"-|","git-ls-tree","-r","-z",$gitrev,$srcpath;
|
||||||
local $/ = "\0";
|
local $/ = "\0";
|
||||||
while(<$f>) {
|
while(<$f>) {
|
||||||
@ -370,9 +391,12 @@ sub copy_subdir($$$$$$) {
|
|||||||
my($m,$p) = split(/\t/,$_,2);
|
my($m,$p) = split(/\t/,$_,2);
|
||||||
my($mode,$type,$sha1) = split(/ /,$m);
|
my($mode,$type,$sha1) = split(/ /,$m);
|
||||||
next if $type ne "blob";
|
next if $type ne "blob";
|
||||||
$p = substr($p,length($srcpath)-1);
|
if ($node_kind eq $SVN::Node::dir) {
|
||||||
print "... found $path$p ...\n" if $opt_v;
|
$p = $path . substr($p,length($srcpath)-1);
|
||||||
push(@$new,[$mode,$sha1,$path.$p]);
|
} else {
|
||||||
|
$p = $path;
|
||||||
|
}
|
||||||
|
push(@$new,[$mode,$sha1,$p]);
|
||||||
}
|
}
|
||||||
close($f) or
|
close($f) or
|
||||||
print STDERR "$newrev:$newbranch: could not list files in $oldpath \@ $rev\n";
|
print STDERR "$newrev:$newbranch: could not list files in $oldpath \@ $rev\n";
|
||||||
@ -476,39 +500,31 @@ sub commit {
|
|||||||
foreach my $path(@paths) {
|
foreach my $path(@paths) {
|
||||||
my $action = $changed_paths->{$path};
|
my $action = $changed_paths->{$path};
|
||||||
|
|
||||||
if ($action->[0] eq "A") {
|
if ($action->[0] eq "R") {
|
||||||
my $f = get_file($revision,$branch,$path);
|
# refer to a file/tree in an earlier commit
|
||||||
if($f) {
|
push(@old,$path); # remove any old stuff
|
||||||
push(@new,$f) if $f;
|
}
|
||||||
} elsif($action->[1]) {
|
if(($action->[0] eq "A") || ($action->[0] eq "R")) {
|
||||||
copy_subdir($revision,$branch,$path,$action->[1],$action->[2],\@new);
|
my $node_kind = node_kind($branch,$path,$revision);
|
||||||
} else {
|
if($action->[1]) {
|
||||||
my $opath = $action->[3];
|
copy_path($revision,$branch,$path,$action->[1],$action->[2],$node_kind,\@new);
|
||||||
print STDERR "$revision: $branch: could not fetch '$opath'\n";
|
} elsif ($node_kind eq $SVN::Node::file) {
|
||||||
|
my $f = get_file($revision,$branch,$path);
|
||||||
|
if ($f) {
|
||||||
|
push(@new,$f) if $f;
|
||||||
|
} else {
|
||||||
|
my $opath = $action->[3];
|
||||||
|
print STDERR "$revision: $branch: could not fetch '$opath'\n";
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} elsif ($action->[0] eq "D") {
|
} elsif ($action->[0] eq "D") {
|
||||||
push(@old,$path);
|
push(@old,$path);
|
||||||
} elsif ($action->[0] eq "M") {
|
} elsif ($action->[0] eq "M") {
|
||||||
my $f = get_file($revision,$branch,$path);
|
my $node_kind = node_kind($branch,$path,$revision);
|
||||||
push(@new,$f) if $f;
|
if ($node_kind eq $SVN::Node::file) {
|
||||||
} elsif ($action->[0] eq "R") {
|
my $f = get_file($revision,$branch,$path);
|
||||||
# refer to a file/tree in an earlier commit
|
push(@new,$f) if $f;
|
||||||
push(@old,$path); # remove any old stuff
|
|
||||||
|
|
||||||
# ... and add any new stuff
|
|
||||||
my($b,$srcpath) = split_path($revision,$action->[1]);
|
|
||||||
$srcpath =~ s#/*$#/#;
|
|
||||||
open my $F,"-|","git-ls-tree","-r","-z", $branches{$b}{$action->[2]}, $srcpath;
|
|
||||||
local $/ = "\0";
|
|
||||||
while(<$F>) {
|
|
||||||
chomp;
|
|
||||||
my($m,$p) = split(/\t/,$_,2);
|
|
||||||
my($mode,$type,$sha1) = split(/ /,$m);
|
|
||||||
next if $type ne "blob";
|
|
||||||
$p = substr($p,length($srcpath)-1);
|
|
||||||
push(@new,[$mode,$sha1,$path.$p]);
|
|
||||||
}
|
}
|
||||||
close($F);
|
|
||||||
} else {
|
} else {
|
||||||
die "$revision: unknown action '".$action->[0]."' for $path\n";
|
die "$revision: unknown action '".$action->[0]."' for $path\n";
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user