Merge in the first bits of the API work

[?]
Jun 17, 2013, 4:34 PM
LZVO64YG43JD7YMZSCTZNOBS5ROZA4FMPKJW2YOMHX2V5PTGBVWQC

Dependencies

  • [2] BJAJLOT3 typo
  • [3] P2NOTX5D if no emailoverride specified, use empty string
  • [4] S4V64WMT Whitespace
  • [5] NS5GKQHW Disable prepared statements completely
  • [6] PHJF4FUT Add missing files
  • [7] FHHFNCCR Fix duplicate function name
  • [8] 4HPT4SDD Revert "Remove now-unused SystemTypes table"
  • [9] HZWUT4YN Allow users to reproduce builds on their own systems
  • [10] FAUCW4NH Remove project/jobset/job/build id from the navbar
  • [11] QLOLZHRX Allow a per-jobset check interval
  • [12] OQNFJWAG Install plugins
  • [13] R6B5CAFF Let Builds.timestamp refer to the time the build was added
  • [14] E7M2WP7A Remove unused Jobs columns
  • [15] 6K5PBUUN Use buildEnv to combine Hydra's Perl dependencies
  • [16] JAH3UPWA Support revision control systems via plugins
  • [17] M6UBWKN2 Fix project/jobset deletion
  • [18] 225GEK4N After editing a project/jobset, redirect back to the config tab
  • [19] FD76WVTQ missing file
  • [20] OEPUOUNB Using twitter bootstrap for more consistent looks for Hydra
  • [21] UMFB2767 Hydra/64: Leaving number of builds empty gives DBIx error
  • [22] BHZXGT2H * Channels: provide an index page that lists all the packages in the
  • [23] A6XVP6FE Make the hide/unhide actions a checkbox in the project settings
  • [24] HXBXDEFK Speed up channel processing
  • [25] AKAXJDMW * Disable the statistics on the project, jobset and job pages for now
  • [26] ND75XNSQ Allow showing all evaluations that contain a given build
  • [27] JARRBLZD Bootstrapify 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] 2NGV7NYN Drop unused "tag" column
  • [33] G2T4WAHI Store the inputs of each evaluation in the database
  • [34] UWVMQIAC * Refactoring.
  • [35] CG2TIX5E grr, 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] BN2MO2MP fix 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] JTRG7RDQ add support for git as jobinput
  • [43] DWIA5CDJ * Make download-by-type more deterministic when there are multiple
  • [44] T7Z63K6T hydra: 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] LMETCA7G Cleanup
  • [52] YJYBKPZ5 Hydra/33: 'Sign in' should return to the referring page
  • [53] LZO3C2KI * Hack around those SQLite timeouts: just retry the transaction.
  • [54] HQGXL4MX Add validation for project and jobset names
  • [55] HSVVEKTY * Start of a JSON API to get information about a specific build.
  • [56] VS3OUK7D if 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] MOX7XJ2E Merge the BuildSchedulingInfo table into the Builds table
  • [61] LBNVQXUB * Build the /build stuff in a separate controller.
  • [62] SU566LI3 * Sort releases.
  • [63] TQKGQ5R3
  • [64] QQ4STW3S missing file
  • [65] 5QE3TIHP hydra: add status icon per jobset on project page
  • [66] 6F4UNDTC * Provide access to the raw, non-pretty-printed logfiles.
  • [67] TNMOG2ZQ Indentation
  • [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] HB3OHPJL hydra: in case of cached build, add link to build that built the storepath
  • [75] XEKWCIDR missing case for hg input type
  • [76] Y6AHH4TH Remove the logfile and logSize columns from the database
  • [77] IK53RV4V
  • [78] OR5SJ42Y Show 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] FGQPXZIX hydra: make nr of build to keep configurable per jobset
  • [92] BKOIYITR added some json responses
  • [93] CLJQCY2X * Store info about all the build actions and allow them to be
  • [94] 2WUNXJGW Hydra/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] SB2V735V Keep track of the database schema version
  • [99] HPEG2RHV Merge the BuildResultInfo table into the Builds table
  • [100] LGNML7VJ Don't use a prepared statement for the active build steps query
  • [101] JZVRK5QJ Group 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] U4TD3AIQ Add support for viewing jobset evaluations
  • [105] GWCV3TQV * BuildInputs table: link to dependencies, include store paths.
  • [106] QTC3SYBM Jobset 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] BOAFFKUX Active build steps: Make the rows clickable
  • [110] 7ZSVXUGF sequence fix for postgresql
  • [111] H7CNGK4O * Log evaluation errors etc. in the DB.
  • [112] DHMTPGST * Ran update-dbix.
  • [113] VG4QG336 Remove tablesorter
  • [114] S6OISBQ3 * Mark the "current" builds in a jobset, i.e. those corresponding to
  • [115] 4JS4DWHD All/recent builds -> Latest builds
  • [116] JJT5QG3K remove revision from cached cvs inputs, and added missing files
  • [117] 3SQCOHZN * minor performance tweaks
  • [118] 6FRLEP4P first try for timeline of last 24 hours in hydra
  • [119] HEZ2V5NU order jobset in project view
  • [120] N45RZUQ6 Reduce 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] 36M6DGIT Show the runtime/build dependencies in the build page
  • [124] FU4GO5VN On build pages, provide a link to the build's first eval
  • [125] RSEGBU6C Hydra/20: Jobset clone feature
  • [126] BTUDUY6F * Provide some redirects to the latest successful build for a job (or
  • [127] ZWCTAZGL added newsitems, added some admin options to clear various caches.
  • [128] SSMN5MPT Remove dead code
  • [129] VH5ZABDR Add a page to show the latest evaluations for the entire server
  • [130] Q4VDOA76 Replace 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] FYO6NECE hydra
  • [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] ZTQEU5QS Hydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet)
  • [150] QMW24O5S Add support for Guile & Guix.
  • [151] FYWE74AA
  • [152] CQTN62OH Die tabs die
  • [153] PMNWRTGJ Add multiple output support
  • [154] 6LETVKRA After editing a jobset, push it to the front of the evaluation queue
  • [155] YS3AVMLC Remove buildtime and runtime dependency graph. It is useless on normal derivations.
  • [156] ZRRPBEI4 Make jobset deletion consistent with project deletion
  • [157] XJRJ4J7M Add user registration
  • [158] YTIDBFGU Drop unused "disabled" columns
  • [159] G5ZR3ZVZ hydra: put contents links into html, add links to files from contents page
  • [160] AS2OXLRM * Editing releases.
  • [161] JM3DPYOM generated 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] P73KM42L Update the list of SQL files to be installed.
  • [165] PVIRRARJ Turn hiding/unhiding a jobset into a checkbox
  • [166] OX6NYJDV Split viewing and editing a jobset
  • [167] LSZLZHJY Allow users to edit their own settings
  • [168] B72GLND4
  • [169] 7ZVZJK54 Re-enable the "Related Builds" tab
  • [170] TJPIS3UP hydra: 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] 3KU4L7L3 remove buildonlylatest propery, which was committed by accident
  • [176] LC64D4PU Correctly redirect to the referring page when logging in
  • [177] QTFVCDIF added hide feature for project/jobset
  • [178] JY7BXXOP Split viewing and editing a project
  • [179] NABL63FI * hydra: project members can do stuff that the owner can do
  • [180] AZCCANUB Missing 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] YPDYBK5G Show dependencies as a tree rather than a list
  • [186] XKXMU5PV Ellipsize long jobset/job names to prevent bootstrap navbar breakage
  • [187] PZL3SZM3 Give every page a consistent title
  • [188] SHYRGAWZ hydra: 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] SJLEZFC4 check 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] 4UUKWXDF Jobset page: Show last evaluation time
  • [200] PCKLFRT5 Support 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] UXXFND4U Add a redirect to the latest finished jobset evaluation
  • [210] NRSKJPP4 makeLink -> menuItem
  • [211] 3PNG7NIB Remove trailing whitespace
  • [212] CFQCNNDR use 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.
  • [*] EVZTBKEF Add 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
  • [*] FV2M6MOT hydra: use autoconf/-make
  • [*] QL55ECJ6 - adapted ui for hydra, more in line with nixos.org website
  • [*] G2ZB6464 first test, not yet in buildprocess

