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:
parent
1492b4245a
commit
97f6987afa
61
git-svn.perl
61
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;
|
||||
|
@ -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' "
|
||||
|
@ -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 &&
|
||||
|
Loading…
Reference in New Issue
Block a user