+sub repoconfig {
+ my $fh;
+ my $val;
+ eval {
+ open $fh, '-|', 'git-repo-config', '--get', 'merge.summary'
+ or die "$!";
+ ($val) = <$fh>;
+ close $fh;
+ };
+ return $val;
+}
+
+sub mergebase {
+ my ($other) = @_;
+ my $fh;
+ open $fh, '-|', 'git-merge-base', '--all', 'HEAD', $other or die "$!";
+ my (@mb) = map { chomp; $_ } <$fh>;
+ close $fh or die "$!";
+ return @mb;
+}
+
+sub shortlog {
+ my ($tip, $limit, @base) = @_;
+ my ($fh, @result);
+ open $fh, '-|', ('git-log', "--max-count=$limit", '--topo-order',
+ '--pretty=oneline', $tip, map { "^$_" } @base)
+ or die "$!";
+ while (<$fh>) {
+ s/^[0-9a-f]{40}\s+//;
+ push @result, $_;
+ }
+ close $fh or die "$!";
+ return @result;
+}
+
+my @origin = ();