From: Eric Wong Date: Fri, 10 Jan 2020 09:14:17 +0000 (+0000) Subject: git: ->modified uses cat_async X-Git-Tag: v1.3.0~121 X-Git-Url: http://www.git.stargrave.org/?p=public-inbox.git;a=commitdiff_plain;h=0615eef4e17b642eca6978cf776834a9f0a31468 git: ->modified uses cat_async While v1 inboxes are typically only a single branch, coderepos will have many branches and being able to pipeline requests to "git cat-file --batch" can help us mask seek times. --- diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index 2aaf1866..9d0f660b 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -339,6 +339,15 @@ sub commit_title ($$) { ($$buf =~ /\r?\n\r?\n([^\r\n]+)\r?\n?/)[0] } +sub extract_cmt_time { + my ($bref, undef, undef, undef, $modified) = @_; + + if ($$bref =~ /^committer .*?> ([0-9]+) [\+\-]?[0-9]+/sm) { + my $cmt_time = $1 + 0; + $$modified = $cmt_time if $cmt_time > $$modified; + } +} + # returns the modified time of a git repo, same as the "modified" field # of a grokmirror manifest sub modified ($) { @@ -346,14 +355,13 @@ sub modified ($) { my $modified = 0; my $fh = popen($self, qw(rev-parse --branches)); defined $fh or return $modified; + cat_async_begin($self); local $/ = "\n"; foreach my $oid (<$fh>) { chomp $oid; - my $buf = cat_file($self, $oid) or next; - $$buf =~ /^committer .*?> ([0-9]+) [\+\-]?[0-9]+/sm or next; - my $cmt_time = $1 + 0; - $modified = $cmt_time if $cmt_time > $modified; + cat_async($self, $oid, \&extract_cmt_time, \$modified); } + cat_async_wait($self); $modified || time; }