Change contents

  • edit in release.nix at line 74
    [15.556]
    [15.601]
    CatalystActionREST
  • edit in release.nix at line 171
    [215.1077]
    [216.3482]
    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
    [19.845][19.33:142](),[19.372][19.33:142]()
    $c->res->redirect($c->uri_for($c->controller('Build')->action_for("view_build"), [$latest->id], @rest));
    [19.845]
    [19.479]
    $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
    [19.849][19.185:294](),[19.1143][19.185:294]()
    $c->res->redirect($c->uri_for($c->controller('Build')->action_for("view_build"), [$latest->id], @rest));
    [19.849]
    [19.702]
    $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
    [19.109][19.1027:1060]()
    use base 'Catalyst::Controller';
    [19.109]
    [19.604]
    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 (d--r------)
    [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
    [19.84][19.84:117]()
    use base 'Catalyst::Controller';
    [19.84]
    [19.117]
    use base 'Hydra::Base::Controller::REST';
  • edit in src/lib/Hydra/Controller/API.pm at line 313
    [19.1440]
    [218.43]
    $self->status_ok(
    $c,
    entity => { jobsetsTriggered => $c->stash->{json}->{jobsetsTriggered} }
    );
  • replacement in src/lib/Hydra/Controller/Build.pm at line 17
    [19.304][19.304:355]()
    sub build : Chained('/') PathPart CaptureArgs(1) {
    [19.158]
    [19.355]
    sub buildChain :Chained('/') :PathPart('build') :CaptureArgs(1) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 53
    [19.2124][19.686:743](),[19.686][19.686:743]()
    sub view_build : Chained('build') PathPart('') Args(0) {
    [19.2124]
    [19.743]
    sub build :Chained('buildChain') :PathPart('') :Args(0) :ActionClass('REST') { }
    sub build_GET {
  • edit in src/lib/Hydra/Controller/Build.pm at line 101
    [19.199]
    [19.1111]
    $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
    [19.1115][19.0:56]()
    sub view_nixlog : Chained('build') PathPart('nixlog') {
    [19.1115]
    [19.56]
    sub view_nixlog : Chained('buildChain') PathPart('nixlog') {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 132
    [19.1558][19.139:189]()
    sub view_log : Chained('build') PathPart('log') {
    [19.1558]
    [19.189]
    sub view_log : Chained('buildChain') PathPart('log') {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 197
    [19.613][19.145:188](),[19.2288][19.145:188]()
    sub download : Chained('build') PathPart {
    [19.613]
    [19.0]
    sub download : Chained('buildChain') PathPart {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 244
    [19.952][19.952:1023]()
    sub download_by_type : Chained('build') PathPart('download-by-type') {
    [19.952]
    [19.1023]
    sub download_by_type : Chained('buildChain') PathPart('download-by-type') {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 259
    [19.193][19.0:51]()
    sub contents : Chained('build') PathPart Args(1) {
    [19.193]
    [19.51]
    sub contents : Chained('buildChain') PathPart Args(1) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 363
    [19.1017][19.0:59]()
    sub build_deps : Chained('build') PathPart('build-deps') {
    [19.1017]
    [19.73]
    sub build_deps : Chained('buildChain') PathPart('build-deps') {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 376
    [19.272][19.272:335]()
    sub runtime_deps : Chained('build') PathPart('runtime-deps') {
    [19.272]
    [19.335]
    sub runtime_deps : Chained('buildChain') PathPart('runtime-deps') {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 390
    [19.1011][19.1410:1470](),[19.1327][19.1410:1470](),[19.1410][19.1410:1470]()
    sub nix : Chained('build') PathPart('nix') CaptureArgs(0) {
    [19.1327]
    [19.1470]
    sub nix : Chained('buildChain') PathPart('nix') CaptureArgs(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 410
    [19.60][19.52:102]()
    sub restart : Chained('build') PathPart Args(0) {
    [19.60]
    [19.121]
    sub restart : Chained('buildChain') PathPart Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 425
    [19.624][19.368:456](),[19.368][19.368:456]()
    $c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));
    [19.624]
    [19.456]
    $c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures));
  • replacement in src/lib/Hydra/Controller/Build.pm at line 429
    [19.460][19.460:509]()
    sub cancel : Chained('build') PathPart Args(0) {
    [19.460]
    [19.509]
    sub cancel : Chained('buildChain') PathPart Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 455
    [19.626][19.66:154](),[19.66][19.66:154]()
    $c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));
    [19.626]
    [19.154]
    $c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures));
  • replacement in src/lib/Hydra/Controller/Build.pm at line 459
    [19.158][19.158:205]()
    sub keep : Chained('build') PathPart Args(1) {
    [19.158]
    [19.3625]
    sub keep : Chained('buildChain') PathPart Args(1) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 478
    [19.628][19.5:93](),[19.5][19.5:93]()
    $c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));
    [19.628]
    [19.93]
    $c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures));
  • replacement in src/lib/Hydra/Controller/Build.pm at line 482
    [19.97][19.97:172]()
    sub add_to_release : Chained('build') PathPart('add-to-release') Args(0) {
    [19.97]
    [19.172]
    sub add_to_release : Chained('buildChain') PathPart('add-to-release') Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 507
    [19.640][19.1155:1243](),[19.828][19.1155:1243](),[19.823][19.1155:1243]()
    $c->res->redirect($c->uri_for($self->action_for("view_build"), $c->req->captures));
    [19.640]
    [19.0]
    $c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures));
  • replacement in src/lib/Hydra/Controller/Build.pm at line 511
    [19.4][19.4:61]()
    sub clone : Chained('build') PathPart('clone') Args(0) {
    [19.4]
    [19.61]
    sub clone : Chained('buildChain') PathPart('clone') Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 522
    [19.225][19.225:296]()
    sub clone_submit : Chained('build') PathPart('clone/submit') Args(0) {
    [19.225]
    [19.296]
    sub clone_submit : Chained('buildChain') PathPart('clone/submit') Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 588
    [19.3297][19.0:67]()
    sub get_info : Chained('build') PathPart('api/get-info') Args(0) {
    [19.3297]
    [19.149]
    sub get_info : Chained('buildChain') PathPart('api/get-info') Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 599
    [19.72][7.0:57]()
    sub evals : Chained('build') PathPart('evals') Args(0) {
    [19.72]
    [19.132]
    sub evals : Chained('buildChain') PathPart('evals') Args(0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 617
    [9.4][9.4:69]()
    sub reproduce : Chained('build') PathPart('reproduce') Args(0) {
    [9.4]
    [9.69]
    sub reproduce : Chained('buildChain') PathPart('reproduce') Args(0) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 10
    [19.275][19.275:337]()
    sub jobset : Chained('/') PathPart('jobset') CaptureArgs(2) {
    [19.275]
    [19.337]
    sub jobsetChain :Chained('/') :PathPart('jobset') :CaptureArgs(2) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 13
    [19.390][19.390:518]()
    my $project = $c->model('DB::Projects')->find($projectName)
    or notFound($c, "Project $projectName doesn't exist.");
    [19.390]
    [19.518]
    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
    [19.519][19.522:559]()
    $c->stash->{project} = $project;
    [19.519]
    [19.0]
    $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_}->single
    or notFound($c, "Jobset $jobsetName doesn't exist.");
    [19.1]
    [19.699]
    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
    [19.702][19.0:53]()
    sub index : Chained('jobset') PathPart('') Args(0) {
    [19.702]
    [19.53]
    sub jobset :Chained('jobsetChain') :PathPart('') :Args(0) :ActionClass('REST::ForBrowsers') { }
    sub jobset_GET {
  • edit in src/lib/Hydra/Controller/Jobset.pm at line 51
    [19.1][19.1:100]()
    my $projectName = $c->stash->{project}->name;
    my $jobsetName = $c->stash->{jobset}->name;
  • edit in src/lib/Hydra/Controller/Jobset.pm at line 54
    [19.293]
    [19.293]
    $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
    [19.296]
    [19.296]
    sub jobset_PUT {
    my ($self, $c) = @_;
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 78
    [19.297][19.297:361]()
    sub jobs_tab : Chained('jobset') PathPart('jobs-tab') Args(0) {
    [19.297]
    [19.361]
    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
    [19.1094][19.1094:1162]()
    sub status_tab : Chained('jobset') PathPart('status-tab') Args(0) {
    [19.1094]
    [19.1162]
    sub status_tab : Chained('jobsetChain') PathPart('status-tab') Args(0) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 212
    [19.873][19.873:938]()
    sub get_builds : Chained('jobset') PathPart('') CaptureArgs(0) {
    [19.873]
    [19.938]
    sub get_builds : Chained('jobsetChain') PathPart('') CaptureArgs(0) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 226
    [19.507][19.507:555]()
    sub edit : Chained('jobset') PathPart Args(0) {
    [19.507]
    [19.555]
    sub edit : Chained('jobsetChain') PathPart Args(0) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 236
    [19.709][19.709:759]()
    sub submit : Chained('jobset') PathPart Args(0) {
    [19.709]
    [19.759]
    sub submit : Chained('jobsetChain') PathPart Args(0) {
  • edit in src/lib/Hydra/Controller/Jobset.pm at line 239
    [19.15][19.789:840](),[19.789][19.789:840]()
    requireProjectOwner($c, $c->stash->{project});
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 247
    [17.210][19.99:223](),[19.99][19.99:223]()
    return $c->res->redirect($c->uri_for($c->controller('Project')->action_for("view"), [$c->stash->{project}->name]));
    [17.210]
    [19.223]
    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");
    [19.17]
    [19.848]
    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
    [19.983][19.983:1048]()
    my $nixExprPath = trim $c->request->params->{"nixexprpath"};
    [19.983]
    [19.1048]
    my $nixExprPath = trim $c->stash->{params}->{"nixexprpath"};
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 268
    [19.1143][19.1143:1210]()
    my $nixExprInput = trim $c->request->params->{"nixexprinput"};
    [19.1143]
    [19.1210]
    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
    [19.1514][19.1514:1571]()
    my $jobsetName = trim $c->request->params->{"name"};
    [19.1514]
    [19.0]
    my $jobsetName = $c->stash->{jobsetName} or $jobset->name;
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 293
    [19.475][19.2292:2367]()
    $c->request->params->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix";
    [19.475]
    [19.543]
    $c->stash->{params}->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix";
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 299
    [19.2126][19.2126:2194]()
    , description => trim($c->request->params->{"description"})
    [19.2126]
    [19.2194]
    , 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}))
    [19.2272]
    [19.0]
    , 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
    [19.2285][19.2285:2305](),[19.2305][19.184:185]()
    my %inputNames;
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 312
    [19.2355][19.2355:2461](),[19.2461][19.2221:2289]()
    foreach my $param (keys %{$c->request->params}) {
    next unless $param =~ /^input-(\w+)-name$/;
    my $baseName = $1;
    next if $baseName eq "template";
    [19.2355]
    [19.2579]
    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
    [19.2580][19.2290:2355]()
    my ($inputName, $inputType) = checkInput($c, $baseName);
    [19.2580]
    [19.2750]
    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
    [19.3097][19.3097:3134]()
    $inputNames{$inputName} = 1;
    [19.2751]
    [19.186]
    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
    [19.3166][19.2356:2448](),[19.2448][19.3259:3311](),[19.3259][19.3259:3311]()
    if ($baseName =~ /^\d+$/) { # numeric base name is auto-generated, i.e. a new entry
    $input = $jobset->jobsetinputs->create(
    [19.3166]
    [19.3311]
    unless (defined $inputData->{oldName}) {
    $input = $jobset->jobsetinputs->update_or_create(
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 342
    [19.3447][19.2449:2527]()
    $input = ($jobset->jobsetinputs->search({name => $baseName}))[0];
    [19.3447]
    [19.3526]
    $input = ($jobset->jobsetinputs->search({name => $inputData->{oldName}}))[0];
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 350
    [19.3808][19.2528:2598]()
    my $values = $c->request->params->{"input-$baseName-values"};
    [19.3808]
    [19.3879]
    my $values = $inputData->{values};
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 363
    [19.4484][19.4484:4549]()
    $input->delete unless defined $inputNames{$input->name};
    [19.4484]
    [19.4549]
    $input->delete unless defined $c->stash->{params}->{inputs}->{$input->name};
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 368
    [19.4][19.4:62]()
    sub clone : Chained('jobset') PathPart('clone') Args(0) {
    [19.4]
    [19.62]
    sub clone : Chained('jobsetChain') PathPart('clone') Args(0) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 378
    [19.139][19.222:294](),[19.1140][19.222:294]()
    sub clone_submit : Chained('jobset') PathPart('clone/submit') Args(0) {
    [19.139]
    [19.294]
    sub clone_submit : Chained('jobsetChain') PathPart('clone/submit') Args(0) {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 385
    [19.427][19.94:159]()
    my $newJobsetName = trim $c->request->params->{"newjobset"};
    [19.427]
    [19.159]
    my $newJobsetName = trim $c->stash->{params}->{"newjobset"};
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 412
    [19.39][19.39:97]()
    sub evals : Chained('jobset') PathPart('evals') Args(0) {
    [19.39]
    [19.97]
    sub evals :Chained('jobsetChain') :PathPart('evals') :Args(0) :ActionClass('REST') { }
    sub evals_GET {
  • replacement in src/lib/Hydra/Controller/Jobset.pm at line 428
    [19.257][19.257:358]()
    $c->stash->{evals} = getEvals($self, $c, $evals, ($page - 1) * $resultsPerPage, $resultsPerPage)
    [19.257]
    [19.1296]
    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
    [19.61][19.61:123]()
    sub latest_eval : Chained('jobset') PathPart('latest-eval') {
    [19.61]
    [19.123]
    sub latest_eval : Chained('jobsetChain') PathPart('latest-eval') {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 10
    [19.1458][19.1458:1522]()
    sub project : Chained('/') PathPart('project') CaptureArgs(1) {
    [19.1457]
    [19.1522]
    sub projectChain :Chained('/') :PathPart('project') :CaptureArgs(1) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 13
    [19.2215][19.554:682](),[19.1566][19.554:682]()
    my $project = $c->model('DB::Projects')->find($projectName)
    or notFound($c, "Project $projectName doesn't exist.");
    [19.2215]
    [19.1712]
    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
    [19.1713][19.631:668]()
    $c->stash->{project} = $project;
    [19.1713]
    [19.1753]
    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
    [4.3][19.1757:1810](),[19.1757][19.1757:1810]()
    sub view : Chained('project') PathPart('') Args(0) {
    [4.3]
    [19.1810]
    sub project :Chained('projectChain') :PathPart('') :Args(0) :ActionClass('REST::ForBrowsers') { }
    sub project_GET {
  • edit in src/lib/Hydra/Controller/Project.pm at line 55
    [19.116]
    [19.1942]
    $self->status_ok(
    $c,
    entity => $c->stash->{project}
    );
  • edit in src/lib/Hydra/Controller/Project.pm at line 62
    [19.1945]
    [19.1945]
    sub project_PUT {
    my ($self, $c) = @_;
  • replacement in src/lib/Hydra/Controller/Project.pm at line 65
    [19.1946][19.1946:1995]()
    sub edit : Chained('project') PathPart Args(0) {
    [19.1946]
    [19.1995]
    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
    [19.2149][19.2149:2200]()
    sub submit : Chained('project') PathPart Args(0) {
    [19.2149]
    [19.2200]
    sub submit : Chained('projectChain') PathPart Args(0) {
  • edit in src/lib/Hydra/Controller/Project.pm at line 144
    [19.2226][19.782:833]()
    requireProjectOwner($c, $c->stash->{project});
  • edit in src/lib/Hydra/Controller/Project.pm at line 145
    [19.4652][19.2216:2217]()
  • 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");
    [19.792]
    [19.884]
    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);
    });
    [19.1273]
    [19.2232]
    $c->stash->{projectName} = trim $c->stash->{params}->{name};
  • replacement in src/lib/Hydra/Controller/Project.pm at line 191
    [19.2233][19.3666:3745](),[19.3666][19.3666:3745]()
    $c->res->redirect($c->uri_for($self->action_for("view"), [$projectName]));
    [19.2233]
    [19.4769]
    project_PUT($self, $c);
  • replacement in src/lib/Hydra/Controller/Project.pm at line 195
    [19.4773][19.4773:4848]()
    sub create_jobset : Chained('project') PathPart('create-jobset') Args(0) {
    [19.4773]
    [19.4848]
    sub create_jobset : Chained('projectChain') PathPart('create-jobset') Args(0) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 206
    [19.5031][19.5031:5120]()
    sub create_jobset_submit : Chained('project') PathPart('create-jobset/submit') Args(0) {
    [19.5031]
    [19.5120]
    sub create_jobset_submit : Chained('projectChain') PathPart('create-jobset/submit') Args(0) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 209
    [19.5146][19.5146:5197]()
    requireProjectOwner($c, $c->stash->{project});
    [19.5146]
    [19.2236]
    $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]));
    [19.2237]
    [19.3745]
    Hydra::Controller::Jobset::jobset_PUT($self, $c);
  • replacement in src/lib/Hydra/Controller/Project.pm at line 219
    [19.5805][19.4396:4437](),[19.4396][19.4396:4437](),[19.4437][19.5806:5858]()
    if ($c->check_user_roles('admin')) {
    $owner = trim $c->request->params->{owner};
    [19.5805]
    [19.4492]
    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
    [19.5515][19.795:851]()
    my $projectName = trim $c->request->params->{name};
    [19.5515]
    [19.851]
    my $projectName = $c->stash->{projectName} or $project->name;
  • replacement in src/lib/Hydra/Controller/Project.pm at line 228
    [19.2243][19.953:1016](),[19.953][19.953:1016]()
    my $displayName = trim $c->request->params->{displayname};
    [19.2243]
    [19.1016]
    my $displayName = trim $c->stash->{params}->{displayname};
  • replacement in src/lib/Hydra/Controller/Project.pm at line 234
    [19.5950][19.5950:6076](),[19.6076][19.0:135]()
    , 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
    [19.5950]
    [19.6149]
    , 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
    [19.9216][19.9216:9282]()
    sub get_builds : Chained('project') PathPart('') CaptureArgs(0) {
    [19.9216]
    [19.9282]
    sub get_builds : Chained('projectChain') PathPart('') CaptureArgs(0) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 257
    [19.4][19.4:89]()
    sub create_view_submit : Chained('project') PathPart('create-view/submit') Args(0) {
    [19.4]
    [19.89]
    sub create_view_submit : Chained('projectChain') PathPart('create-view/submit') Args(0) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 277
    [19.9372][19.676:747]()
    sub create_view : Chained('project') PathPart('create-view') Args(0) {
    [19.9372]
    [19.747]
    sub create_view : Chained('projectChain') PathPart('create-view') Args(0) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 287
    [19.4][19.4:81]()
    sub create_release : Chained('project') PathPart('create-release') Args(0) {
    [19.4]
    [19.81]
    sub create_release : Chained('projectChain') PathPart('create-release') Args(0) {
  • replacement in src/lib/Hydra/Controller/Project.pm at line 295
    [19.204][19.234:325]()
    sub create_release_submit : Chained('project') PathPart('create-release/submit') Args(0) {
    [19.204]
    [19.274]
    sub create_release_submit : Chained('projectChain') PathPart('create-release/submit') Args(0) {
  • replacement in src/lib/Hydra/Controller/Release.pm at line 69
    [19.160][19.117:202]()
    $c->res->redirect($c->uri_for($c->controller('Project')->action_for('view'),
    [19.160]
    [19.249]
    $c->res->redirect($c->uri_for($c->controller('Project')->action_for('project'),
  • replacement in src/lib/Hydra/Controller/Release.pm at line 75
    [19.417][19.417:482]()
    $c->res->redirect($c->uri_for($self->action_for("view"),
    [19.417]
    [19.482]
    $c->res->redirect($c->uri_for($self->action_for("project"),
  • edit in src/lib/Hydra/Controller/Root.pm at line 40
    [16.575]
    [19.1351]
    $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
    [19.1353]
    [19.1353]
    sub deserialize :ActionClass('Deserialize') { }
  • edit in src/lib/Hydra/Controller/Root.pm at line 57
    [19.2335]
    [19.1318]
    $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
    [19.1322][19.56:75](),[19.56][19.56:75]()
    sub queue :Local {
    [19.1322]
    [19.1323]
    sub queue :Local :Args(0) :ActionClass('REST') { }
    sub queue_GET {
  • edit in src/lib/Hydra/Controller/Root.pm at line 72
    [19.141][19.141:200](),[19.200][13.970:1147]()
    $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
    [19.250]
    [219.2120]
    $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
    [19.557]
    [19.377]
  • edit in src/lib/Hydra/Controller/Root.pm at line 95
    [19.378]
    [19.557]
    sub status :Local :Args(0) :ActionClass('REST') { }
  • replacement in src/lib/Hydra/Controller/Root.pm at line 97
    [19.558][19.379:399]()
    sub status :Local {
    [19.558]
    [19.399]
    sub status_GET {
  • replacement in src/lib/Hydra/Controller/Root.pm at line 99
    [19.424][5.0:215]()
    $c->stash->{steps} = [ $c->model('DB::BuildSteps')->search(
    { 'me.busy' => 1, 'build.finished' => 0, 'build.busy' => 1 },
    { join => [ 'build' ]
    , order_by => [ 'machine' ]
    } ) ];
    [19.424]
    [19.646]
    $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
    [19.226][19.226:260]()
    elsif (scalar @{$c->error}) {
    [19.226]
    [19.1625]
    if (scalar @{$c->error}) {
    $c->stash->{resource} = { errors => "$c->error" };
  • edit in src/lib/Hydra/Controller/Root.pm at line 234
    [19.1736]
    [19.1736]
    } elsif (defined $c->stash->{resource} and
    (ref $c->stash->{resource} eq ref {}) and
    defined $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
    [19.1742]
    [19.1742]
    $c->forward('serialize');
  • edit in src/lib/Hydra/Controller/Root.pm at line 244
    [19.1744]
    [220.362]
    sub serialize : ActionClass('Serialize') { }
  • replacement in src/lib/Hydra/Controller/User.pm at line 6
    [19.313][19.313:346]()
    use base 'Catalyst::Controller';
    [19.313]
    [19.272]
    use base 'Hydra::Base::Controller::REST';
  • replacement in src/lib/Hydra/Controller/User.pm at line 16
    [19.478][19.478:497]()
    sub login :Local {
    [19.478]
    [19.497]
    sub login :Local :Args(0) :ActionClass('REST::ForBrowsers') { }
    sub login_GET {
  • replacement in src/lib/Hydra/Controller/User.pm at line 21
    [19.523][19.523:639]()
    my $username = $c->request->params->{username} || "";
    my $password = $c->request->params->{password} || "";
    [19.523]
    [19.639]
    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)/;
    }
    [19.640]
    [19.877]
    $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
    [19.912][19.516:611](),[19.611][19.1142:1203](),[19.1142][19.1142:1203]()
    backToReferer($c) if $c->authenticate({username => $username, password => $password});
    $c->stash->{errorMsg} = "Bad username or password.";
    [19.912]
    [19.1203]
    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
    [19.1209]
    [19.1241]
    }
  • edit in src/lib/Hydra/Controller/User.pm at line 53
    [19.1242][19.1242:1284]()
    $c->stash->{template} = 'login.tt';
    }
  • edit in src/lib/Hydra/Controller/User.pm at line 54
    [19.1285]
    [19.1285]
    sub logout :Local :Args(0) :ActionClass('REST::ForBrowsers') { }
  • replacement in src/lib/Hydra/Controller/User.pm at line 56
    [19.1286][19.1286:1306]()
    sub logout :Local {
    [19.1286]
    [19.1306]
    sub logout_POST {
  • replacement in src/lib/Hydra/Controller/User.pm at line 59
    [19.1347][19.1347:1417]()
    $c->response->redirect($c->request->referer || $c->uri_for('/'));
    [19.1347]
    [19.1417]
    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
    [19.1420]
    [19.1420]
    sub logout_GET {
    # Probably a better way to do this
    my ($self, $c) = @_;
    logout_POST($self, $c);
    }
  • edit in src/lib/Hydra/Controller/User.pm at line 72
    [19.1421]
    [19.1421]
  • edit in src/lib/Hydra/Controller/User.pm at line 148
    [19.1128]
    [19.1128]
    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
    [19.1855][19.1855:1891]()
    sub edit :Chained('user') Args(0) {
    [19.1855]
    [19.3353]
    sub edit :Chained('user') :Args(0) :ActionClass('REST::ForBrowsers') { }
    sub edit_GET {
  • replacement in src/lib/Hydra/Controller/User.pm at line 200
    [19.2055][19.2055:2224]()
    if ($c->request->method ne "POST") {
    $c->stash->{fullname} = $user->fullname;
    $c->stash->{emailonerror} = $user->emailonerror;
    return;
    }
    [19.2055]
    [19.2224]
    $c->stash->{fullname} = $user->fullname;
  • replacement in src/lib/Hydra/Controller/User.pm at line 202
    [19.2225][19.2225:2286]()
    if (($c->request->params->{submit} // "") eq "delete") {
    [19.2225]
    [19.2286]
    $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
    [19.2358][19.2358:2427]()
    if (($c->request->params->{submit} // "") eq "reset-password") {
    [19.2358]
    [19.2427]
    if (($c->stash->{params}->{submit} // "") eq "reset-password") {
  • replacement in src/lib/Hydra/Controller/User.pm at line 236
    [19.3041][19.3041:3094]()
    my $fullName = trim $c->req->params->{fullname};
    [19.3041]
    [19.3094]
    my $fullName = trim $c->stash->{params}->{fullname};
  • replacement in src/lib/Hydra/Controller/User.pm at line 244
    [19.3273][19.3273:3349]()
    , emailonerror => $c->request->params->{"emailonerror"} ? 1 : 0
    [19.3273]
    [19.3349]
    , emailonerror => $c->stash->{params}->{"emailonerror"} ? 1 : 0
  • replacement in src/lib/Hydra/Controller/User.pm at line 247
    [19.3366][19.3366:3424]()
    my $password = $c->req->params->{password} // "";
    [19.3366]
    [19.3424]
    my $password = $c->stash->{params}->{password} // "";
  • replacement in src/lib/Hydra/Controller/User.pm at line 252
    [19.3653][19.3653:3720]()
    if $password ne trim $c->req->params->{password2};
    [19.3653]
    [19.3720]
    if $password ne trim $c->stash->{params}->{password2};
  • replacement in src/lib/Hydra/Controller/User.pm at line 264
    [19.3965][19.3965:3988]()
    backToReferer($c);
    [19.3965]
    [19.3413]
    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
    [19.1308][19.1308:1393]()
    $c->res->redirect($c->uri_for($c->controller('Project')->action_for('view'),
    [19.1308]
    [19.1393]
    $c->res->redirect($c->uri_for($c->controller('Project')->action_for('project'),
  • replacement in src/lib/Hydra/Controller/View.pm at line 227
    [19.5966][19.5966:6062]()
    return $c->res->redirect($c->uri_for($c->controller('Build')->action_for('view_build'),
    [19.5966]
    [19.6062]
    return $c->res->redirect($c->uri_for($c->controller('Build')->action_for('build'),
  • replacement in src/lib/Hydra/Helper/CatalystUtils.pm at line 205
    [19.5085][19.5085:5127]()
    my $x = $c->request->params->{$name};
    [19.5085]
    [19.5127]
    my $x = $c->stash->{params}->{$name};
  • edit in src/lib/Hydra/Schema/BuildInputs.pm at line 17
    [19.31]
    [19.31]
    =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
    [19.25][19.1907:2049]()
    # 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
    [19.25]
    [19.151]
    # 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
    [6.241]
    [6.241]
    =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
    [6.1127][6.1127:1269]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UpVoKdd3OwMvlvyMjcYNVA
    [6.1127]
    [6.1269]
    # 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
    [19.1499]
    [19.1499]
    =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
    [19.5065][19.2587:2729]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KHwh/Np40jxKXc3ijMImEQ
    [19.5065]
    [19.5065]
    # 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
    [6.1663]
    [6.1663]
    =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
    [6.3027][6.3027:3169]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dC1yX7arRVu9K3wG9dAjCg
    [6.3027]
    [6.3169]
    # 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
    [19.5578]
    [19.5578]
    =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
    [19.9976][19.9976:10118]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:36:03
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZiA1nv73Fpp0/DTi4sLfEQ
    [19.9976]
    [19.10118]
    # 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
    [19.7023]
    [19.7037]
    =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
    [19.1182][19.0:142]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-05-03 14:35:11
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:aYVEk+AeDsgTRi5GAqOhEw
    [19.1182]
    [19.3377]
    # 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
    [19.644]
    [19.644]
    =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
    [19.1677][19.11573:11715]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ONhBo6Xhq7uwYFdEzbp3dg
    [19.1677]
    [19.1819]
    # 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
    [19.10554]
    [19.180]
    =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
    [19.1055][19.12333:12475]()
    # 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
    [19.1055]
    [19.1200]
    # 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
    [19.11351]
    [19.1494]
    =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
    [19.2415][19.13012:13154]()
    # 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
    [19.2415]
    [19.2415]
    # 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
    [19.185]
    [19.185]
    =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
    [19.1417][19.13689:13831]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:xFLnuCBAcJCg+N3b4aajZQ
    [19.1417]
    [19.1559]
    # 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
    [19.12238]
    [19.12238]
    =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
    [19.1497][19.14368:14510]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:4KzXhMnUldVgNuuNXWIYjw
    [19.1497]
    [19.1639]
    # 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
    [19.12952]
    [19.12952]
    =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
    [19.2485][19.14979:15121]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:1rjwWtZXGEowHqhfjLqjmA
    [19.2485]
    [19.2485]
    # 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
    [19.13573]
    [19.1536]
    =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
    [19.2613][14.0:142]()
    # 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
    [19.2613]
    [19.2756]
    # 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
    [19.626]
    [19.626]
    =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
    [19.2509][19.4272:4414]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ng+Q6tMX5EJMD7DxRWVy7Q
    [19.2509]
    [19.2651]
    # 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
    [19.1514]
    [19.1514]
    =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
    [19.17200][19.4746:4888]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:EVwSR9WBqbBdIHq1ANQMHg
    [19.17200]
    [19.2915]
    # 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
    [19.15993]
    [221.221]
    =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
    [19.18354][19.5154:5296]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:qElGj6zzuI0xo426np3r1w
    [19.18354]
    [19.1674]
    # 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
    [19.14945]
    [19.14945]
    =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
    [19.1974][19.5372:5514]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:M3pNBRLfxgSScrPj1zaajA
    [19.1974]
    [19.1974]
    # 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
    [19.16929]
    [19.16930]
    =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
    [19.1825][19.5610:5752]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:xjioYUPo6visoLAVDkDZ0Q
    [19.1825]
    [19.20420]
    # 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
    [19.17859]
    [19.17860]
    =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
    [19.3136][11.317:459]()
    # 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
    [19.3136]
    [19.22627]
    # 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
    [19.2516]
    [19.2516]
    =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
    [19.3800][19.6354:6496]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:lnA5Utkwk5WTyKA/M5mlyg
    [19.3800]
    [19.4112]
    # 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
    [19.478]
    [19.479]
    =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
    [19.1559][19.6742:6884]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:zW87n6E7xWaShcFbgFkVuw
    [19.1559]
    [19.1701]
    # 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
    [19.19826]
    [19.19839]
    =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
    [19.7308][19.7308:7450]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:OCuhmxs8pZxvmk81eVLLcQ
    [19.7308]
    [19.4514]
    # 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
    [19.21504]
    [19.21504]
    =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
    [19.3083][19.7862:8004]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:eP00w5UJp1uTtiB7D5IhTQ
    [19.3083]
    [19.22596]
    # 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
    [19.22629]
    [19.3281]
    =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
    [19.4209][19.8187:8329]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:UTUE3Hb89fT7prwnwwBgvQ
    [19.4209]
    [19.4355]
    # 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
    [19.27412]
    [19.27412]
    =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
    [19.27814][19.5636:5778]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2012-02-29 00:47:18
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:LFD28W0GvvrOOylCM98SEQ
    [19.27814]
    [19.27956]
    # 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
    [8.408]
    [8.408]
    =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
    [8.918][8.918:1060]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:zg8db3Cbi0QOv+gLJqH8cQ
    [8.918]
    [8.1060]
    # 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
    [19.183]
    [19.183]
    =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
    [19.768][19.28850:28992]()
    # Created by DBIx::Class::Schema::Loader v0.07014 @ 2011-12-05 14:15:43
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hzKzGAgAiCfU0nBOiDnjWw
    [19.768]
    [19.910]
    # 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
    [19.23980]
    [19.23980]
    =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
    [19.24455][19.8405:8547]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:KArPHyemtnm/siwE4x5mGQ
    [19.24455]
    [19.24597]
    # 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
    [19.5184]
    [19.5184]
    =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
    [19.8787][19.8787:8929]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:OAUFl/teGpfeleb6D8FPlw
    [19.8787]
    [19.7363]
    # 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
    [19.25520]
    [19.5143]
    =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
    [19.6213][19.9175:9317]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:cbSUw113ENPypbd/sICfgg
    [19.6213]
    [19.6213]
    # 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
    [19.26797]
    [19.26811]
    =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
    [19.7142][19.9498:9640]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:Vyd2+0RAF3XGTpq3KswfAQ
    [19.7142]
    [19.7285]
    # 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
    [12.36]
    [12.36]
    $(wildcard Hydra/Component/*.pm) \
  • replacement in src/root/queue.tt at line 10
    [19.250][19.1667:1750]()
    [% INCLUDE renderBuildList builds=queue showSchedulingInfo=1 hideResultInfo=1 %]
    [19.250]
    [19.333]
    [% INCLUDE renderBuildList builds=resource showSchedulingInfo=1 hideResultInfo=1 %]
  • replacement in src/root/status.tt at line 9
    [19.4654][19.4654:4686]()
    [% FOREACH step IN steps %]
    [19.4654]
    [19.4686]
    [% FOREACH step IN resource %]
  • replacement in src/root/topbar.tt at line 40
    [10.145][19.11260:11384](),[19.656][19.11260:11384](),[19.11260][19.11260:11384]()
    [% INCLUDE menuItem uri = c.uri_for(c.controller('Project').action_for('view'), [project.name]) title = "Overview" %]
    [10.145]
    [19.81]
    [% 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
    [19.151][19.12386:12483](),[19.12386][19.12386:12483]()
    uri = c.uri_for(c.controller('Jobset').action_for('index'), [project.name, jobset.name])
    [19.151]
    [19.12483]
    uri = c.uri_for(c.controller('Jobset').action_for('jobset'), [project.name, jobset.name])
  • replacement in src/sql/Makefile.am at line 19
    [19.3735][19.32443:32664]()
    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]
    let
    builder = 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 30s
    sleep 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");