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]
FD76WVTQmissing file - [20]
OEPUOUNBUsing twitter bootstrap for more consistent looks for Hydra - [21]
UMFB2767Hydra/64: Leaving number of builds empty gives DBIx error - [22]
BHZXGT2H* Channels: provide an index page that lists all the packages in the - [23]
A6XVP6FEMake the hide/unhide actions a checkbox in the project settings - [24]
HXBXDEFKSpeed up channel processing - [25]
AKAXJDMW* Disable the statistics on the project, jobset and job pages for now - [26]
ND75XNSQAllow showing all evaluations that contain a given build - [27]
JARRBLZDBootstrapify the Hydra forms (except the project and jobset edit pages) - [28]
FPK5LF53* Put the project-related actions in a separate controller. Put the - [29]
GPHLV42M* Allow the description of a release member to be edited, and to - [30]
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. - [31]
JLDUSNUO* Unify rendering of finished and scheduled builds. - [32]
2NGV7NYNDrop unused "tag" column - [33]
G2T4WAHIStore the inputs of each evaluation in the database - [34]
UWVMQIAC* Refactoring. - [35]
CG2TIX5Egrr, typo - [36]
ECBA3GQO* Make the schema class names match the case of the SQL table names. - [37]
37R34XJO* Negative caching: don't perform a build if a dependency already - [38]
BN2MO2MPfix redirect after login - [39]
PHX2HIVG* Store info about the build inputs in the build record. - [40]
ODNCGFQ5* Improved the navigation bar: don't include all projects (since that - [41]
L755DXLC - [42]
JTRG7RDQadd support for git as jobinput - [43]
DWIA5CDJ* Make download-by-type more deterministic when there are multiple - [44]
T7Z63K6Thydra: moves jobsetOverview sub - [45]
BD3GRK4B* Get rid of "positive failures" and separate log phases. - [46]
CHCVBZ3W* Slight cleanup. - [47]
6LTPI6B2 - [48]
X27GNHDV* Basic job info in the database. - [49]
OOQ2D3KC* Refactoring: move fetchInput out of hydra_scheduler into a separate - [50]
RFE6T5LG* Store jobset evaluations in the database explicitly. This includes - [51]
LMETCA7GCleanup - [52]
YJYBKPZ5Hydra/33: 'Sign in' should return to the referring page - [53]
LZO3C2KI* Hack around those SQLite timeouts: just retry the transaction. - [54]
HQGXL4MXAdd validation for project and jobset names - [55]
HSVVEKTY* Start of a JSON API to get information about a specific build. - [56]
VS3OUK7Dif no emailoverride specified, use empty string - [57]
L2E6EVE2* Merged the Build and Job tables. - [58]
5NO7NCKT* Refactoring. - [59]
RBNQKATL* Adding persistant releases. A release is a named set of builds. - [60]
MOX7XJ2EMerge the BuildSchedulingInfo table into the Builds table - [61]
LBNVQXUB* Build the /build stuff in a separate controller. - [62]
SU566LI3* Sort releases. - [63]
TQKGQ5R3 - [64]
QQ4STW3Smissing file - [65]
5QE3TIHPhydra: add status icon per jobset on project page - [66]
6F4UNDTC* Provide access to the raw, non-pretty-printed logfiles. - [67]
TNMOG2ZQIndentation - [68]
4D4U5IPY* Allow jobsets to be disabled. - [69]
TWVSALRL* Allow the maximum number of concurrent builds per platform to be - [70]
BVOPAMLS - [71]
KOTB7BKV - [72]
NYC3LZKH* Generate NAR archives on the fly. Necessary for producing channels - [73]
ZILILXXK* Allow scheduled builds to be cancelled. They're not removed from - [74]
HB3OHPJLhydra: in case of cached build, add link to build that built the storepath - [75]
XEKWCIDRmissing case for hg input type - [76]
Y6AHH4THRemove the logfile and logSize columns from the database - [77]
IK53RV4V - [78]
OR5SJ42YShow releases in a tab on the project page - [79]
WYN733ST* Store build duration, handle cached builds. - [80]
67P45PY4 - [81]
R5D7DZPE - [82]
3E6IP3R3* Add the name of the jobset to ReleaseSetJobs, otherwise we can't - [83]
KAZWI5G4* hydra: buildpage, show changes since last build/successful build - [84]
NEWDDAOF* Allow users to change the value of a build's "keep" flag, which - [85]
FHF6IZJQ* Basic release management: releases are now dynamically computed as - [86]
TLZ2SPBR - [87]
YTZOC7C5* Editing of jobset inputs. - [88]
ZVTSOVHN* Support Subversion checkouts. - [89]
NUIKDEHL* A quick hack to list the contents of various types of files (RPM, - [90]
H5REHM3M - [91]
FGQPXZIXhydra: make nr of build to keep configurable per jobset - [92]
BKOIYITRadded some json responses - [93]
CLJQCY2X* Store info about all the build actions and allow them to be - [94]
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 - [95]
WRIU3S5E* UI for cloning builds (not functional yet). - [96]
AKAZKCR6* At top-level and for each project, provide two channels: "latest" - [97]
QMPX3JDF* hydra: show queue optimization - [98]
SB2V735VKeep track of the database schema version - [99]
HPEG2RHVMerge the BuildResultInfo table into the Builds table - [100]
LGNML7VJDon't use a prepared statement for the active build steps query - [101]
JZVRK5QJGroup some menu items together under a "Status" menu - [102]
SHBLLAVH* More global substitution. - [103]
P5X4P6VK* Renaming "release sets" to "views" (not finished yet). Having - [104]
U4TD3AIQAdd support for viewing jobset evaluations - [105]
GWCV3TQV* BuildInputs table: link to dependencies, include store paths. - [106]
QTC3SYBMJobset page: Load the jobs and status tabs on demand - [107]
7UJ5YV4V* Provide a channel for each project containing all the latest - [108]
S66BOMVU* Added authentication. - [109]
BOAFFKUXActive build steps: Make the rows clickable - [110]
7ZSVXUGFsequence fix for postgresql - [111]
H7CNGK4O* Log evaluation errors etc. in the DB. - [112]
DHMTPGST* Ran update-dbix. - [113]
VG4QG336Remove tablesorter - [114]
S6OISBQ3* Mark the "current" builds in a jobset, i.e. those corresponding to - [115]
4JS4DWHDAll/recent builds -> Latest builds - [116]
JJT5QG3Kremove revision from cached cvs inputs, and added missing files - [117]
3SQCOHZN* minor performance tweaks - [118]
6FRLEP4Pfirst try for timeline of last 24 hours in hydra - [119]
HEZ2V5NUorder jobset in project view - [120]
N45RZUQ6Reduce I/O in build listings by only fetching required columns - [121]
VJHIHMEH* Store the meta.longDescription and meta.license attributes in the - [122]
LCKWLQW3* In Sqlite "release" is now a keyword, so use "release_" instead. - [123]
36M6DGITShow the runtime/build dependencies in the build page - [124]
FU4GO5VNOn build pages, provide a link to the build's first eval - [125]
RSEGBU6CHydra/20: Jobset clone feature - [126]
BTUDUY6F* Provide some redirects to the latest successful build for a job (or - [127]
ZWCTAZGLadded newsitems, added some admin options to clear various caches. - [128]
SSMN5MPTRemove dead code - [129]
VH5ZABDRAdd a page to show the latest evaluations for the entire server - [130]
Q4VDOA76Replace last 5 builds on jobset page with last 5 evaluations. Moved hide/unhide and evaluate options to jobset topmenu. - [131]
GJFYEU3S* Nix now stores logs by default as bzip2, make sure the build page uncompresses before showing. - [132]
AWYTL4HO* Don't show platforms that are not included in the current jobset. - [133]
KN3VYE5P* Cleaned up the foreign key constraints. - [134]
M552HLIA* Support variant builds. - [135]
RU7AQO7U* Role-based access control. Only admins can create projects. Only - [136]
EYNG4EL4* Regenerate the bindings from a clean sqlite database. - [137]
A52HEFHQ* Allow builds to be restarted (if they failed with a transient error, - [138]
2BUX775I* More release -> view. - [139]
YAPITGB3* Boolean inputs. - [140]
RJICSUYG* Align the apply/delete buttons. - [141]
FYO6NECEhydra - [142]
KPZNJ33U* In views, support selecting a job that doesn't depend on the - [143]
TP3PFR5K - [144]
J5UVLXOK* Start of a basic Catalyst web interface. - [145]
DVNWJXWW* Generic declaration of build products. - [146]
BHJ62LYE* Allow authorised users to create projects. - [147]
OD5FSS5A* Quick hack to allow viewing of dependency graphs (via nix-store -q - [148]
AHTEIK7G* Added a maintainers field to the Builds table. - [149]
ZTQEU5QSHydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet) - [150]
QMW24O5SAdd support for Guile & Guix. - [151]
FYWE74AA - [152]
CQTN62OHDie tabs die - [153]
PMNWRTGJAdd multiple output support - [154]
6LETVKRAAfter editing a jobset, push it to the front of the evaluation queue - [155]
YS3AVMLCRemove buildtime and runtime dependency graph. It is useless on normal derivations. - [156]
ZRRPBEI4Make jobset deletion consistent with project deletion - [157]
XJRJ4J7MAdd user registration - [158]
YTIDBFGUDrop unused "disabled" columns - [159]
G5ZR3ZVZhydra: put contents links into html, add links to files from contents page - [160]
AS2OXLRM* Editing releases. - [161]
JM3DPYOMgenerated schema with new dbix class schema loader, grrrrrr - [162]
XDDCO6CH* hydra: add dependency list with links to logfiles - [163]
CMU3YKOU* Store the release name. - [164]
P73KM42LUpdate the list of SQL files to be installed. - [165]
PVIRRARJTurn hiding/unhiding a jobset into a checkbox - [166]
OX6NYJDVSplit viewing and editing a jobset - [167]
LSZLZHJYAllow users to edit their own settings - [168]
B72GLND4 - [169]
7ZVZJK54Re-enable the "Related Builds" tab - [170]
TJPIS3UPhydra: minor improvements in hydra ui - [171]
SMM4HQTP* Put actions related to builds under /build (e.g. /log/<buildid> - [172]
3ZCEPLNO - [173]
XHVZXX6N - [174]
BPVJBR2P* Only put Nix builds in the global channel. - [175]
3KU4L7L3remove buildonlylatest propery, which was committed by accident - [176]
LC64D4PUCorrectly redirect to the referring page when logging in - [177]
QTFVCDIFadded hide feature for project/jobset - [178]
JY7BXXOPSplit viewing and editing a project - [179]
NABL63FI* hydra: project members can do stuff that the owner can do - [180]
AZCCANUBMissing part of aaacf9eda36f5cdcc77cec20d6f49fbb6f925105 - [181]
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. - [182]
Z6MDQIGO* A quick (non-Web 2.0) interface to manually add builds to a release. - [183]
75XUS62Y* Added a page to quickly see all failed builds and failed evaluations - [184]
3Y7AFJSS* Support linking to the latest job in a view for a specific platform, e.g. - [185]
YPDYBK5GShow dependencies as a tree rather than a list - [186]
XKXMU5PVEllipsize long jobset/job names to prevent bootstrap navbar breakage - [187]
PZL3SZM3Give every page a consistent title - [188]
SHYRGAWZhydra: when no external url is given for diff's of git/hg input, revert to a diff done on a local available clone - [189]
CS7T2XFI - [190]
V4RNHJNR* Add a link to each project's homepage. Suggested by karltk. - [191]
3HZY24CX* Make jobsets viewable under - [192]
QZLMDKMU* Queue runner: don't start scheduled builds builds if they belong to - [193]
KXGOUX7P* Creating releases. - [194]
S5PV6IIM* Represent jobs explicitly in the DB. - [195]
XJFHFZCA* Provide some redirects to build products by type so that we can for - [196]
SJLEZFC4check getHydraPath in stead of Envvar HYDRA_DBI directly - [197]
EFWN7JBV* Added a status page that shows all the currently executing build steps. - [198]
RI4S7SYT* Job status: show the active jobs. - [199]
4UUKWXDFJobset page: Show last evaluation time - [200]
PCKLFRT5Support push notification of repository changes - [201]
ZEHSSVFG - [202]
7YBYT2LQ - [203]
D3DIBMOK* For products that are directories (like manuals), allow a default - [204]
GNIEG2GC* Disambiguate jobs by jobset name. I.e. jobs with the same name in - [205]
7Z3YOKCV* PROCESS -> INCLUDE in most cases. INCLUDE does proper scoping of - [206]
6QRHXIM3* Speed up the jobset index page. Especially the query to get the - [207]
6BLUKEQ2* Caching of "path" inputs, and fake a revision number for those. - [208]
3HCBU2FA - [209]
UXXFND4UAdd a redirect to the latest finished jobset evaluation - [210]
NRSKJPP4makeLink -> menuItem - [211]
3PNG7NIBRemove trailing whitespace - [212]
CFQCNNDRuse build timestamp as last-modified header on download - [*]
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");