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 <normalperson@yhbt.net>
This commit is contained in:
Eric Wong 2007-01-25 11:53:13 -08:00
parent 1492b4245a
commit 97f6987afa
3 changed files with 42 additions and 35 deletions

View File

@ -315,7 +315,7 @@ sub cmd_set_tree {
my $gs = Git::SVN->new; my $gs = Git::SVN->new;
my ($r_last, $cmt_last) = $gs->last_rev_commit; my ($r_last, $cmt_last) = $gs->last_rev_commit;
$gs->fetch; $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 ", fatal "There are new revisions that were fetched ",
"and need to be merged (or acknowledged) ", "and need to be merged (or acknowledged) ",
"before committing.\nlast rev: $r_last\n", "before committing.\nlast rev: $r_last\n",
@ -1214,50 +1214,46 @@ sub do_fetch {
$self->make_log_entry($rev, \@parents, $ed); $self->make_log_entry($rev, \@parents, $ed);
} }
sub write_untracked { sub get_untracked {
my ($self, $rev, $fh, $untracked) = @_; my ($self, $ed) = @_;
my $h; my @out;
print $fh "r$rev\n" or croak $!; my $h = $ed->{empty};
$h = $untracked->{empty};
foreach (sort keys %$h) { foreach (sort keys %$h) {
my $act = $h->{$_} ? '+empty_dir' : '-empty_dir'; my $act = $h->{$_} ? '+empty_dir' : '-empty_dir';
print $fh " $act: ", uri_encode($_), "\n" or croak $!; push @out, " $act: " . uri_encode($_);
warn "W: $act: $_\n"; warn "W: $act: $_\n";
} }
foreach my $t (qw/dir_prop file_prop/) { foreach my $t (qw/dir_prop file_prop/) {
$h = $untracked->{$t} or next; $h = $ed->{$t} or next;
foreach my $path (sort keys %$h) { foreach my $path (sort keys %$h) {
my $ppath = $path eq '' ? '.' : $path; my $ppath = $path eq '' ? '.' : $path;
foreach my $prop (sort keys %{$h->{$path}}) { foreach my $prop (sort keys %{$h->{$path}}) {
next if $SKIP_PROP{$prop}; next if $SKIP_PROP{$prop};
my $v = $h->{$path}->{$prop}; my $v = $h->{$path}->{$prop};
my $t_ppath_prop = "$t: " .
uri_encode($ppath) . ' ' .
uri_encode($prop);
if (defined $v) { if (defined $v) {
print $fh " +$t: ", push @out, " +$t_ppath_prop " .
uri_encode($ppath), ' ', uri_encode($v);
uri_encode($prop), ' ',
uri_encode($v), "\n"
or croak $!;
} else { } else {
print $fh " -$t: ", push @out, " -$t_ppath_prop";
uri_encode($ppath), ' ',
uri_encode($prop), "\n"
or croak $!;
} }
} }
} }
} }
foreach my $t (qw/absent_file absent_directory/) { 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 $parent (sort keys %$h) {
foreach my $path (sort @{$h->{$parent}}) { foreach my $path (sort @{$h->{$parent}}) {
print $fh " $t: ", push @out, " $t: " .
uri_encode("$parent/$path"), "\n" uri_encode("$parent/$path");
or croak $!;
warn "W: $t: $parent/$path ", warn "W: $t: $parent/$path ",
"Insufficient permissions?\n"; "Insufficient permissions?\n";
} }
} }
} }
\@out;
} }
sub parse_svn_date { sub parse_svn_date {
@ -1280,12 +1276,15 @@ sub check_author {
} }
sub make_log_entry { sub make_log_entry {
my ($self, $rev, $parents, $untracked) = @_; my ($self, $rev, $parents, $ed) = @_;
my $rp = $self->ra->rev_proplist($rev); my $untracked = $self->get_untracked($ed);
my %log_entry = ( parents => $parents || [], revision => $rev,
revprops => $rp, log => '');
open my $un, '>>', "$self->{dir}/unhandled.log" or croak $!; 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) { foreach (sort keys %$rp) {
my $v = $rp->{$_}; my $v = $rp->{$_};
if (/^svn:(author|date|log)$/) { if (/^svn:(author|date|log)$/) {
@ -1296,6 +1295,11 @@ sub make_log_entry {
} }
} }
close $un or croak $!; 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{date} = parse_svn_date($log_entry{date});
$log_entry{author} = check_author($log_entry{author}); $log_entry{author} = check_author($log_entry{author});
$log_entry{log} .= "\n"; $log_entry{log} .= "\n";
@ -1320,8 +1324,9 @@ sub fetch {
my ($paths, $rev, $author, $date, $log) = @_; my ($paths, $rev, $author, $date, $log) = @_;
push @revs, [ $paths, $rev ] }); push @revs, [ $paths, $rev ] });
foreach (@revs) { foreach (@revs) {
my $log_entry = $self->do_fetch(@$_); if (my $log_entry = $self->do_fetch(@$_)) {
$self->do_git_commit($log_entry, @parents); $self->do_git_commit($log_entry, @parents);
}
} }
last if $max >= $head; last if $max >= $head;
$min = $max + 1; $min = $max + 1;

View File

@ -211,8 +211,6 @@ tree d667270a1f7b109f5eb3aaea21ede14b56bfdd6e
tree 8f51f74cf0163afc9ad68a4b1537288c4558b5a4 tree 8f51f74cf0163afc9ad68a4b1537288c4558b5a4
EOF EOF
echo tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 >> expected
test_expect_success "$name" "diff -u a expected" test_expect_success "$name" "diff -u a expected"
test_expect_failure 'exit if remote refs are ambigious' " test_expect_failure 'exit if remote refs are ambigious' "

View File

@ -5,13 +5,17 @@ test_description='git-svn metadata migrations from previous versions'
test_expect_success 'setup old-looking metadata' " test_expect_success 'setup old-looking metadata' "
cp $GIT_DIR/config $GIT_DIR/config-old-git-svn && 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 init $svnrepo &&
git-svn fetch && 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/ && mv $GIT_DIR/svn/* $GIT_DIR/ &&
rmdir $GIT_DIR/svn && rmdir $GIT_DIR/svn &&
git-update-ref refs/heads/git-svn-HEAD refs/remotes/git-svn && git-update-ref refs/heads/git-svn-HEAD refs/remotes/git-svn &&