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] CMU3YKOU * Store the release name.
  • [20] LBNVQXUB * Build the /build stuff in a separate controller.
  • [21] 7YBYT2LQ
  • [22] LGNML7VJ Don't use a prepared statement for the active build steps query
  • [23] BD3GRK4B * Get rid of "positive failures" and separate log phases.
  • [24] BK24VA6Q * for git inputs, check latest revision of branch (defaults to master for now), if there is change, only use input if last checkout was > hour ago.
  • [25] ODNCGFQ5 * Improved the navigation bar: don't include all projects (since that
  • [26] 3PNG7NIB Remove trailing whitespace
  • [27] CLJQCY2X * Store info about all the build actions and allow them to be
  • [28] P73KM42L Update the list of SQL files to be installed.
  • [29] SU566LI3 * Sort releases.
  • [30] SHBLLAVH * More global substitution.
  • [31] 6LTPI6B2
  • [32] SSMN5MPT Remove dead code
  • [33] XJRJ4J7M Add user registration
  • [34] 6LETVKRA After editing a jobset, push it to the front of the evaluation queue
  • [35] 5NO7NCKT * Refactoring.
  • [36] DHMTPGST * Ran update-dbix.
  • [37] SB2V735V Keep track of the database schema version
  • [38] UMFB2767 Hydra/64: Leaving number of builds empty gives DBIx error
  • [39] Y6AHH4TH Remove the logfile and logSize columns from the database
  • [40] QMPX3JDF * hydra: show queue optimization
  • [41] JZVRK5QJ Group some menu items together under a "Status" menu
  • [42] QMW24O5S Add support for Guile & Guix.
  • [43] Z6MDQIGO * A quick (non-Web 2.0) interface to manually add builds to a release.
  • [44] S5PV6IIM * Represent jobs explicitly in the DB.
  • [45] TP3PFR5K
  • [46] RJICSUYG * Align the apply/delete buttons.
  • [47] GPHLV42M * Allow the description of a release member to be edited, and to
  • [48] 3ZCEPLNO
  • [49] CG2TIX5E grr, typo
  • [50] LMETCA7G Cleanup
  • [51] JY7BXXOP Split viewing and editing a project
  • [52] LSZLZHJY Allow users to edit their own settings
  • [53] AKAZKCR6 * At top-level and for each project, provide two channels: "latest"
  • [54] P5X4P6VK * Renaming "release sets" to "views" (not finished yet). Having
  • [55] ZWCTAZGL added newsitems, added some admin options to clear various caches.
  • [56] YPDYBK5G Show dependencies as a tree rather than a list
  • [57] 5QE3TIHP hydra: add status icon per jobset on project page
  • [58] L2E6EVE2 * Merged the Build and Job tables.
  • [59] FYWE74AA
  • [60] BTUDUY6F * Provide some redirects to the latest successful build for a job (or
  • [61] OX6NYJDV Split viewing and editing a jobset
  • [62] UXXFND4U Add a redirect to the latest finished jobset evaluation
  • [63] XEKWCIDR missing case for hg input type
  • [64] NABL63FI * hydra: project members can do stuff that the owner can do
  • [65] J5UVLXOK * Start of a basic Catalyst web interface.
  • [66] EFWN7JBV * Added a status page that shows all the currently executing build steps.
  • [67] BOAFFKUX Active build steps: Make the rows clickable
  • [68] BHZXGT2H * Channels: provide an index page that lists all the packages in the
  • [69] RSEGBU6C Hydra/20: Jobset clone feature
  • [70] 2NGV7NYN Drop unused "tag" column
  • [71] FHF6IZJQ * Basic release management: releases are now dynamically computed as
  • [72] QTC3SYBM Jobset page: Load the jobs and status tabs on demand
  • [73] AHTEIK7G * Added a maintainers field to the Builds table.
  • [74] MOX7XJ2E Merge the BuildSchedulingInfo table into the Builds table
  • [75] NRSKJPP4 makeLink -> menuItem
  • [76] HQGXL4MX Add validation for project and jobset names
  • [77] NUIKDEHL * A quick hack to list the contents of various types of files (RPM,
  • [78] YAPITGB3 * Boolean inputs.
  • [79] SMM4HQTP * Put actions related to builds under /build (e.g. /log/<buildid>
  • [80] KOTB7BKV
  • [81] RFE6T5LG * Store jobset evaluations in the database explicitly. This includes
  • [82] 4JS4DWHD All/recent builds -> Latest builds
  • [83] LC64D4PU Correctly redirect to the referring page when logging in
  • [84] HB3OHPJL hydra: in case of cached build, add link to build that built the storepath
  • [85] JM3DPYOM generated schema with new dbix class schema loader, grrrrrr
  • [86] 75XUS62Y * Added a page to quickly see all failed builds and failed evaluations
  • [87] LZO3C2KI * Hack around those SQLite timeouts: just retry the transaction.
  • [88] 7Z3YOKCV * PROCESS -> INCLUDE in most cases. INCLUDE does proper scoping of
  • [89] FD76WVTQ missing file
  • [90] KAZWI5G4 * hydra: buildpage, show changes since last build/successful build
  • [91] L755DXLC
  • [92] QQ4STW3S missing file
  • [93] WRIU3S5E * UI for cloning builds (not functional yet).
  • [94] HEZ2V5NU order jobset in project view
  • [95] BPVJBR2P * Only put Nix builds in the global channel.
  • [96] V4RNHJNR * Add a link to each project's homepage. Suggested by karltk.
  • [97] 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
  • [98] ZTQEU5QS Hydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet)
  • [99] T7Z63K6T hydra: moves jobsetOverview sub
  • [100] CHCVBZ3W * Slight cleanup.
  • [101] 7UJ5YV4V * Provide a channel for each project containing all the latest
  • [102] XDDCO6CH * hydra: add dependency list with links to logfiles
  • [103] HSVVEKTY * Start of a JSON API to get information about a specific build.
  • [104] WYN733ST * Store build duration, handle cached builds.
  • [105] GWCV3TQV * BuildInputs table: link to dependencies, include store paths.
  • [106] N45RZUQ6 Reduce I/O in build listings by only fetching required columns
  • [107] OEPUOUNB Using twitter bootstrap for more consistent looks for Hydra
  • [108] G2T4WAHI Store the inputs of each evaluation in the database
  • [109] EYNG4EL4 * Regenerate the bindings from a clean sqlite database.
  • [110] RI4S7SYT * Job status: show the active jobs.
  • [111] GJFYEU3S * Nix now stores logs by default as bzip2, make sure the build page uncompresses before showing.
  • [112] 3SQCOHZN * minor performance tweaks
  • [113] PZL3SZM3 Give every page a consistent title
  • [114] 36M6DGIT Show the runtime/build dependencies in the build page
  • [115] VH5ZABDR Add a page to show the latest evaluations for the entire server
  • [116] LCKWLQW3 * In Sqlite "release" is now a keyword, so use "release_" instead.
  • [117] 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
  • [118] YS3AVMLC Remove buildtime and runtime dependency graph. It is useless on normal derivations.
  • [119] FU4GO5VN On build pages, provide a link to the build's first eval
  • [120] BVOPAMLS
  • [121] PHX2HIVG * Store info about the build inputs in the build record.
  • [122] TQKGQ5R3
  • [123] CS7T2XFI
  • [124] ZILILXXK * Allow scheduled builds to be cancelled. They're not removed from
  • [125] 67P45PY4
  • [126] RU7AQO7U * Role-based access control. Only admins can create projects. Only
  • [127] UWVMQIAC * Refactoring.
  • [128] B72GLND4
  • [129] BHJ62LYE * Allow authorised users to create projects.
  • [130] 7ZSVXUGF sequence fix for postgresql
  • [131] XJFHFZCA * Provide some redirects to build products by type so that we can for
  • [132] JJT5QG3K remove revision from cached cvs inputs, and added missing files
  • [133] A52HEFHQ * Allow builds to be restarted (if they failed with a transient error,
  • [134] AWYTL4HO * Don't show platforms that are not included in the current jobset.
  • [135] 3HCBU2FA
  • [136] YFPZ46YK * hydra: added variant of build input type, 'build output (same system)' to allow better continous integration in one jobset for multiple system. it makes sure that the system of the build that is passed as input for a job has the same system as the job.
  • [137] 4D4U5IPY * Allow jobsets to be disabled.
  • [138] 37R34XJO * Negative caching: don't perform a build if a dependency already
  • [139] FPK5LF53 * Put the project-related actions in a separate controller. Put the
  • [140] OOQ2D3KC * Refactoring: move fetchInput out of hydra_scheduler into a separate
  • [141] TWVSALRL * Allow the maximum number of concurrent builds per platform to be
  • [142] YTZOC7C5 * Editing of jobset inputs.
  • [143] DVNWJXWW * Generic declaration of build products.
  • [144] OD5FSS5A * Quick hack to allow viewing of dependency graphs (via nix-store -q
  • [145] 6BLUKEQ2 * Caching of "path" inputs, and fake a revision number for those.
  • [146] 3HZY24CX * Make jobsets viewable under
  • [147] JTRG7RDQ add support for git as jobinput
  • [148] 6FRLEP4P first try for timeline of last 24 hours in hydra
  • [149] FGQPXZIX hydra: make nr of build to keep configurable per jobset
  • [150] R5D7DZPE
  • [151] BKOIYITR added some json responses
  • [152] VS3OUK7D if no emailoverride specified, use empty string
  • [153] JLDUSNUO * Unify rendering of finished and scheduled builds.
  • [154] BN2MO2MP fix redirect after login
  • [155] HPEG2RHV Merge the BuildResultInfo table into the Builds table
  • [156] U4TD3AIQ Add support for viewing jobset evaluations
  • [157] 3Y7AFJSS * Support linking to the latest job in a view for a specific platform, e.g.
  • [158] XHVZXX6N
  • [159] X27GNHDV * Basic job info in the database.
  • [160] G5ZR3ZVZ hydra: put contents links into html, add links to files from contents page
  • [161] 2BUX775I * More release -> view.
  • [162] VJHIHMEH * Store the meta.longDescription and meta.license attributes in the
  • [163] KPZNJ33U * In views, support selecting a job that doesn't depend on the
  • [164] TLZ2SPBR
  • [165] HXBXDEFK Speed up channel processing
  • [166] QTFVCDIF added hide feature for project/jobset
  • [167] DWIA5CDJ * Make download-by-type more deterministic when there are multiple
  • [168] Q4VDOA76 Replace last 5 builds on jobset page with last 5 evaluations. Moved hide/unhide and evaluate options to jobset topmenu.
  • [169] PCKLFRT5 Support push notification of repository changes
  • [170] VG4QG336 Remove tablesorter
  • [171] AZCCANUB Missing part of aaacf9eda36f5cdcc77cec20d6f49fbb6f925105
  • [172] H7CNGK4O * Log evaluation errors etc. in the DB.
  • [173] 7ZVZJK54 Re-enable the "Related Builds" tab
  • [174] CQTN62OH Die tabs die
  • [175] KN3VYE5P * Cleaned up the foreign key constraints.
  • [176] 6QRHXIM3 * Speed up the jobset index page. Especially the query to get the
  • [177] JARRBLZD Bootstrapify the Hydra forms (except the project and jobset edit pages)
  • [178] S66BOMVU * Added authentication.
  • [179] 4UUKWXDF Jobset page: Show last evaluation time
  • [180] FYO6NECE hydra
  • [181] H5REHM3M
  • [182] ZRRPBEI4 Make jobset deletion consistent with project deletion
  • [183] CFQCNNDR use build timestamp as last-modified header on download
  • [184] ZEHSSVFG
  • [185] YTIDBFGU Drop unused "disabled" columns
  • [186] PMNWRTGJ Add multiple output support
  • [187] GNIEG2GC * Disambiguate jobs by jobset name. I.e. jobs with the same name in
  • [188] ZVTSOVHN * Support Subversion checkouts.
  • [189] SJLEZFC4 check getHydraPath in stead of Envvar HYDRA_DBI directly
  • [190] NYC3LZKH * Generate NAR archives on the fly. Necessary for producing channels
  • [191] NEWDDAOF * Allow users to change the value of a build's "keep" flag, which
  • [192] ECBA3GQO * Make the schema class names match the case of the SQL table names.
  • [193] S6OISBQ3 * Mark the "current" builds in a jobset, i.e. those corresponding to
  • [194] ND75XNSQ Allow showing all evaluations that contain a given build
  • [195] AS2OXLRM * Editing releases.
  • [196] KXGOUX7P * Creating releases.
  • [197] QZLMDKMU * Queue runner: don't start scheduled builds builds if they belong to
  • [198] YJYBKPZ5 Hydra/33: 'Sign in' should return to the referring page
  • [199] IK53RV4V
  • [200] TNMOG2ZQ Indentation
  • [201] PVIRRARJ Turn hiding/unhiding a jobset into a checkbox
  • [202] M552HLIA * Support variant builds.
  • [203] D3DIBMOK * For products that are directories (like manuals), allow a default
  • [204] AKAXJDMW * Disable the statistics on the project, jobset and job pages for now
  • [205] 3KU4L7L3 remove buildonlylatest propery, which was committed by accident
  • [206] OR5SJ42Y Show releases in a tab on the project page
  • [207] 3E6IP3R3 * Add the name of the jobset to ReleaseSetJobs, otherwise we can't
  • [208] RBNQKATL * Adding persistant releases. A release is a named set of builds.
  • [209] 6F4UNDTC * Provide access to the raw, non-pretty-printed logfiles.
  • [210] TJPIS3UP hydra: minor improvements in hydra ui
  • [211] A6XVP6FE Make the hide/unhide actions a checkbox in the project settings
  • [212] XKXMU5PV Ellipsize long jobset/job names to prevent bootstrap navbar breakage
  • [*] T4LLYESZ * Nix expression for building Hydra.
  • [*] 7C6HSXUQ * Start of a regression test for Hydra.
  • [*] YQWH4POV * Simplify.
  • [*] D5QIOJGP * Move everything up one directory.
  • [*] 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");