Add a '-2|' dir for "execute the command and pipe both stdout and stderr to us". Use this to catch stderr from the rev-parse call in is_unmerged. We already check the status, so we don't want to confuse users with stuff like:
error: No upstream configured for branch 'master' on nmbug's stderr. --- devel/nmbug/nmbug | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/devel/nmbug/nmbug b/devel/nmbug/nmbug index 998ee6b..c9ac046 100755 --- a/devel/nmbug/nmbug +++ b/devel/nmbug/nmbug @@ -56,7 +56,7 @@ my $EMPTYBLOB = git (qw{hash-object -t blob /dev/null}); sub git_pipe { my $envref = (ref $_[0] eq 'HASH') ? shift : {}; my $ioref = (ref $_[0] eq 'ARRAY') ? shift : undef; - my $dir = ($_[0] eq '-|' or $_[0] eq '|-') ? shift : undef; + my $dir = ($_[0] eq '-|' or $_[0] eq '-2|' or $_[0] eq '|-') ? shift : undef; unshift @_, 'git'; $envref->{GIT_DIR} ||= $NMBGIT; @@ -83,10 +83,15 @@ sub git { sub spawn { my $envref = (ref $_[0] eq 'HASH') ? shift : {}; my $ioref = (ref $_[0] eq 'ARRAY') ? shift : undef; - my $dir = ($_[0] eq '-|' or $_[0] eq '|-') ? shift : '-|'; + my $dir = ($_[0] eq '-|' or $_[0] eq '-2|' or $_[0] eq '|-') ? shift : '-|'; + my $stderr_to_stdout = $dir eq '-2|'; die unless @_; + if ($dir eq '-2|') { + $dir = '-|'; + } + if (open my $child, $dir) { return $child; } @@ -105,6 +110,9 @@ sub spawn { if ($dir ne '|-') { open STDIN, '<', '/dev/null' or die "reopening stdin: $!" } + if ($stderr_to_stdout) { + open(STDERR, ">&STDOUT"); + } exec @_; die "exec @_: $!"; } @@ -430,7 +438,7 @@ sub do_status { sub is_unmerged { my $commit = shift || '@{upstream}'; - my ($fetch_head, $status) = git_with_status ('rev-parse', $commit); + my ($fetch_head, $status) = git_with_status ('-2|', 'rev-parse', $commit); if ($status) { return 0; } -- 1.9.1.353.gc66d89d