Add multiple output support

[?]
Feb 13, 2013, 4:49 PM
PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC

Dependencies

  • [2] 5YKSN2MJ * Doh.
  • [3] 36TOESVE * When marking a build as "keep", register it as a root right away
  • [4] DGZE7ZRA * Don't log redundant build steps in case of cached failures.
  • [5] 32LK6HFV * Escape the outPath in the generated nixexpr.tar.bz2 in channels, because
  • [6] SKQXOQ7T hydra: fixed missing argument to restartbuild function
  • [7] ZXJSQF6B point log link for running build step to the automatically reloading log page in stead of the 'useless' pretty log page
  • [8] FP72ASZX No wonder our disk was filling up
  • [9] YISCM3G3 Fix query for certain postgresql versions.
  • [10] E2X5OTFS Keep builds of disabled jobsets that are not hidden. Fixes #18.
  • [11] WQXF2T3D hydra-evaluator: Don't require $HYDRA_CONFIG
  • [12] EX4FXA5T Handle active build steps of aborted builds properly
  • [13] 5NO7NCKT * Refactoring.
  • [14] HGVQUIUX * hydra: download closure now makes closure of outpath in stead of useless drvpath
  • [15] BOFOHCPK removed debug print, added last 50 lines in failure emails
  • [16] UVNQPK3T Hydra/56: handle failed builds with result only at build level, not buildsteps
  • [17] KJQWSRCC Speed up hydra-update-gc-roots
  • [18] YTZOC7C5 * Editing of jobset inputs.
  • [19] TOTSL2RB When checking if build is already built, check for potential 'failed with result'. Fixes issue #7.
  • [20] 2WRTOU2Z Cleanup
  • [21] IK53RV4V
  • [22] 3HCBU2FA
  • [23] RNLGIF4J hydra: remove debug statement
  • [24] ODNCGFQ5 * Improved the navigation bar: don't include all projects (since that
  • [25] GPRYAAFP hydra: change icon for positive failures
  • [26] HVXL2XUZ
  • [27] FM4O2L4M hydra: if evaluator sees cached build, also add the buildproducts
  • [28] YFYRNNQU Use <h3> for running/failed build steps
  • [29] KQS7DSKJ * Clean up indentation.
  • [30] RU7AQO7U * Role-based access control. Only admins can create projects. Only
  • [31] RAKTHYAI * In the job status and error pages, show when the status of a job
  • [32] JZE7DC2F Whitespace
  • [33] BHZXGT2H * Channels: provide an index page that lists all the packages in the
  • [34] FYO6NECE hydra
  • [35] TJK27WSB Open the DB using Hydra::Model::DB->new
  • [36] 57Y7RG2A Update queryPathInfo calls
  • [37] LGNML7VJ Don't use a prepared statement for the active build steps query
  • [38] I42G2Z7P * Escape string literals.[
  • [39] 2M7J26V4 inital version of links to diff in scm
  • [40] BPVJBR2P * Only put Nix builds in the global channel.
  • [41] EDRUQ4UK Die TABs die
  • [42] WZ3AEJ67 * hydra_update_gc_roots.pl registers build outputs that should be kept
  • [43] SB2V735V Keep track of the database schema version
  • [44] S3ZLZP3N * Cut off builds after half an hour of apparent inactivity. This
  • [45] WYN733ST * Store build duration, handle cached builds.
  • [46] 7DWCXNC7 Use the new Nix Perl bindings
  • [47] 3SQCOHZN * minor performance tweaks
  • [48] LZO3C2KI * Hack around those SQLite timeouts: just retry the transaction.
  • [49] INNOEHO6 * Fix getBuildLog for bzip2'd files.
  • [50] HLYVEJX7 * Keep the 3 most recent builds for every platform for every job.
  • [51] 5Y3XOQBR Include the URL of the binary cache in .nixpkg files
  • [52] H47WLVAT * Handle the case where there is no cached build step that produced
  • [53] A52HEFHQ * Allow builds to be restarted (if they failed with a transient error,
  • [54] AEFNBIIW * Merge the GC branch.
  • [55] KAZWI5G4 * hydra: buildpage, show changes since last build/successful build
  • [56] VJHIHMEH * Store the meta.longDescription and meta.license attributes in the
  • [57] 4MBKR4XM Gratuitous whitespace.
  • [58] 2IEFMER5 * Add --fallback to prevent problems with obsolete substitutes.
  • [59] 3PNG7NIB Remove trailing whitespace
  • [60] 2GK5DOU7 * Downloading closures.
  • [61] S6OISBQ3 * Mark the "current" builds in a jobset, i.e. those corresponding to
  • [62] PP4LPADG hydra: buildmachine disabled by default, add some default constraints
  • [63] SJLEZFC4 check getHydraPath in stead of Envvar HYDRA_DBI directly
  • [64] LVJKRTIK * Generate a Nix expression for the channel.
  • [65] RBHHV7P7 * Read logs using logContents function in stead of handling it everywhere separately.
  • [66] CLJQCY2X * Store info about all the build actions and allow them to be
  • [67] KOTB7BKV
  • [68] LL36GPHA added help, removed nix closure from 'failed build with output' productlist
  • [69] A32UT34U hydra_build.pl: Honor `$build->timeout'.
  • [70] HSVVEKTY * Start of a JSON API to get information about a specific build.
  • [71] JOYONH2K Prevent multiple builds with the same (job, outPath) tuple from being added
  • [72] GNIEG2GC * Disambiguate jobs by jobset name. I.e. jobs with the same name in
  • [73] 3E6IP3R3 * Add the name of the jobset to ReleaseSetJobs, otherwise we can't
  • [74] SJN2QPWH * Big speed-up of the job status page and the channel generation (such
  • [75] R5D7DZPE
  • [76] UWVMQIAC * Refactoring.
  • [77] TWVSALRL * Allow the maximum number of concurrent builds per platform to be
  • [78] S66BOMVU * Added authentication.
  • [79] NLJJZVHO * Use ->update({...}) properly.
  • [80] GAIBDEZZ * Store the name of the machine that performed a build step in the
  • [81] S5PV6IIM * Represent jobs explicitly in the DB.
  • [82] LCKWLQW3 * In Sqlite "release" is now a keyword, so use "release_" instead.
  • [83] ZTQEU5QS Hydra: Add support for maxSilent meta attribute (also already added timeout, but not implemented the actual timeout for the build yet)
  • [84] A22P7HCO hydra: at evaluation, check if path is already built, and mark as built in stead of adding to the queue.
  • [85] E2TOU3L6 * More indices.
  • [86] ONAQU4BR hydra: handle case where build to keep set to 0
  • [87] 2JQ7WEFM
  • [88] UXVDOUBJ
  • [89] OOQ2D3KC * Refactoring: move fetchInput out of hydra_scheduler into a separate
  • [90] TLZ2SPBR
  • [91] VVOAXWH4 fix wrong dbix:class:loader generation
  • [92] SZPBGW2N Fix a race condition in hydra-update-gc-roots
  • [93] TPDJL4TY * Add derivations and all build-time dependencies of a build to the
  • [94] 5O6E5SU5 hydra: store logfile/output path/closure size
  • [95] VVDQKVNL
  • [96] PPJN6SDP * paging for releases page
  • [97] JM3DPYOM generated schema with new dbix class schema loader, grrrrrr
  • [98] N22GPKYT * Put info about logs / build products in the DB.
  • [99] WAZFSDSL using backquote as argument resulted in only first line as first argument to removeAsciiEscapes
  • [100] GTGPPGJC Prevent an unnecessary SQL query for every package in the NixExprs view
  • [101] SHBLLAVH * More global substitution.
  • [102] BEKA3TMM Hydra/25: At job pages, show the hash of the output
  • [103] MOX7XJ2E Merge the BuildSchedulingInfo table into the Builds table
  • [104] IN272KZW * Automatically keep all builds in the latest successful release in
  • [105] 3HZY24CX * Make jobsets viewable under
  • [106] DEMSSSB2 * Controller for jobs which inherits all actions in ListBuilds. So
  • [107] LQNBKF3D
  • [108] U7G4EEQC
  • [109] G5A7TZVI * Don't discard old build steps when restarting a build.
  • [110] 3ZCEPLNO
  • [111] G3IUM7VL hydra: add support for succeedOnFailure feature in stdenv
  • [112] T273UOB7 Support obtaining the contents of an evaluation as a channel
  • [113] TVMJTXMB remove header on build page
  • [114] KQZQI2WN Allow creating a release from an evaluation
  • [115] YAPITGB3 * Boolean inputs.
  • [116] QS4OX6Z7 Huuuge speedup in the Hydra evaluator
  • [117] TQKGQ5R3
  • [118] MMDLWWZ2 automatic reload of tail log when build is running
  • [119] RXVJFQ5A Evaluator cleanups
  • [120] GJFYEU3S * Nix now stores logs by default as bzip2, make sure the build page uncompresses before showing.
  • [121] JFZNAYJX * Showing releases.
  • [122] ZILILXXK * Allow scheduled builds to be cancelled. They're not removed from
  • [123] YGRLM2SK * Export all relevant info about the derivation.
  • [124] ON4DDIBZ * Forgot to commit.
  • [125] NEWDDAOF * Allow users to change the value of a build's "keep" flag, which
  • [126] AS5PAYLI
  • [127] NZI7E2E3 * hydra: handle case where logfile is empty
  • [128] 2QA4Y4G3 * hydra: added index, actual build time (buildstep with same outpath, so without deps) of the build
  • [129] A43SLRSH Fix handling of IPC::Run::run exit status
  • [130] 2T42QGZD * Register builds as GC roots so they don't get deleted.
  • [131] X5OIC5FF * hydra: ui bug
  • [132] PY4WQF5G remove ascii escapes from log in tail page and emails
  • [133] JTRG7RDQ add support for git as jobinput
  • [134] CMU3YKOU * Store the release name.
  • [135] 2R7GHSA4 * hydra: added initial version of build graph
  • [136] AHTEIK7G * Added a maintainers field to the Builds table.
  • [137] SMCOU72F hydra: add some admin for adding/enabling/etc build machines
  • [138] V4RNHJNR * Add a link to each project's homepage. Suggested by karltk.
  • [139] AFGT66EI hydra: if a project or jobset is hidden (and thus disabled) do not keep builds
  • [140] OSVLMLCQ hydra: factored out build restart and
  • [141] HXBXDEFK Speed up channel processing
  • [142] U4TD3AIQ Add support for viewing jobset evaluations
  • [143] 7YBYT2LQ
  • [144] 6BLUKEQ2 * Caching of "path" inputs, and fake a revision number for those.
  • [145] LBNVQXUB * Build the /build stuff in a separate controller.
  • [146] BDSD2JLV * Speed up manifest generation.
  • [147] 3XTHEUMP * Implemented the clone feature.
  • [148] J5UVLXOK * Start of a basic Catalyst web interface.
  • [149] E3LZ5H7Q hydra: only use keepnr to determine if builds should be kept
  • [150] Y6AHH4TH Remove the logfile and logSize columns from the database
  • [151] 6F4UNDTC * Provide access to the raw, non-pretty-printed logfiles.
  • [152] KRVD4EW7 * Only non-garbage collected builds can be added to a release.
  • [153] D7NXMCON * Doh.
  • [154] QUTWJR7P * Include more info in notification emails.
  • [155] 6US6LEC7 * Add a NarSize field to Hydra manifests. This allows nix-env
  • [156] XDDCO6CH * hydra: add dependency list with links to logfiles
  • [157] CHQEG6WY Hydra/29: Added timeout to svn/git checkouts, job evaluation
  • [158] VJP6O6WA * Doh. Remove debug statement.
  • [159] YTSIRIMK * Separate job status and all builds pages.
  • [160] GWCV3TQV * BuildInputs table: link to dependencies, include store paths.
  • [161] 4X6NS66Q * Keep the most recent builds for each job.
  • [162] XHVZXX6N
  • [163] 4D4U5IPY * Allow jobsets to be disabled.
  • [164] FHF6IZJQ * Basic release management: releases are now dynamically computed as
  • [165] 3BKF6P72 * Use Nix's negative caching.
  • [166] ZDNXMJ3J * Typo.
  • [167] G2T4WAHI Store the inputs of each evaluation in the database
  • [168] DDGBLKEN Update isCurrent properly
  • [169] ZVTSOVHN * Support Subversion checkouts.
  • [170] 5EIPRLDD export logContents
  • [171] AKAZKCR6 * At top-level and for each project, provide two channels: "latest"
  • [172] EYNG4EL4 * Regenerate the bindings from a clean sqlite database.
  • [173] Z6MDQIGO * A quick (non-Web 2.0) interface to manually add builds to a release.
  • [174] RFE6T5LG * Store jobset evaluations in the database explicitly. This includes
  • [175] D3DIBMOK * For products that are directories (like manuals), allow a default
  • [176] B72GLND4
  • [177] OD5FSS5A * Quick hack to allow viewing of dependency graphs (via nix-store -q
  • [178] A63IHCMX * Register GC roots properly.
  • [179] TW5ZQX5Z * Move up the build products in the builds page, since they're more
  • [180] 2AIIYGI5 * Show job status and all builds for a project.
  • [181] H7CNGK4O * Log evaluation errors etc. in the DB.
  • [182] BD3GRK4B * Get rid of "positive failures" and separate log phases.
  • [183] ECBA3GQO * Make the schema class names match the case of the SQL table names.
  • [184] KN3VYE5P * Cleaned up the foreign key constraints.
  • [185] HB3OHPJL hydra: in case of cached build, add link to build that built the storepath
  • [186] CQTN62OH Die tabs die
  • [187] EFWN7JBV * Added a status page that shows all the currently executing build steps.
  • [188] HPEG2RHV Merge the BuildResultInfo table into the Builds table
  • [189] AX5EQJO3 hydra: show machine in buildsteps
  • [190] 6QRHXIM3 * Speed up the jobset index page. Especially the query to get the
  • [191] 22JB5HNE make changes section more compact/readable
  • [192] BVOPAMLS
  • [193] KNAVU6BH * Do not garbage collect releases.
  • [194] UMOJJ6DV time out to 3600 for now
  • [195] P5X4P6VK * Renaming "release sets" to "views" (not finished yet). Having
  • [196] 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.
  • [197] 2B63JW6F * hydra: changes in list in stead of table, also showing changes of changed 'build output' inputs
  • [198] 6KJXJB7N qualify ordery_by clauses when necessary, remove unnecessary order_by's, reported by Ludo, resulted in errors in sqlite
  • [199] 64K7R4Y6 Forgot to change Nix to Nix::Store in one place
  • [200] FFEH62DE Machine status page now looks much better and more consistent with rest of Hydra
  • [201] JARRBLZD Bootstrapify the Hydra forms (except the project and jobset edit pages)
  • [202] ZI535LI6 * hydra: 'new' UI for project/jobset/job/build
  • [203] 5DSF5KWY * Perl sucks. "getBuildLog $drvPath" doesn't mean the same as
  • [204] BMSQD2ZH Indentation
  • [205] 37R34XJO * Negative caching: don't perform a build if a dependency already
  • [206] L2E6EVE2 * Merged the Build and Job tables.
  • [207] RBNQKATL * Adding persistant releases. A release is a named set of builds.
  • [*] 4N5APGRG * Start of a helper tool to evaluate job expressions efficiently.
  • [*] 4LWGZL33
  • [*] 7YCFGMZB * Report evaluation errors per job, and don't bail out if a job fails
  • [*] FPK5LF53 * Put the project-related actions in a separate controller. Put the
  • [*] ARD6Z67T Do incremental SVN checkouts
  • [*] QMW24O5S Add support for Guile & Guix.
  • [*] AFTXA575 * $HYDRA_DATA environment variable.
  • [*] ZWCTAZGL added newsitems, added some admin options to clear various caches.
  • [*] CXRCPDSQ * added support for twitter notification
  • [*] FHAVPTZ6 Hydra/23: added some X-headers with meta info in email notifications, added more descriptive status
  • [*] OG7BEM57
  • [*] PHX2HIVG * Store info about the build inputs in the build record.

Change contents

  • edit in src/c/hydra-eval-jobs.cc at line 125
    [13.55]
    [210.747]
    DrvInfo::Outputs outputs = drv.queryOutputs(state);
  • edit in src/c/hydra-eval-jobs.cc at line 132
    [13.125][13.217:276](),[13.217][13.217:276]()
    xmlAttrs["outPath"] = drv.queryOutPath(state);
  • edit in src/c/hydra-eval-jobs.cc at line 168
    [210.1148]
    [211.378]
    foreach (DrvInfo::Outputs::iterator, j, outputs) {
    XMLAttrs attrs2;
    attrs2["name"] = j->first;
    attrs2["path"] = j->second;
    doc.writeEmptyElement("output", attrs2);
    }
  • replacement in src/lib/Hydra/Base/Controller/ListBuilds.pm at line 81
    [13.186][13.186:301]()
    ->search({}, { columns => [@buildListColumns, 'drvpath', 'outpath', 'description', 'homepage'] });
    [13.186]
    [13.577]
    ->search({}, { join => ["buildoutputs"]
    , columns => [@buildListColumns, 'drvpath', 'description', 'homepage']
    , '+select' => ['buildoutputs.path', 'buildoutputs.name'], '+as' => ['outpath', 'outname'] });
  • edit in src/lib/Hydra/Base/Controller/NixChannel.pm at line 6
    [212.1060]
    [13.302]
    use List::MoreUtils qw(all);
  • edit in src/lib/Hydra/Base/Controller/NixChannel.pm at line 16
    [13.402]
    [13.402]
    $c->stash->{nixPkgs} = [];
  • replacement in src/lib/Hydra/Base/Controller/NixChannel.pm at line 18
    [13.460][13.460:1045]()
    next if $checkValidity && !isValidPath($build->outpath);
    #if (isValidPath($build->drvpath)) {
    # # Adding `drvpath' implies adding `outpath' because of the
    # # `--include-outputs' flag passed to `nix-store'.
    # push @storePaths, $build->drvpath;
    #} else {
    # push @storePaths, $build->outpath;
    #}
    push @storePaths, $build->outpath;
    my $pkgName = $build->nixname . "-" . $build->system . "-" . $build->id;
    $c->stash->{nixPkgs}->{"${pkgName}.nixpkg"} = {build => $build, name => $pkgName};
    [13.460]
    [13.1045]
    my $outPath = $build->get_column("outpath");
    my $outName = $build->get_column("outname");
    next if $checkValidity && !isValidPath($outPath);
    push @storePaths, $outPath;
    my $pkgName = $build->nixname . "-" . $build->system . "-" . $build->id . ($outName ne "out" ? "-" . $outName : "");
    push @{$c->stash->{nixPkgs}}, { build => $build, name => $pkgName, outPath => $outPath, outName => $outName };
  • replacement in src/lib/Hydra/Base/Controller/NixChannel.pm at line 29
    [13.1345][13.1345:1417]()
    $c->stash->{systemForPath}->{$build->outpath} = $build->system;
    [13.1345]
    [13.1417]
    $c->stash->{systemForPath}->{$outPath} = $build->system;
  • edit in src/lib/Hydra/Base/Controller/NixChannel.pm at line 32
    [13.204]
    [13.1425]
    print STDERR @storePaths, "\n";
  • edit in src/lib/Hydra/Base/Controller/NixChannel.pm at line 42
    [13.1502]
    [13.1502]
    # FIXME: get the closure of the selected path only.
  • edit in src/lib/Hydra/Base/Controller/NixChannel.pm at line 65
    [13.1639]
    [13.1639]
    # FIXME: need to handle multiple outputs: channelBuilds is
    # joined with the build outputs, so find() can return multiple
    # results.
  • replacement in src/lib/Hydra/Base/Controller/NixChannel.pm at line 72
    [13.133][13.1787:1840]()
    if (!isValidPath($c->stash->{build}->outpath)) {
    [13.133]
    [13.1840]
    unless (all { isValidPath($_->path) } $c->stash->{build}->buildoutputs->all) {
  • replacement in src/lib/Hydra/Base/Controller/NixChannel.pm at line 121
    [13.279][13.207:279]()
    $c->stash->{nixPkgs} = [sortPkgs (values %{$c->stash->{nixPkgs}})];
    [13.279]
    [13.399]
    $c->stash->{nixPkgs} = [sortPkgs @{$c->stash->{nixPkgs}}];
  • edit in src/lib/Hydra/Controller/Build.pm at line 13
    [13.31]
    [13.73]
    use List::MoreUtils qw(all);
  • edit in src/lib/Hydra/Controller/Build.pm at line 33
    [13.56]
    [13.682]
    }
    sub findBuildStepByOutPath {
    my ($self, $c, $path, $status) = @_;
    return $c->model('DB::BuildSteps')->search(
    { path => $path, busy => 0, status => $status },
    { join => ["buildstepoutputs"], order_by => ["stopTime"], limit => 1 })->single;
  • edit in src/lib/Hydra/Controller/Build.pm at line 44
    [13.685]
    [13.686]
    sub findBuildStepByDrvPath {
    my ($self, $c, $drvPath, $status) = @_;
    return $c->model('DB::BuildSteps')->search(
    { drvpath => $drvPath, busy => 0, status => $status },
    { order_by => ["stopTime"], limit => 1 })->single;
    }
  • replacement in src/lib/Hydra/Controller/Build.pm at line 58
    [13.883][13.883:941]()
    $c->stash->{available} = isValidPath $build->outpath;
    [13.850]
    [13.0]
    $c->stash->{available} = all { isValidPath($_->path) } $build->buildoutputs->all;
  • edit in src/lib/Hydra/Controller/Build.pm at line 62
    [13.11][13.895:988](),[13.51][13.941:942](),[13.55][13.941:942](),[13.61][13.941:942](),[13.149][13.941:942](),[13.988][13.941:942](),[13.941][13.941:942]()
    $c->stash->{pathHash} = $c->stash->{available} ? queryPathHash($build->outpath) : undef;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 67
    [13.3014][13.105:210]()
    (my $cachedBuildStep) = $c->model('DB::BuildSteps')->search({ outpath => $build->outpath }, {});
    [13.3014]
    [13.0]
    my $path = ($build->buildoutputs)[0]->path or die;
    my $cachedBuildStep = findBuildStepByOutPath($self, $c, $path,
    $build->buildstatus == 0 || $build->buildstatus == 6 ? 0 : 1);
  • replacement in src/lib/Hydra/Controller/Build.pm at line 73
    [13.229][13.3150:3178]()
    if ($build->finished) {
    [13.272]
    [13.3178]
    if ($build->finished && 0) {
  • replacement in src/lib/Hydra/Controller/Build.pm at line 299
    [13.139][13.139:258]()
    $c->stash->{available} = isValidPath $build->outpath;
    $c->stash->{drvAvailable} = isValidPath $build->drvpath;
    [13.139]
    [13.1010]
    my $drvPath = $build->drvpath;
    my @outPaths = map { $_->path } $build->buildoutputs->all;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 302
    [13.1011][13.259:329]()
    my $drvpath = $build->drvpath;
    my $outpath = $build->outpath;
    [13.1011]
    [13.609]
    $c->stash->{available} = all { isValidPath($_) } @outPaths;
    $c->stash->{drvAvailable} = isValidPath $drvPath;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 305
    [13.610][13.334:363](),[13.334][13.334:363]()
    my @buildtimepaths = ();
    [13.610]
    [13.363]
    my @buildtimepaths = $c->stash->{drvAvailable} ? computeFSClosure(0, 0, $drvPath) : ();
  • edit in src/lib/Hydra/Controller/Build.pm at line 307
    [13.391][13.391:518]()
    @buildtimepaths = split '\n', `nix-store --query --requisites --include-outputs $drvpath` if isValidPath($build->drvpath);
  • replacement in src/lib/Hydra/Controller/Build.pm at line 308
    [13.612][13.523:550](),[13.523][13.523:550]()
    my @runtimepaths = ();
    [13.612]
    [13.550]
    my @runtimepaths = $c->stash->{available} ? computeFSClosure(0, 0, @outPaths) : ();
  • edit in src/lib/Hydra/Controller/Build.pm at line 310
    [13.576][13.576:701]()
    @runtimepaths = split '\n', `nix-store --query --requisites --include-outputs $outpath` if isValidPath($build->outpath);
  • replacement in src/lib/Hydra/Controller/Build.pm at line 312
    [13.744][13.1245:1413]()
    my $buildStep;
    ($buildStep) = $c->model('DB::BuildSteps')->search({ outpath => $p }, {}) ;
    my %dep = ( buildstep => $buildStep, path => $p ) ;
    [13.744]
    [13.1413]
    next unless $p =~ /\.drv$/;
    my ($buildStep) = findBuildStepByDrvPath($self, $c, $p, 0);
    my %dep = ( buildstep => $buildStep, path => $p );
  • replacement in src/lib/Hydra/Controller/Build.pm at line 319
    [13.980][13.1451:1619]()
    my $buildStep;
    ($buildStep) = $c->model('DB::BuildSteps')->search({ outpath => $p }, {}) ;
    my %dep = ( buildstep => $buildStep, path => $p ) ;
    [13.980]
    [13.1619]
    my ($buildStep) = findBuildStepByOutPath($self, $c, $p, 0);
    my %dep = ( buildstep => $buildStep, path => $p );
  • edit in src/lib/Hydra/Controller/Build.pm at line 324
    [13.1178][13.615:616]()
  • replacement in src/lib/Hydra/Controller/Build.pm at line 337
    [13.76][13.1606:1670](),[13.1606][13.1606:1670]()
    if !$build->buildproducts->find({type => "nix-build"});
    [13.76]
    [13.1670]
    if $build->buildproducts->search({type => "nix-build"})->count == 0;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 339
    [13.1671][13.77:150](),[13.150][13.1741:1786](),[13.1741][13.1741:1786]()
    notFound($c, "Path " . $build->outpath . " is no longer available.")
    unless isValidPath($build->outpath);
    [13.1671]
    [13.619]
    foreach my $out ($build->buildoutputs) {
    notFound($c, "Path " . $out->path . " is no longer available.")
    unless isValidPath($out->path);
    }
  • replacement in src/lib/Hydra/Controller/Build.pm at line 344
    [13.620][13.2172:2258](),[13.1791][13.2172:2258]()
    $c->stash->{channelBuilds} = $c->model('DB::Builds')->search({id => $build->id});
    [13.620]
    [13.56]
    $c->stash->{channelBuilds} = $c->model('DB::Builds')->search(
    { id => $build->id },
    { join => ["buildoutputs"]
    , '+select' => ['buildoutputs.path', 'buildoutputs.name'], '+as' => ['outpath', 'outname'] });
  • replacement in src/lib/Hydra/Controller/Build.pm at line 398
    [13.205][13.205:242]()
    my ($self, $c, $newStatus) = @_;
    [13.205]
    [13.242]
    my ($self, $c, $x) = @_;
    my $keep = $x eq "1" ? 1 : 0;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 405
    [13.327][13.327:378]()
    die unless $newStatus == 0 || $newStatus == 1;
    [13.327]
    [3.0]
    if ($keep) {
    registerRoot $_->path foreach $build->buildoutputs;
    }
  • edit in src/lib/Hydra/Controller/Build.pm at line 409
    [3.1][3.1:54](),[3.54][13.378:379](),[13.378][13.378:379]()
    registerRoot $build->outpath if $newStatus == 1;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 410
    [13.128][13.3388:3438]()
    $build->update({keep => int $newStatus});
    [13.128]
    [13.483]
    $build->update({keep => $keep});
  • replacement in src/lib/Hydra/Controller/Build.pm at line 414
    [13.520][13.520:597]()
    $newStatus == 0 ? "Build will not be kept." : "Build will be kept.";
    [13.520]
    [13.627]
    $keep ? "Build will be kept." : "Build will not be kept.";
  • replacement in src/lib/Hydra/Controller/Build.pm at line 436
    [13.634][13.2:36](),[13.2][13.2:36]()
    registerRoot $build->outpath;
    [13.634]
    [13.635]
    foreach my $output ($build->buildoutputs) {
    error($c, "This build is no longer available.") unless isValidPath $output->path;
    registerRoot $output->path;
    }
  • edit in src/lib/Hydra/Controller/Build.pm at line 441
    [13.636][13.41:129](),[13.41][13.41:129](),[13.129][13.647:648](),[13.647][13.647:648]()
    error($c, "This build is no longer available.") unless isValidPath $build->outpath;
  • replacement in src/lib/Hydra/Controller/Build.pm at line 532
    [13.333][13.333:381]()
    $c->stash->{jsonOutPath} = $build->outpath;
    [13.333]
    [13.381]
    my $out = $build->buildoutputs->find({name => "out"});
    $c->stash->{jsonOutPath} = $out->path if defined $out;
  • replacement in src/lib/Hydra/Controller/JobsetEval.pm at line 144
    [13.466][13.466:606]()
    ->search({ finished => 1, buildstatus => 0 }, { columns => [@buildListColumns, 'drvpath', 'outpath', 'description', 'homepage'] });
    [13.466]
    [13.3916]
    ->search({ finished => 1, buildstatus => 0 },
    { columns => [@buildListColumns, 'drvpath', 'description', 'homepage']
    , join => ["buildoutputs"]
    , '+select' => ['buildoutputs.path', 'buildoutputs.name'], '+as' => ['outpath', 'outname'] });
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 16
    [213.16]
    [13.2759]
    use File::Slurp;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 47
    [13.24][13.24:25](),[13.25][13.143:374](),[13.143][13.143:374]()
    my $releaseName;
    if (-e "$outPath/nix-support/hydra-release-name") {
    open FILE, "$outPath/nix-support/hydra-release-name" or die;
    $releaseName = <FILE>;
    chomp $releaseName;
    close FILE;
    }
    [13.24]
    [13.374]
    return undef unless -f "$outPath/nix-support/hydra-release-name";
    my $releaseName = read_file("$outPath/nix-support/hydra-release-name");
    chomp $releaseName;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 241
    [13.9288][13.4243:4311]()
    if (!defined $prevBuild || !isValidPath($prevBuild->outpath)) {
    [13.9288]
    [13.4311]
    if (!defined $prevBuild || !isValidPath(getMainOutput($prevBuild)->path)) {
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 255
    [13.234][13.219:262](),[13.4754][13.219:262]()
    { storePath => $prevBuild->outpath
    [13.234]
    [13.4823]
    { storePath => getMainOutput($prevBuild)->path
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 274
    [13.5249][13.5249:5317]()
    push(@validBuilds, $build) if isValidPath($build->outpath);
    [13.5249]
    [13.5317]
    push(@validBuilds, $build) if !isValidPath(getMainOutput($build)->path);
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 292
    [13.5847][13.317:364]()
    { storePath => $prevBuild->outpath
    [13.5847]
    [13.5927]
    { storePath => getMainOutput($prevBuild)->path
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 664
    [214.2105]
    [13.1359]
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 742
    [13.3251][13.3251:3321]()
    ForceArray => ['error', 'job', 'arg'],
    KeyAttr => [],
    [13.3251]
    [13.3321]
    ForceArray => ['error', 'job', 'arg', 'output'],
    KeyAttr => { output => "+name" },
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 751
    [13.9046][13.9046:9116]()
    my $input = $inputInfo->{$arg->{name}}->[$arg->{altnr}] ;
    [13.9046]
    [13.9116]
    my $input = $inputInfo->{$arg->{name}}->[$arg->{altnr}];
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 769
    [13.52][13.52:87]()
    my $outPath = $build->outpath;
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 770
    [13.110]
    [13.110]
    my $explicitProducts = 0;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 772
    [13.111][13.111:169](),[13.169][13.1648:1982]()
    if (-e "$outPath/nix-support/hydra-build-products") {
    open LIST, "$outPath/nix-support/hydra-build-products" or die;
    while (<LIST>) {
    /^([\w\-]+)\s+([\w\-]+)\s+(\S+)(\s+(\S+))?$/ or next;
    my $type = $1;
    my $subtype = $2 eq "none" ? "" : $2;
    my $path = $3;
    my $defaultPath = $5;
    next unless -e $path;
    [13.111]
    [13.567]
    foreach my $output ($build->buildoutputs->all) {
    my $outPath = $output->path;
    if (-e "$outPath/nix-support/hydra-build-products") {
    $explicitProducts = 1;
    open LIST, "$outPath/nix-support/hydra-build-products" or die;
    while (<LIST>) {
    /^([\w\-]+)\s+([\w\-]+)\s+(\S+)(\s+(\S+))?$/ or next;
    my $type = $1;
    my $subtype = $2 eq "none" ? "" : $2;
    my $path = $3;
    my $defaultPath = $5;
    next unless -e $path;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 786
    [13.568][13.1983:2031]()
    my $fileSize, my $sha1, my $sha256;
    [13.568]
    [13.624]
    my $fileSize, my $sha1, my $sha256;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 788
    [13.625][13.2032:2079]()
    # !!! validate $path, $defaultPath
    [13.625]
    [13.3430]
    # !!! validate $path, $defaultPath
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 790
    [13.3431][13.2080:2216]()
    if (-f $path) {
    my $st = stat($path) or die "cannot stat $path: $!";
    $fileSize = $st->size;
    [13.3431]
    [13.417]
    if (-f $path) {
    my $st = stat($path) or die "cannot stat $path: $!";
    $fileSize = $st->size;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 794
    [13.418][13.2217:2359](),[13.866][13.2217:2359]()
    $sha1 = `nix-hash --flat --type sha1 $path`
    or die "cannot hash $path: $?";;
    chomp $sha1;
    [13.418]
    [13.419]
    $sha1 = `nix-hash --flat --type sha1 $path`
    or die "cannot hash $path: $?";;
    chomp $sha1;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 798
    [13.420][13.2376:2538](),[13.2376][13.2376:2538]()
    $sha256 = `nix-hash --flat --type sha256 $path`
    or die "cannot hash $path: $?";;
    chomp $sha256;
    }
    [13.420]
    [13.3431]
    $sha256 = `nix-hash --flat --type sha256 $path`
    or die "cannot hash $path: $?";;
    chomp $sha256;
    }
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 803
    [13.3432][13.2539:2603]()
    my $name = $path eq $outPath ? "" : basename $path;
    [13.3432]
    [13.421]
    my $name = $path eq $outPath ? "" : basename $path;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 805
    [13.422][13.2604:3055](),[13.1341][13.2604:3055]()
    $db->resultset('BuildProducts')->create(
    { build => $build->id
    , productnr => $productnr++
    , type => $type
    , subtype => $subtype
    , path => $path
    , filesize => $fileSize
    , sha1hash => $sha1
    , sha256hash => $sha256
    , name => $name
    , defaultpath => $defaultPath
    });
    [13.422]
    [13.3055]
    $db->resultset('BuildProducts')->create(
    { build => $build->id
    , productnr => $productnr++
    , type => $type
    , subtype => $subtype
    , path => $path
    , filesize => $fileSize
    , sha1hash => $sha1
    , sha256hash => $sha256
    , name => $name
    , defaultpath => $defaultPath
    });
    }
    close LIST;
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 820
    [13.3065][13.3065:3085]()
    close LIST;
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 821
    [13.1281]
    [13.1948]
    return if $explicitProducts;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 824
    [13.1949][13.1282:1293]()
    else {
    [13.1949]
    [13.3086]
    foreach my $output ($build->buildoutputs->all) {
    my $outPath = $output->path;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 830
    [13.3243][13.3243:3271]()
    , subtype => ""
    [13.3243]
    [13.3271]
    , subtype => $output->name eq "out" ? "" : $output->name
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 853
    [13.186]
    [13.3600]
    my @outputNames = sort keys %{$buildInfo->{output}};
    die unless scalar @outputNames;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 857
    [13.3601][13.3601:3724]()
    my $jobName = $buildInfo->{jobName};
    my $drvPath = $buildInfo->{drvPath};
    my $outPath = $buildInfo->{outPath};
    [13.3601]
    [13.3724]
    # In various checks we can use an arbitrary output (the first)
    # rather than all outputs, since if one output is the same, the
    # others will be as well.
    my $firstOutputName = $outputNames[0];
    my $firstOutputPath = $buildInfo->{output}->{$firstOutputName}->{path};
    my $jobName = $buildInfo->{jobName} or die;
    my $drvPath = $buildInfo->{drvPath} or die;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 889
    [13.4677][13.4677:4892]()
    # the channels.
    # !!! Checking $outPath doesn't take meta-attributes into
    # account. For instance, do we want a new build to be
    # scheduled if the meta.maintainers field is changed?
    [13.4677]
    [13.495]
    # the channels. FIXME: Checking the output paths doesn't take
    # meta-attributes into account. For instance, do we want a
    # new build to be scheduled if the meta.maintainers field is
    # changed?
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 894
    [13.528]
    [13.0]
    # Only check one output: if it's the same, the other will be as well.
    my $firstOutput = $outputNames[0];
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 901
    [13.4387][13.4387:4550]()
    { project => $project->name, jobset => $jobset->name, job => $job->name, outPath => $outPath },
    { rows => 1, columns => ['id'] });
    [13.4387]
    [13.663]
    { project => $project->name, jobset => $jobset->name, job => $job->name,
    name => $firstOutputName, path => $firstOutputPath },
    { rows => 1, columns => ['id'], join => ['buildoutputs'] });
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 913
    [13.279][13.279:345]()
    my $prev = $$jobOutPathMap{$job->name . "\t" . $outPath};
    [13.279]
    [13.345]
    my $prev = $$jobOutPathMap{$job->name . "\t" . $firstOutputPath};
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 921
    [13.581][13.5184:5211](),[13.5184][13.5184:5211]()
    # Nope, so add it.
    [13.581]
    [13.881]
    # Are the outputs already in the Nix store? Then add a cached
    # build.
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 924
    [13.905][13.905:942]()
    if (isValidPath($outPath)) {
    [13.905]
    [13.942]
    my $allValid = 1;
    my $buildStatus;
    my $releaseName;
    foreach my $name (@outputNames) {
    my $path = $buildInfo->{output}->{$name}->{path};
    if (isValidPath($path)) {
    if (-f "$path/nix-support/failed") {
    $buildStatus = 6;
    } else {
    $buildStatus //= 0;
    }
    $releaseName //= getReleaseName($path);
    } else {
    $allValid = 0;
    last;
    }
    }
    if ($allValid) {
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 946
    [13.1038][13.0:74]()
    , buildstatus => -f "$outPath/nix-support/failed" ? 6 : 0
    [13.1038]
    [13.615]
    , buildstatus => $buildStatus
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 949
    [13.1199][13.1199:1290]()
    , errormsg => ""
    , releasename => getReleaseName($outPath)
    [13.688]
    [13.1290]
    , releasename => $releaseName
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 955
    [13.690]
    [13.5211]
    # Add the build to the database.
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 967
    [13.5662][13.5662:5696]()
    , outpath => $outPath
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 975
    [13.5888]
    [13.5888]
    $build->buildoutputs->create({ name => $_, path => $buildInfo->{output}->{$_}->{path} })
    foreach @outputNames;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 980
    [13.1542][13.478:546]()
    $$jobOutPathMap{$job->name . "\t" . $outPath} = $build->id;
    [13.1542]
    [13.725]
    $$jobOutPathMap{$job->name . "\t" . $firstOutputPath} = $build->id;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 1028
    [13.379][13.2990:3068]()
    my $drvpath = $build->drvpath;
    my $outpath = $build->outpath;
    [13.379]
    [13.459]
    my @paths;
    push @paths, $build->drvpath;
    push @paths, $_->drvpath foreach $build->buildsteps;
  • replacement in src/lib/Hydra/Helper/AddBuilds.pm at line 1032
    [13.460][13.460:530](),[13.530][13.4665:4715](),[6.90][13.578:588](),[13.3112][13.578:588](),[13.4715][13.578:588](),[13.578][13.578:588]()
    my $paths = "";
    foreach my $bs ($build->buildsteps) {
    $paths = $paths . " " . $bs->outpath;
    }
    [13.460]
    [13.588]
    my $r = `nix-store --clear-failed-paths @paths`;
  • edit in src/lib/Hydra/Helper/AddBuilds.pm at line 1034
    [13.589][13.589:655](),[13.715][13.715:716]()
    my $r = `nix-store --clear-failed-paths $paths $outpath`;
  • replacement in src/lib/Hydra/Helper/Nix.pm at line 17
    [13.48][13.845:911]()
    jobsetOverview removeAsciiEscapes getDrvLogPath logContents);
    [13.48]
    [13.77]
    jobsetOverview removeAsciiEscapes getDrvLogPath logContents
    getMainOutput);
  • edit in src/lib/Hydra/Helper/Nix.pm at line 282
    [13.5602]
    [215.850]
    sub getMainOutput {
    my ($build) = @_;
    return
    $build->buildoutputs->find({name => "out"}) //
    $build->buildoutputs->find({}, {limit => 1, order_by => ["name"]});
    }
  • edit in src/lib/Hydra/Schema/BuildSteps.pm at line 46
    [13.6024][13.6024:6040]()
    =head2 outpath
  • edit in src/lib/Hydra/Schema/BuildSteps.pm at line 47
    [13.6041][13.6394:6414](),[13.6414][13.6082:6099](),[13.6082][13.6082:6099](),[13.6129][13.6129:6130]()
    data_type: 'text'
    is_nullable: 1
  • edit in src/lib/Hydra/Schema/BuildSteps.pm at line 94
    [13.6258][13.2162:2175](),[13.6840][13.2162:2175](),[13.2162][13.2162:2175](),[13.2175][13.6841:6886]()
    "outpath",
    { data_type => "text", is_nullable => 1 },
  • edit in src/lib/Hydra/Schema/BuildSteps.pm at line 141
    [13.2816]
    [13.2958]
    =head2 buildstepoutputs
  • replacement in src/lib/Hydra/Schema/BuildSteps.pm at line 143
    [13.2959][13.2894:3036]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:29:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ItI1OvxHfLTzLVEqfPRjHg
    [13.2959]
    [13.2959]
    Type: has_many
    Related object: L<Hydra::Schema::BuildStepOutputs>
    =cut
  • edit in src/lib/Hydra/Schema/BuildSteps.pm at line 149
    [13.2960]
    [13.3050]
    __PACKAGE__->has_many(
    "buildstepoutputs",
    "Hydra::Schema::BuildStepOutputs",
    { "foreign.build" => "self.build", "foreign.stepnr" => "self.stepnr" },
    undef,
    );
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:36:03
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:ZiA1nv73Fpp0/DTi4sLfEQ
  • edit in src/lib/Hydra/Schema/Builds.pm at line 74
    [13.7976][13.7976:7992]()
    =head2 outpath
  • edit in src/lib/Hydra/Schema/Builds.pm at line 75
    [13.7993][13.7791:7811](),[13.7811][13.8034:8051](),[13.8034][13.8034:8051](),[13.8065][13.8065:8066]()
    data_type: 'text'
    is_nullable: 0
  • edit in src/lib/Hydra/Schema/Builds.pm at line 222
    [13.5698][13.8495:8540](),[13.8164][13.5758:5771](),[13.8540][13.5758:5771](),[13.5758][13.5758:5771]()
    { data_type => "text", is_nullable => 0 },
    "outpath",
  • edit in src/lib/Hydra/Schema/Builds.pm at line 314
    [13.9620]
    [13.3047]
    undef,
    );
    =head2 buildoutputs
    Type: has_many
    Related object: L<Hydra::Schema::BuildOutputs>
    =cut
    __PACKAGE__->has_many(
    "buildoutputs",
    "Hydra::Schema::BuildOutputs",
    { "foreign.build" => "self.id" },
  • edit in src/lib/Hydra/Schema/Builds.pm at line 346
    [13.2883]
    [13.9309]
    =head2 buildstepoutputs
  • edit in src/lib/Hydra/Schema/Builds.pm at line 349
    [13.9310]
    [13.9387]
    Type: has_many
    Related object: L<Hydra::Schema::BuildStepOutputs>
    =cut
    __PACKAGE__->has_many(
    "buildstepoutputs",
    "Hydra::Schema::BuildStepOutputs",
    { "foreign.build" => "self.id" },
    undef,
    );
  • replacement in src/lib/Hydra/Schema/Builds.pm at line 468
    [13.1182][13.3433:3575]()
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:34:39
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:wPBFqpUWncuD9xki8Pbnvg
    [13.1182]
    [13.3377]
    # Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:YBdqPWScG4dtGx+U3dJcwA
  • replacement in src/lib/Hydra/Schema/Builds.pm at line 485
    [13.147][13.147:221](),[13.221][13.2576:2616](),[13.2616][13.262:300](),[13.262][13.262:300](),[13.300][13.293:296](),[13.3767][13.293:296]()
    __PACKAGE__->has_one(
    "actualBuildStep",
    "Hydra::Schema::BuildSteps",
    { 'foreign.outpath' => 'self.outpath'
    , 'foreign.build' => 'self.id'
    },
    );
    [13.147]
    [13.296]
    #__PACKAGE__->has_one(
    # "actualBuildStep",
    # "Hydra::Schema::BuildSteps",
    # { 'foreign.outpath' => 'self.outpath'
    # , 'foreign.build' => 'self.id'
    # },
    #);
  • replacement in src/lib/Hydra/View/NixExprs.pm at line 24
    [13.543][13.543:597](),[13.597][2.0:60](),[2.60][13.648:679](),[13.648][13.648:679]()
    foreach my $name (keys %{$c->stash->{nixPkgs}}) {
    my $build = $c->stash->{nixPkgs}->{$name}->{build};
    $res .= " # $name\n";
    [13.543]
    [13.679]
    foreach my $pkg (@{$c->stash->{nixPkgs}}) {
    my $build = $pkg->{build};
    $res .= " # $pkg->{name}\n";
  • replacement in src/lib/Hydra/View/NixExprs.pm at line 30
    [13.302][5.0:69]()
    $res .= " outPath = " . (escape $build->outpath) . ";\n";
    [13.302]
    [13.970]
    $res .= " outPath = " . (escape $pkg->{outPath}) . ";\n";
  • edit in src/lib/Hydra/View/NixPkg.pm at line 13
    [13.211]
    [13.96]
    # FIXME: add multiple output support
  • replacement in src/lib/Hydra/View/NixPkg.pm at line 16
    [13.327][13.0:56]()
    . " " . $build->drvpath . " " . $build->outpath
    [13.327]
    [13.4868]
    . " " . $build->drvpath . " " . $build->buildoutputs->find({name => "out"})->path
  • replacement in src/root/admin.tt at line 29
    [13.10531][13.10531:10601]()
    <td><tt>[% step.outpath.match('-(.*)').0 %]</tt></td>
    [13.10531]
    [13.10601]
    <td><tt>[% step.drvpath.match('-(.*)').0 %]</tt></td>
  • replacement in src/root/all.tt at line 9
    [13.1128][13.1128:1234](),[13.1234][13.3962:4019]()
    <p>Showing builds [% (page - 1) * resultsPerPage + 1 %] - [% (page - 1) * resultsPerPage + builds.size %]
    out of [% total %] in order of descending timestamp.</p>
    [13.1128]
    [13.1297]
    <p>Showing builds [% (page - 1) * resultsPerPage + 1 %] - [% (page - 1) * resultsPerPage + builds.size %] out of [% total %] in order of descending timestamp.</p>
  • edit in src/root/build.tt at line 10
    [13.6589]
    [13.1960]
    [% BLOCK renderOutputs %]
    [% start=1; FOREACH output IN outputs %]
    [% IF !start %],<br/>[% END; start=0; output.path %]
    [% END %]
    [% END %]
  • replacement in src/root/build.tt at line 18
    [13.1990][13.3118:3530](),[13.3530][13.9877:10136](),[13.10136][13.3787:4764](),[13.3787][13.3787:4764](),[13.4764][13.88:145](),[13.3198][13.88:145](),[13.145][13.4765:4844](),[13.4844][12.0:54](),[12.54][13.5094:5187](),[13.5094][13.5094:5187](),[13.5187][12.55:173](),[12.173][13.5187:5356](),[13.5187][13.5187:5356](),[13.5356][13.10137:10180](),[13.10180][13.5404:5725](),[13.5404][13.5404:5725](),[13.2447][13.7413:7414](),[13.3588][13.7413:7414](),[13.3878][13.7413:7414](),[13.5725][13.7413:7414](),[13.6589][13.7413:7414](),[13.7413][13.7413:7414]()
    <table class="tablesorter table table-striped table-condensed">
    <thead>
    <tr><th>Nr</th><th>What</th><th>Duration</th><th>Machine</th><th>Status</th></tr>
    </thead>
    <tbody>
    [% FOREACH step IN build.buildsteps -%]
    [% IF ( type == "All" ) || ( type == "Failed" && step.status != 0 ) || ( type == "Running" && step.busy == 1 ) -%]
    [% has_log = log_exists(step.drvpath);
    log = c.uri_for('/build' build.id 'nixlog' step.stepnr); -%]
    <tr [% IF has_log %] class="clickable" onclick="window.location = '[% log %]'" [% END %]>
    <td>[% step.stepnr %]</td>
    <td>
    [% IF step.type == 0 %]
    Build of <tt>[% step.outpath %]</tt>
    [% ELSE %]
    Substitution of <tt>[% step.outpath %]</tt>
    [% END %]
    </td>
    <td>
    [% IF step.busy == 0 %]
    [% INCLUDE renderDuration duration = step.stoptime - step.starttime %]
    [% ELSE %]
    [% IF build.finished %]
    [% INCLUDE renderDuration duration = build.stoptime - step.starttime %]
    [% ELSE %]
    [% INCLUDE renderDuration duration = curTime - step.starttime %]
    [% END %]
    [% END %]
    </td>
    <td>[% step.machine.split('@').1 %]</td>
    <td>
    [% IF step.busy == 1 %]
    <strong>Building</strong>
    [% ELSIF step.status == 0 %]
    Succeeded
    [% ELSIF step.status == 4 %]
    <span class="error">Aborted</span>
    [% ELSE %]
    <span class="error">Failed: [% HTML.escape(step.errormsg) %]</span>
    [% END %]
    [% IF has_log %]
    (<a href="[% log %]">log</a>, <a href="[% "$log/raw" %]">raw</a>, <a href="[% "$log/tail-reload" %]">tail</a>)
    [% END %]
    </td>
    </tr>
    [% END %]
    [% END %]
    </tbody>
    </table>
    [13.1990]
    [13.3879]
    <table class="tablesorter table table-striped table-condensed">
    <thead>
    <tr><th>Nr</th><th>What</th><th>Duration</th><th>Machine</th><th>Status</th></tr>
    </thead>
    <tbody>
    [% FOREACH step IN build.buildsteps %]
    [% IF ( type == "All" ) || ( type == "Failed" && step.status != 0 ) || ( type == "Running" && step.busy == 1 ) %]
    [% has_log = log_exists(step.drvpath);
    log = c.uri_for('/build' build.id 'nixlog' step.stepnr); %]
    <tr [% IF has_log %] class="clickable" onclick="window.location = '[% log %]'" [% END %]>
    <td>[% step.stepnr %]</td>
    <td>
    [% IF step.type == 0 %]
    Build of <tt>[% INCLUDE renderOutputs outputs=step.buildstepoutputs %]</tt>
    [% ELSE %]
    Substitution of <tt>[% INCLUDE renderOutputs outputs=step.buildstepoutputs %]</tt>
    [% END %]
    </td>
    <td>
    [% IF step.busy == 0;
    INCLUDE renderDuration duration = step.stoptime - step.starttime;
    ELSIF build.finished;
    INCLUDE renderDuration duration = build.stoptime - step.starttime;
    ELSE;
    INCLUDE renderDuration duration = curTime - step.starttime;
    END %]
    </td>
    <td>[% step.machine.split('@').1 %]</td>
    <td>
    [% IF step.busy == 1 %]
    <strong>Building</strong>
    [% ELSIF step.status == 0 %]
    Succeeded
    [% ELSIF step.status == 4 %]
    <span class="error">Aborted</span>
    [% ELSE %]
    <span class="error">Failed: [% HTML.escape(step.errormsg) %]</span>
    [% END %]
    [% IF has_log %]
    (<a href="[% log %]">log</a>, <a href="[% "$log/raw" %]">raw</a>, <a href="[% "$log/tail-reload" %]">tail</a>)
    [% END %]
    </td>
    </tr>
    [% END %]
    [% END %]
    </tbody>
    </table>
  • replacement in src/root/build.tt at line 116
    [13.8045][13.8045:8103]()
    [% IF build.finished %]
    [13.8045]
    [13.8103]
    [% IF build.iscachedbuild %]
    <tr>
    <th>Cached from:</th>
    <td>
    [% INCLUDE renderFullBuildLink build=cachedBuild %]
    </td>
    </tr>
    [% ELSE %]
  • replacement in src/root/build.tt at line 127
    [13.8244][13.8244:8740]()
    [% IF build.iscachedbuild %]
    (cached[% IF cachedBuild %] from [% INCLUDE renderFullBuildLink build=cachedBuild %][% END %])
    [% ELSE %]
    [% INCLUDE renderDuration duration = build.stoptime - build.starttime %] finished at [% INCLUDE renderDateTime timestamp = build.stoptime %]
    [% END %]
    [13.8244]
    [13.8740]
    [% INCLUDE renderDuration duration = build.stoptime - build.starttime %]; finished at [% INCLUDE renderDateTime timestamp = build.stoptime %]
  • edit in src/root/build.tt at line 226
    [13.11304][13.11304:12179]()
    <tr>
    <th>Build ID:</th>
    <td>[% build.id %]</td>
    </tr>
    <tr>
    <th>Status:</th>
    <td>
    [% INCLUDE renderStatus build=build %]
    </td>
    </tr>
    <tr>
    <th>Project:</th>
    <td>[% INCLUDE renderProjectName project=project.name %]</td>
    </tr>
    <tr>
    <th>Jobset:</th>
    <td>[% INCLUDE renderJobsetName project=project.name jobset=jobset.name %]</td>
    </tr>
    <tr>
    <th>Job name:</th>
    <td>[% INCLUDE renderJobName project=project.name jobset=jobset.name job=job.name %]</td>
    </tr>
  • edit in src/root/build.tt at line 236
    [13.12625][13.12625:12871]()
    [% IF build.releasename %]
    <tr>
    <th>Release name:</th>
    <td><tt>[% HTML.escape(build.releasename) %]</tt></td>
    </tr>
    [% END %]
  • replacement in src/root/build.tt at line 270
    [13.14763][13.14763:14811]()
    <th>Output store path:</th>
    [13.14763]
    [13.14811]
    <th>Output store paths:</th>
  • replacement in src/root/build.tt at line 272
    [13.14836][13.14836:14887]()
    <tt>[% build.outpath %]</tt>
    [13.14836]
    [13.14887]
    <tt>[% INCLUDE renderOutputs outputs=build.buildoutputs %]</tt>
  • edit in src/root/build.tt at line 278
    [13.15121][13.5836:5872](),[13.172][13.5836:5872]()
    [% IF pathHash %]
  • edit in src/root/build.tt at line 279
    [13.15145][13.15145:15370]()
    <th>Output store path hash:</th>
    <td>
    <tt>[% pathHash %]</tt>
    </td>
    </tr>
    [% END %]
    <tr>
  • edit in src/root/channel-contents.tt at line 67
    [13.4517]
    [13.4517]
    [% IF pkg.outName != 'out' %] [[% pkg.outName %]][% END %]
  • replacement in src/root/common.tt at line 350
    [13.143][13.1761:1937]()
    <tr><td><b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]</tt></td></tr>
    [13.143]
    [13.284]
    <tr><td><b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %]</tt> to <tt>[% INCLUDE renderShortInputValue input=bi2 %]</tt></td></tr>
  • replacement in src/root/common.tt at line 363
    [13.518][13.2441:2603]()
    <b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]</tt>
    [13.518]
    [13.815]
    <b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %]</tt> to <tt>[% INCLUDE renderShortInputValue input=bi2 %]</tt>
  • replacement in src/root/common.tt at line 398
    [7.124][13.11682:11744](),[13.11682][13.11682:11744]()
    <td><tt>[% step.outpath.match('-(.*)').0 %]</tt></td>
    [7.124]
    [13.11744]
    <td><tt>[% step.drvpath.match('-(.*)').0 %]</tt></td>
  • replacement in src/root/deps.tt at line 11
    [13.1937][13.1937:1991]()
    <h1>Runtime dependencies for [% build.outpath %]</h1>
    [13.1937]
    [13.1991]
    <h1>Runtime dependencies</h1>
  • replacement in src/root/deps.tt at line 29
    [13.2367][13.2367:2424]()
    <h1>Build time dependencies for [% build.drvpath %]</h1>
    [13.2367]
    [13.2424]
    <h1>Build time dependencies</h1>
  • replacement in src/root/jobset.tt at line 207
    [13.30375][13.30375:30517]()
    [% FOREACH j IN activeJobs %] [% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %] [% END %]
    [13.30375]
    [13.30517]
    [% FOREACH j IN activeJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]
  • replacement in src/root/jobset.tt at line 215
    [13.30810][13.30810:30954]()
    [% FOREACH j IN inactiveJobs %] [% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %] [% END %]
    [13.30810]
    [13.30954]
    [% FOREACH j IN inactiveJobs %][% INCLUDE renderJobName project=project.name jobset=jobset.name job=j %]<br/>[% END %]
  • replacement in src/root/log.tt at line 7
    [13.591][13.591:687]()
    This is the build log of path <tt>[% IF step; step.outpath; ELSE; build.outpath; END %]</tt>.
    [13.591]
    [13.687]
    This is the build log of derivation <tt>[% IF step; step.drvpath; ELSE; build.drvpath; END %]</tt>.
  • replacement in src/root/product-list.tt at line 19
    [13.9534][13.0:57](),[13.51][13.0:57]()
    [% filename = "${build.nixname}.closure.gz" %]
    [13.9534]
    [13.57]
    [% filename = build.nixname _ (product.subtype ? "-" _ product.subtype : "") _ ".closure.gz" %]
  • replacement in src/root/product-list.tt at line 73
    [13.31281][13.745:804](),[13.745][13.745:804]()
    [% filename = "${build.nixname}.closure.gz" %]
    [13.31281]
    [13.804]
    [% filename = build.nixname _ (product.subtype ? "-" _ product.subtype : "") _ ".closure.gz" %]
  • edit in src/script/hydra-build at line 4
    [13.2939]
    [13.2939]
    use List::MoreUtils qw(all);
  • edit in src/script/hydra-build at line 62
    [217.1033]
    [218.13]
  • edit in src/script/hydra-build at line 76
    [218.362]
    [218.362]
  • replacement in src/script/hydra-build at line 133
    [13.623][13.623:674]()
    [ "Output store path:", $build->outpath ],
    [13.623]
    [13.674]
    [ "Output store path:", join(", ", map { $_->path } $build->buildoutputs) ],
  • edit in src/script/hydra-build at line 210
    [219.870]
    [219.870]
  • edit in src/script/hydra-build at line 212
    [219.871]
    [219.871]
    sub addBuildStepOutputs {
    my ($step) = @_;
    my $drv = derivationFromPath($step->drvpath);
    $step->buildstepoutputs->create({ name => $_, path => $drv->{outputs}->{$_} })
    foreach keys %{$drv->{outputs}};
    }
  • edit in src/script/hydra-build at line 219
    [219.872]
    [13.7330]
  • edit in src/script/hydra-build at line 222
    [13.7366]
    [13.3229]
    my %outputs;
    $outputs{$_->name} = $_->path foreach $build->buildoutputs->all;
  • edit in src/script/hydra-build at line 227
    [13.1084][13.1084:1121]()
    my $outPath = $build->outpath;
  • replacement in src/script/hydra-build at line 239
    [13.3470][13.3470:3504]()
    if (!isValidPath($outPath)) {
    [13.3434]
    [13.3504]
    unless (all { isValidPath($_) } values(%outputs)) {
  • edit in src/script/hydra-build at line 251
    [13.5001][11.516:585]()
    # Note: `--timeout' was added in Nix 1.0pre27564, June 2011.
  • replacement in src/script/hydra-build at line 255
    [13.187][13.1105:1163](),[13.1105][13.1105:1163]()
    "--add-root " . gcRootFor $outPath . " 2>&1";
    [13.187]
    [13.405]
    "--add-root " . gcRootFor($outputs{out} // $outputs{(sort keys %outputs)[0]}) . " 2>&1";
    print STDERR "$cmd\n";
  • replacement in src/script/hydra-build at line 277
    [13.974][13.4340:4388](),[13.5496][13.4340:4388]()
    $build->buildsteps->create(
    [13.974]
    [13.25]
    my $step = $build->buildsteps->create(
  • edit in src/script/hydra-build at line 281
    [13.157][13.5734:5774](),[13.5734][13.5734:5774]()
    , outpath => $2
  • edit in src/script/hydra-build at line 285
    [13.5878]
    [13.5878]
    addBuildStepOutputs($step);
  • replacement in src/script/hydra-build at line 321
    [4.333][13.4694:4746](),[13.2927][13.4694:4746]()
    $build->buildsteps->create(
    [4.333]
    [13.379]
    my $step = $build->buildsteps->create(
  • edit in src/script/hydra-build at line 325
    [13.4025][13.3191:3235](),[13.3191][13.3191:3235]()
    , outpath => $2
  • edit in src/script/hydra-build at line 331
    [13.3533]
    [13.3533]
    addBuildStepOutputs($step);
  • replacement in src/script/hydra-build at line 337
    [13.730][13.730:764]()
    my $outPath = $1;
    [13.730]
    [13.1045]
    my $path = $1;
  • replacement in src/script/hydra-build at line 339
    [13.1079][13.4802:4850](),[13.798][13.4802:4850](),[13.4850][13.508:585]()
    $build->buildsteps->create(
    { stepnr => ($buildSteps{$outPath} = $buildStepNr++)
    [13.1079]
    [13.950]
    my $step = $build->buildsteps->create(
    { stepnr => ($buildSteps{$path} = $buildStepNr++)
  • edit in src/script/hydra-build at line 342
    [13.1003][13.1003:1043]()
    , outpath => $1
  • edit in src/script/hydra-build at line 345
    [13.1151]
    [13.1151]
    # "out" is kinda fake (substitutions don't have named outputs).
    $step->buildstepoutputs->create({ name => "out", path => $path });
  • replacement in src/script/hydra-build at line 351
    [13.1246][13.1246:1280]()
    my $outPath = $1;
    [13.1246]
    [13.1080]
    my $path = $1;
  • replacement in src/script/hydra-build at line 353
    [13.1114][13.586:685](),[13.1314][13.586:685]()
    my $step = $build->buildsteps->find({stepnr => $buildSteps{$outPath}}) or die;
    [13.1114]
    [13.641]
    my $step = $build->buildsteps->find({stepnr => $buildSteps{$path}}) or die;
  • replacement in src/script/hydra-build at line 359
    [13.1731][13.1731:1765]()
    my $outPath = $1;
    [13.1731]
    [13.1115]
    my $path = $1;
  • replacement in src/script/hydra-build at line 361
    [13.1149][13.686:785](),[13.1799][13.686:785]()
    my $step = $build->buildsteps->find({stepnr => $buildSteps{$outPath}}) or die;
    [13.1149]
    [13.721]
    my $step = $build->buildsteps->find({stepnr => $buildSteps{$path}}) or die;
  • edit in src/script/hydra-build at line 388
    [13.1533][13.389:407](),[13.407][13.1533:1558](),[13.1533][13.1533:1558]()
    my $size = 0;
    my $closuresize = 0;
  • replacement in src/script/hydra-build at line 389
    [13.409][13.1558:1591](),[13.1558][13.1558:1591](),[13.1591][13.166:249](),[13.97][13.495:521](),[13.249][13.495:521](),[13.495][13.495:521]()
    if (isValidPath($outPath)) {
    my ($deriver, $hash, $time, $narSize, $refs) = queryPathInfo($outPath, 0);
    $size = $narSize;
    [13.409]
    [13.521]
    txn_do($db, sub {
    if ($buildStatus == 0) {
  • replacement in src/script/hydra-build at line 392
    [13.522][13.98:154](),[13.154][13.583:621](),[13.583][13.583:621](),[13.621][11.712:834](),[11.834][13.736:746](),[13.1175][13.736:746](),[13.736][13.736:746](),[13.746][13.1703:1709](),[13.1703][13.1703:1709]()
    my @closure = computeFSClosure(0, 0, $outPath);
    foreach my $path (@closure) {
    my ($deriver, $hash, $time, $narSize, $refs) = queryPathInfo($path, 0);
    $closuresize += $narSize;
    }
    }
    [13.522]
    [13.1709]
    my $size = 0;
    my $closureSize = 0;
    my $releaseName;
  • replacement in src/script/hydra-build at line 396
    [13.1710][13.1150:1172](),[13.4021][13.1150:1172](),[13.1652][13.1383:1435]()
    txn_do($db, sub {
    my $releaseName = getReleaseName($outPath);
    [13.1710]
    [13.1176]
    my @closure = computeFSClosure(0, 0, values %outputs);
    foreach my $path (@closure) {
    my ($deriver, $hash, $time, $narSize, $refs) = queryPathInfo($path, 0);
    $closureSize += $narSize;
    $size += $narSize if grep { $path eq $_ } values(%outputs);
    }
    foreach my $path (values %outputs) {
    $buildStatus = 6 if $buildStatus == 0 && -f "$path/nix-support/failed";
    $releaseName //= getReleaseName($path);
    }
  • replacement in src/script/hydra-build at line 408
    [13.1177][13.10612:10695](),[13.4472][13.10612:10695]()
    $buildStatus = 6 if $buildStatus == 0 && -f "$outPath/nix-support/failed";
    [13.1177]
    [13.123]
    $build->update(
    { releasename => $releaseName
    , size => $size
    , closuresize => $closureSize
    });
    addBuildProducts($db, $build);
    }
  • edit in src/script/hydra-build at line 427
    [13.1779][13.1779:1849]()
    , size => $size
    , closuresize => $closuresize
  • edit in src/script/hydra-build at line 428
    [13.4543][13.1912:1954]()
    , releasename => $releaseName
  • edit in src/script/hydra-build at line 430
    [13.4797][13.912:966](),[13.966][13.2494:2537](),[13.4577][13.2494:2537](),[13.2537][13.6606:6616](),[13.6606][13.6606:6616]()
    if ($buildStatus == 0 || $buildStatus == 6) {
    addBuildProducts($db, $build);
    }
  • replacement in src/script/hydra-update-gc-roots at line 24
    [13.1073][13.43:152]()
    my @columns = ( "id", "project", "jobset", "job", "system", "finished", "outpath", "drvpath", "timestamp" );
    [13.1073]
    [13.1073]
    my @columns = ( "id", "project", "jobset", "job", "system", "finished", "drvpath", "timestamp" );
  • replacement in src/script/hydra-update-gc-roots at line 30
    [13.364][13.364:387]()
    $build->system, "; ",
    [13.364]
    [13.30]
    $build->system, "; ",
  • replacement in src/script/hydra-update-gc-roots at line 32
    [13.106][13.303:343](),[13.303][13.303:343](),[13.343][13.388:414](),[13.414][13.381:394](),[13.381][13.381:394](),[13.394][13.415:519]()
    if (isValidPath($build->outpath)) {
    addRoot $build->outpath;
    } else {
    print STDERR " warning: output ", $build->outpath, " has disappeared\n" if $build->finished;
    [13.106]
    [13.519]
    foreach my $out ($build->buildoutputs->all) {
    if (isValidPath($out->path)) {
    addRoot $out->path;
    } else {
    print STDERR " warning: output ", $out->path, " has disappeared\n" if $build->finished;
    }
  • replacement in src/script/hydra-update-gc-roots at line 40
    [13.554][13.554:719]()
    if (isValidPath($build->drvpath)) {
    addRoot $build->drvpath;
    } else {
    print STDERR " warning: derivation ", $build->drvpath, " has disappeared\n";
    }
    [13.554]
    [13.474]
    if (isValidPath($build->drvpath)) {
    addRoot $build->drvpath;
    } else {
    print STDERR " warning: derivation ", $build->drvpath, " has disappeared\n";
    }
  • replacement in src/script/hydra-update-gc-roots at line 62
    [13.887][13.887:1005]()
    "exists (select 1 from releasemembers where build = me.id)", { order_by => ["project", "jobset", "job", "id"] });
    [13.887]
    [13.1005]
    "exists (select 1 from releasemembers where build = me.id)",
    { order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] });
  • replacement in src/script/hydra-update-gc-roots at line 80
    [13.577][10.0:82](),[10.82][13.71:112](),[13.71][13.71:112]()
    # If the jobset has been hidden and disabled for more than one week, than
    # don't keep its builds anymore.
    [13.577]
    [10.83]
    # If the jobset has been hidden and disabled for more than one
    # week, then don't keep its builds anymore.
  • replacement in src/script/hydra-update-gc-roots at line 92
    [13.923][13.1505:1650]()
    print STDERR "*** looking for the $keepnr most recent successful builds of each job in jobset ",
    $project->name, ":", $jobset->name, "\n";
    [13.923]
    [13.797]
    # FIXME: base this on jobset evals?
    print STDERR "*** looking for the $keepnr most recent successful builds of each job in jobset ",
    $project->name, ":", $jobset->name, "\n";
  • replacement in src/script/hydra-update-gc-roots at line 96
    [13.798][13.1651:1698](),[13.1698][13.37580:37610](),[13.37610][13.1729:1829](),[13.1729][13.1729:1829]()
    keepBuild $_ foreach $jobset->builds->search(
    { 'me.id' => { 'in' => \
    [ "select b2.id from Builds b2 join " .
    " (select distinct job, system, coalesce( " .
    [13.798]
    [13.1829]
    keepBuild $_ foreach $jobset->builds->search(
    { 'me.id' => { 'in' => \
    [ "select b2.id from Builds b2 join " .
    " (select distinct job, system, coalesce( " .
  • replacement in src/script/hydra-update-gc-roots at line 102
    [9.107][13.2140:2487](),[13.2140][13.2140:2487]()
    " on b2.project = ? and b2.jobset = ? and b2.job = x.job and b2.system = x.system and (id >= x.nth) where finished = 1 and buildStatus = 0"
    , [ '', $keepnr - 1 ], [ '', $project->name ], [ '', $jobset->name ], [ '', $project->name ], [ '', $jobset->name ] ] }
    },
    { order_by => ["job", "system", "id"], columns => [ @columns ] });
    [9.107]
    [13.3896]
    " on b2.project = ? and b2.jobset = ? and b2.job = x.job and b2.system = x.system and (id >= x.nth) where finished = 1 and buildStatus = 0"
    , [ '', $keepnr - 1 ], [ '', $project->name ], [ '', $jobset->name ], [ '', $project->name ], [ '', $jobset->name ] ] }
    },
    { order_by => ["job", "system", "id"], columns => [ @columns ] });
  • replacement in src/script/hydra-update-gc-roots at line 142
    [13.2267][13.2846:2864]()
    $rootsDeleted++;
    [13.2267]
    [8.0]
    $rootsDeleted++;
  • replacement in src/script/hydra-update-gc-roots at line 145
    [13.2955][13.2955:2970]()
    $rootsKept++;
    [13.2955]
    [13.2344]
    $rootsKept++;
  • edit in src/sql/hydra.sql at line 136
    [13.266][13.266:299]()
    outPath text not null,
  • edit in src/sql/hydra.sql at line 176
    [13.126]
    [13.4847]
    -- 6 = failure with output
  • edit in src/sql/hydra.sql at line 194
    [220.2530]
    [13.7124]
    create table BuildOutputs (
    build integer not null,
    name text not null,
    path text not null,
    primary key (build, name),
    foreign key (build) references Builds(id) on delete cascade
    );
  • edit in src/sql/hydra.sql at line 210
    [13.5426][13.7316:7340](),[13.7316][13.7316:7340]()
    outPath text,
  • edit in src/sql/hydra.sql at line 228
    [13.7678]
    [13.10076]
    create table BuildStepOutputs (
    build integer not null,
    stepnr integer not null,
    name text not null,
    path text not null,
    primary key (build, stepnr, name),
    foreign key (build) references Builds(id) on delete cascade,
    foreign key (build, stepnr) references BuildSteps(build, stepnr) on delete cascade
    );
  • replacement in src/sql/hydra.sql at line 516
    [13.12428][13.12428:12468](),[13.12468][13.124:239](),[13.239][13.12550:12640](),[13.12550][13.12550:12640](),[13.12640][13.240:279]()
    hostname text primary key NOT NULL,
    username text DEFAULT '' NOT NULL,
    ssh_key text DEFAULT '' NOT NULL,
    options text DEFAULT '' NOT NULL,
    maxconcurrent integer DEFAULT 2 NOT NULL,
    speedfactor integer DEFAULT 1 NOT NULL,
    enabled integer DEFAULT 0 NOT NULL
    [13.12428]
    [13.864]
    hostname text primary key not null,
    username text default '' not null,
    ssh_key text default '' not null,
    options text default '' not null,
    maxconcurrent integer default 2 not null,
    speedfactor integer default 1 not null,
    enabled integer default 0 not null
  • edit in src/sql/hydra.sql at line 540
    [13.2466][13.2466:2524]()
    create index IndexBuildStepsOnBuild on BuildSteps(build);
  • replacement in src/sql/hydra.sql at line 542
    [13.96][13.96:158](),[13.158][13.559:634]()
    create index IndexBuildStepsOnOutpath on BuildSteps(outpath);
    create index IndexBuildStepsOnOutpathBuild on BuildSteps (outpath, build);
    [13.96]
    [13.2524]
    create index IndexBuildStepOutputsOnPath on BuildStepOutputs(path);