From 7973bc101755b13a1381579c5ee60a716da6ffe1 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 17 Apr 2019 10:49:15 +0000 Subject: git: calculate modified time of repository This will be used for generating an HTML listing for v1 inboxes, at least. The logic for this follows that of grokmirror, and we may dynamically generate manifest.js.gz natively... --- lib/PublicInbox/Git.pm | 18 ++++++++++++++++++ t/git.fast-import-data | 2 +- t/git.t | 5 +++++ 3 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/PublicInbox/Git.pm b/lib/PublicInbox/Git.pm index 8a96e10c..236f70c1 100644 --- a/lib/PublicInbox/Git.pm +++ b/lib/PublicInbox/Git.pm @@ -312,6 +312,24 @@ sub commit_title ($$) { ($$buf =~ /\r?\n\r?\n([^\r\n]+)\r?\n?/)[0] } +# returns the modified time of a git repo, same as the "modified" field +# of a grokmirror manifest +sub modified ($) { + my ($self) = @_; + my $modified = 0; + my $fh = popen($self, qw(rev-parse --branches)); + defined $fh or return $modified; + local $/ = "\n"; + foreach my $oid (<$fh>) { + chomp $oid; + my $buf = cat_file($self, $oid) or next; + $$buf =~ /^committer .*?> (\d+) [\+\-]?\d+/sm or next; + my $cmt_time = $1; + $modified = $cmt_time if $cmt_time > $modified; + } + $modified || time; +} + 1; __END__ =pod diff --git a/t/git.fast-import-data b/t/git.fast-import-data index 4a105ee7..6d5159dd 100644 --- a/t/git.fast-import-data +++ b/t/git.fast-import-data @@ -90,7 +90,7 @@ data 78 commit refs/heads/master mark :13 author AU Thor 0 +0000 -committer AU Thor 0 +0000 +committer AU Thor 749520000 +0000 data 18 add git submodule from :11 diff --git a/t/git.t b/t/git.t index d637e63b..5b612b8e 100644 --- a/t/git.t +++ b/t/git.t @@ -23,6 +23,7 @@ use_ok 'PublicInbox::Git'; { my $gcf = PublicInbox::Git->new($dir); + is($gcf->modified, 749520000, 'modified time detected from commit'); my $f = 'HEAD:foo.txt'; my @x = $gcf->check($f); is(scalar @x, 3, 'returned 3 element array for existing file'); @@ -146,6 +147,10 @@ if ('alternates reloaded') { ok($gcf->cleanup(time - 30), 'cleanup did not expire'); ok(!$gcf->cleanup(time + 30), 'cleanup can expire'); ok(!$gcf->cleanup, 'cleanup idempotent'); + + my $t = $gcf->modified; + ok($t <= time, 'repo not modified in the future'); + isnt($t, 0, 'repo not modified in 1970') } use_ok 'PublicInbox::Git', qw(git_unquote git_quote); -- cgit v1.2.3-24-ge0c7