X-Git-Url: http://www.git.stargrave.org/?a=blobdiff_plain;f=lib%2FPublicInbox%2FGit.pm;h=2ae5eff9c01614a13f0781561c9aed64d1a52838;hb=081918279573b209c27a91e443c37df597bcd43f;hp=47928c550298eff0d3a604ed96d508466df7f336;hpb=fd71b2ab7a8d18c657ec27e15702ab3057419f02;p=public-inbox.git
diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm
index 47928c55..2ae5eff9 100644
--- a/lib/PublicInbox/Git.pm
+++ b/lib/PublicInbox/Git.pm
@@ -1,4 +1,4 @@
-# Copyright (C) 2014-2020 all contributors
+# Copyright (C) 2014-2021 all contributors
# License: GPLv2 or later
#
# Used to read files from a git repository without excessive forking.
@@ -240,17 +240,16 @@ sub batch_prepare ($) {
}
sub _cat_file_cb {
- my ($bref, undef, undef, $size, $result) = @_;
- @$result = ($bref, $size);
+ my ($bref, $oid, $type, $size, $result) = @_;
+ @$result = ($bref, $oid, $type, $size);
}
sub cat_file {
- my ($self, $oid, $sizeref) = @_;
+ my ($self, $oid) = @_;
my $result = [];
cat_async($self, $oid, \&_cat_file_cb, $result);
cat_async_wait($self);
- $$sizeref = $result->[1] if $sizeref;
- $result->[0];
+ wantarray ? @$result : $result->[0];
}
sub check_async_step ($$) {
@@ -352,17 +351,35 @@ sub fail { # may be augmented in subclasses
croak(ref($self) . ' ' . ($self->{git_dir} // '') . ": $msg");
}
+# $git->popen(qw(show f00)); # or
+# $git->popen(qw(show f00), { GIT_CONFIG => ... }, { 2 => ... });
sub popen {
- my ($self, @cmd) = @_;
- @cmd = ('git', "--git-dir=$self->{git_dir}", @cmd);
- popen_rd(\@cmd);
+ my ($self, $cmd) = splice(@_, 0, 2);
+ $cmd = [ 'git', "--git-dir=$self->{git_dir}",
+ ref($cmd) ? @$cmd : ($cmd, grep { defined && !ref } @_) ];
+ popen_rd($cmd, grep { !defined || ref } @_); # env and opt
}
+# same args as popen above
sub qx {
- my ($self, @cmd) = @_;
- my $fh = $self->popen(@cmd);
- local $/ = wantarray ? "\n" : undef;
- <$fh>;
+ my $fh = popen(@_);
+ if (wantarray) {
+ my @ret = <$fh>;
+ close $fh; # caller should check $?
+ @ret;
+ } else {
+ local $/;
+ my $ret = <$fh>;
+ close $fh; # caller should check $?
+ $ret;
+ }
+}
+
+sub date_parse {
+ my $self = shift;
+ map {
+ substr($_, length('--max-age='), -1)
+ } $self->qx('rev-parse', map { "--since=$_" } @_);
}
# check_async and cat_async may trigger the other, so ensure they're
@@ -410,7 +427,7 @@ sub local_nick ($) {
my $ret = '???';
# don't show full FS path, basename should be OK:
if ($self->{git_dir} =~ m!/([^/]+)(?:/\.git)?\z!) {
- $ret = "/path/to/$1";
+ $ret = "$1.git";
}
wantarray ? ($ret) : $ret;
}
@@ -450,20 +467,6 @@ sub cat_async ($$$;$) {
push(@$inflight, $oid, $cb, $arg);
}
-sub async_prefetch {
- my ($self, $oid, $cb, $arg) = @_;
- if (my $inflight = $self->{inflight}) {
- # we could use MAX_INFLIGHT here w/o the halving,
- # but lets not allow one client to monopolize a git process
- if (scalar(@$inflight) < int(MAX_INFLIGHT/2)) {
- print { $self->{out} } $oid, "\n" or
- $self->fail("write error: $!");
- return push(@$inflight, $oid, $cb, $arg);
- }
- }
- undef;
-}
-
sub extract_cmt_time {
my ($bref, undef, undef, undef, $modified) = @_;
@@ -494,14 +497,13 @@ sub modified ($) {
# templates/this--description in git.git
sub manifest_entry {
my ($self, $epoch, $default_desc) = @_;
- my ($fh, $pid) = $self->popen('show-ref');
+ my $fh = $self->popen('show-ref');
my $dig = Digest::SHA->new(1);
while (read($fh, my $buf, 65536)) {
$dig->add($buf);
}
- close $fh;
- waitpid($pid, 0);
- return if $?; # empty, uninitialized git repo
+ close $fh or return; # empty, uninitialized git repo
+ undef $fh; # for open, below
my $git_dir = $self->{git_dir};
my $ent = {
fingerprint => $dig->hexdigest,