* for git inputs, check latest revision of branch (defaults to master for now), if there is change, only use input if last checkout was > hour ago.

This commit is contained in:
Rob Vermaas 2009-11-19 08:15:49 +00:00
parent 2b5ef66111
commit 06dc6d8f86
3 changed files with 48 additions and 13 deletions

View file

@ -223,15 +223,33 @@ sub fetchInputGit {
my $sha256; my $sha256;
my $storePath; my $storePath;
# Some simple caching: don't check a path more than once every N seconds. my $branch = "master";
(my $cachedInput) = $db->resultset('CachedGitInputs')->search(
{uri => $uri, lastseen => {">", $timestamp - 3600}}, # First figure out the last-modified revision of the URI.
my $stdout; my $stderr;
(my $res, $stdout, $stderr) = captureStdoutStderr(
"git", "ls-remote", $uri, $branch);
die "Cannot get head revision of Git branch '$branch' at `$uri':\n$stderr" unless $res;
(my $revision, my $ref) = split ' ', $stdout;
die unless $revision =~ /^[0-9a-fA-F]+$/;
# Some simple caching: don't check a uri/branch more than once every hour, but prefer exact match on uri/branch/revision.
my $cachedInput ;
($cachedInput) = $db->resultset('CachedGitInputs')->search(
{uri => $uri, branch => $branch, revision => $revision},
{rows => 1});
if (! defined $cachedInput ) {
($cachedInput) = $db->resultset('CachedGitInputs')->search(
{uri => $uri, branch => $branch, lastseen => {">", $timestamp - 3600}},
{rows => 1, order_by => "lastseen DESC"}); {rows => 1, order_by => "lastseen DESC"});
}
if (defined $cachedInput && isValidPath($cachedInput->storepath)) { if (defined $cachedInput && isValidPath($cachedInput->storepath)) {
$storePath = $cachedInput->storepath; $storePath = $cachedInput->storepath;
$sha256 = $cachedInput->sha256hash; $sha256 = $cachedInput->sha256hash;
$timestamp = $cachedInput->timestamp; $timestamp = $cachedInput->timestamp;
$revision = $cachedInput->revision;
} else { } else {
# Then download this revision into the store. # Then download this revision into the store.
@ -244,19 +262,20 @@ sub fetchInputGit {
# script. Thus, we leave `.git' in there. # script. Thus, we leave `.git' in there.
$ENV{"NIX_PREFETCH_GIT_LEAVE_DOT_GIT"} = "1"; $ENV{"NIX_PREFETCH_GIT_LEAVE_DOT_GIT"} = "1";
my $stdout; my $stderr;
(my $res, $stdout, $stderr) = captureStdoutStderr( (my $res, $stdout, $stderr) = captureStdoutStderr(
"nix-prefetch-git", $uri); "nix-prefetch-git", $uri, $revision);
die "Cannot check out Git repository `$uri':\n$stderr" unless $res; die "Cannot check out Git repository branch '$branch' at `$uri':\n$stderr" unless $res;
($sha256, $storePath) = split ' ', $stdout; ($sha256, $storePath) = split ' ', $stdout;
($cachedInput) = $db->resultset('CachedGitInputs')->search( ($cachedInput) = $db->resultset('CachedGitInputs')->search(
{uri => $uri, sha256hash => $sha256}); {uri => $uri, branch => $branch, sha256hash => $sha256});
if (!defined $cachedInput) { if (!defined $cachedInput) {
txn_do($db, sub { txn_do($db, sub {
$db->resultset('CachedGitInputs')->create( $db->resultset('CachedGitInputs')->create(
{ uri => $uri { uri => $uri
, branch => $branch
, revision => $revision
, timestamp => $timestamp , timestamp => $timestamp
, lastseen => $timestamp , lastseen => $timestamp
, sha256hash => $sha256 , sha256hash => $sha256
@ -276,7 +295,7 @@ sub fetchInputGit {
, uri => $uri , uri => $uri
, storePath => $storePath , storePath => $storePath
, sha256hash => $sha256 , sha256hash => $sha256
, revision => strftime "%Y%m%d%H%M%S", gmtime($timestamp) , revision => $revision
}; };
} }

View file

@ -18,6 +18,20 @@ __PACKAGE__->add_columns(
is_nullable => 0, is_nullable => 0,
size => undef, size => undef,
}, },
"branch",
{
data_type => "text",
default_value => undef,
is_nullable => 0,
size => undef,
},
"revision",
{
data_type => "text",
default_value => undef,
is_nullable => 0,
size => undef,
},
"timestamp", "timestamp",
{ {
data_type => "integer", data_type => "integer",
@ -47,11 +61,11 @@ __PACKAGE__->add_columns(
size => undef, size => undef,
}, },
); );
__PACKAGE__->set_primary_key("uri", "sha256hash"); __PACKAGE__->set_primary_key("uri", "branch", "revision");
# Created by DBIx::Class::Schema::Loader v0.04999_09 @ 2009-11-17 16:04:13 # Created by DBIx::Class::Schema::Loader v0.04999_09 @ 2009-11-18 21:46:00
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:WzfB4qf6XqvIll/gPFZE6Q # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:K9P4pi33P54ZB8D/6WzAYw
# You can replace this text with custom content, and it will be preserved on regeneration # You can replace this text with custom content, and it will be preserved on regeneration

View file

@ -294,11 +294,13 @@ create table CachedSubversionInputs (
create table CachedGitInputs ( create table CachedGitInputs (
uri text not null, uri text not null,
branch text not null,
revision text not null,
timestamp integer not null, -- when we first saw this hash timestamp integer not null, -- when we first saw this hash
lastSeen integer not null, -- when we last saw this hash lastSeen integer not null, -- when we last saw this hash
sha256hash text not null, sha256hash text not null,
storePath text not null, storePath text not null,
primary key (uri, sha256hash) primary key (uri, branch, revision)
); );
create table CachedCVSInputs ( create table CachedCVSInputs (