diff --git a/src/lib/Hydra/Controller/Jobset.pm b/src/lib/Hydra/Controller/Jobset.pm index 75284c10..0be73418 100644 --- a/src/lib/Hydra/Controller/Jobset.pm +++ b/src/lib/Hydra/Controller/Jobset.pm @@ -223,12 +223,19 @@ sub updateJobset { error($c, "Cannot rename jobset to ‘$jobsetName’ since that identifier is already taken.") if $jobsetName ne $oldName && defined $c->stash->{project}->jobsets->find({ name => $jobsetName }); - # When the expression is in a .scm file, assume it's a Guile + Guix - # build expression. - my $exprType = - $c->stash->{params}->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix"; + my $type = int($c->stash->{params}->{"type"}) // 0; - my ($nixExprPath, $nixExprInput) = nixExprPathFromParams $c; + my ($nixExprPath, $nixExprInput); + my $flake; + + if ($type == 0) { + ($nixExprPath, $nixExprInput) = nixExprPathFromParams $c; + } elsif ($type == 1) { + $flake = trim($c->stash->{params}->{"flakeref"}); + error($c, "Invalid flake URI ‘$flake’.") if $flake !~ /^[a-zA-Z]/; + } else { + error($c, "Invalid jobset type."); + } my $enabled = int($c->stash->{params}->{enabled}); die if $enabled < 0 || $enabled > 2; @@ -251,6 +258,8 @@ sub updateJobset { , checkinterval => $checkinterval , triggertime => ($enabled && $checkinterval > 0) ? $jobset->triggertime // time() : undef , schedulingshares => $shares + , type => $type + , flake => $flake }); $jobset->project->jobsetrenames->search({ from_ => $jobsetName })->delete; @@ -260,23 +269,25 @@ sub updateJobset { # Set the inputs of this jobset. $jobset->jobsetinputs->delete; - foreach my $name (keys %{$c->stash->{params}->{inputs}}) { - my $inputData = $c->stash->{params}->{inputs}->{$name}; - my $type = $inputData->{type}; - my $value = $inputData->{value}; - my $emailresponsible = defined $inputData->{emailresponsible} ? 1 : 0; + if ($type == 0) { + foreach my $name (keys %{$c->stash->{params}->{inputs}}) { + my $inputData = $c->stash->{params}->{inputs}->{$name}; + my $type = $inputData->{type}; + my $value = $inputData->{value}; + my $emailresponsible = defined $inputData->{emailresponsible} ? 1 : 0; - error($c, "Invalid input name ‘$name’.") unless $name =~ /^[[:alpha:]][\w-]*$/; - error($c, "Invalid input type ‘$type’.") unless defined $c->stash->{inputTypes}->{$type}; + error($c, "Invalid input name ‘$name’.") unless $name =~ /^[[:alpha:]][\w-]*$/; + error($c, "Invalid input type ‘$type’.") unless defined $c->stash->{inputTypes}->{$type}; - my $input = $jobset->jobsetinputs->create( - { name => $name, - type => $type, - emailresponsible => $emailresponsible - }); + my $input = $jobset->jobsetinputs->create( + { name => $name, + type => $type, + emailresponsible => $emailresponsible + }); - $value = checkInputValue($c, $name, $type, $value); - $input->jobsetinputalts->create({altnr => 0, value => $value}); + $value = checkInputValue($c, $name, $type, $value); + $input->jobsetinputalts->create({altnr => 0, value => $value}); + } } } diff --git a/src/lib/Hydra/Schema/Builds.pm b/src/lib/Hydra/Schema/Builds.pm index 1c80f710..a4de7f55 100644 --- a/src/lib/Hydra/Schema/Builds.pm +++ b/src/lib/Hydra/Schema/Builds.pm @@ -191,6 +191,11 @@ __PACKAGE__->table("Builds"); default_value: 0 is_nullable: 0 +=head2 notificationpendingsince + + data_type: 'integer' + is_nullable: 1 + =cut __PACKAGE__->add_columns( @@ -252,6 +257,8 @@ __PACKAGE__->add_columns( { data_type => "text", is_nullable => 1 }, "keep", { data_type => "integer", default_value => 0, is_nullable => 0 }, + "notificationpendingsince", + { data_type => "integer", is_nullable => 1 }, ); =head1 PRIMARY KEY @@ -537,8 +544,8 @@ __PACKAGE__->many_to_many( ); -# Created by DBIx::Class::Schema::Loader v0.07043 @ 2016-02-12 17:20:42 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:/8aVtXu/+o0jmKHnSzwt+g +# Created by DBIx::Class::Schema::Loader v0.07049 @ 2019-05-10 22:30:12 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:YK8Fc+37UAcL0u6ziOc5xQ __PACKAGE__->has_many( "dependents", diff --git a/src/lib/Hydra/Schema/Jobsets.pm b/src/lib/Hydra/Schema/Jobsets.pm index 17b4ab93..3ca67e18 100644 --- a/src/lib/Hydra/Schema/Jobsets.pm +++ b/src/lib/Hydra/Schema/Jobsets.pm @@ -56,12 +56,12 @@ __PACKAGE__->table("Jobsets"); data_type: 'text' is_foreign_key: 1 - is_nullable: 0 + is_nullable: 1 =head2 nixexprpath data_type: 'text' - is_nullable: 0 + is_nullable: 1 =head2 errormsg @@ -139,6 +139,17 @@ __PACKAGE__->table("Jobsets"); data_type: 'integer' is_nullable: 1 +=head2 type + + data_type: 'integer' + default_value: 0 + is_nullable: 0 + +=head2 flake + + data_type: 'text' + is_nullable: 1 + =cut __PACKAGE__->add_columns( @@ -149,9 +160,9 @@ __PACKAGE__->add_columns( "description", { data_type => "text", is_nullable => 1 }, "nixexprinput", - { data_type => "text", is_foreign_key => 1, is_nullable => 0 }, + { data_type => "text", is_foreign_key => 1, is_nullable => 1 }, "nixexprpath", - { data_type => "text", is_nullable => 0 }, + { data_type => "text", is_nullable => 1 }, "errormsg", { data_type => "text", is_nullable => 1 }, "errortime", @@ -180,6 +191,10 @@ __PACKAGE__->add_columns( { data_type => "boolean", is_nullable => 1 }, "starttime", { data_type => "integer", is_nullable => 1 }, + "type", + { data_type => "integer", default_value => 0, is_nullable => 0 }, + "flake", + { data_type => "text", is_nullable => 1 }, ); =head1 PRIMARY KEY @@ -282,7 +297,12 @@ __PACKAGE__->belongs_to( "jobsetinput", "Hydra::Schema::JobsetInputs", { jobset => "name", name => "nixexprinput", project => "project" }, - { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" }, + { + is_deferrable => 0, + join_type => "LEFT", + on_delete => "NO ACTION", + on_update => "NO ACTION", + }, ); =head2 jobsetinputs @@ -352,8 +372,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07045 @ 2017-03-09 13:03:05 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ivYvsUyhEeaeI4EmRQ0/QQ +# Created by DBIx::Class::Schema::Loader v0.07049 @ 2019-05-11 00:03:52 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UVG1D59bXaQ1TUEF237tXQ my %hint = ( columns => [ diff --git a/src/root/edit-jobset.tt b/src/root/edit-jobset.tt index 6c380a3a..95b1afaf 100644 --- a/src/root/edit-jobset.tt +++ b/src/root/edit-jobset.tt @@ -42,7 +42,7 @@ [% END %] [% BLOCK renderJobsetInputs %] - +
@@ -96,6 +96,24 @@
+ +
+
+ + + +
+
+
+ +
+ +
+ jobset.flake) %]/> +
+
+ +
jobset.nixexprpath) %]/> @@ -167,6 +185,21 @@ $(document).ready(function() { var id = 0; + function update() { + if ($("#type").val() == 0) { + $(".show-on-legacy").show(); + $(".show-on-flake").hide(); + } else { + $(".show-on-legacy").hide(); + $(".show-on-flake").show(); + } + } + + $("#type-flake").click(function() { update(); }); + $("#type-legacy").click(function() { update(); }); + + update(); + $(".add-input").click(function() { var newid = "input-" + id++; var x = $("#input-template").clone(true).attr("id", "").insertBefore($(this).parents("tr")).show(); diff --git a/src/root/jobset.tt b/src/root/jobset.tt index 9cf1202a..4b891ff6 100644 --- a/src/root/jobset.tt +++ b/src/root/jobset.tt @@ -135,6 +135,15 @@
+ [% IF jobset.type == 1 %] + + + + + [% END %] + [% IF jobset.type == 0 %] + [% END %] @@ -166,7 +176,9 @@
Input nameTypeValueNotify committers
Description: [% HTML.escape(jobset.description) %]
Flake URI: + [% HTML.escape(jobset.flake) %] +
Nix expression: @@ -142,6 +151,7 @@ [% HTML.escape(jobset.nixexprinput) %]
Check interval: [% jobset.checkinterval || "disabled" %]
+ [% IF jobset.type == 0 %] [% INCLUDE renderJobsetInputs %] + [% END %] [% INCLUDE makeLazyTab tabName="tabs-jobs" uri=c.uri_for('/jobset' project.name jobset.name "jobs-tab") %] diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index 4c8710b8..4b37f6e1 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -54,8 +54,8 @@ create table Jobsets ( name text not null, project text not null, description text, - nixExprInput text not null, -- name of the jobsetInput containing the Nix or Guix expression - nixExprPath text not null, -- relative path of the Nix or Guix expression + nixExprInput text, -- name of the jobsetInput containing the Nix or Guix expression + nixExprPath text, -- relative path of the Nix or Guix expression errorMsg text, -- used to signal the last evaluation error etc. for this jobset errorTime integer, -- timestamp associated with errorMsg lastCheckedTime integer, -- last time the evaluator looked at this jobset @@ -70,7 +70,11 @@ create table Jobsets ( fetchErrorMsg text, forceEval boolean, startTime integer, -- if jobset is currently running + type integer not null default 0, -- 0 == legacy, 1 == flake + flake text, check (schedulingShares > 0), + check ((type = 0) = (nixExprInput is not null and nixExprPath is not null)), + check ((type = 1) = (flake is not null)), primary key (project, name), foreign key (project) references Projects(name) on delete cascade on update cascade #ifdef SQLITE diff --git a/src/sql/upgrade-57.sql b/src/sql/upgrade-57.sql new file mode 100644 index 00000000..15553beb --- /dev/null +++ b/src/sql/upgrade-57.sql @@ -0,0 +1,6 @@ +alter table Jobsets alter column nixExprInput drop not null; +alter table Jobsets alter column nixExprPath drop not null; +alter table Jobsets add column type integer default 0; +alter table Jobsets add column flake text; +alter table Jobsets add check ((type = 0) = (nixExprInput is not null and nixExprPath is not null)); +alter table Jobsets add check ((type = 1) = (flake is not null));