1
0
mirror of https://github.com/git/git.git synced 2024-11-18 17:13:55 +01:00

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

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