forked from lix-project/hydra
Add support for darcs repositories.
This commit is contained in:
parent
5078730cb5
commit
5a35912956
|
@ -149,7 +149,6 @@ sub fetchInputSystemBuild {
|
|||
return @inputs;
|
||||
}
|
||||
|
||||
|
||||
sub fetchInput {
|
||||
my ($plugins, $db, $project, $jobset, $name, $type, $value) = @_;
|
||||
my @inputs;
|
||||
|
|
105
src/lib/Hydra/Plugin/DarcsInput.pm
Normal file
105
src/lib/Hydra/Plugin/DarcsInput.pm
Normal file
|
@ -0,0 +1,105 @@
|
|||
package Hydra::Plugin::DarcsInput;
|
||||
|
||||
use strict;
|
||||
use parent 'Hydra::Plugin';
|
||||
use Digest::SHA qw(sha256_hex);
|
||||
use File::Path;
|
||||
use Hydra::Helper::Nix;
|
||||
use Nix::Store;
|
||||
|
||||
sub supportedInputTypes {
|
||||
my ($self, $inputTypes) = @_;
|
||||
$inputTypes->{'darcs'} = 'Darcs checkout';
|
||||
}
|
||||
|
||||
sub fetchInput {
|
||||
my ($self, $type, $name, $uri) = @_;
|
||||
|
||||
return undef if $type ne "darcs";
|
||||
|
||||
my $timestamp = time;
|
||||
my $sha256;
|
||||
my $storePath;
|
||||
my $revCount;
|
||||
|
||||
my $cacheDir = getSCMCacheDir . "/git";
|
||||
mkpath($cacheDir);
|
||||
my $clonePath = $cacheDir . "/" . sha256_hex($uri);
|
||||
$uri =~ s|^file://||; # darcs wants paths, not file:// uris
|
||||
|
||||
chdir $ENV{"TMPDIR"}; # sigh. darcs needs a writeable working directory
|
||||
|
||||
my $stdout = ""; my $stderr = ""; my $res;
|
||||
if (! -d $clonePath) {
|
||||
# Clone the repository.
|
||||
($res, $stdout, $stderr) = captureStdoutStderr(600,
|
||||
("darcs", "get", "--lazy", $uri, $clonePath));
|
||||
die "Error getting darcs repo at `$uri':\n$stderr" if $res;
|
||||
}
|
||||
|
||||
# Update the repository to match $uri.
|
||||
($res, $stdout, $stderr) = captureStdoutStderr(600,
|
||||
("darcs", "pull", "-a", "--repodir", $clonePath, "$uri"));
|
||||
die "Error fetching latest change from darcs repo at `$uri':\n$stderr" if $res;
|
||||
|
||||
($res, $stdout, $stderr) = captureStdoutStderr(600,
|
||||
("darcs", "changes", "--last", "1", "--xml", "--repodir", $clonePath));
|
||||
die "Error getting revision ID of darcs repo at `$uri':\n$stderr" if $res;
|
||||
|
||||
$stdout =~ /^<patch.*hash='([0-9a-fA-F-]+)'/sm; # sigh.
|
||||
my $revision = $1;
|
||||
die "Error obtaining revision from output: $stdout\nstderr = $stderr)" unless $revision =~ /^[0-9a-fA-F-]+$/;
|
||||
die "Error getting a revision identifier at `$uri':\n$stderr" if $res;
|
||||
|
||||
# Some simple caching: don't check a uri/revision more than once.
|
||||
my $cachedInput ;
|
||||
($cachedInput) = $self->{db}->resultset('CachedDarcsInputs')->search(
|
||||
{uri => $uri, revision => $revision},
|
||||
{rows => 1});
|
||||
|
||||
if (defined $cachedInput && isValidPath($cachedInput->storepath)) {
|
||||
$storePath = $cachedInput->storepath;
|
||||
$sha256 = $cachedInput->sha256hash;
|
||||
$revision = $cachedInput->revision;
|
||||
$revCount = $cachedInput->revcount;
|
||||
} else {
|
||||
# Then download this revision into the store.
|
||||
print STDERR "checking out darcs repo $uri\n";
|
||||
|
||||
my $tmpDir = File::Temp->newdir("hydra-darcs-export.XXXXXX", CLEANUP => 1, TMPDIR => 1) or die;
|
||||
(system "darcs", "get", "--lazy", $clonePath, "$tmpDir/export", "--quiet",
|
||||
"--to-match", "hash $revision") == 0
|
||||
or die "darcs export failed";
|
||||
$revCount = `darcs changes --count --repodir $tmpDir/export`; chomp $revCount;
|
||||
die "darcs changes --count failed" if $? != 0;
|
||||
|
||||
system "rm", "-rf", "$tmpDir/export/_darcs";
|
||||
$storePath = addToStore("$tmpDir/export", 1, "sha256");
|
||||
$sha256 = queryPathHash($storePath);
|
||||
$sha256 =~ s/sha256://;
|
||||
|
||||
txn_do($self->{db}, sub {
|
||||
$self->{db}->resultset('CachedDarcsInputs')->update_or_create(
|
||||
{ uri => $uri
|
||||
, revision => $revision
|
||||
, revcount => $revCount
|
||||
, sha256hash => $sha256
|
||||
, storepath => $storePath
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
$revision =~ /^([0-9]+)/;
|
||||
my $shortRev = $1;
|
||||
|
||||
return
|
||||
{ uri => $uri
|
||||
, storePath => $storePath
|
||||
, sha256hash => $sha256
|
||||
, revision => $revision
|
||||
, revCount => int($revCount)
|
||||
, shortRev => $shortRev
|
||||
};
|
||||
}
|
||||
|
||||
1;
|
86
src/lib/Hydra/Schema/CachedDarcsInputs.pm
Normal file
86
src/lib/Hydra/Schema/CachedDarcsInputs.pm
Normal file
|
@ -0,0 +1,86 @@
|
|||
use utf8;
|
||||
package Hydra::Schema::CachedDarcsInputs;
|
||||
|
||||
# Created by DBIx::Class::Schema::Loader
|
||||
# DO NOT MODIFY THE FIRST PART OF THIS FILE
|
||||
|
||||
=head1 NAME
|
||||
|
||||
Hydra::Schema::CachedDarcsInputs
|
||||
|
||||
=cut
|
||||
|
||||
use strict;
|
||||
use warnings;
|
||||
|
||||
use base 'DBIx::Class::Core';
|
||||
|
||||
=head1 TABLE: C<CachedDarcsInputs>
|
||||
|
||||
=cut
|
||||
|
||||
__PACKAGE__->table("CachedDarcsInputs");
|
||||
|
||||
=head1 ACCESSORS
|
||||
|
||||
=head2 uri
|
||||
|
||||
data_type: 'text'
|
||||
is_nullable: 0
|
||||
|
||||
=head2 branch
|
||||
|
||||
data_type: 'text'
|
||||
is_nullable: 0
|
||||
|
||||
=head2 revision
|
||||
|
||||
data_type: 'text'
|
||||
is_nullable: 0
|
||||
|
||||
=head2 sha256hash
|
||||
|
||||
data_type: 'text'
|
||||
is_nullable: 0
|
||||
|
||||
=head2 storepath
|
||||
|
||||
data_type: 'text'
|
||||
is_nullable: 0
|
||||
|
||||
=cut
|
||||
|
||||
__PACKAGE__->add_columns(
|
||||
"uri",
|
||||
{ data_type => "text", is_nullable => 0 },
|
||||
"revision",
|
||||
{ data_type => "text", is_nullable => 0 },
|
||||
"revcount",
|
||||
{ data_type => "integer", is_nullable => 0 },
|
||||
"sha256hash",
|
||||
{ data_type => "text", is_nullable => 0 },
|
||||
"storepath",
|
||||
{ data_type => "text", is_nullable => 0 },
|
||||
);
|
||||
|
||||
=head1 PRIMARY KEY
|
||||
|
||||
=over 4
|
||||
|
||||
=item * L</uri>
|
||||
|
||||
=item * L</branch>
|
||||
|
||||
=item * L</revision>
|
||||
|
||||
=back
|
||||
|
||||
=cut
|
||||
|
||||
__PACKAGE__->set_primary_key("uri", "revision");
|
||||
|
||||
|
||||
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
|
||||
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:fx3yosWMmJ+MnvL/dSWtFA
|
||||
|
||||
1;
|
|
@ -322,6 +322,15 @@ create table CachedGitInputs (
|
|||
primary key (uri, branch, revision)
|
||||
);
|
||||
|
||||
create table CachedDarcsInputs (
|
||||
uri text not null,
|
||||
revision text not null,
|
||||
sha256hash text not null,
|
||||
storePath text not null,
|
||||
revCount integer not null,
|
||||
primary key (uri, revision)
|
||||
);
|
||||
|
||||
create table CachedHgInputs (
|
||||
uri text not null,
|
||||
branch text not null,
|
||||
|
|
8
src/sql/upgrade-darcs.sql
Normal file
8
src/sql/upgrade-darcs.sql
Normal file
|
@ -0,0 +1,8 @@
|
|||
create table CachedDarcsInputs (
|
||||
uri text not null,
|
||||
revision text not null,
|
||||
sha256hash text not null,
|
||||
storePath text not null,
|
||||
revCount integer not null,
|
||||
primary key (uri, revision)
|
||||
);
|
|
@ -7,7 +7,7 @@ my $db = Hydra::Model::DB->new;
|
|||
my @sources = $db->schema->sources;
|
||||
my $nrtables = scalar(@sources);
|
||||
|
||||
use Test::Simple tests => 41;
|
||||
use Test::Simple tests => 45;
|
||||
|
||||
foreach my $source (@sources) {
|
||||
my $title = "Basic select query for $source";
|
||||
|
|
Loading…
Reference in a new issue