git-svn: optimize --branch and --branch-all-ref

By breaking the pipe read once we've seen a commit twice.

This should make -B/--branch-all-ref faster and usable on a
frequent basis.

We use topological order now for calling git-rev-list, and any
commit we've seen before should imply that all parents have been
seen (at least I hope that's the case for --topo-order).

Signed-off-by: Eric Wong <normalperson@yhbt.net>
This commit is contained in:
Eric Wong 2006-04-28 03:51:16 -07:00
parent bf78b1d89b
commit 098749d9be

View File

@ -1220,23 +1220,30 @@ sub check_upgrade_needed {
# fills %tree_map with a reverse mapping of trees to commits. Useful # fills %tree_map with a reverse mapping of trees to commits. Useful
# for finding parents to commit on. # for finding parents to commit on.
sub map_tree_joins { sub map_tree_joins {
my %seen;
foreach my $br (@_branch_from) { foreach my $br (@_branch_from) {
my $pid = open my $pipe, '-|'; my $pid = open my $pipe, '-|';
defined $pid or croak $!; defined $pid or croak $!;
if ($pid == 0) { if ($pid == 0) {
exec(qw(git-rev-list --pretty=raw), $br) or croak $?; exec(qw(git-rev-list --topo-order --pretty=raw), $br)
or croak $?;
} }
while (<$pipe>) { while (<$pipe>) {
if (/^commit ($sha1)$/o) { if (/^commit ($sha1)$/o) {
my $commit = $1; my $commit = $1;
# if we've seen a commit,
# we've seen its parents
last if $seen{$commit};
my ($tree) = (<$pipe> =~ /^tree ($sha1)$/o); my ($tree) = (<$pipe> =~ /^tree ($sha1)$/o);
unless (defined $tree) { unless (defined $tree) {
die "Failed to parse commit $commit\n"; die "Failed to parse commit $commit\n";
} }
push @{$tree_map{$tree}}, $commit; push @{$tree_map{$tree}}, $commit;
$seen{$commit} = 1;
} }
} }
close $pipe or croak $?; close $pipe; # we could be breaking the pipe early
} }
} }