mirror of
https://github.com/git/git
synced 2024-10-30 04:01:21 +00:00
git-svn: --follow-parent now works on sub-directories of larger branches
This means that tracking the path of: /another-larger/trunk/thunk/bump/thud inside a repository would follow: /larger-parent/trunk/thunk/bump/thud even if the svn log output looks like this: -------------------------------------------- Changed paths: A /another-larger (from /larger-parent:5) -------------------------------------------- Note: the usage of get_log() in git-svn still makes a an assumption that shouldn't be made with regard to revisions existing for a particular path. Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:
parent
e6434f8760
commit
7f578c55af
2 changed files with 40 additions and 8 deletions
31
git-svn.perl
31
git-svn.perl
|
@ -1102,9 +1102,21 @@ sub find_parent_branch {
|
||||||
return undef unless $::_follow_parent;
|
return undef unless $::_follow_parent;
|
||||||
|
|
||||||
# look for a parent from another branch:
|
# look for a parent from another branch:
|
||||||
my $abs_path = '/'.$self->rel_path;
|
my @b_path_components = split m#/#, $self->rel_path;
|
||||||
my $i = $paths->{$abs_path} or goto not_found;
|
my @a_path_components;
|
||||||
|
my $i;
|
||||||
|
while (@b_path_components) {
|
||||||
|
$i = $paths->{'/'.join('/', @b_path_components)};
|
||||||
|
last if $i;
|
||||||
|
unshift(@a_path_components, pop(@b_path_components));
|
||||||
|
}
|
||||||
|
goto not_found unless defined $i;
|
||||||
my $branch_from = $i->copyfrom_path or goto not_found;
|
my $branch_from = $i->copyfrom_path or goto not_found;
|
||||||
|
if (@a_path_components) {
|
||||||
|
print STDERR "branch_from: $branch_from => ";
|
||||||
|
$branch_from .= '/'.join('/', @a_path_components);
|
||||||
|
print STDERR $branch_from, "\n";
|
||||||
|
}
|
||||||
my $r = $i->copyfrom_rev;
|
my $r = $i->copyfrom_rev;
|
||||||
my $repos_root = $self->ra->{repos_root};
|
my $repos_root = $self->ra->{repos_root};
|
||||||
my $url = $self->ra->{url};
|
my $url = $self->ra->{url};
|
||||||
|
@ -1134,10 +1146,11 @@ sub find_parent_branch {
|
||||||
}
|
}
|
||||||
my ($r0, $parent) = $gs->find_rev_before($r, 1);
|
my ($r0, $parent) = $gs->find_rev_before($r, 1);
|
||||||
if ($::_follow_parent && (!defined $r0 || !defined $parent)) {
|
if ($::_follow_parent && (!defined $r0 || !defined $parent)) {
|
||||||
foreach (0 .. $r) {
|
$gs->ra->get_log([$gs->{path}], 0, $r, 0, 1, 1, sub {
|
||||||
my $log_entry = eval { $gs->do_fetch(undef, $_) };
|
my ($paths, $rev) = @_;
|
||||||
|
my $log_entry = eval { $gs->do_fetch($paths, $rev) };
|
||||||
$gs->do_git_commit($log_entry) if $log_entry;
|
$gs->do_git_commit($log_entry) if $log_entry;
|
||||||
}
|
});
|
||||||
($r0, $parent) = $gs->last_rev_commit;
|
($r0, $parent) = $gs->last_rev_commit;
|
||||||
}
|
}
|
||||||
if (defined $r0 && defined $parent && $gs->revisions_eq($r0, $r)) {
|
if (defined $r0 && defined $parent && $gs->revisions_eq($r0, $r)) {
|
||||||
|
@ -1164,10 +1177,12 @@ sub find_parent_branch {
|
||||||
return $self->make_log_entry($rev, [$parent], $ed);
|
return $self->make_log_entry($rev, [$parent], $ed);
|
||||||
}
|
}
|
||||||
not_found:
|
not_found:
|
||||||
print STDERR "Branch parent for path: '$abs_path' not found\n";
|
print STDERR "Branch parent for path: '/",
|
||||||
|
$self->rel_path, "' not found\n";
|
||||||
return undef unless $paths;
|
return undef unless $paths;
|
||||||
foreach my $p (sort keys %$paths) {
|
foreach my $x (sort keys %$paths) {
|
||||||
print STDERR ' ', $p->action, ' ', $p;
|
my $p = $paths->{$x};
|
||||||
|
print STDERR ' ', $p->action, ' ', $x;
|
||||||
if (my $cp_from = $p->copyfrom_path) {
|
if (my $cp_from = $p->copyfrom_path) {
|
||||||
print STDERR "(from $cp_from:", $p->copyfrom_rev, ')';
|
print STDERR "(from $cp_from:", $p->copyfrom_rev, ')';
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,6 +61,23 @@ test_expect_success 'follow deleted parent' "
|
||||||
= \"\`git rev-parse svn/trunk\`\"
|
= \"\`git rev-parse svn/trunk\`\"
|
||||||
"
|
"
|
||||||
|
|
||||||
|
test_expect_success 'follow larger parent' "
|
||||||
|
mkdir -p import/trunk/thunk/bump/thud &&
|
||||||
|
echo hi > import/trunk/thunk/bump/thud/file &&
|
||||||
|
svn import -m 'import a larger parent' import $svnrepo/larger-parent &&
|
||||||
|
svn cp -m 'hi' $svnrepo/larger-parent $svnrepo/another-larger &&
|
||||||
|
git-svn init -i larger $svnrepo/another-larger/trunk/thunk/bump/thud &&
|
||||||
|
git-svn fetch -i larger --follow-parent &&
|
||||||
|
git-rev-parse --verify refs/remotes/larger &&
|
||||||
|
git-rev-parse --verify \
|
||||||
|
refs/remotes/larger-parent/trunk/thunk/bump/thud &&
|
||||||
|
test \"\`git-merge-base \
|
||||||
|
refs/remotes/larger-parent/trunk/thunk/bump/thud \
|
||||||
|
refs/remotes/larger\`\" = \
|
||||||
|
\"\`git-rev-parse refs/remotes/larger\`\"
|
||||||
|
true
|
||||||
|
"
|
||||||
|
|
||||||
test_debug 'gitk --all &'
|
test_debug 'gitk --all &'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
|
Loading…
Reference in a new issue