When renaming a jobset, add a redirect from the old name

This commit is contained in:
Eelco Dolstra 2014-04-23 23:12:00 +02:00
parent 5a5f1e42e6
commit 5e0d10a392
6 changed files with 181 additions and 7 deletions

View file

@ -20,8 +20,11 @@ sub jobsetChain :Chained('/') :PathPart('jobset') :CaptureArgs(2) {
$c->stash->{jobset} = $project->jobsets->find({ name => $jobsetName }); $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 { sub updateJobset {
my ($c, $jobset) = @_; my ($c, $jobset) = @_;
my $oldName = $jobset->name;
my $jobsetName = $c->stash->{params}->{name}; my $jobsetName = $c->stash->{params}->{name};
error($c, "Invalid jobset identifier $jobsetName.") if $jobsetName !~ /^$jobsetNameRE$/; error($c, "Invalid jobset identifier $jobsetName.") if $jobsetName !~ /^$jobsetNameRE$/;
error($c, "Cannot rename jobset to $jobsetName since that identifier is already taken.") 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 # When the expression is in a .scm file, assume it's a Guile + Guix
# build expression. # build expression.
@ -224,6 +228,10 @@ sub updateJobset {
, schedulingshares => int($c->stash->{params}->{schedulingshares}) , 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. # Set the inputs of this jobset.
$jobset->jobsetinputs->delete; $jobset->jobsetinputs->delete;

View file

@ -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<Hydra::Component::ToJSON>
=back
=cut
__PACKAGE__->load_components("+Hydra::Component::ToJSON");
=head1 TABLE: C<JobsetRenames>
=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</project>
=item * L</from_>
=back
=cut
__PACKAGE__->set_primary_key("project", "from_");
=head1 RELATIONS
=head2 jobset
Type: belongs_to
Related object: L<Hydra::Schema::Jobsets>
=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<Hydra::Schema::Projects>
=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;

View file

@ -271,6 +271,21 @@ __PACKAGE__->has_many(
undef, undef,
); );
=head2 jobsetrenames
Type: has_many
Related object: L<Hydra::Schema::JobsetRenames>
=cut
__PACKAGE__->has_many(
"jobsetrenames",
"Hydra::Schema::JobsetRenames",
{ "foreign.project" => "self.project", "foreign.to_" => "self.name" },
undef,
);
=head2 project =head2 project
Type: belongs_to Type: belongs_to
@ -305,8 +320,8 @@ __PACKAGE__->has_many(
); );
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29 # Created by DBIx::Class::Schema::Loader v0.07033 @ 2014-04-23 23:13:51
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:DTAGxP5RFvcNxP/ciJGo4Q # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:CO0aE+jrjB+UrwGRzWZLlw
my %hint = ( my %hint = (
columns => [ columns => [

View file

@ -151,6 +151,21 @@ __PACKAGE__->has_many(
undef, undef,
); );
=head2 jobsetrenames
Type: has_many
Related object: L<Hydra::Schema::JobsetRenames>
=cut
__PACKAGE__->has_many(
"jobsetrenames",
"Hydra::Schema::JobsetRenames",
{ "foreign.project" => "self.name" },
undef,
);
=head2 jobsets =head2 jobsets
Type: has_many Type: has_many
@ -282,8 +297,8 @@ Composing rels: L</projectmembers> -> username
__PACKAGE__->many_to_many("usernames", "projectmembers", "username"); __PACKAGE__->many_to_many("usernames", "projectmembers", "username");
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-10-14 15:46:29 # Created by DBIx::Class::Schema::Loader v0.07033 @ 2014-04-23 22:48:21
# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:PdNQ2mf5azBB6nI+iAm8fQ # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:l8eN9UAavdqnL7Sjv4rmFw
my %hint = ( my %hint = (
columns => [ columns => [

View file

@ -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 ( create table JobsetInputs (
project text not null, project text not null,
jobset text not null, jobset text not null,

8
src/sql/upgrade-26.sql Normal file
View file

@ -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
);