-# Copyright (C) 2014-2018 all contributors <meta@public-inbox.org>
+# Copyright (C) 2014-2019 all contributors <meta@public-inbox.org>
# License: GPLv2 or later <https://www.gnu.org/licenses/gpl-2.0.txt>
#
# Used to read files from a git repository without excessive forking.
use POSIX qw(dup2);
require IO::Handle;
use PublicInbox::Spawn qw(spawn popen_rd);
+use PublicInbox::Tmpfile;
use base qw(Exporter);
our @EXPORT_OK = qw(git_unquote git_quote);
qw(-c core.abbrev=40 cat-file), $batch);
my $redir = { 0 => fileno($out_r), 1 => fileno($in_w) };
if ($err) {
- open(my $fh, '+>', undef) or fail($self, "open.err failed: $!");
+ my $id = "git.$self->{git_dir}$batch.err";
+ my $fh = tmpfile($id) or fail($self, "tmpfile($id): $!");
$self->{$err} = $fh;
$redir->{2} = fileno($fh);
}
my $p = delete $self->{$pid} or return;
delete @$self{($in, $out)};
delete $self->{$err} if $err; # `err_c'
- waitpid $p, 0;
+
+ # PublicInbox::DS may not be loaded
+ eval { PublicInbox::DS::dwaitpid($p, undef, undef) };
+ waitpid($p, 0) if $@; # wait synchronously if not in event loop
}
sub fail {
wantarray ? ($ret) : $ret;
}
-# show the blob URL for cgit/gitweb/whatever
-sub src_blob_url {
- my ($self, $oid) = @_;
- # blob_url_format = "https://example.com/foo.git/blob/%s"
- if (my $bfu = $self->{blob_url_format}) {
- return map { sprintf($_, $oid) } @$bfu if wantarray;
- return sprintf($bfu->[0], $oid);
- }
- local_nick($self);
-}
-
sub host_prefix_url ($$) {
my ($env, $url) = @_;
return $url if index($url, '//') >= 0;
chomp $oid;
my $buf = cat_file($self, $oid) or next;
$$buf =~ /^committer .*?> ([0-9]+) [\+\-]?[0-9]+/sm or next;
- my $cmt_time = $1;
+ my $cmt_time = $1 + 0;
$modified = $cmt_time if $cmt_time > $modified;
}
$modified || time;