}
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 ($$) {
# same args as popen above
sub qx {
- my $self = shift;
- my $fh = $self->popen(@_);
+ my $fh = popen(@_);
if (wantarray) {
- local $/ = "\n";
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
# both completely done by using this:
sub async_wait_all ($) {
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) = @_;
# 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,