From 5a35912956b40f73e0c7235581fbdea998df2966 Mon Sep 17 00:00:00 2001 From: Petr Rockai Date: Tue, 5 Feb 2013 19:50:58 +0100 Subject: [PATCH] Add support for darcs repositories. --- src/lib/Hydra/Helper/AddBuilds.pm | 1 - src/lib/Hydra/Plugin/DarcsInput.pm | 105 ++++++++++++++++++++++ src/lib/Hydra/Schema/CachedDarcsInputs.pm | 86 ++++++++++++++++++ src/sql/hydra.sql | 9 ++ src/sql/upgrade-darcs.sql | 8 ++ tests/query-all-tables.pl | 2 +- 6 files changed, 209 insertions(+), 2 deletions(-) create mode 100644 src/lib/Hydra/Plugin/DarcsInput.pm create mode 100644 src/lib/Hydra/Schema/CachedDarcsInputs.pm create mode 100644 src/sql/upgrade-darcs.sql diff --git a/src/lib/Hydra/Helper/AddBuilds.pm b/src/lib/Hydra/Helper/AddBuilds.pm index ec62811d..cf6d7243 100644 --- a/src/lib/Hydra/Helper/AddBuilds.pm +++ b/src/lib/Hydra/Helper/AddBuilds.pm @@ -149,7 +149,6 @@ sub fetchInputSystemBuild { return @inputs; } - sub fetchInput { my ($plugins, $db, $project, $jobset, $name, $type, $value) = @_; my @inputs; diff --git a/src/lib/Hydra/Plugin/DarcsInput.pm b/src/lib/Hydra/Plugin/DarcsInput.pm new file mode 100644 index 00000000..4c593842 --- /dev/null +++ b/src/lib/Hydra/Plugin/DarcsInput.pm @@ -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 =~ /^{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; diff --git a/src/lib/Hydra/Schema/CachedDarcsInputs.pm b/src/lib/Hydra/Schema/CachedDarcsInputs.pm new file mode 100644 index 00000000..426f6f2f --- /dev/null +++ b/src/lib/Hydra/Schema/CachedDarcsInputs.pm @@ -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 + +=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 + +=item * L + +=item * L + +=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; diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index 7bbd26b3..12e56ff2 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -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, diff --git a/src/sql/upgrade-darcs.sql b/src/sql/upgrade-darcs.sql new file mode 100644 index 00000000..17df74c0 --- /dev/null +++ b/src/sql/upgrade-darcs.sql @@ -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) +); diff --git a/tests/query-all-tables.pl b/tests/query-all-tables.pl index c484c4a8..d786505c 100755 --- a/tests/query-all-tables.pl +++ b/tests/query-all-tables.pl @@ -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";