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:
parent
bf78b1d89b
commit
098749d9be
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user