From 289370578ca5833641fbb59813173ac6db1986d1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Tue, 30 Jan 2007 00:35:18 -0800 Subject: [PATCH] git-svn: fetch tracks initial change with --follow-parent We were still skipping path information from get_log if we are tracking /r9270/drunk/subversion/bindings/..., but got something like this in the log: A /r9270/drunk (from /r9270/trunk:14) Signed-off-by: Eric Wong --- git-svn.perl | 17 ++++++++++++++--- t/t9104-git-svn-follow-parent.sh | 14 +++++++++++++- 2 files changed, 27 insertions(+), 4 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index 4e357dfce..b0248c948 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -1090,6 +1090,19 @@ sub revisions_eq { return 1; } +sub match_paths { + my ($self, $paths) = @_; + return 1 if $paths->{'/'}; + $self->{path_regex} ||= qr/^\/\Q$self->{path}\E\/?/; + grep /$self->{path_regex}/, keys %$paths and return 1; + my $c = ''; + foreach (split m#/#, $self->rel_path) { + $c .= "/$_"; + return 1 if $paths->{$c}; + } + return 0; +} + sub find_parent_branch { my ($self, $paths, $rev) = @_; return undef unless $::_follow_parent; @@ -2313,7 +2326,6 @@ sub gs_fetch_loop_common { if (my $last_commit = $gs->last_commit) { $gs->assert_index_clean($last_commit); } - $gs->{path_regex} = qr/^\/\Q$gs->{path}\E\/?/; } while (1) { my @revs; @@ -2339,8 +2351,7 @@ sub gs_fetch_loop_common { my ($paths, $r) = @$_; foreach my $gs (@gs) { if ($paths) { - grep /$gs->{path_regex}/, keys %$paths - or next; + $gs->match_paths($paths) or next; } next if defined $gs->rev_db_get($r); if (my $log_entry = $gs->do_fetch($paths, $r)) { diff --git a/t/t9104-git-svn-follow-parent.sh b/t/t9104-git-svn-follow-parent.sh index 0f4e73627..dcec16bda 100755 --- a/t/t9104-git-svn-follow-parent.sh +++ b/t/t9104-git-svn-follow-parent.sh @@ -105,7 +105,7 @@ test_expect_success 'follow deleted directory' " # ref: r9270 of the Subversion repository: (http://svn.collab.net/repos/svn) # in trunk/subversion/bindings/swig/perl -test_expect_success '' " +test_expect_success 'follow-parent avoids deleting relevant info' " mkdir -p import/trunk/subversion/bindings/swig/perl/t && for i in a b c ; do \ echo \$i > import/trunk/subversion/bindings/swig/perl/\$i.pm && @@ -134,6 +134,18 @@ test_expect_success '' " \"\`git ls-tree --name-only r9270-t\`\" " +test_expect_success "track initial change if it was only made to parent" " + svn cp -m 'wheee!' $svnrepo/r9270/trunk $svnrepo/r9270/drunk && + git-svn init -i r9270-d \ + $svnrepo/r9270/drunk/subversion/bindings/swig/perl/native/t && + git-svn fetch -i r9270-d --follow-parent && + test \`git rev-list r9270-d | wc -l\` -eq 3 && + test \"\`git ls-tree --name-only r9270-t\`\" = \ + \"\`git ls-tree --name-only r9270-d\`\" && + test \"\`git rev-parse r9270-t\`\" = \ + \"\`git rev-parse r9270-d~1\`\" + " + test_debug 'gitk --all &' test_done -- 2.30.2