[PATCH 3/13] git-svn: optimize --branch and --branch-all-ref

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxx>
---
 contrib/git-svn/git-svn.perl |   11 +++++++++--
 1 files changed, 9 insertions(+), 2 deletions(-)

diff --git a/contrib/git-svn/git-svn.perl b/contrib/git-svn/git-svn.perl
index c91160d..d4b9323 100755
--- a/contrib/git-svn/git-svn.perl
+++ b/contrib/git-svn/git-svn.perl
@@ -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
 	}
 }
 
-- 
1.4.0

-
: send the line "unsubscribe git" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Index of Archives]     [Linux Kernel Development]     [Gcc Help]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [V4L]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Fedora Users]