Merge in the first bits of the API work
[?]
Jun 17, 2013, 4:34 PM
LZVO64YG43JD7YMZSCTZNOBS5ROZA4FMPKJW2YOMHX2V5PTGBVWQCDependencies
- [2]
BJAJLOT3typo - [3]
P2NOTX5Dif no emailoverride specified, use empty string - [4]
S4V64WMTWhitespace - [5]
NS5GKQHWDisable prepared statements completely - [6]
PHJF4FUTAdd missing files - [7]
FHHFNCCRFix duplicate function name - [8]
4HPT4SDDRevert "Remove now-unused SystemTypes table" - [9]
HZWUT4YNAllow users to reproduce builds on their own systems - [10]
FAUCW4NHRemove project/jobset/job/build id from the navbar - [11]
QLOLZHRXAllow a per-jobset check interval - [12]
OQNFJWAGInstall plugins - [13]
R6B5CAFFLet Builds.timestamp refer to the time the build was added - [14]
E7M2WP7ARemove unused Jobs columns - [15]
6K5PBUUNUse buildEnv to combine Hydra's Perl dependencies - [16]
JAH3UPWASupport revision control systems via plugins - [17]
M6UBWKN2Fix project/jobset deletion - [18]
225GEK4NAfter editing a project/jobset, redirect back to the config tab - [19]
CMU3YKOU* Store the release name. - [20]
LBNVQXUB* Build the /build stuff in a separate controller. - [21]
7YBYT2LQ - [22]
LGNML7VJDon't use a prepared statement for the active build steps query - [23]
BD3GRK4B* Get rid of "positive failures" and separate log phases. - [24]
BK24VA6Q* for git inputs, check latest revision of branch (defaults to master for now), if there is change, only use input if last checkout was > hour ago. - [25]
ODNCGFQ5* Improved the navigation bar: don't include all projects (since that - [26]
3PNG7NIBRemove trailing whitespace - [27]
CLJQCY2X* Store info about all the build actions and allow them to be - [28]
P73KM42LUpdate the list of SQL files to be installed. - [29]
SU566LI3* Sort releases. - [30]
SHBLLAVH* More global substitution. - [31]
6LTPI6B2 - [32]
SSMN5MPTRemove dead code - [33]
XJRJ4J7MAdd user registration - [34]
6LETVKRAAfter editing a jobset, push it to the front of the evaluation queue - [35]
5NO7NCKT* Refactoring. - [36]
DHMTPGST* Ran update-dbix. - [37]
SB2V735VKeep track of the database schema version - [38]
UMFB2767Hydra/64: Leaving number of builds empty gives DBIx error - [39]
Y6AHH4THRemove the logfile and logSize columns from the database - [40]
QMPX3JDF* hydra: show queue optimization - [41]
JZVRK5QJGroup some menu items together under a "Status" menu - [42]
QMW24O5SAdd support for Guile & Guix. - [43]
Z6MDQIGO* A quick (non-Web 2.0) interface to manually add builds to a release. - [44]
S5PV6IIM* Represent jobs explicitly in the DB. - [45]
TP3PFR5K - [46]
RJICSUYG* Align the apply/delete buttons. - [47]
GPHLV42M* Allow the description of a release member to be edited, and to - [48]
3ZCEPLNO - [49]
CG2TIX5Egrr, typo - [50]
LMETCA7GCleanup - [51]
JY7BXXOPSplit viewing and editing a project - [52]
LSZLZHJYAllow users to edit their own settings - [53]
AKAZKCR6* At top-level and for each project, provide two channels: "latest" - [54]
P5X4P6VK* Renaming "release sets" to "views" (not finished yet). Having - [55]
ZWCTAZGLadded newsitems, added some admin options to clear various caches. - [56]
YPDYBK5GShow dependencies as a tree rather than a list - [57]
5QE3TIHPhydra: add status icon per jobset on project page - [58]
L2E6EVE2* Merged the Build and Job tables. - [59]
FYWE74AA - [60]
BTUDUY6F* Provide some redirects to the latest successful build for a job (or - [61]
OX6NYJDVSplit viewing and editing a jobset - [62]
UXXFND4UAdd a redirect to the latest finished jobset evaluation - [63]
XEKWCIDRmissing case for hg input type - [64]
NABL63FI* hydra: project members can do stuff that the owner can do - [65]
J5UVLXOK* Start of a basic Catalyst web interface. - [66]
EFWN7JBV* Added a status page that shows all the currently executing build steps. - [67]
BOAFFKUXActive build steps: Make the rows clickable - [68]
BHZXGT2H* Channels: provide an index page that lists all the packages in the - [69]
RSEGBU6CHydra/20: Jobset clone feature - [70]
2NGV7NYNDrop unused "tag" column - [71]
FHF6IZJQ* Basic release management: releases are now dynamically computed as - [72]
QTC3SYBMJobset page: Load the jobs and status tabs on demand - [73]
AHTEIK7G* Added a maintainers field to the Builds table. - [74]
MOX7XJ2EMerge the BuildSchedulingInfo table into the Builds table - [75]
NRSKJPP4makeLink -> menuItem - [76]
HQGXL4MXAdd validation for project and jobset names - [77]
NUIKDEHL* A quick hack to list the contents of various types of files (RPM, - [78]
YAPITGB3* Boolean inputs. - [79]
SMM4HQTP* Put actions related to builds under /build (e.g. /log/<buildid> - [80]
KOTB7BKV - [81]
RFE6T5LG* Store jobset evaluations in the database explicitly. This includes - [82]
4JS4DWHDAll/recent builds -> Latest builds - [83]
LC64D4PUCorrectly redirect to the referring page when logging in - [84]
HB3OHPJLhydra: in case of cached build, add link to build that built the storepath - [85]
JM3DPYOMgenerated schema with new dbix class schema loader, grrrrrr - [86]
75XUS62Y* Added a page to quickly see all failed builds and failed evaluations - [87]
LZO3C2KI* Hack around those SQLite timeouts: just retry the transaction. - [88]
7Z3YOKCV* PROCESS -> INCLUDE in most cases. INCLUDE does proper scoping of - [89]
FD76WVTQmissing file - [90]
KAZWI5G4* hydra: buildpage, show changes since last build/successful build - [91]
L755DXLC - [92]
QQ4STW3Smissing file - [93]
WRIU3S5E* UI for cloning builds (not functional yet). - [94]
HEZ2V5NUorder jobset in project view - [95]
BPVJBR2P* Only put Nix builds in the global channel. - [96]
V4RNHJNR* Add a link to each project's homepage. Suggested by karltk. - [97]
2WUNXJGWHydra/26: Go back to using "svn export" as default for svn, added svn-checkout type for jobset which need .svn dirs. export is much more efficient - [98]
ZTQEU5QSHydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet) - [99]
T7Z63K6Thydra: moves jobsetOverview sub - [100]
CHCVBZ3W* Slight cleanup. - [101]
7UJ5YV4V* Provide a channel for each project containing all the latest - [102]
XDDCO6CH* hydra: add dependency list with links to logfiles - [103]
HSVVEKTY* Start of a JSON API to get information about a specific build. - [104]
WYN733ST* Store build duration, handle cached builds. - [105]
GWCV3TQV* BuildInputs table: link to dependencies, include store paths. - [106]
N45RZUQ6Reduce I/O in build listings by only fetching required columns - [107]
OEPUOUNBUsing twitter bootstrap for more consistent looks for Hydra - [108]
G2T4WAHIStore the inputs of each evaluation in the database - [109]
EYNG4EL4* Regenerate the bindings from a clean sqlite database. - [110]
RI4S7SYT* Job status: show the active jobs. - [111]
GJFYEU3S* Nix now stores logs by default as bzip2, make sure the build page uncompresses before showing. - [112]
3SQCOHZN* minor performance tweaks - [113]
PZL3SZM3Give every page a consistent title - [114]
36M6DGITShow the runtime/build dependencies in the build page - [115]
VH5ZABDRAdd a page to show the latest evaluations for the entire server - [116]
LCKWLQW3* In Sqlite "release" is now a keyword, so use "release_" instead. - [117]
SHYRGAWZhydra: when no external url is given for diff's of git/hg input, revert to a diff done on a local available clone - [118]
YS3AVMLCRemove buildtime and runtime dependency graph. It is useless on normal derivations. - [119]
FU4GO5VNOn build pages, provide a link to the build's first eval - [120]
BVOPAMLS - [121]
PHX2HIVG* Store info about the build inputs in the build record. - [122]
TQKGQ5R3 - [123]
CS7T2XFI - [124]
ZILILXXK* Allow scheduled builds to be cancelled. They're not removed from - [125]
67P45PY4 - [126]
RU7AQO7U* Role-based access control. Only admins can create projects. Only - [127]
UWVMQIAC* Refactoring. - [128]
B72GLND4 - [129]
BHJ62LYE* Allow authorised users to create projects. - [130]
7ZSVXUGFsequence fix for postgresql - [131]
XJFHFZCA* Provide some redirects to build products by type so that we can for - [132]
JJT5QG3Kremove revision from cached cvs inputs, and added missing files - [133]
A52HEFHQ* Allow builds to be restarted (if they failed with a transient error, - [134]
AWYTL4HO* Don't show platforms that are not included in the current jobset. - [135]
3HCBU2FA - [136]
YFPZ46YK* hydra: added variant of build input type, 'build output (same system)' to allow better continous integration in one jobset for multiple system. it makes sure that the system of the build that is passed as input for a job has the same system as the job. - [137]
4D4U5IPY* Allow jobsets to be disabled. - [138]
37R34XJO* Negative caching: don't perform a build if a dependency already - [139]
FPK5LF53* Put the project-related actions in a separate controller. Put the - [140]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [141]
TWVSALRL* Allow the maximum number of concurrent builds per platform to be - [142]
YTZOC7C5* Editing of jobset inputs. - [143]
DVNWJXWW* Generic declaration of build products. - [144]
OD5FSS5A* Quick hack to allow viewing of dependency graphs (via nix-store -q - [145]
6BLUKEQ2* Caching of "path" inputs, and fake a revision number for those. - [146]
3HZY24CX* Make jobsets viewable under - [147]
JTRG7RDQadd support for git as jobinput - [148]
6FRLEP4Pfirst try for timeline of last 24 hours in hydra - [149]
FGQPXZIXhydra: make nr of build to keep configurable per jobset - [150]
R5D7DZPE - [151]
BKOIYITRadded some json responses - [152]
VS3OUK7Dif no emailoverride specified, use empty string - [153]
JLDUSNUO* Unify rendering of finished and scheduled builds. - [154]
BN2MO2MPfix redirect after login - [155]
HPEG2RHVMerge the BuildResultInfo table into the Builds table - [156]
U4TD3AIQAdd support for viewing jobset evaluations - [157]
3Y7AFJSS* Support linking to the latest job in a view for a specific platform, e.g. - [158]
XHVZXX6N - [159]
X27GNHDV* Basic job info in the database. - [160]
G5ZR3ZVZhydra: put contents links into html, add links to files from contents page - [161]
2BUX775I* More release -> view. - [162]
VJHIHMEH* Store the meta.longDescription and meta.license attributes in the - [163]
KPZNJ33U* In views, support selecting a job that doesn't depend on the - [164]
TLZ2SPBR - [165]
HXBXDEFKSpeed up channel processing - [166]
QTFVCDIFadded hide feature for project/jobset - [167]
DWIA5CDJ* Make download-by-type more deterministic when there are multiple - [168]
Q4VDOA76Replace last 5 builds on jobset page with last 5 evaluations. Moved hide/unhide and evaluate options to jobset topmenu. - [169]
PCKLFRT5Support push notification of repository changes - [170]
VG4QG336Remove tablesorter - [171]
AZCCANUBMissing part of aaacf9eda36f5cdcc77cec20d6f49fbb6f925105 - [172]
H7CNGK4O* Log evaluation errors etc. in the DB. - [173]
7ZVZJK54Re-enable the "Related Builds" tab - [174]
CQTN62OHDie tabs die - [175]
KN3VYE5P* Cleaned up the foreign key constraints. - [176]
6QRHXIM3* Speed up the jobset index page. Especially the query to get the - [177]
JARRBLZDBootstrapify the Hydra forms (except the project and jobset edit pages) - [178]
S66BOMVU* Added authentication. - [179]
4UUKWXDFJobset page: Show last evaluation time - [180]
FYO6NECEhydra - [181]
H5REHM3M - [182]
ZRRPBEI4Make jobset deletion consistent with project deletion - [183]
CFQCNNDRuse build timestamp as last-modified header on download - [184]
ZEHSSVFG - [185]
YTIDBFGUDrop unused "disabled" columns - [186]
PMNWRTGJAdd multiple output support - [187]
GNIEG2GC* Disambiguate jobs by jobset name. I.e. jobs with the same name in - [188]
ZVTSOVHN* Support Subversion checkouts. - [189]
SJLEZFC4check getHydraPath in stead of Envvar HYDRA_DBI directly - [190]
NYC3LZKH* Generate NAR archives on the fly. Necessary for producing channels - [191]
NEWDDAOF* Allow users to change the value of a build's "keep" flag, which - [192]
ECBA3GQO* Make the schema class names match the case of the SQL table names. - [193]
S6OISBQ3* Mark the "current" builds in a jobset, i.e. those corresponding to - [194]
ND75XNSQAllow showing all evaluations that contain a given build - [195]
AS2OXLRM* Editing releases. - [196]
KXGOUX7P* Creating releases. - [197]
QZLMDKMU* Queue runner: don't start scheduled builds builds if they belong to - [198]
YJYBKPZ5Hydra/33: 'Sign in' should return to the referring page - [199]
IK53RV4V - [200]
TNMOG2ZQIndentation - [201]
PVIRRARJTurn hiding/unhiding a jobset into a checkbox - [202]
M552HLIA* Support variant builds. - [203]
D3DIBMOK* For products that are directories (like manuals), allow a default - [204]
AKAXJDMW* Disable the statistics on the project, jobset and job pages for now - [205]
3KU4L7L3remove buildonlylatest propery, which was committed by accident - [206]
OR5SJ42YShow releases in a tab on the project page - [207]
3E6IP3R3* Add the name of the jobset to ReleaseSetJobs, otherwise we can't - [208]
RBNQKATL* Adding persistant releases. A release is a named set of builds. - [209]
6F4UNDTC* Provide access to the raw, non-pretty-printed logfiles. - [210]
TJPIS3UPhydra: minor improvements in hydra ui - [211]
A6XVP6FEMake the hide/unhide actions a checkbox in the project settings - [212]
XKXMU5PVEllipsize long jobset/job names to prevent bootstrap navbar breakage - [*]
T4LLYESZ* Nix expression for building Hydra. - [*]
7C6HSXUQ* Start of a regression test for Hydra. - [*]
YQWH4POV* Simplify. - [*]
D5QIOJGP* Move everything up one directory. - [*]
EVZTBKEFAdd simpler push support for GitHub - [*]
JFZNAYJX* Showing releases. - [*]
MVB7RRLT* Move NARs from the NixChannel controller to the Root controller and - [*]
5SHCWE7X* Prevent repeated evaluation of a jobset with the same inputs. This - [*]
FV2M6MOThydra: use autoconf/-make - [*]
QL55ECJ6- adapted ui for hydra, more in line with nixos.org website - [*]
G2ZB6464first test, not yet in buildprocess
Change contents
- edit in release.nix at line 74
CatalystActionREST - edit in release.nix at line 171
tests.api = genAttrs' (system:with import <nixos/lib/testing.nix> { inherit system; };let hydra = builtins.getAttr system build; in # build.${system}simpleTest {machine ={ config, pkgs, ... }:{ services.postgresql.enable = true;services.postgresql.package = pkgs.postgresql92;environment.systemPackages = [ hydra pkgs.perlPackages.LWP pkgs.perlPackages.JSON ];virtualisation.memorySize = 2048;};testScript =''$machine->waitForJob("postgresql");# Initialise the database and the state.$machine->mustSucceed( "createdb -O root hydra", "psql hydra -f ${hydra}/libexec/hydra/sql/hydra-postgresql.sql", "mkdir /var/lib/hydra", "echo \"insert into Users(userName, emailAddress, password) values('root', 'e.dolstra\@tudelft.nl', '\$(echo -n foobar | sha1sum | cut -c1-40)');\" | psql hydra", "echo \"insert into UserRoles(userName, role) values('root', 'admin');\" | psql hydra", "mkdir /run/jobset", "chmod 755 /run/jobset", "cp ${./tests/api-test.nix} /run/jobset/default.nix", "chmod 644 /run/jobset/default.nix");# Start the web interface.$machine->mustSucceed("NIX_STORE_DIR=/run/nix NIX_LOG_DIR=/run/nix/var/log/nix NIX_STATE_DIR=/run/nix/var/nix HYDRA_DATA=/var/lib/hydra HYDRA_DBI='dbi:Pg:dbname=hydra;user=root;' LOGNAME=root DBIC_TRACE=1 hydra-server -d >&2 &");$machine->waitForOpenPort("3000");$machine->mustSucceed("perl ${./tests/api-test.pl} >&2");'';}); - replacement in src/lib/Hydra/Base/Controller/ListBuilds.pm at line 104
$c->res->redirect($c->uri_for($c->controller('Build')->action_for("view_build"), [$latest->id], @rest));$c->res->redirect($c->uri_for($c->controller('Build')->action_for("build"), [$latest->id], @rest)); - replacement in src/lib/Hydra/Base/Controller/ListBuilds.pm at line 119
$c->res->redirect($c->uri_for($c->controller('Build')->action_for("view_build"), [$latest->id], @rest));$c->res->redirect($c->uri_for($c->controller('Build')->action_for("build"), [$latest->id], @rest)); - replacement in src/lib/Hydra/Base/Controller/NixChannel.pm at line 5
use base 'Catalyst::Controller';use base 'Hydra::Base::Controller::REST'; - file addition: REST.pm[217.90]
package Hydra::Base::Controller::REST;use strict;use warnings;use base 'Catalyst::Controller::REST';__PACKAGE__->config(map => {'text/html' => [ 'View', 'TT' ]},default => 'text/html','stash_key' => 'resource',);sub begin { my ( $self, $c ) = @_; $c->forward('Hydra::Controller::Root::begin'); }sub end { my ( $self, $c ) = @_; $c->forward('Hydra::Controller::Root::end'); }1; - file addition: Component[217.53]
- file addition: ToJSON.pm[0.2446]
use utf8;package Hydra::Component::ToJSON;use strict;use warnings;use base 'DBIx::Class';sub TO_JSON {my $self = shift;my $json = { $self->get_columns };my $rs = $self->result_source;my @relnames = $rs->relationships;RELLOOP: foreach my $relname (@relnames) {my $relinfo = $rs->relationship_info($relname);next unless defined $relinfo->{attrs}->{accessor};my $accessor = $relinfo->{attrs}->{accessor};if ($accessor eq "single" and exists $self->{_relationship_data}{$relname}) {$json->{$relname} = $self->$relname->TO_JSON;} else {unless (defined $self->{related_resultsets}{$relname}) {my $cond = $relinfo->{cond};if (ref $cond eq 'HASH') {foreach my $k (keys %{$cond}) {my $v = $cond->{$k};$v =~ s/^self\.//;next RELLOOP unless $self->has_column_loaded($v);}} #!!! TODO: Handle ARRAY conditions}if (defined $self->related_resultset($relname)->get_cache) {if ($accessor eq "multi") {$json->{$relname} = [ map { $_->TO_JSON } $self->$relname ];} else {$json->{$relname} = $self->$relname->TO_JSON;}}}}return $json;}1; - replacement in src/lib/Hydra/Controller/API.pm at line 6
use base 'Catalyst::Controller';use base 'Hydra::Base::Controller::REST'; - edit in src/lib/Hydra/Controller/API.pm at line 313
$self->status_ok($c,entity => { jobsetsTriggered => $c->stash->{json}->{jobsetsTriggered} }); - replacement in src/lib/Hydra/Controller/Build.pm at line 17
sub build : Chained('/') PathPart CaptureArgs(1) {sub buildChain :Chained('/') :PathPart('build') :CaptureArgs(1) { - replacement in src/lib/Hydra/Controller/Build.pm at line 53
sub view_build : Chained('build') PathPart('') Args(0) {sub build :Chained('buildChain') :PathPart('') :Args(0) :ActionClass('REST') { }sub build_GET { - edit in src/lib/Hydra/Controller/Build.pm at line 101
$self->status_ok($c,entity => $c->model('DB::Builds')->find($build->id,{columns => ['id','finished','timestamp','buildstatus','job','project','jobset','starttime','stoptime',]})); - replacement in src/lib/Hydra/Controller/Build.pm at line 120
sub view_nixlog : Chained('build') PathPart('nixlog') {sub view_nixlog : Chained('buildChain') PathPart('nixlog') { - replacement in src/lib/Hydra/Controller/Build.pm at line 132
sub view_log : Chained('build') PathPart('log') {sub view_log : Chained('buildChain') PathPart('log') { - replacement in src/lib/Hydra/Controller/Build.pm at line 197
sub download : Chained('build') PathPart {sub download : Chained('buildChain') PathPart { - replacement in src/lib/Hydra/Controller/Build.pm at line 244
sub download_by_type : Chained('build') PathPart('download-by-type') {sub download_by_type : Chained('buildChain') PathPart('download-by-type') { - replacement in src/lib/Hydra/Controller/Build.pm at line 259
sub contents : Chained('build') PathPart Args(1) {sub contents : Chained('buildChain') PathPart Args(1) { - replacement in src/lib/Hydra/Controller/Build.pm at line 363
sub build_deps : Chained('build') PathPart('build-deps') {sub build_deps : Chained('buildChain') PathPart('build-deps') { - replacement in src/lib/Hydra/Controller/Build.pm at line 376
sub runtime_deps : Chained('build') PathPart('runtime-deps') {sub runtime_deps : Chained('buildChain') PathPart('runtime-deps') { - replacement in src/lib/Hydra/Controller/Build.pm at line 390
sub nix : Chained('build') PathPart('nix') CaptureArgs(0) {sub nix : Chained('buildChain') PathPart('nix') CaptureArgs(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 410
sub restart : Chained('build') PathPart Args(0) {sub restart : Chained('buildChain') PathPart Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 425
$c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));$c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures)); - replacement in src/lib/Hydra/Controller/Build.pm at line 429
sub cancel : Chained('build') PathPart Args(0) {sub cancel : Chained('buildChain') PathPart Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 455
$c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));$c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures)); - replacement in src/lib/Hydra/Controller/Build.pm at line 459
sub keep : Chained('build') PathPart Args(1) {sub keep : Chained('buildChain') PathPart Args(1) { - replacement in src/lib/Hydra/Controller/Build.pm at line 478
$c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));$c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures)); - replacement in src/lib/Hydra/Controller/Build.pm at line 482
sub add_to_release : Chained('build') PathPart('add-to-release') Args(0) {sub add_to_release : Chained('buildChain') PathPart('add-to-release') Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 507
$c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));$c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures)); - replacement in src/lib/Hydra/Controller/Build.pm at line 511
sub clone : Chained('build') PathPart('clone') Args(0) {sub clone : Chained('buildChain') PathPart('clone') Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 522
sub clone_submit : Chained('build') PathPart('clone/submit') Args(0) {sub clone_submit : Chained('buildChain') PathPart('clone/submit') Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 588
sub get_info : Chained('build') PathPart('api/get-info') Args(0) {sub get_info : Chained('buildChain') PathPart('api/get-info') Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 599
sub evals : Chained('build') PathPart('evals') Args(0) {sub evals : Chained('buildChain') PathPart('evals') Args(0) { - replacement in src/lib/Hydra/Controller/Build.pm at line 617
sub reproduce : Chained('build') PathPart('reproduce') Args(0) {sub reproduce : Chained('buildChain') PathPart('reproduce') Args(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 10
sub jobset : Chained('/') PathPart('jobset') CaptureArgs(2) {sub jobsetChain :Chained('/') :PathPart('jobset') :CaptureArgs(2) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 13
my $project = $c->model('DB::Projects')->find($projectName)or notFound($c, "Project $projectName doesn't exist.");my $project = $c->model('DB::Projects')->find($projectName);if ($project) {$c->stash->{project} = $project; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 18
$c->stash->{project} = $project;$c->stash->{jobset_} = $project->jobsets->search({'me.name' => $jobsetName});my $jobset = $c->stash->{jobset_}->single; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 21[19.1]→[19.851:983](∅→∅),[19.564]→[19.851:983](∅→∅),[19.983]→[19.637:699](∅→∅),[19.637]→[19.637:699](∅→∅)
$c->stash->{jobset_} = $project->jobsets->search({name => $jobsetName});$c->stash->{jobset} = $c->stash->{jobset_}->singleor notFound($c, "Jobset $jobsetName doesn't exist.");if ($jobset) {$c->stash->{jobset} = $jobset;} else {if ($c->action->name eq "jobset" and $c->request->method eq "PUT") {$c->stash->{jobsetName} = $jobsetName;} else {$self->status_not_found($c,message => "Jobset $jobsetName doesn't exist.");$c->detach;}}} else {$self->status_not_found($c,message => "Project $projectName doesn't exist.");$c->detach;} - replacement in src/lib/Hydra/Controller/Jobset.pm at line 44
sub index : Chained('jobset') PathPart('') Args(0) {sub jobset :Chained('jobsetChain') :PathPart('') :Args(0) :ActionClass('REST::ForBrowsers') { }sub jobset_GET { - edit in src/lib/Hydra/Controller/Jobset.pm at line 51
my $projectName = $c->stash->{project}->name;my $jobsetName = $c->stash->{jobset}->name; - edit in src/lib/Hydra/Controller/Jobset.pm at line 54
$self->status_ok($c,entity => $c->stash->{jobset_}->find({}, {columns => ['me.name','me.project','me.errormsg','jobsetinputs.name',{'jobsetinputs.jobsetinputalts.altnr' => 'jobsetinputalts.altnr','jobsetinputs.jobsetinputalts.value' => 'jobsetinputalts.value'}],join => { 'jobsetinputs' => 'jobsetinputalts' },collapse => 1,order_by => "me.name"})); - edit in src/lib/Hydra/Controller/Jobset.pm at line 75
sub jobset_PUT {my ($self, $c) = @_; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 78
sub jobs_tab : Chained('jobset') PathPart('jobs-tab') Args(0) {requireProjectOwner($c, $c->stash->{project});if (defined $c->stash->{jobset}) {error($c, "Cannot rename jobset `$c->stash->{params}->{oldName}' over existing jobset `$c->stash->{jobset}->name") if defined $c->stash->{params}->{oldName} and $c->stash->{params}->{oldName} ne $c->stash->{jobset}->name;txn_do($c->model('DB')->schema, sub {updateJobset($c, $c->stash->{jobset});});if ($c->req->looks_like_browser) {$c->res->redirect($c->uri_for($self->action_for("jobset"),[$c->stash->{project}->name, $c->stash->{jobset}->name]) . "#tabs-configuration");} else {$self->status_no_content($c);}} elsif (defined $c->stash->{params}->{oldName}) {my $jobset = $c->stash->{project}->jobsets->find({'me.name' => $c->stash->{params}->{oldName}});if (defined $jobset) {txn_do($c->model('DB')->schema, sub {updateJobset($c, $jobset);});my $uri = $c->uri_for($self->action_for("jobset"), [$c->stash->{project}->name, $jobset->name]);if ($c->req->looks_like_browser) {$c->res->redirect($uri . "#tabs-configuration");} else {$self->status_created($c,location => "$uri",entity => { name => $jobset->name, uri => "$uri", type => "jobset" });}} else {$self->status_not_found($c,message => "Jobset $c->stash->{params}->{oldName} doesn't exist.");}} else {my $exprType =$c->stash->{params}->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix";error($c, "Invalid jobset name: ‘$c->stash->{jobsetName}’") if $c->stash->{jobsetName} !~ /^$jobsetNameRE$/;my $jobset;txn_do($c->model('DB')->schema, sub {# Note: $jobsetName is validated in updateProject, which will# abort the transaction if the name isn't valid.$jobset = $c->stash->{project}->jobsets->create({name => $c->stash->{jobsetName}, nixexprinput => "", nixexprpath => "", emailoverride => ""});updateJobset($c, $jobset);});my $uri = $c->uri_for($self->action_for("jobset"), [$c->stash->{project}->name, $jobset->name]);if ($c->req->looks_like_browser) {$c->res->redirect($uri . "#tabs-configuration");} else {$self->status_created($c,location => "$uri",entity => { name => $jobset->name, uri => "$uri", type => "jobset" });}}}sub jobs_tab : Chained('jobsetChain') PathPart('jobs-tab') Args(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 175
sub status_tab : Chained('jobset') PathPart('status-tab') Args(0) {sub status_tab : Chained('jobsetChain') PathPart('status-tab') Args(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 212
sub get_builds : Chained('jobset') PathPart('') CaptureArgs(0) {sub get_builds : Chained('jobsetChain') PathPart('') CaptureArgs(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 226
sub edit : Chained('jobset') PathPart Args(0) {sub edit : Chained('jobsetChain') PathPart Args(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 236
sub submit : Chained('jobset') PathPart Args(0) {sub submit : Chained('jobsetChain') PathPart Args(0) { - edit in src/lib/Hydra/Controller/Jobset.pm at line 239
requireProjectOwner($c, $c->stash->{project}); - replacement in src/lib/Hydra/Controller/Jobset.pm at line 247
return $c->res->redirect($c->uri_for($c->controller('Project')->action_for("view"), [$c->stash->{project}->name]));return $c->res->redirect($c->uri_for($c->controller('Project')->action_for("project"), [$c->stash->{project}->name])); - replacement in src/lib/Hydra/Controller/Jobset.pm at line 250[19.17]→[19.129:171](∅→∅),[19.866]→[19.129:171](∅→∅),[19.171]→[19.908:1026](∅→∅),[19.908]→[19.908:1026](∅→∅),[19.1026]→[18.0:91](∅→∅)
txn_do($c->model('DB')->schema, sub {updateJobset($c, $c->stash->{jobset});});$c->res->redirect($c->uri_for($self->action_for("index"),[$c->stash->{project}->name, $c->stash->{jobset}->name]) . "#tabs-configuration");my $newName = trim $c->stash->{params}->{name};my $oldName = trim $c->stash->{jobset}->name;unless ($oldName eq $newName) {$c->stash->{params}->{oldName} = $oldName;$c->stash->{jobsetName} = $newName;undef $c->stash->{jobset};}jobset_PUT($self, $c); - replacement in src/lib/Hydra/Controller/Jobset.pm at line 265
my $nixExprPath = trim $c->request->params->{"nixexprpath"};my $nixExprPath = trim $c->stash->{params}->{"nixexprpath"}; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 268
my $nixExprInput = trim $c->request->params->{"nixexprinput"};my $nixExprInput = trim $c->stash->{params}->{"nixexprinput"}; - edit in src/lib/Hydra/Controller/Jobset.pm at line 272[19.1352]→[19.1352:1692](∅→∅),[19.1692]→[19.0:112](∅→∅),[19.112]→[2.0:140](∅→∅),[2.140]→[19.50:133](∅→∅),[19.1858]→[19.50:133](∅→∅),[19.133]→[19.1889:1927](∅→∅),[19.155]→[19.1889:1927](∅→∅),[19.1889]→[19.1889:1927](∅→∅)
}sub checkInput {my ($c, $baseName) = @_;my $inputName = trim $c->request->params->{"input-$baseName-name"};error($c, "Invalid input name: $inputName") unless $inputName =~ /^[[:alpha:]]\w*$/;my $inputType = trim $c->request->params->{"input-$baseName-type"};error($c, "Invalid input type: $inputType") unless$inputType eq "svn" || $inputType eq "svn-checkout" || $inputType eq "hg" || $inputType eq "tarball" ||$inputType eq "string" || $inputType eq "path" || $inputType eq "boolean" || $inputType eq "bzr" || $inputType eq "bzr-checkout" ||$inputType eq "git" || $inputType eq "build" || $inputType eq "sysbuild" ;return ($inputName, $inputType); - replacement in src/lib/Hydra/Controller/Jobset.pm at line 287
my $jobsetName = trim $c->request->params->{"name"};my $jobsetName = $c->stash->{jobsetName} or $jobset->name; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 293
$c->request->params->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix";$c->stash->{params}->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix"; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 299
, description => trim($c->request->params->{"description"}), description => trim($c->stash->{params}->{"description"}) - replacement in src/lib/Hydra/Controller/Jobset.pm at line 302[19.2272]→[19.47:191](∅→∅),[19.191]→[19.0:76](∅→∅),[19.81]→[19.0:76](∅→∅),[19.76]→[19.0:67](∅→∅),[19.67]→[11.0:141](∅→∅)
, enabled => defined $c->request->params->{enabled} ? 1 : 0, enableemail => defined $c->request->params->{enableemail} ? 1 : 0, emailoverride => trim($c->request->params->{emailoverride}) || "", hidden => defined $c->request->params->{visible} ? 0 : 1, keepnr => int(trim($c->request->params->{keepnr})) || 3, checkinterval => int(trim($c->request->params->{checkinterval})), enabled => defined $c->stash->{params}->{enabled} ? 1 : 0, enableemail => defined $c->stash->{params}->{enableemail} ? 1 : 0, emailoverride => trim($c->stash->{params}->{emailoverride}) || "", hidden => defined $c->stash->{params}->{visible} ? 0 : 1, keepnr => int(trim($c->stash->{params}->{keepnr})) || 3, checkinterval => int(trim($c->stash->{params}->{checkinterval})) - edit in src/lib/Hydra/Controller/Jobset.pm at line 311
my %inputNames; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 312
foreach my $param (keys %{$c->request->params}) {next unless $param =~ /^input-(\w+)-name$/;my $baseName = $1;next if $baseName eq "template";unless (defined $c->stash->{params}->{inputs}) {$c->stash->{params}->{inputs} = {};foreach my $param (keys %{$c->stash->{params}}) {next unless $param =~ /^input-(\w+)-name$/;my $baseName = $1;next if $baseName eq "template";$c->stash->{params}->{inputs}->{$c->stash->{params}->{$param}} = { type => $c->stash->{params}->{"input-$baseName-type"}, values => $c->stash->{params}->{"input-$baseName-values"} };unless ($baseName =~ /^\d+$/) { # non-numeric base name is an existing entry$c->stash->{params}->{inputs}->{$c->stash->{params}->{$param}}->{oldName} = $baseName;}}} - replacement in src/lib/Hydra/Controller/Jobset.pm at line 325
my ($inputName, $inputType) = checkInput($c, $baseName);foreach my $inputName (keys %{$c->stash->{params}->{inputs}}) {my $inputData = $c->stash->{params}->{inputs}->{$inputName};error($c, "Invalid input name: $inputName") unless $inputName =~ /^[[:alpha:]]\w*$/; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 329
$inputNames{$inputName} = 1;my $inputType = $inputData->{type};error($c, "Invalid input type: $inputType") unless$inputType eq "svn" || $inputType eq "svn-checkout" || $inputType eq "hg" || $inputType eq "tarball" ||$inputType eq "string" || $inputType eq "path" || $inputType eq "boolean" || $inputType eq "bzr" || $inputType eq "bzr-checkout" ||$inputType eq "git" || $inputType eq "build" || $inputType eq "sysbuild" ; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 336
if ($baseName =~ /^\d+$/) { # numeric base name is auto-generated, i.e. a new entry$input = $jobset->jobsetinputs->create(unless (defined $inputData->{oldName}) {$input = $jobset->jobsetinputs->update_or_create( - replacement in src/lib/Hydra/Controller/Jobset.pm at line 342
$input = ($jobset->jobsetinputs->search({name => $baseName}))[0];$input = ($jobset->jobsetinputs->search({name => $inputData->{oldName}}))[0]; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 350
my $values = $c->request->params->{"input-$baseName-values"};my $values = $inputData->{values}; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 363
$input->delete unless defined $inputNames{$input->name};$input->delete unless defined $c->stash->{params}->{inputs}->{$input->name}; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 368
sub clone : Chained('jobset') PathPart('clone') Args(0) {sub clone : Chained('jobsetChain') PathPart('clone') Args(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 378
sub clone_submit : Chained('jobset') PathPart('clone/submit') Args(0) {sub clone_submit : Chained('jobsetChain') PathPart('clone/submit') Args(0) { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 385
my $newJobsetName = trim $c->request->params->{"newjobset"};my $newJobsetName = trim $c->stash->{params}->{"newjobset"}; - replacement in src/lib/Hydra/Controller/Jobset.pm at line 412
sub evals : Chained('jobset') PathPart('evals') Args(0) {sub evals :Chained('jobsetChain') :PathPart('evals') :Args(0) :ActionClass('REST') { }sub evals_GET { - replacement in src/lib/Hydra/Controller/Jobset.pm at line 428
$c->stash->{evals} = getEvals($self, $c, $evals, ($page - 1) * $resultsPerPage, $resultsPerPage)my $offset = ($page - 1) * $resultsPerPage;$c->stash->{evals} = getEvals($self, $c, $evals, $offset, $resultsPerPage);my %entity = (evals => [ $evals->search({ 'me.hasnewbuilds' => 1 }, {columns => ['me.hasnewbuilds','me.id','jobsetevalinputs.name','jobsetevalinputs.altnr','jobsetevalinputs.revision','jobsetevalinputs.type','jobsetevalinputs.uri','jobsetevalinputs.dependency','jobsetevalmembers.build',],join => [ 'jobsetevalinputs', 'jobsetevalmembers' ],collapse => 1,rows => $resultsPerPage,offset => $offset,order_by => "me.id DESC",}) ],first => "?page=1",last => "?page=" . POSIX::ceil($c->stash->{total}/$resultsPerPage));if ($page > 1) {$entity{previous} = "?page=" . ($page - 1);}if ($page < POSIX::ceil($c->stash->{total}/$resultsPerPage)) {$entity{next} = "?page=" . ($page + 1);}$self->status_ok($c,entity => \%entity); - replacement in src/lib/Hydra/Controller/Jobset.pm at line 466
sub latest_eval : Chained('jobset') PathPart('latest-eval') {sub latest_eval : Chained('jobsetChain') PathPart('latest-eval') { - replacement in src/lib/Hydra/Controller/Project.pm at line 10
sub project : Chained('/') PathPart('project') CaptureArgs(1) {sub projectChain :Chained('/') :PathPart('project') :CaptureArgs(1) { - replacement in src/lib/Hydra/Controller/Project.pm at line 13
my $project = $c->model('DB::Projects')->find($projectName)or notFound($c, "Project $projectName doesn't exist.");my $project = $c->model('DB::Projects')->find($projectName, { columns => ["me.name","me.displayName","me.description","me.enabled","me.hidden","me.homepage","owner.username","owner.fullname","views.name","releases.name","releases.timestamp","jobsets.name",], join => [ 'owner', 'views', 'releases', 'jobsets' ], order_by => { -desc => "releases.timestamp" }, collapse => 1 }); - replacement in src/lib/Hydra/Controller/Project.pm at line 28
$c->stash->{project} = $project;if ($project) {$c->stash->{project} = $project;} else {if ($c->action->name eq "project" and $c->request->method eq "PUT") {$c->stash->{projectName} = $projectName;} else {$self->status_not_found($c,message => "Project $projectName doesn't exist.");$c->detach;}} - replacement in src/lib/Hydra/Controller/Project.pm at line 44
sub view : Chained('project') PathPart('') Args(0) {sub project :Chained('projectChain') :PathPart('') :Args(0) :ActionClass('REST::ForBrowsers') { }sub project_GET { - edit in src/lib/Hydra/Controller/Project.pm at line 55
$self->status_ok($c,entity => $c->stash->{project}); - edit in src/lib/Hydra/Controller/Project.pm at line 62
sub project_PUT {my ($self, $c) = @_; - replacement in src/lib/Hydra/Controller/Project.pm at line 65
sub edit : Chained('project') PathPart Args(0) {if (defined $c->stash->{project}) {error($c, "Cannot rename project `$c->stash->{params}->{oldName}' over existing project `$c->stash->{project}->name") if defined $c->stash->{params}->{oldName};requireProjectOwner($c, $c->stash->{project});txn_do($c->model('DB')->schema, sub {updateProject($c, $c->stash->{project});});if ($c->req->looks_like_browser) {$c->res->redirect($c->uri_for($self->action_for("project"), [$c->stash->{project}->name]) . "#tabs-configuration");} else {$self->status_no_content($c);}} elsif (defined $c->stash->{params}->{oldName}) {my $project = $c->model('DB::Projects')->find($c->stash->{params}->{oldName});if (defined $project) {requireProjectOwner($c, $project);txn_do($c->model('DB')->schema, sub {updateProject($c, $project);});my $uri = $c->uri_for($self->action_for("project"), [$project->name]);if ($c->req->looks_like_browser) {$c->res->redirect($uri . "#tabs-configuration");} else {$self->status_created($c,location => "$uri",entity => { name => $project->name, uri => "$uri", type => "project" });}} else {$self->status_not_found($c,message => "Project $c->stash->{params}->{oldName} doesn't exist.");}} else {requireMayCreateProjects($c);error($c, "Invalid project name: ‘$c->stash->{projectName}’") if $c->stash->{projectName} !~ /^$projectNameRE$/;my $project;txn_do($c->model('DB')->schema, sub {# Note: $projectName is validated in updateProject,# which will abort the transaction if the name isn't# valid. Idem for the owner.my $owner = $c->user->username;$project = $c->model('DB::Projects')->create({name => $c->stash->{projectName}, displayname => "", owner => $owner});updateProject($c, $project);});my $uri = $c->uri_for($self->action_for("project"), [$project->name]);if ($c->req->looks_like_browser) {$c->res->redirect($uri . "#tabs-configuration");} else {$self->status_created($c,location => "$uri",entity => { name => $project->name, uri => "$uri", type => "project" });}}}sub edit : Chained('projectChain') PathPart Args(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 141
sub submit : Chained('project') PathPart Args(0) {sub submit : Chained('projectChain') PathPart Args(0) { - edit in src/lib/Hydra/Controller/Project.pm at line 144
requireProjectOwner($c, $c->stash->{project}); - edit in src/lib/Hydra/Controller/Project.pm at line 145
- replacement in src/lib/Hydra/Controller/Project.pm at line 154[19.792]→[19.215:257](∅→∅),[19.2361]→[19.215:257](∅→∅),[19.257]→[19.834:883](∅→∅),[19.2403]→[19.834:883](∅→∅),[19.883]→[19.2455:2463](∅→∅),[19.2455]→[19.2455:2463](∅→∅),[19.2463]→[19.2218:2219](∅→∅),[19.2219]→[18.92:209](∅→∅)
txn_do($c->model('DB')->schema, sub {updateProject($c, $c->stash->{project});});$c->res->redirect($c->uri_for($self->action_for("view"), [$c->stash->{project}->name]) . "#tabs-configuration");my $newName = trim $c->stash->{params}->{name};my $oldName = trim $c->stash->{project}->name;unless ($oldName eq $newName) {$c->stash->{params}->{oldName} = $oldName;$c->stash->{projectName} = $newName;undef $c->stash->{project};}project_PUT($self, $c); - edit in src/lib/Hydra/Controller/Project.pm at line 188[19.3173]→[19.3173:3174](∅→∅),[19.3174]→[19.308:342](∅→∅),[19.342]→[19.3196:3253](∅→∅),[19.3196]→[19.3196:3253](∅→∅),[19.3253]→[19.2230:2231](∅→∅),[19.2231]→[19.1175:1272](∅→∅),[19.3258]→[19.1175:1272](∅→∅)
requireMayCreateProjects($c);my $projectName = trim $c->request->params->{name};error($c, "Invalid project name: ‘$projectName’") if $projectName !~ /^$projectNameRE$/; - replacement in src/lib/Hydra/Controller/Project.pm at line 189[19.1273]→[19.301:343](∅→∅),[19.3258]→[19.301:343](∅→∅),[19.343]→[19.3300:3459](∅→∅),[19.3300]→[19.3300:3459](∅→∅),[19.3459]→[19.343:463](∅→∅),[19.463]→[19.3459:3516](∅→∅),[19.3459]→[19.3459:3516](∅→∅),[19.3516]→[19.464:537](∅→∅),[19.537]→[19.3616:3661](∅→∅),[19.3616]→[19.3616:3661](∅→∅)
txn_do($c->model('DB')->schema, sub {# Note: $projectName is validated in updateProject,# which will abort the transaction if the name isn't# valid. Idem for the owner.my $owner = $c->check_user_roles('admin')? trim $c->request->params->{owner} : $c->user->username;my $project = $c->model('DB::Projects')->create({name => $projectName, displayname => "", owner => $owner});updateProject($c, $project);});$c->stash->{projectName} = trim $c->stash->{params}->{name}; - replacement in src/lib/Hydra/Controller/Project.pm at line 191
$c->res->redirect($c->uri_for($self->action_for("view"), [$projectName]));project_PUT($self, $c); - replacement in src/lib/Hydra/Controller/Project.pm at line 195
sub create_jobset : Chained('project') PathPart('create-jobset') Args(0) {sub create_jobset : Chained('projectChain') PathPart('create-jobset') Args(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 206
sub create_jobset_submit : Chained('project') PathPart('create-jobset/submit') Args(0) {sub create_jobset_submit : Chained('projectChain') PathPart('create-jobset/submit') Args(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 209
requireProjectOwner($c, $c->stash->{project});$c->stash->{jobsetName} = trim $c->stash->{params}->{name}; - replacement in src/lib/Hydra/Controller/Project.pm at line 211[19.2237]→[19.5202:5257](∅→∅),[19.5202]→[19.5202:5257](∅→∅),[19.5257]→[19.545:564](∅→∅),[19.564]→[19.2431:2506](∅→∅),[19.632]→[19.1274:1368](∅→∅),[19.2506]→[19.1274:1368](∅→∅),[19.5257]→[19.1274:1368](∅→∅),[19.1368]→[19.5257:5258](∅→∅),[19.5257]→[19.5257:5258](∅→∅),[19.5258]→[19.344:386](∅→∅),[19.386]→[19.5300:5487](∅→∅),[19.5300]→[19.5300:5487](∅→∅),[19.5487]→[3.0:96](∅→∅),[3.96]→[19.5562:5632](∅→∅),[19.5562]→[19.5562:5632](∅→∅),[19.5632]→[19.2238:2239](∅→∅),[19.2239]→[19.5637:5771](∅→∅),[19.5637]→[19.5637:5771](∅→∅)
my $jobsetName = trim $c->request->params->{name};my $exprType =$c->request->params->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix";error($c, "Invalid jobset name: ‘$jobsetName’") if $jobsetName !~ /^$jobsetNameRE$/;txn_do($c->model('DB')->schema, sub {# Note: $jobsetName is validated in updateProject, which will# abort the transaction if the name isn't valid.my $jobset = $c->stash->{project}->jobsets->create({name => $jobsetName, nixexprinput => "", nixexprpath => "", emailoverride => ""});Hydra::Controller::Jobset::updateJobset($c, $jobset);});$c->res->redirect($c->uri_for($c->controller('Jobset')->action_for("index"),[$c->stash->{project}->name, $jobsetName]));Hydra::Controller::Jobset::jobset_PUT($self, $c); - replacement in src/lib/Hydra/Controller/Project.pm at line 219
if ($c->check_user_roles('admin')) {$owner = trim $c->request->params->{owner};if ($c->check_user_roles('admin') and defined $c->stash->{params}->{owner}) {$owner = trim $c->stash->{params}->{owner}; - replacement in src/lib/Hydra/Controller/Project.pm at line 225
my $projectName = trim $c->request->params->{name};my $projectName = $c->stash->{projectName} or $project->name; - replacement in src/lib/Hydra/Controller/Project.pm at line 228
my $displayName = trim $c->request->params->{displayname};my $displayName = trim $c->stash->{params}->{displayname}; - replacement in src/lib/Hydra/Controller/Project.pm at line 234
, description => trim($c->request->params->{description}), homepage => trim($c->request->params->{homepage}), enabled => defined $c->request->params->{enabled} ? 1 : 0, hidden => defined $c->request->params->{visible} ? 0 : 1, description => trim($c->stash->{params}->{description}), homepage => trim($c->stash->{params}->{homepage}), enabled => defined $c->stash->{params}->{enabled} ? 1 : 0, hidden => defined $c->stash->{params}->{visible} ? 0 : 1 - replacement in src/lib/Hydra/Controller/Project.pm at line 244
sub get_builds : Chained('project') PathPart('') CaptureArgs(0) {sub get_builds : Chained('projectChain') PathPart('') CaptureArgs(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 257
sub create_view_submit : Chained('project') PathPart('create-view/submit') Args(0) {sub create_view_submit : Chained('projectChain') PathPart('create-view/submit') Args(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 277
sub create_view : Chained('project') PathPart('create-view') Args(0) {sub create_view : Chained('projectChain') PathPart('create-view') Args(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 287
sub create_release : Chained('project') PathPart('create-release') Args(0) {sub create_release : Chained('projectChain') PathPart('create-release') Args(0) { - replacement in src/lib/Hydra/Controller/Project.pm at line 295
sub create_release_submit : Chained('project') PathPart('create-release/submit') Args(0) {sub create_release_submit : Chained('projectChain') PathPart('create-release/submit') Args(0) { - replacement in src/lib/Hydra/Controller/Release.pm at line 69
$c->res->redirect($c->uri_for($c->controller('Project')->action_for('view'),$c->res->redirect($c->uri_for($c->controller('Project')->action_for('project'), - replacement in src/lib/Hydra/Controller/Release.pm at line 75
$c->res->redirect($c->uri_for($self->action_for("view"),$c->res->redirect($c->uri_for($self->action_for("project"), - edit in src/lib/Hydra/Controller/Root.pm at line 40
$c->forward('deserialize');$c->stash->{params} = $c->request->data or $c->request->params;unless (defined $c->stash->{params} and %{$c->stash->{params}}) {$c->stash->{params} = $c->request->params;} - edit in src/lib/Hydra/Controller/Root.pm at line 48
sub deserialize :ActionClass('Deserialize') { } - edit in src/lib/Hydra/Controller/Root.pm at line 57
$self->status_ok($c,entity => [$c->model('DB::Projects')->search(isAdmin($c) ? {} : {hidden => 0}, {order_by => 'name',columns => [ 'name', 'displayname' ]})]); - replacement in src/lib/Hydra/Controller/Root.pm at line 67
sub queue :Local {sub queue :Local :Args(0) :ActionClass('REST') { }sub queue_GET { - edit in src/lib/Hydra/Controller/Root.pm at line 72
$c->stash->{queue} = [$c->model('DB::Builds')->search({finished => 0}, { join => ['project'], order_by => ["priority DESC", "id"], columns => [@buildListColumns], '+select' => ['project.enabled'], '+as' => ['enabled'] })]; - edit in src/lib/Hydra/Controller/Root.pm at line 73
$self->status_ok($c,entity => [$c->model('DB::Builds')->search({finished => 0}, { join => ['project'], order_by => ["priority DESC", "id"], columns => [@buildListColumns], '+select' => ['project.enabled'], '+as' => ['enabled'] })]); - edit in src/lib/Hydra/Controller/Root.pm at line 93
- edit in src/lib/Hydra/Controller/Root.pm at line 95
sub status :Local :Args(0) :ActionClass('REST') { } - replacement in src/lib/Hydra/Controller/Root.pm at line 97
sub status :Local {sub status_GET { - replacement in src/lib/Hydra/Controller/Root.pm at line 99
$c->stash->{steps} = [ $c->model('DB::BuildSteps')->search({ 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 },{ join => [ 'build' ], order_by => [ 'machine' ]} ) ];$self->status_ok($c,entity => [ $c->model('DB::BuildSteps')->search({ 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 },{ join => { build => [ 'project', 'job', 'jobset' ] },columns => ['me.machine','me.system','me.stepnr','me.drvpath','me.starttime','build.id',{'build.project.name' => 'project.name','build.jobset.name' => 'jobset.name','build.job.name' => 'job.name'}],order_by => [ 'machine' ]}) ]); - replacement in src/lib/Hydra/Controller/Root.pm at line 224
elsif (scalar @{$c->error}) {if (scalar @{$c->error}) {$c->stash->{resource} = { errors => "$c->error" }; - edit in src/lib/Hydra/Controller/Root.pm at line 234
} elsif (defined $c->stash->{resource} and(ref $c->stash->{resource} eq ref {}) anddefined $c->stash->{resource}->{error}) {$c->stash->{template} = 'error.tt';$c->stash->{httpStatus} =$c->response->status . " " . HTTP::Status::status_message($c->response->status); - edit in src/lib/Hydra/Controller/Root.pm at line 241
$c->forward('serialize'); - edit in src/lib/Hydra/Controller/Root.pm at line 244
sub serialize : ActionClass('Serialize') { } - replacement in src/lib/Hydra/Controller/User.pm at line 6
use base 'Catalyst::Controller';use base 'Hydra::Base::Controller::REST'; - replacement in src/lib/Hydra/Controller/User.pm at line 16
sub login :Local {sub login :Local :Args(0) :ActionClass('REST::ForBrowsers') { }sub login_GET { - replacement in src/lib/Hydra/Controller/User.pm at line 21
my $username = $c->request->params->{username} || "";my $password = $c->request->params->{password} || "";my $baseurl = $c->uri_for('/');my $referer = $c->request->referer;$c->session->{referer} = $referer if defined $referer && $referer =~ m/^($baseurl)/; - replacement in src/lib/Hydra/Controller/User.pm at line 25[19.640]→[19.296:377](∅→∅),[19.377]→[19.719:759](∅→∅),[19.719]→[19.719:759](∅→∅),[19.759]→[19.378:515](∅→∅),[19.515]→[19.871:877](∅→∅),[19.871]→[19.871:877](∅→∅)
if ($username eq "" && $password eq "" && !defined $c->session->{referer}) {my $baseurl = $c->uri_for('/');my $referer = $c->request->referer;$c->session->{referer} = $referer if defined $referer && $referer =~ m/^($baseurl)/;}$c->stash->{template} = 'login.tt';}sub login_POST {my ($self, $c) = @_;my $username;my $password;$username = $c->stash->{params}->{username};$password = $c->stash->{params}->{password}; - replacement in src/lib/Hydra/Controller/User.pm at line 38
backToReferer($c) if $c->authenticate({username => $username, password => $password});$c->stash->{errorMsg} = "Bad username or password.";if ($c->authenticate({username => $username, password => $password})) {if ($c->request->looks_like_browser) {backToReferer($c);} else {currentUser_GET($self, $c);}} else {$self->status_forbidden($c, message => "Bad username or password.");if ($c->request->looks_like_browser) {login_GET($self, $c);}} - edit in src/lib/Hydra/Controller/User.pm at line 51
} - edit in src/lib/Hydra/Controller/User.pm at line 53
$c->stash->{template} = 'login.tt';} - edit in src/lib/Hydra/Controller/User.pm at line 54
sub logout :Local :Args(0) :ActionClass('REST::ForBrowsers') { } - replacement in src/lib/Hydra/Controller/User.pm at line 56
sub logout :Local {sub logout_POST { - replacement in src/lib/Hydra/Controller/User.pm at line 59
$c->response->redirect($c->request->referer || $c->uri_for('/'));if ($c->request->looks_like_browser) {$c->response->redirect($c->request->referer || $c->uri_for('/'));} else {$self->status_no_content($c);} - edit in src/lib/Hydra/Controller/User.pm at line 66
sub logout_GET {# Probably a better way to do thismy ($self, $c) = @_;logout_POST($self, $c);} - edit in src/lib/Hydra/Controller/User.pm at line 72
- edit in src/lib/Hydra/Controller/User.pm at line 148
sub currentUser :Path('/current-user') :ActionClass('REST') { }sub currentUser_GET {my ($self, $c) = @_;requireLogin($c) if !$c->user_exists;$self->status_ok($c,entity => $c->model('DB::Users')->find({ 'me.username' => $c->user->username}, {columns => [ "me.fullname", "me.emailaddress", "me.username", "userroles.role" ], join => [ "userroles" ], collapse => 1}));} - replacement in src/lib/Hydra/Controller/User.pm at line 189
sub edit :Chained('user') Args(0) {sub edit :Chained('user') :Args(0) :ActionClass('REST::ForBrowsers') { }sub edit_GET { - replacement in src/lib/Hydra/Controller/User.pm at line 200
if ($c->request->method ne "POST") {$c->stash->{fullname} = $user->fullname;$c->stash->{emailonerror} = $user->emailonerror;return;}$c->stash->{fullname} = $user->fullname; - replacement in src/lib/Hydra/Controller/User.pm at line 202
if (($c->request->params->{submit} // "") eq "delete") {$c->stash->{emailonerror} = $user->emailonerror;}sub edit_POST {my ($self, $c) = @_;my $user = $c->stash->{user};$c->stash->{template} = 'user.tt';$c->session->{referer} = $c->request->referer if !defined $c->session->{referer};if (($c->stash->{params}->{submit} // "") eq "delete") { - replacement in src/lib/Hydra/Controller/User.pm at line 219
if (($c->request->params->{submit} // "") eq "reset-password") {if (($c->stash->{params}->{submit} // "") eq "reset-password") { - replacement in src/lib/Hydra/Controller/User.pm at line 236
my $fullName = trim $c->req->params->{fullname};my $fullName = trim $c->stash->{params}->{fullname}; - replacement in src/lib/Hydra/Controller/User.pm at line 244
, emailonerror => $c->request->params->{"emailonerror"} ? 1 : 0, emailonerror => $c->stash->{params}->{"emailonerror"} ? 1 : 0 - replacement in src/lib/Hydra/Controller/User.pm at line 247
my $password = $c->req->params->{password} // "";my $password = $c->stash->{params}->{password} // ""; - replacement in src/lib/Hydra/Controller/User.pm at line 252
if $password ne trim $c->req->params->{password2};if $password ne trim $c->stash->{params}->{password2}; - replacement in src/lib/Hydra/Controller/User.pm at line 264
backToReferer($c);if ($c->request->looks_like_browser) {backToReferer($c);} else {$self->status_no_content($c);} - replacement in src/lib/Hydra/Controller/View.pm at line 121
$c->res->redirect($c->uri_for($c->controller('Project')->action_for('view'),$c->res->redirect($c->uri_for($c->controller('Project')->action_for('project'), - replacement in src/lib/Hydra/Controller/View.pm at line 227
return $c->res->redirect($c->uri_for($c->controller('Build')->action_for('view_build'),return $c->res->redirect($c->uri_for($c->controller('Build')->action_for('build'), - replacement in src/lib/Hydra/Helper/CatalystUtils.pm at line 205
my $x = $c->request->params->{$name};my $x = $c->stash->{params}->{$name}; - edit in src/lib/Hydra/Schema/BuildInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/BuildInputs.pm at line 171
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:byU/SLN03zNJlSFbi/3Bcg# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:tKZAybbNaRIMs9n5tHkqPw - edit in src/lib/Hydra/Schema/BuildOutputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/BuildOutputs.pm at line 97
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UpVoKdd3OwMvlvyMjcYNVA# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:V8MbzKvZNEaeHBJV67+ZMQ - edit in src/lib/Hydra/Schema/BuildProducts.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/BuildProducts.pm at line 153
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KHwh/Np40jxKXc3ijMImEQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+0LkZiaRL5tGJvbLxnwD/g - edit in src/lib/Hydra/Schema/BuildStepOutputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/BuildStepOutputs.pm at line 122
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dC1yX7arRVu9K3wG9dAjCg# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:A/4v3ugXYbuYoKPlOvC6mg - edit in src/lib/Hydra/Schema/BuildSteps.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/BuildSteps.pm at line 169
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:36:03# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZiA1nv73Fpp0/DTi4sLfEQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:OZsXJniZ/7EB2iSz7p5y4A - edit in src/lib/Hydra/Schema/Builds.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Builds.pm at line 472
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-05-03 14:35:11# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:aYVEk+AeDsgTRi5GAqOhEw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:isCEXACY/PwkvgKHcXvAIg - edit in src/lib/Hydra/Schema/CachedBazaarInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/CachedBazaarInputs.pm at line 86
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ONhBo6Xhq7uwYFdEzbp3dg# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:zvun8uhxwrr7B8EsqBoCjA - edit in src/lib/Hydra/Schema/CachedCVSInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/CachedCVSInputs.pm at line 102
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:IcSVN/tlfQQtX88Ix+aKnw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Vi1qzjW52Lnsl0JSmGzy0w - edit in src/lib/Hydra/Schema/CachedGitInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/CachedGitInputs.pm at line 95
# 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# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:I4hI02FKRMkw76WV/KBocA - edit in src/lib/Hydra/Schema/CachedHgInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/CachedHgInputs.pm at line 95
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:xFLnuCBAcJCg+N3b4aajZQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qS/eiiZXmpc7KpTHdtaT7g - edit in src/lib/Hydra/Schema/CachedPathInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/CachedPathInputs.pm at line 93
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:4KzXhMnUldVgNuuNXWIYjw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:28rja0vR1glJJ15hzVfjsQ - edit in src/lib/Hydra/Schema/CachedSubversionInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/CachedSubversionInputs.pm at line 86
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1rjwWtZXGEowHqhfjLqjmA# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:3qXfnvkOVj25W94bfhQ65w - edit in src/lib/Hydra/Schema/Jobs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Jobs.pm at line 141
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-05-23 16:09:46# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:JgxEaCz/TW9YKa+HavRzXw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:t2CCfUjFEz/lO4szROz1AQ - edit in src/lib/Hydra/Schema/JobsetEvalInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/JobsetEvalInputs.pm at line 169
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ng+Q6tMX5EJMD7DxRWVy7Q# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1Dp8B58leBLh4GK0GPw2zg - edit in src/lib/Hydra/Schema/JobsetEvalMembers.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/JobsetEvalMembers.pm at line 113
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:EVwSR9WBqbBdIHq1ANQMHg# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ccPNQe/QnSjTAC3uGWe8Ng - edit in src/lib/Hydra/Schema/JobsetEvals.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/JobsetEvals.pm at line 191
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qElGj6zzuI0xo426np3r1w# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:SlEiF8oN6FBK262uSiMKiw - edit in src/lib/Hydra/Schema/JobsetInputAlts.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/JobsetInputAlts.pm at line 124
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:M3pNBRLfxgSScrPj1zaajA# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UUO37lIuEYm0GiR92m/fyA - edit in src/lib/Hydra/Schema/JobsetInputs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/JobsetInputs.pm at line 145
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:xjioYUPo6visoLAVDkDZ0Q# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UXBzqO0vHPql4LYyXpgEQg - edit in src/lib/Hydra/Schema/Jobsets.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Jobsets.pm at line 275
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-05-02 14:50:55# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:q4amPCWRoWMThnRa/n/y1w# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:tsGR8MhZRIUeNwpcVczMUw - edit in src/lib/Hydra/Schema/NewsItems.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/NewsItems.pm at line 103
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:lnA5Utkwk5WTyKA/M5mlyg# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:3CRNsvd+YnZp9c80tuZREQ - edit in src/lib/Hydra/Schema/ProjectMembers.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/ProjectMembers.pm at line 106
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:zW87n6E7xWaShcFbgFkVuw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:imPoiaitrTbX0vVNlF6dPA - edit in src/lib/Hydra/Schema/Projects.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Projects.pm at line 270
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:OCuhmxs8pZxvmk81eVLLcQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:RffghAo9jAaqYk41y1Sdqw - edit in src/lib/Hydra/Schema/ReleaseMembers.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/ReleaseMembers.pm at line 138
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:eP00w5UJp1uTtiB7D5IhTQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:7M7WPlGQT6rNHKJ+82/KSA - edit in src/lib/Hydra/Schema/Releases.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Releases.pm at line 122
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UTUE3Hb89fT7prwnwwBgvQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qISBiwvboB8dIdinaE45mg - edit in src/lib/Hydra/Schema/SchemaVersion.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/SchemaVersion.pm at line 48
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2012-02-29 00:47:18# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:LFD28W0GvvrOOylCM98SEQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:08/7gbEQp1TqBiWFJXVY0w - edit in src/lib/Hydra/Schema/SystemTypes.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/SystemTypes.pm at line 71
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:zg8db3Cbi0QOv+gLJqH8cQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:8cC34cEw9T3+x+7uRs4KHQ - edit in src/lib/Hydra/Schema/UriRevMapper.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/UriRevMapper.pm at line 70
# Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hzKzGAgAiCfU0nBOiDnjWw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:G2GAF/Rb7cRkRegH94LwIA - edit in src/lib/Hydra/Schema/UserRoles.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/UserRoles.pm at line 90
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KArPHyemtnm/siwE4x5mGQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:aS+ivlFpndqIv8U578zz9A - edit in src/lib/Hydra/Schema/Users.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Users.pm at line 164
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:OAUFl/teGpfeleb6D8FPlw# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hy3MKvFxfL+1bTc7Hcb1zA - edit in src/lib/Hydra/Schema/ViewJobs.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/ViewJobs.pm at line 154
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cbSUw113ENPypbd/sICfgg# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hz912vBfYw0rHslBPqJW2w - edit in src/lib/Hydra/Schema/Views.pm at line 17
=head1 COMPONENTS LOADED=over 4=item * L<Hydra::Component::ToJSON>=back=cut__PACKAGE__->load_components("+Hydra::Component::ToJSON"); - replacement in src/lib/Hydra/Schema/Views.pm at line 120
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Vyd2+0RAF3XGTpq3KswfAQ# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-06-13 01:54:50# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:U23GZ3k5KZk2go6j2LYLHA - edit in src/lib/Makefile.am at line 12
$(wildcard Hydra/Component/*.pm) \ - replacement in src/root/queue.tt at line 10
[% INCLUDE renderBuildList builds=queue showSchedulingInfo=1 hideResultInfo=1 %][% INCLUDE renderBuildList builds=resource showSchedulingInfo=1 hideResultInfo=1 %] - replacement in src/root/status.tt at line 9
[% FOREACH step IN steps %][% FOREACH step IN resource %] - replacement in src/root/topbar.tt at line 40
[% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('view'), [project.name]) title = "Overview" %][% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('project'), [project.name]) title = "Overview" %] - replacement in src/root/topbar.tt at line 59
uri = c.uri_for(c.controller('Jobset').action_for('index'), [project.name, jobset.name])uri = c.uri_for(c.controller('Jobset').action_for('jobset'), [project.name, jobset.name]) - replacement in src/sql/Makefile.am at line 19
perl -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:../lib -e 'make_schema_at("Hydra::Schema", { naming => { ALL => "v5" }, relationships => 1, moniker_map => sub {return "$$_";} }, ["dbi:SQLite:tmp.sqlite"])'[19.3735]perl -I ../lib -MDBIx::Class::Schema::Loader=make_schema_at,dump_to_dir:../lib -e 'make_schema_at("Hydra::Schema", { naming => { ALL => "v5" }, relationships => 1, moniker_map => sub {return "$$_";}, components => [ "+Hydra::Component::ToJSON" ], }, ["dbi:SQLite:tmp.sqlite"])' - file addition: api-test.nix[224.73]
letbuilder = builtins.toFile "builder.sh" ''echo -n ${builtins.readFile ./default.nix} > $out'';in {job = derivation {name = "job";system = builtins.currentSystem;builder = "/bin/sh";args = [ builder ];};} - file addition: api-test.pl[224.73]
use LWP::UserAgent;use JSON;use Test::Simple tests => 15;my $ua = LWP::UserAgent->new;$ua->cookie_jar({});sub request_json {my ($opts) = @_;my $req = HTTP::Request->new;$req->method($opts->{method} or "GET");$req->uri("http://localhost:3000$opts->{uri}");$req->header(Accept => "application/json");$req->content(encode_json($opts->{data})) if defined $opts->{data};my $res = $ua->request($req);print $res->as_string();return $res;}my $result = request_json({ uri => "/login", method => "POST", data => { username => "root", password => "foobar" } });my $user = decode_json($result->content());ok($user->{username} eq "root", "The root user is named root");ok($user->{userroles}->[0]->{role} eq "admin", "The root user is an admin");$user = decode_json(request_json({ uri => "/current-user" })->content());ok($user->{username} eq "root", "The current user is named root");ok($user->{userroles}->[0]->{role} eq "admin", "The current user is an admin");ok(request_json({ uri => '/project/sample' })->code() == 404, "Non-existent projects don't exist");$result = request_json({ uri => '/project/sample', method => 'PUT', data => { displayname => "Sample", enabled => "1", } });ok($result->code() == 201, "PUTting a new project creates it");my $project = decode_json(request_json({ uri => '/project/sample' })->content());ok((not @{$project->{jobsets}}), "A new project has no jobsets");$result = request_json({ uri => '/jobset/sample/default', method => 'PUT', data => { nixexprpath => "default.nix", nixexprinput => "src", inputs => { src => { type => "path", values => "/run/jobset" } }, enabled => "1", checkinterval => "3600"} });ok($result->code() == 201, "PUTting a new jobset creates it");my $jobset = decode_json(request_json({ uri => '/jobset/sample/default' })->content());ok($jobset->{jobsetinputs}->[0]->{name} eq "src", "The new jobset has an 'src' input");ok($jobset->{jobsetinputs}->[0]->{jobsetinputalts}->[0]->{value} eq "/run/jobset", "The 'src' input is in /run/jobset");system("LOGNAME=root NIX_STORE_DIR=/run/nix/store NIX_LOG_DIR=/run/nix/var/log/nix NIX_STATE_DIR=/run/nix/var/nix HYDRA_DATA=/var/lib/hydra HYDRA_DBI='dbi:Pg:dbname=hydra;user=root;' hydra-evaluator sample default");$result = request_json({ uri => '/jobset/sample/default/evals' });ok($result->code() == 200, "Can get evals of a jobset");my $evals = decode_json($result->content())->{evals};my $eval = $evals->[0];ok($eval->{hasnewbuilds} == 1, "The first eval of a jobset has new builds");# Ugh, cached for 30ssleep 30;system("echo >> /run/jobset/default.nix; LOGNAME=root NIX_STORE_DIR=/run/nix/store NIX_LOG_DIR=/run/nix/var/log/nix NIX_STATE_DIR=/run/nix/var/nix HYDRA_DATA=/var/lib/hydra HYDRA_DBI='dbi:Pg:dbname=hydra;user=root;' hydra-evaluator sample default");my $evals = decode_json(request_json({ uri => '/jobset/sample/default/evals' })->content())->{evals};ok($evals->[0]->{jobsetevalinputs}->[0]->{revision} != $evals->[1]->{jobsetevalinputs}->[0]->{revision}, "Changing a jobset source changes its revision");my $build = decode_json(request_json({ uri => "/build/" . $evals->[0]->{jobsetevalmembers}->[0]->{build} })->content());ok($build->{job} eq "job", "The build's job name is job");ok($build->{finished} == 0, "The build isn't finished yet");