From 5e0d10a392058495bc673125ad1198166a1231c1 Mon Sep 17 00:00:00 2001 From: Eelco Dolstra Date: Wed, 23 Apr 2014 23:12:00 +0200 Subject: [PATCH] When renaming a jobset, add a redirect from the old name --- src/lib/Hydra/Controller/Jobset.pm | 14 ++- src/lib/Hydra/Schema/JobsetRenames.pm | 118 ++++++++++++++++++++++++++ src/lib/Hydra/Schema/Jobsets.pm | 19 ++++- src/lib/Hydra/Schema/Projects.pm | 19 ++++- src/sql/hydra.sql | 10 +++ src/sql/upgrade-26.sql | 8 ++ 6 files changed, 181 insertions(+), 7 deletions(-) create mode 100644 src/lib/Hydra/Schema/JobsetRenames.pm create mode 100644 src/sql/upgrade-26.sql diff --git a/src/lib/Hydra/Controller/Jobset.pm b/src/lib/Hydra/Controller/Jobset.pm index 55100b3f..3fc5e26f 100644 --- a/src/lib/Hydra/Controller/Jobset.pm +++ b/src/lib/Hydra/Controller/Jobset.pm @@ -20,8 +20,11 @@ sub jobsetChain :Chained('/') :PathPart('jobset') :CaptureArgs(2) { $c->stash->{jobset} = $project->jobsets->find({ name => $jobsetName }); - notFound($c, "Jobset ‘$jobsetName’ doesn't exist.") - if !$c->stash->{jobset} && !($c->action->name eq "jobset" and $c->request->method eq "PUT"); + if (!$c->stash->{jobset} && !($c->action->name eq "jobset" and $c->request->method eq "PUT")) { + my $rename = $project->jobsetrenames->find({ from_ => $jobsetName }); + notFound($c, "Jobset ‘$jobsetName’ doesn't exist.") unless defined $rename; + $c->stash->{jobset} = $project->jobsets->find({ name => $rename->to_ }) or die; + } } @@ -193,11 +196,12 @@ sub checkInputValue { sub updateJobset { my ($c, $jobset) = @_; + my $oldName = $jobset->name; my $jobsetName = $c->stash->{params}->{name}; error($c, "Invalid jobset identifier ‘$jobsetName’.") if $jobsetName !~ /^$jobsetNameRE$/; error($c, "Cannot rename jobset to ‘$jobsetName’ since that identifier is already taken.") - if $jobsetName ne $jobset->name && defined $c->stash->{project}->jobsets->find({ name => $jobsetName }); + 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. @@ -224,6 +228,10 @@ sub updateJobset { , schedulingshares => int($c->stash->{params}->{schedulingshares}) }); + $jobset->project->jobsetrenames->search({ from_ => $jobsetName })->delete; + $jobset->project->jobsetrenames->create({ from_ => $oldName, to_ => $jobsetName }) + if $jobsetName ne $oldName; + # Set the inputs of this jobset. $jobset->jobsetinputs->delete; diff --git a/src/lib/Hydra/Schema/JobsetRenames.pm b/src/lib/Hydra/Schema/JobsetRenames.pm new file mode 100644 index 00000000..874e7a24 --- /dev/null +++ b/src/lib/Hydra/Schema/JobsetRenames.pm @@ -0,0 +1,118 @@ +use utf8; +package Hydra::Schema::JobsetRenames; + +# Created by DBIx::Class::Schema::Loader +# DO NOT MODIFY THE FIRST PART OF THIS FILE + +=head1 NAME + +Hydra::Schema::JobsetRenames + +=cut + +use strict; +use warnings; + +use base 'DBIx::Class::Core'; + +=head1 COMPONENTS LOADED + +=over 4 + +=item * L + +=back + +=cut + +__PACKAGE__->load_components("+Hydra::Component::ToJSON"); + +=head1 TABLE: C + +=cut + +__PACKAGE__->table("JobsetRenames"); + +=head1 ACCESSORS + +=head2 project + + data_type: 'text' + is_foreign_key: 1 + is_nullable: 0 + +=head2 from_ + + data_type: 'text' + is_nullable: 0 + +=head2 to_ + + data_type: 'text' + is_foreign_key: 1 + is_nullable: 0 + +=cut + +__PACKAGE__->add_columns( + "project", + { data_type => "text", is_foreign_key => 1, is_nullable => 0 }, + "from_", + { data_type => "text", is_nullable => 0 }, + "to_", + { data_type => "text", is_foreign_key => 1, is_nullable => 0 }, +); + +=head1 PRIMARY KEY + +=over 4 + +=item * L + +=item * L + +=back + +=cut + +__PACKAGE__->set_primary_key("project", "from_"); + +=head1 RELATIONS + +=head2 jobset + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "jobset", + "Hydra::Schema::Jobsets", + { name => "to_", project => "project" }, + { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" }, +); + +=head2 project + +Type: belongs_to + +Related object: L + +=cut + +__PACKAGE__->belongs_to( + "project", + "Hydra::Schema::Projects", + { name => "project" }, + { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" }, +); + + +# Created by DBIx::Class::Schema::Loader v0.07033 @ 2014-04-23 23:13:51 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:SBpKWF9swFc9T1Uc0VFlgA + + +# You can replace this text with custom code or comments, and it will be preserved on regeneration +1; diff --git a/src/lib/Hydra/Schema/Jobsets.pm b/src/lib/Hydra/Schema/Jobsets.pm index b588156c..f304f770 100644 --- a/src/lib/Hydra/Schema/Jobsets.pm +++ b/src/lib/Hydra/Schema/Jobsets.pm @@ -271,6 +271,21 @@ __PACKAGE__->has_many( undef, ); +=head2 jobsetrenames + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "jobsetrenames", + "Hydra::Schema::JobsetRenames", + { "foreign.project" => "self.project", "foreign.to_" => "self.name" }, + undef, +); + =head2 project Type: belongs_to @@ -305,8 +320,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:DTAGxP5RFvcNxP/ciJGo4Q +# Created by DBIx::Class::Schema::Loader v0.07033 @ 2014-04-23 23:13:51 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CO0aE+jrjB+UrwGRzWZLlw my %hint = ( columns => [ diff --git a/src/lib/Hydra/Schema/Projects.pm b/src/lib/Hydra/Schema/Projects.pm index 75f40b6f..162f9172 100644 --- a/src/lib/Hydra/Schema/Projects.pm +++ b/src/lib/Hydra/Schema/Projects.pm @@ -151,6 +151,21 @@ __PACKAGE__->has_many( undef, ); +=head2 jobsetrenames + +Type: has_many + +Related object: L + +=cut + +__PACKAGE__->has_many( + "jobsetrenames", + "Hydra::Schema::JobsetRenames", + { "foreign.project" => "self.name" }, + undef, +); + =head2 jobsets Type: has_many @@ -282,8 +297,8 @@ Composing rels: L -> username __PACKAGE__->many_to_many("usernames", "projectmembers", "username"); -# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:PdNQ2mf5azBB6nI+iAm8fQ +# Created by DBIx::Class::Schema::Loader v0.07033 @ 2014-04-23 22:48:21 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:l8eN9UAavdqnL7Sjv4rmFw my %hint = ( columns => [ diff --git a/src/sql/hydra.sql b/src/sql/hydra.sql index a91013c8..ff4b9cc4 100644 --- a/src/sql/hydra.sql +++ b/src/sql/hydra.sql @@ -73,6 +73,16 @@ create table Jobsets ( ); +create table JobsetRenames ( + project text not null, + from_ text not null, + to_ text not null, + primary key (project, from_), + foreign key (project) references Projects(name) on delete cascade on update cascade, + foreign key (project, to_) references Jobsets(project, name) on delete cascade on update cascade +); + + create table JobsetInputs ( project text not null, jobset text not null, diff --git a/src/sql/upgrade-26.sql b/src/sql/upgrade-26.sql new file mode 100644 index 00000000..586ec716 --- /dev/null +++ b/src/sql/upgrade-26.sql @@ -0,0 +1,8 @@ +create table JobsetRenames ( + project text not null, + from_ text not null, + to_ text not null, + primary key (project, from_), + foreign key (project) references Projects(name) on delete cascade on update cascade, + foreign key (project, to_) references Jobsets(project, name) on delete cascade on update cascade +);