git-svn: avoid tracking change-less revisions
authorEric Wong <normalperson@yhbt.net>
Thu, 25 Jan 2007 19:53:13 +0000 (11:53 -0800)
committerEric Wong <normalperson@yhbt.net>
Fri, 23 Feb 2007 08:57:10 +0000 (00:57 -0800)
They simply aren't interesting to track, and this will allow
us to avoid get_log().

Since r0 is covered by this, we need to update the tests to not
rely on r0 (which is always empty).

Signed-off-by: Eric Wong <normalperson@yhbt.net>
git-svn.perl
t/t9100-git-svn-basic.sh
t/t9107-git-svn-migrate.sh

index a19afb83fbb9e7424cf6783dd1665d19f8c79f6b..6ff3a8c5c56fc03a2b9851981bf174cb67bdc95c 100755 (executable)
@@ -315,7 +315,7 @@ sub cmd_set_tree {
        my $gs = Git::SVN->new;
        my ($r_last, $cmt_last) = $gs->last_rev_commit;
        $gs->fetch;
-       if ($r_last != $gs->{last_rev}) {
+       if (defined $gs->{last_rev} && $r_last != $gs->{last_rev}) {
                fatal "There are new revisions that were fetched ",
                      "and need to be merged (or acknowledged) ",
                      "before committing.\nlast rev: $r_last\n",
@@ -1214,50 +1214,46 @@ sub do_fetch {
        $self->make_log_entry($rev, \@parents, $ed);
 }
 
-sub write_untracked {
-       my ($self, $rev, $fh, $untracked) = @_;
-       my $h;
-       print $fh "r$rev\n" or croak $!;
-       $h = $untracked->{empty};
+sub get_untracked {
+       my ($self, $ed) = @_;
+       my @out;
+       my $h = $ed->{empty};
        foreach (sort keys %$h) {
                my $act = $h->{$_} ? '+empty_dir' : '-empty_dir';
-               print $fh "  $act: ", uri_encode($_), "\n" or croak $!;
+               push @out, "  $act: " . uri_encode($_);
                warn "W: $act: $_\n";
        }
        foreach my $t (qw/dir_prop file_prop/) {
-               $h = $untracked->{$t} or next;
+               $h = $ed->{$t} or next;
                foreach my $path (sort keys %$h) {
                        my $ppath = $path eq '' ? '.' : $path;
                        foreach my $prop (sort keys %{$h->{$path}}) {
                                next if $SKIP_PROP{$prop};
                                my $v = $h->{$path}->{$prop};
+                               my $t_ppath_prop = "$t: " .
+                                                   uri_encode($ppath) . ' ' .
+                                                   uri_encode($prop);
                                if (defined $v) {
-                                       print $fh "  +$t: ",
-                                                 uri_encode($ppath), ' ',
-                                                 uri_encode($prop), ' ',
-                                                 uri_encode($v), "\n"
-                                                 or croak $!;
+                                       push @out, "  +$t_ppath_prop " .
+                                                  uri_encode($v);
                                } else {
-                                       print $fh "  -$t: ",
-                                                 uri_encode($ppath), ' ',
-                                                 uri_encode($prop), "\n"
-                                                 or croak $!;
+                                       push @out, "  -$t_ppath_prop";
                                }
                        }
                }
        }
        foreach my $t (qw/absent_file absent_directory/) {
-               $h = $untracked->{$t} or next;
+               $h = $ed->{$t} or next;
                foreach my $parent (sort keys %$h) {
                        foreach my $path (sort @{$h->{$parent}}) {
-                               print $fh "  $t: ",
-                                     uri_encode("$parent/$path"), "\n"
-                                     or croak $!;
+                               push @out, "  $t: " .
+                                          uri_encode("$parent/$path");
                                warn "W: $t: $parent/$path ",
                                     "Insufficient permissions?\n";
                        }
                }
        }
+       \@out;
 }
 
 sub parse_svn_date {
@@ -1280,12 +1276,15 @@ sub check_author {
 }
 
 sub make_log_entry {
-       my ($self, $rev, $parents, $untracked) = @_;
-       my $rp = $self->ra->rev_proplist($rev);
-       my %log_entry = ( parents => $parents || [], revision => $rev,
-                         revprops => $rp, log => '');
+       my ($self, $rev, $parents, $ed) = @_;
+       my $untracked = $self->get_untracked($ed);
+
        open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!;
-       $self->write_untracked($rev, $un, $untracked);
+       print $un "r$rev\n" or croak $!;
+       print $un $_, "\n" foreach @$untracked;
+       my %log_entry = ( parents => $parents || [], revision => $rev,
+                         log => '');
+       my $rp = $self->ra->rev_proplist($rev);
        foreach (sort keys %$rp) {
                my $v = $rp->{$_};
                if (/^svn:(author|date|log)$/) {
@@ -1296,6 +1295,11 @@ sub make_log_entry {
                }
        }
        close $un or croak $!;
+
+       delete $rp->{'svn:date'}; # this is the only revprop for r0
+       return undef if ($ed->{nr} == 0 && scalar @$untracked == 0 &&
+                        scalar keys %$rp == 0);
+
        $log_entry{date} = parse_svn_date($log_entry{date});
        $log_entry{author} = check_author($log_entry{author});
        $log_entry{log} .= "\n";
@@ -1320,8 +1324,9 @@ sub fetch {
                        my ($paths, $rev, $author, $date, $log) = @_;
                        push @revs, [ $paths, $rev ] });
                foreach (@revs) {
-                       my $log_entry = $self->do_fetch(@$_);
-                       $self->do_git_commit($log_entry, @parents);
+                       if (my $log_entry = $self->do_fetch(@$_)) {
+                               $self->do_git_commit($log_entry, @parents);
+                       }
                }
                last if $max >= $head;
                $min = $max + 1;
index 97798c4d0708e6bbf1ad363e6f8d29a3fe77ae2b..5355243b926cf6963db029b020de641e857d7641 100755 (executable)
@@ -211,8 +211,6 @@ tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
 tree 8f51f74cf0163afc9ad68a4b1537288c4558b5a4
 EOF
 
-echo tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 >> expected
-
 test_expect_success "$name" "diff -u a expected"
 
 test_expect_failure 'exit if remote refs are ambigious' "
index 74a45ec6478012eb9172bc7700fc1abd997a8ac2..f6d84ba7a5109f6fb3d88f789d75ed7448140a40 100755 (executable)
@@ -5,13 +5,17 @@ test_description='git-svn metadata migrations from previous versions'
 
 test_expect_success 'setup old-looking metadata' "
        cp $GIT_DIR/config $GIT_DIR/config-old-git-svn &&
+       mkdir import &&
+       cd import
+               for i in trunk branches/a branches/b \
+                        tags/0.1 tags/0.2 tags/0.3; do
+                       mkdir -p \$i && \
+                       echo hello >> \$i/README || exit 1
+               done && \
+               svn import -m test . $svnrepo
+               cd .. &&
        git-svn init $svnrepo &&
        git-svn fetch &&
-       for i in trunk branches/a branches/b tags/0.1 tags/0.2 tags/0.3; do
-               mkdir -p \$i && echo hello >> \$i/README || exit 1; done &&
-       git ls-files -o trunk branches tags | git update-index --add --stdin &&
-       git commit -m 'test' &&
-       git-svn dcommit &&
        mv $GIT_DIR/svn/* $GIT_DIR/ &&
        rmdir $GIT_DIR/svn &&
        git-update-ref refs/heads/git-svn-HEAD refs/remotes/git-svn &&