hydra: do not perform git clone every time. in stead work on local clone and pull

This commit is contained in:
Rob Vermaas 2010-07-28 12:48:29 +00:00
parent 812689e523
commit 0802559b03
3 changed files with 30 additions and 35 deletions

View file

@ -1,4 +1,4 @@
{ nixpkgs ? ../nixpkgs { nixpkgs ? /etc/nixos/nixpkgs
, hydraSrc ? {outPath = ./.; rev = 1234;} , hydraSrc ? {outPath = ./.; rev = 1234;}
, officialRelease ? false , officialRelease ? false
}: }:

View file

@ -12,6 +12,9 @@ use File::Path;
our @ISA = qw(Exporter); our @ISA = qw(Exporter);
our @EXPORT = qw(fetchInput evalJobs checkBuild inputsToArgs captureStdoutStderr); our @EXPORT = qw(fetchInput evalJobs checkBuild inputsToArgs captureStdoutStderr);
sub scmPath {
return getHydraPath . "/scm" ;
}
sub getStorePathHash { sub getStorePathHash {
my ($storePath) = @_; my ($storePath) = @_;
@ -275,11 +278,26 @@ sub fetchInputGit {
my $sha256; my $sha256;
my $storePath; my $storePath;
# First figure out the last-modified revision of the URI. my $clonePath;
mkpath(scmPath);
$clonePath = scmPath . "/" . sha256_hex($uri);
my $stdout; my $stderr; my $stdout; my $stderr;
if (! -d $clonePath) {
(my $res, $stdout, $stderr) = captureStdoutStderr(600,
("git", "clone", $uri, $clonePath));
die "Error cloning git repo at `$uri':\n$stderr" unless $res;
}
# git pull + check rev
chdir $clonePath or die $!;
(my $res, $stdout, $stderr) = captureStdoutStderr(600, (my $res, $stdout, $stderr) = captureStdoutStderr(600,
("git", "ls-remote", $uri, "refs/heads/".$branch)); ("git", "pull"));
die "Cannot get head revision of Git branch '$branch' at `$uri':\n$stderr" unless $res; die "Error pulling latest change git repo at `$uri':\n$stderr" unless $res;
(my $res1, $stdout, $stderr) = captureStdoutStderr(600,
("git", "ls-remote", $clonePath, "refs/heads/".$branch));
die "Cannot get head revision of Git branch '$branch' at `$uri':\n$stderr" unless $res1;
(my $revision, my $ref) = split ' ', $stdout; (my $revision, my $ref) = split ' ', $stdout;
die unless $revision =~ /^[0-9a-fA-F]+$/; die unless $revision =~ /^[0-9a-fA-F]+$/;
@ -289,16 +307,10 @@ sub fetchInputGit {
($cachedInput) = $db->resultset('CachedGitInputs')->search( ($cachedInput) = $db->resultset('CachedGitInputs')->search(
{uri => $uri, branch => $branch, revision => $revision}, {uri => $uri, branch => $branch, revision => $revision},
{rows => 1}); {rows => 1});
if (! defined $cachedInput ) {
($cachedInput) = $db->resultset('CachedGitInputs')->search(
{uri => $uri, branch => $branch, lastseen => {">", $timestamp - 3600}},
{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;
$revision = $cachedInput->revision; $revision = $cachedInput->revision;
} else { } else {
@ -324,27 +336,16 @@ sub fetchInputGit {
die "Cannot check out Git repository branch '$branch' at `$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(
{uri => $uri, branch => $branch, sha256hash => $sha256});
if (!defined $cachedInput) { txn_do($db, sub {
txn_do($db, sub { $db->resultset('CachedGitInputs')->update_or_create(
$db->resultset('CachedGitInputs')->update_or_create( { uri => $uri
{ uri => $uri , branch => $branch
, branch => $branch , revision => $revision
, revision => $revision , sha256hash => $sha256
, timestamp => $timestamp , storepath => $storePath
, lastseen => $timestamp
, sha256hash => $sha256
, storepath => $storePath
});
}); });
} else {
$timestamp = $cachedInput->timestamp;
txn_do($db, sub {
$cachedInput->update({lastseen => time});
}); });
}
} }
return return
@ -356,10 +357,6 @@ sub fetchInputGit {
}; };
} }
sub scmPath {
return getHydraPath . "/scm" ;
}
sub fetchInputHg { sub fetchInputHg {
my ($db, $project, $jobset, $name, $type, $value) = @_; my ($db, $project, $jobset, $name, $type, $value) = @_;
@ -387,7 +384,7 @@ sub fetchInputHg {
(my $res1, $stdout, $stderr) = captureStdoutStderr(600, (my $res1, $stdout, $stderr) = captureStdoutStderr(600,
("hg", "heads", $branch)); ("hg", "heads", $branch));
die "Error getting head of $branch from `$uri':\n$stderr" unless $res; die "Error getting head of $branch from `$uri':\n$stderr" unless $res1;
$stdout =~ m/[0-9]+:([0-9A-Fa-f]{12})/; $stdout =~ m/[0-9]+:([0-9A-Fa-f]{12})/;
my $revision = $1; my $revision = $1;

View file

@ -311,8 +311,6 @@ create table CachedGitInputs (
uri text not null, uri text not null,
branch text not null, branch text not null,
revision text not null, revision text not null,
timestamp integer not null, -- when we first 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, branch, revision) primary key (uri, branch, revision)