# Read .git/FETCH_HEAD and make a human readable merge message
# by grouping branches and tags together to form a single line.
+unshift @INC, '@@INSTLIBDIR@@';
use strict;
+use Git;
+use Error qw(:try);
+
+my $repo = Git->repository();
my @src;
my %src;
sub repoconfig {
my $val;
- eval {
- my $pid = open(my $fh, '-|');
- if (!$pid) {
- exec('git-repo-config', '--get', 'merge.summary');
+ try {
+ $val = $repo->command_oneline('repo-config', '--get', 'merge.summary');
+ } catch Git::Error::Command with {
+ my ($E) = shift;
+ if ($E->value() == 1) {
+ return undef;
+ } else {
+ throw $E;
}
- ($val) = <$fh>;
- close $fh;
};
return $val;
}
sub current_branch {
- my $fh;
- my $pid = open($fh, '-|');
- die "$!" unless defined $pid;
- if (!$pid) {
- exec('git-symbolic-ref', 'HEAD') or die "$!";
- }
- my ($bra) = <$fh>;
- chomp($bra);
- close $fh or die "$!";
+ my ($bra) = $repo->command_oneline('symbolic-ref', 'HEAD');
$bra =~ s|^refs/heads/||;
if ($bra ne 'master') {
$bra = " into $bra";
}
sub shortlog {
- my ($tip, $limit) = @_;
- my ($fh, @result);
- my $pid = open($fh, '-|');
- die "$!" unless defined $pid;
- if (!$pid) {
- exec('git-log', "--max-count=$limit", '--topo-order',
- '--pretty=oneline', $tip, '^HEAD') or die "$!";
- }
- while (<$fh>) {
+ my ($tip) = @_;
+ my @result;
+ foreach ($repo->command('log', '--no-merges', '--topo-order', '--pretty=oneline', $tip, '^HEAD')) {
s/^[0-9a-f]{40}\s+//;
push @result, $_;
}
- close $fh or die "$!";
return @result;
}
$src{$src} = {
BRANCH => [],
TAG => [],
+ R_BRANCH => [],
GENERIC => [],
# &1 == has HEAD.
# &2 == has others.
push @{$src{$src}{TAG}}, $1;
$src{$src}{HEAD_STATUS} |= 2;
}
+ elsif (/^remote branch (.*)$/) {
+ $origin = $1;
+ push @{$src{$src}{R_BRANCH}}, $1;
+ $src{$src}{HEAD_STATUS} |= 2;
+ }
elsif (/^HEAD$/) {
$origin = $src;
$src{$src}{HEAD_STATUS} |= 1;
}
push @this, andjoin("branch ", "branches ",
$src{$src}{BRANCH});
+ push @this, andjoin("remote branch ", "remote branches ",
+ $src{$src}{R_BRANCH});
push @this, andjoin("tag ", "tags ",
$src{$src}{TAG});
push @this, andjoin("commit ", "commits ",
for (@origin) {
my ($sha1, $name) = @$_;
- my @log = shortlog($sha1, $limit + 1);
+ my @log = shortlog($sha1);
if ($limit + 1 <= @log) {
print "\n* $name: (" . scalar(@log) . " commits)\n";
}
print " ...\n";
last;
}
- print " $log";
+ print " $log\n";
}
}