From 97f6987afaae239f7e3ae3944e0b29343b43a894 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Thu, 25 Jan 2007 11:53:13 -0800 Subject: [PATCH] git-svn: avoid tracking change-less revisions 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 --- git-svn.perl | 61 +++++++++++++++++++++----------------- t/t9100-git-svn-basic.sh | 2 -- t/t9107-git-svn-migrate.sh | 14 +++++---- 3 files changed, 42 insertions(+), 35 deletions(-) diff --git a/git-svn.perl b/git-svn.perl index a19afb83f..6ff3a8c5c 100755 --- a/git-svn.perl +++ b/git-svn.perl @@ -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; diff --git a/t/t9100-git-svn-basic.sh b/t/t9100-git-svn-basic.sh index 97798c4d0..5355243b9 100755 --- a/t/t9100-git-svn-basic.sh +++ b/t/t9100-git-svn-basic.sh @@ -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' " diff --git a/t/t9107-git-svn-migrate.sh b/t/t9107-git-svn-migrate.sh index 74a45ec64..f6d84ba7a 100755 --- a/t/t9107-git-svn-migrate.sh +++ b/t/t9107-git-svn-migrate.sh @@ -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 && -- 2.26.2