git-svn: fetch tracks initial change with --follow-parent
authorEric Wong <normalperson@yhbt.net>
Tue, 30 Jan 2007 08:35:18 +0000 (00:35 -0800)
committerEric Wong <normalperson@yhbt.net>
Fri, 23 Feb 2007 08:57:10 +0000 (00:57 -0800)
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 <normalperson@yhbt.net>
git-svn.perl
t/t9104-git-svn-follow-parent.sh

index 4e357dfcef8bdec39932d565d77e271bbb97b979..b0248c94878d271a455ca25b44d092862c6a658c 100755 (executable)
@@ -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)) {
index 0f4e7362714b548cf67339f2cc4711da4d1c3b6f..dcec16bda236ecad6c8c3bfa2679615d5f6e3fc7 100755 (executable)
@@ -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