forked from lix-project/hydra
Merge branch 'master' into build-ng
This commit is contained in:
commit
309ef5baa9
|
@ -163,7 +163,7 @@ sub edit : Chained('jobsetChain') PathPart Args(0) {
|
||||||
|
|
||||||
$c->stash->{template} = 'edit-jobset.tt';
|
$c->stash->{template} = 'edit-jobset.tt';
|
||||||
$c->stash->{edit} = 1;
|
$c->stash->{edit} = 1;
|
||||||
$c->stash->{clone} = defined $c->stash->{params}->{clone};
|
$c->stash->{cloneJobset} = defined $c->stash->{params}->{cloneJobset};
|
||||||
$c->stash->{totalShares} = getTotalShares($c->model('DB')->schema);
|
$c->stash->{totalShares} = getTotalShares($c->model('DB')->schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -269,7 +269,7 @@ sub clone : Chained('jobsetChain') PathPart('clone') Args(0) {
|
||||||
requireProjectOwner($c, $c->stash->{project});
|
requireProjectOwner($c, $c->stash->{project});
|
||||||
|
|
||||||
$c->stash->{template} = 'edit-jobset.tt';
|
$c->stash->{template} = 'edit-jobset.tt';
|
||||||
$c->stash->{clone} = 1;
|
$c->stash->{cloneJobset} = 1;
|
||||||
$c->stash->{totalShares} = getTotalShares($c->model('DB')->schema);
|
$c->stash->{totalShares} = getTotalShares($c->model('DB')->schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -157,6 +157,17 @@ sub release : Chained('eval') PathPart('release') Args(0) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
sub create_jobset : Chained('eval') PathPart('create-jobset') Args(0) {
|
||||||
|
my ($self, $c) = @_;
|
||||||
|
my $eval = $c->stash->{eval};
|
||||||
|
|
||||||
|
requireProjectOwner($c, $c->stash->{project});
|
||||||
|
|
||||||
|
$c->stash->{template} = 'edit-jobset.tt';
|
||||||
|
$c->stash->{createFromEval} = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
sub cancel : Chained('eval') PathPart('cancel') Args(0) {
|
sub cancel : Chained('eval') PathPart('cancel') Args(0) {
|
||||||
my ($self, $c) = @_;
|
my ($self, $c) = @_;
|
||||||
requireProjectOwner($c, $c->stash->{eval}->project);
|
requireProjectOwner($c, $c->stash->{eval}->project);
|
||||||
|
|
|
@ -113,7 +113,6 @@ sub create : Path('/create-project') {
|
||||||
|
|
||||||
$c->stash->{template} = 'edit-project.tt';
|
$c->stash->{template} = 'edit-project.tt';
|
||||||
$c->stash->{create} = 1;
|
$c->stash->{create} = 1;
|
||||||
$c->stash->{edit} = 1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -124,7 +123,6 @@ sub create_jobset : Chained('projectChain') PathPart('create-jobset') Args(0) {
|
||||||
|
|
||||||
$c->stash->{template} = 'edit-jobset.tt';
|
$c->stash->{template} = 'edit-jobset.tt';
|
||||||
$c->stash->{create} = 1;
|
$c->stash->{create} = 1;
|
||||||
$c->stash->{edit} = 1;
|
|
||||||
$c->stash->{totalShares} = getTotalShares($c->model('DB')->schema);
|
$c->stash->{totalShares} = getTotalShares($c->model('DB')->schema);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,11 @@ sub supportedInputTypes {
|
||||||
$inputTypes->{'git'} = 'Git checkout';
|
$inputTypes->{'git'} = 'Git checkout';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub _isHash {
|
||||||
|
my ($rev) = @_;
|
||||||
|
return length($rev) == 40 && $rev =~ /^[0-9a-f]+$/;
|
||||||
|
}
|
||||||
|
|
||||||
# Clone or update a branch of a repository into our SCM cache.
|
# Clone or update a branch of a repository into our SCM cache.
|
||||||
sub _cloneRepo {
|
sub _cloneRepo {
|
||||||
my ($self, $uri, $branch, $deepClone) = @_;
|
my ($self, $uri, $branch, $deepClone) = @_;
|
||||||
|
@ -24,15 +29,16 @@ sub _cloneRepo {
|
||||||
my $res;
|
my $res;
|
||||||
if (! -d $clonePath) {
|
if (! -d $clonePath) {
|
||||||
# Clone everything and fetch the branch.
|
# Clone everything and fetch the branch.
|
||||||
# TODO: Optimize the first clone by using "git init $clonePath" and "git remote add origin $uri".
|
$res = run(cmd => ["git", "init", $clonePath]);
|
||||||
$res = run(cmd => ["git", "clone", "--branch", $branch, $uri, $clonePath], timeout => 600);
|
$res = run(cmd => ["git", "remote", "add", "origin", "--", $uri], dir => $clonePath) unless $res->{status};
|
||||||
die "error cloning git repo at `$uri':\n$res->{stderr}" if $res->{status};
|
die "error creating git repo in `$clonePath':\n$res->{stderr}" if $res->{status};
|
||||||
}
|
}
|
||||||
|
|
||||||
# This command forces the update of the local branch to be in the same as
|
# This command forces the update of the local branch to be in the same as
|
||||||
# the remote branch for whatever the repository state is. This command mirrors
|
# the remote branch for whatever the repository state is. This command mirrors
|
||||||
# only one branch of the remote repository.
|
# only one branch of the remote repository.
|
||||||
$res = run(cmd => ["git", "fetch", "-fu", "origin", "+$branch:$branch"], dir => $clonePath, timeout => 600);
|
my $localBranch = _isHash($branch) ? "_hydra_tmp" : $branch;
|
||||||
|
$res = run(cmd => ["git", "fetch", "-fu", "origin", "+$branch:$localBranch"], dir => $clonePath, timeout => 600);
|
||||||
$res = run(cmd => ["git", "fetch", "-fu", "origin"], dir => $clonePath, timeout => 600) if $res->{status};
|
$res = run(cmd => ["git", "fetch", "-fu", "origin"], dir => $clonePath, timeout => 600) if $res->{status};
|
||||||
die "error fetching latest change from git repo at `$uri':\n$res->{stderr}" if $res->{status};
|
die "error fetching latest change from git repo at `$uri':\n$res->{stderr}" if $res->{status};
|
||||||
|
|
||||||
|
@ -78,7 +84,8 @@ sub fetchInput {
|
||||||
my $sha256;
|
my $sha256;
|
||||||
my $storePath;
|
my $storePath;
|
||||||
|
|
||||||
my $revision = grab(cmd => ["git", "rev-parse", "$branch"], dir => $clonePath, chomp => 1);
|
my $revision = _isHash($branch) ? $branch
|
||||||
|
: grab(cmd => ["git", "rev-parse", "$branch"], dir => $clonePath, chomp => 1);
|
||||||
die "did not get a well-formated revision number of Git branch '$branch' at `$uri'"
|
die "did not get a well-formated revision number of Git branch '$branch' at `$uri'"
|
||||||
unless $revision =~ /^[0-9a-fA-F]+$/;
|
unless $revision =~ /^[0-9a-fA-F]+$/;
|
||||||
|
|
||||||
|
@ -104,8 +111,7 @@ sub fetchInput {
|
||||||
if (defined $deepClone) {
|
if (defined $deepClone) {
|
||||||
# Checked out code often wants to be able to run `git
|
# Checked out code often wants to be able to run `git
|
||||||
# describe', e.g., code that uses Gnulib's `git-version-gen'
|
# describe', e.g., code that uses Gnulib's `git-version-gen'
|
||||||
# script. Thus, we leave `.git' in there. Same for
|
# script. Thus, we leave `.git' in there.
|
||||||
# Subversion (e.g., libgcrypt's build system uses that.)
|
|
||||||
$ENV{"NIX_PREFETCH_GIT_LEAVE_DOT_GIT"} = "1";
|
$ENV{"NIX_PREFETCH_GIT_LEAVE_DOT_GIT"} = "1";
|
||||||
|
|
||||||
# Ask for a "deep clone" to allow "git describe" and similar
|
# Ask for a "deep clone" to allow "git describe" and similar
|
||||||
|
@ -115,6 +121,7 @@ sub fetchInput {
|
||||||
$ENV{"NIX_PREFETCH_GIT_DEEP_CLONE"} = "1";
|
$ENV{"NIX_PREFETCH_GIT_DEEP_CLONE"} = "1";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# FIXME: Don't use nix-prefetch-git.
|
||||||
($sha256, $storePath) = split ' ', grab(cmd => ["nix-prefetch-git", $clonePath, $revision], chomp => 1);
|
($sha256, $storePath) = split ' ', grab(cmd => ["nix-prefetch-git", $clonePath, $revision], chomp => 1);
|
||||||
|
|
||||||
txn_do($self->{db}, sub {
|
txn_do($self->{db}, sub {
|
||||||
|
|
|
@ -1,4 +1,8 @@
|
||||||
[% WRAPPER layout.tt title=(create ? "Create jobset in project $project.name" : clone ? "Cloning jobset $project.name:$jobset.name" : "Editing jobset $project.name:$jobset.name") %]
|
[% WRAPPER layout.tt title=
|
||||||
|
(create ? "Creating jobset in project $project.name" :
|
||||||
|
createFromEval ? "Creating jobset from evaluation $eval.id of $project.name:$jobset.name" :
|
||||||
|
cloneJobset ? "Cloning jobset $project.name:$jobset.name" :
|
||||||
|
"Editing jobset $project.name:$jobset.name") %]
|
||||||
[% PROCESS common.tt %]
|
[% PROCESS common.tt %]
|
||||||
[% USE format %]
|
[% USE format %]
|
||||||
|
|
||||||
|
@ -11,16 +15,25 @@
|
||||||
<input type="text" id="[% baseName %]-name" name="[% baseName %]-name" [% HTML.attributes(value => input.name) %]/>
|
<input type="text" id="[% baseName %]-name" name="[% baseName %]-name" [% HTML.attributes(value => input.name) %]/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
[% INCLUDE renderSelection curValue=input.type param="$baseName-type" options=inputTypes %]
|
[% INCLUDE renderSelection curValue=input.type param="$baseName-type" options=inputTypes edit=1 %]
|
||||||
</td>
|
</td>
|
||||||
<td id="[% baseName %]">
|
<td id="[% baseName %]">
|
||||||
[% alt = input.search_related('jobsetinputalts', {altnr => 0}) %]
|
[% IF createFromEval %]
|
||||||
<input style="width: 95%" type="text" [% HTML.attributes(value => alt.value, id => "$baseName-value", name => "$baseName-value") %]/>
|
[% value = (input.uri or input.value); IF input.revision; value = value _ " " _ input.revision; END;
|
||||||
[% IF input.jobsetinputalts_rs.count > 1 %]
|
warn = input.altnr != 0;
|
||||||
|
%]
|
||||||
|
[% ELSE %]
|
||||||
|
[% alt = input.search_related('jobsetinputalts', {altnr => 0});
|
||||||
|
value = alt.value
|
||||||
|
warn = input.jobsetinputalts_rs.count > 1;
|
||||||
|
%]
|
||||||
|
[% END %]
|
||||||
|
[% IF warn %]
|
||||||
<div class="alert alert-warning">Warning: This input had more
|
<div class="alert alert-warning">Warning: This input had more
|
||||||
than one value. This is no longer supported. The additional
|
than one value. This is no longer supported. The additional
|
||||||
values have been removed.</div>
|
values have been removed.</div>
|
||||||
[% END %]
|
[% END %]
|
||||||
|
<input style="width: 95%" type="text" [% HTML.attributes(value => value, id => "$baseName-value", name => "$baseName-value") %]/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<input type="checkbox" id="[% baseName %]-emailresponsible" name="[% baseName %]-emailresponsible" [% IF input.emailresponsible; 'checked="checked"'; END %]/>
|
<input type="checkbox" id="[% baseName %]-emailresponsible" name="[% baseName %]-emailresponsible" [% IF input.emailresponsible; 'checked="checked"'; END %]/>
|
||||||
|
@ -34,7 +47,7 @@
|
||||||
<tr><th></th><th>Input name</th><th>Type</th><th style="width: 50%">Value</th><th>Notify committers</th></tr>
|
<tr><th></th><th>Input name</th><th>Type</th><th style="width: 50%">Value</th><th>Notify committers</th></tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody class="inputs">
|
<tbody class="inputs">
|
||||||
[% FOREACH input IN jobset.jobsetinputs %]
|
[% inputs = createFromEval ? eval.jobsetevalinputs : jobset.jobsetinputs; FOREACH input IN inputs %]
|
||||||
[% INCLUDE renderJobsetInput input=input baseName="input-$input.name" %]
|
[% INCLUDE renderJobsetInput input=input baseName="input-$input.name" %]
|
||||||
[% END %]
|
[% END %]
|
||||||
<tr>
|
<tr>
|
||||||
|
@ -71,7 +84,7 @@
|
||||||
<div class="control-group">
|
<div class="control-group">
|
||||||
<label class="control-label">Identifier</label>
|
<label class="control-label">Identifier</label>
|
||||||
<div class="controls">
|
<div class="controls">
|
||||||
<input type="text" class="span3" name="name" [% HTML.attributes(value => clone ? "" : jobset.name) %]/>
|
<input type="text" class="span3" name="name" [% HTML.attributes(value => edit ? jobset.name : "") %]/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -139,7 +152,7 @@
|
||||||
[% INCLUDE renderJobsetInputs %]
|
[% INCLUDE renderJobsetInputs %]
|
||||||
|
|
||||||
<div class="form-actions">
|
<div class="form-actions">
|
||||||
<button id="submit-jobset" type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF create || clone %]Create jobset[% ELSE %]Apply changes[% END %]</button>
|
<button id="submit-jobset" type="submit" class="btn btn-primary"><i class="icon-ok icon-white"></i> [%IF !edit %]Create jobset[% ELSE %]Apply changes[% END %]</button>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</fieldset>
|
</fieldset>
|
||||||
|
@ -191,7 +204,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
redirectJSON({
|
redirectJSON({
|
||||||
[% IF create || clone %]
|
[% IF !edit %]
|
||||||
url: "[% c.uri_for('/jobset' project.name '.new') %]",
|
url: "[% c.uri_for('/jobset' project.name '.new') %]",
|
||||||
[% ELSE %]
|
[% ELSE %]
|
||||||
url: "[% c.uri_for('/jobset' project.name jobset.name) %]",
|
url: "[% c.uri_for('/jobset' project.name jobset.name) %]",
|
||||||
|
|
|
@ -46,6 +46,7 @@ c.uri_for(c.controller('JobsetEval').action_for('view'),
|
||||||
</a>
|
</a>
|
||||||
<ul class="dropdown-menu">
|
<ul class="dropdown-menu">
|
||||||
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('release'), [eval.id]) %]">Create a release from this evaluation</a></li>
|
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('release'), [eval.id]) %]">Create a release from this evaluation</a></li>
|
||||||
|
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('create_jobset'), [eval.id]) %]">Create a jobset from this evaluation</a></li>
|
||||||
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('cancel'), [eval.id]) %]">Cancel all scheduled builds</a></li>
|
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('cancel'), [eval.id]) %]">Cancel all scheduled builds</a></li>
|
||||||
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('restart_aborted'), [eval.id]) %]">Restart all aborted builds</a></li>
|
<li><a href="[% c.uri_for(c.controller('JobsetEval').action_for('restart_aborted'), [eval.id]) %]">Restart all aborted builds</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
Loading…
Reference in a new issue