Remove the "releases" feature

[?]
May 6, 2020, 10:39 AM
N74SRHS6XG3M4II7HDCJZKFF6RFXEVGBUN3DN4FUEMELHYCGMHLQC

Dependencies

  • [2] ZQS3ZNA3 Fix broken redirect when editing a release
  • [3] SLBM7H4Q hydra-update-gc-roots: Keep derivations of failed builds
  • [4] 6S3ZLOZL Return JSON for /eval
  • [5] GRMV5GEW Adds documentation for the external API (#441)
  • [6] ICRGXEPI Builds.jobset_id: make not-null
  • [7] 75BCCX2T Get rid of dependency to SQLite
  • [8] CUFVKLLA Remove Hydra::Helper::nix::txn_do from the Perl code
  • [9] 7YBYT2LQ
  • [10] J5UVLXOK * Start of a basic Catalyst web interface.
  • [11] YTZOC7C5 * Editing of jobset inputs.
  • [12] QNDXPVCI * Store the jobset's nixExprPath and nixExprInput fields in a build to
  • [13] HPEG2RHV Merge the BuildResultInfo table into the Builds table
  • [14] 6HWIUOSU Avoid fetching Projects/Jobsets just to get the name column
  • [15] SJPEC375 Builds: add a nullable jobset_id foreign key to Jobsets.
  • [16] 3HCBU2FA
  • [17] KRVD4EW7 * Only non-garbage collected builds can be added to a release.
  • [18] RYTQLATY Keep track of failed paths in the Hydra database
  • [19] AHTEIK7G * Added a maintainers field to the Builds table.
  • [20] WRIU3S5E * UI for cloning builds (not functional yet).
  • [21] 5DSDXORD hydra: missing plain.tt
  • [22] 2BUX775I * More release -> view.
  • [23] UICHT2PS Add a search feature
  • [24] ZI535LI6 * hydra: 'new' UI for project/jobset/job/build
  • [25] U4TD3AIQ Add support for viewing jobset evaluations
  • [26] SU566LI3 * Sort releases.
  • [27] VJHIHMEH * Store the meta.longDescription and meta.license attributes in the
  • [28] RO7REZL3 Remove unnecessary Javascript code
  • [29] 4NTIBJ74 Implement DELETE for jobsets and use it in the web interface
  • [30] SMTMFEKE hydra: add missing templates
  • [31] LSZLZHJY Allow users to edit their own settings
  • [32] RXVJFQ5A Evaluator cleanups
  • [33] GPHLV42M * Allow the description of a release member to be edited, and to
  • [34] 6BLUKEQ2 * Caching of "path" inputs, and fake a revision number for those.
  • [35] KJQWSRCC Speed up hydra-update-gc-roots
  • [36] EFWN7JBV * Added a status page that shows all the currently executing build steps.
  • [37] IWUYFG5T Controllers: allows lazy tabs to return custom errors.
  • [38] SMCOU72F hydra: add some admin for adding/enabling/etc build machines
  • [39] 6GEU36HW Remove obsolete CSS classes
  • [40] TCXFZZFN * hydra: make chart zoomable and clickable
  • [41] W6DC6K4I * Happy Javascript hacking.
  • [42] SYAIW23X Add missing file
  • [43] PMNWRTGJ Add multiple output support
  • [44] EYNG4EL4 * Regenerate the bindings from a clean sqlite database.
  • [45] WE5Q2NVI Allow build to be bumped to the front of the queue via the web interface
  • [46] AS2OXLRM * Editing releases.
  • [47] UDS5VIT6 Lazy load the metrics tab
  • [48] VH5ZABDR Add a page to show the latest evaluations for the entire server
  • [49] D7PL2VWU Move more actions from the top bar
  • [50] G6HJY2V4
  • [51] TRDGNILT Remove unused file
  • [52] JJT5QG3K remove revision from cached cvs inputs, and added missing files
  • [53] KOTB7BKV
  • [54] AWMM5OGV Use delete instead of delete_all
  • [55] K63JYJDH Compose release name for an evaluation if none has been defined
  • [56] ODNCGFQ5 * Improved the navigation bar: don't include all projects (since that
  • [57] P5X4P6VK * Renaming "release sets" to "views" (not finished yet). Having
  • [58] SZPBGW2N Fix a race condition in hydra-update-gc-roots
  • [59] YU6CND7C Remove support for views
  • [60] KKJNJHO5 Update bootstrap to 2.0.3
  • [61] ZVTSOVHN * Support Subversion checkouts.
  • [62] 2VBQRQ2Q Fix some XML well-formedness problems
  • [63] JIJDYWPY Remove the Build menu from the top bar
  • [64] UOINKJ2J Add an action to cancel all builds in a jobset eval
  • [65] ASIRNHAH Load the dependency tabs on demand
  • [66] 77BG3TYK Use c.req.captures
  • [67] S6OISBQ3 * Mark the "current" builds in a jobset, i.e. those corresponding to
  • [68] QTC3SYBM Jobset page: Load the jobs and status tabs on demand
  • [69] GNIEG2GC * Disambiguate jobs by jobset name. I.e. jobs with the same name in
  • [70] RSEGBU6C Hydra/20: Jobset clone feature
  • [71] D7X6XTKQ Integrate the "Job status" and "All jobs" tabs
  • [72] LCKWLQW3 * In Sqlite "release" is now a keyword, so use "release_" instead.
  • [73] D3DIBMOK * For products that are directories (like manuals), allow a default
  • [74] J3RYO2CU Remove the jobs status page
  • [75] 26PYNDXV Remove the errorMsg column from the Builds table
  • [76] 6DMDTQ7M Add bump-to-front role
  • [77] Z6MDQIGO * A quick (non-Web 2.0) interface to manually add builds to a release.
  • [78] RU7AQO7U * Role-based access control. Only admins can create projects. Only
  • [79] H7CNGK4O * Log evaluation errors etc. in the DB.
  • [80] VG4QG336 Remove tablesorter
  • [81] 3D3F5I74 Fix race between hydra-eval-jobs and hydra-update-gc-roots
  • [82] DHMTPGST * Ran update-dbix.
  • [83] B72GLND4
  • [84] 3E6IP3R3 * Add the name of the jobset to ReleaseSetJobs, otherwise we can't
  • [85] YTIDBFGU Drop unused "disabled" columns
  • [86] GWCV3TQV * BuildInputs table: link to dependencies, include store paths.
  • [87] VCOSLZRP
  • [88] QL55ECJ6 - adapted ui for hydra, more in line with nixos.org website
  • [89] VBWHG272 Re-add the history tab (store size and build time), now as lazy-loaded tab on build page.
  • [90] JTHWA6AM Rename aggregate members to constituents
  • [91] 2GUAKGTB Fix indentation of build.tt
  • [92] ZB3JV52W Add a "My jobsets" tab to the dashboard
  • [93] 3QWDDLBR Add support for logging in via a Google account
  • [94] FV2M6MOT hydra: use autoconf/-make
  • [95] G2WXEQHE Remove the Errors page
  • [96] HZWUT4YN Allow users to reproduce builds on their own systems
  • [97] NEQ4BISO Add bootstrap.zip
  • [98] JY7BXXOP Split viewing and editing a project
  • [99] OW6XV2YS * Allow a view result to be saved as a release.
  • [100] KXGOUX7P * Creating releases.
  • [101] PHJF4FUT Add missing files
  • [102] NABL63FI * hydra: project members can do stuff that the owner can do
  • [103] KQZQI2WN Allow creating a release from an evaluation
  • [104] SZYDW2DG hydra: added some user admin
  • [105] 5SHCWE7X * Prevent repeated evaluation of a jobset with the same inputs. This
  • [106] KSBB33RE Add a dashboard
  • [107] 64IV56HI Replace bootstrap tarball
  • [108] 3HZY24CX * Make jobsets viewable under
  • [109] ACFFJUAN hydra-update-gc-roots: Keep more evals
  • [110] JTRG7RDQ add support for git as jobinput
  • [111] T2232OBS * Add some DB indices to make the /releases page much faster.
  • [112] A52HEFHQ * Allow builds to be restarted (if they failed with a transient error,
  • [113] QUMWPGCU Add flake configuration to the web interface
  • [114] XDDCO6CH * hydra: add dependency list with links to logfiles
  • [115] 75XUS62Y * Added a page to quickly see all failed builds and failed evaluations
  • [116] W3XAFDK6 Remove obsolete/broken timeline feature
  • [117] 4D4U5IPY * Allow jobsets to be disabled.
  • [118] T5BIOVJE Add support for tracking custom metrics
  • [119] 36M6DGIT Show the runtime/build dependencies in the build page
  • [120] BVOPAMLS
  • [121] S5PV6IIM * Represent jobs explicitly in the DB.
  • [122] JOVVHIJX Remove all entry points to modify machines
  • [123] BB2KXLXZ Move the build time chart to the job page
  • [124] 6FRLEP4P first try for timeline of last 24 hours in hydra
  • [125] CLJQCY2X * Store info about all the build actions and allow them to be
  • [126] 4S5JF5JP Use latest DBIx::Class::Schema::Loader
  • [127] TPNHTE5V Remove obsolete Builds columns and provide accurate "Running builds"
  • [128] ITJWNQEZ Update Hydra schema, otherwise hydra-notify will not work.
  • [129] U72VNKRU Remove unused file
  • [130] L2E6EVE2 * Merged the Build and Job tables.
  • [131] SJLEZFC4 check getHydraPath in stead of Envvar HYDRA_DBI directly
  • [132] VCG6KNUX Remove the "clone build" feature
  • [133] ZEHSSVFG
  • [134] KN3VYE5P * Cleaned up the foreign key constraints.
  • [135] TX7Q4RAS Add page showing latest build steps
  • [136] WYN733ST * Store build duration, handle cached builds.
  • [137] XTKCALUA Make "Add to release" a modal dialog
  • [138] FTPCV25M Store aggregate members in the database
  • [139] D5QIOJGP * Move everything up one directory.
  • [140] 3JBUMW3E forgot to commit a file
  • [141] 2R7GHSA4 * hydra: added initial version of build graph
  • [142] 3ZCEPLNO
  • [143] IK53RV4V
  • [144] R5D7DZPE
  • [145] E2TOU3L6 * More indices.
  • [146] BKOIYITR added some json responses
  • [147] 4HPT4SDD Revert "Remove now-unused SystemTypes table"
  • [148] R2PON6R7 Allow non-admin users to see the machine status page
  • [149] OR5SJ42Y Show releases in a tab on the project page
  • [150] QAUDQPWG Add a more concise queue page
  • [151] QQ4STW3S missing file
  • [152] 7ECJWNVX Cleanup Project model
  • [153] JM3DPYOM generated schema with new dbix class schema loader, grrrrrr
  • [154] Q5HZWFCY Add support for darcs repositories.
  • [155] WDKFN4B2 Make sign in a modal dialog box rather than a separate page
  • [156] TQKGQ5R3
  • [157] UMEKGOSY Update flot to 0.8.3
  • [158] IN272KZW * Automatically keep all builds in the latest successful release in
  • [159] EYAA7MJY hydra-server: Support logs in S3
  • [160] MOX7XJ2E Merge the BuildSchedulingInfo table into the Builds table
  • [161] BHZXGT2H * Channels: provide an index page that lists all the packages in the
  • [162] ZFEN2MAO Simplify jobset cloning
  • [163] LZVO64YG Merge in the first bits of the API work
  • [164] RBNQKATL * Adding persistant releases. A release is a named set of builds.
  • [165] TWVSALRL * Allow the maximum number of concurrent builds per platform to be
  • [166] PHX2HIVG * Store info about the build inputs in the build record.
  • [167] FD76WVTQ missing file
  • [168] 34DPX2OR * Create some more indices on tables that have a foreign key reference
  • [169] XJRJ4J7M Add user registration
  • [170] 44AGCSXK Use a proper spinning wheel icon
  • [171] FPK5LF53 * Put the project-related actions in a separate controller. Put the
  • [172] 3PNG7NIB Remove trailing whitespace
  • [173] V4RNHJNR * Add a link to each project's homepage. Suggested by karltk.
  • [174] GJFYEU3S * Nix now stores logs by default as bzip2, make sure the build page uncompresses before showing.
  • [175] ECBA3GQO * Make the schema class names match the case of the SQL table names.
  • [176] 2G63HKCH Fix some wellformedness issues
  • [177] T273UOB7 Support obtaining the contents of an evaluation as a channel
  • [178] PCD3ZH6Z Partially revert 1c20cfdf2403feb78cef515faf15c04d5c9f17bd
  • [179] 4X6NS66Q * Keep the most recent builds for each job.
  • [180] WHAFVCEI
  • [181] UUGBVEGY * Development notes.
  • [182] P3M6UFMP Merge remote-tracking branch 'origin/master' into flake
  • [183] YAPITGB3 * Boolean inputs.
  • [184] WNQRX7QB Doh
  • [185] RJICSUYG * Align the apply/delete buttons.
  • [186] BXHG3HYL When renaming a jobset, add a redirect from the old name
  • [187] ZWCTAZGL added newsitems, added some admin options to clear various caches.
  • [188] RX7USXWQ jobset: Add a new "channels" tab.
  • [189] JARRBLZD Bootstrapify the Hydra forms (except the project and jobset edit pages)
  • [190] FANTYCR7 Materialize the number of finished builds
  • [191] PZL3SZM3 Give every page a consistent title
  • [192] S66BOMVU * Added authentication.
  • [193] WZ3AEJ67 * hydra_update_gc_roots.pl registers build outputs that should be kept
  • [194] M552HLIA * Support variant builds.
  • [195] VVOAXWH4 fix wrong dbix:class:loader generation
  • [196] 53IMJNBB Add isChannel column and meta attribute.
  • [197] AK2UZDS2 Jobset page: Add a new tab to show job status in a matrix
  • [198] Y6AHH4TH Remove the logfile and logSize columns from the database
  • [199] QCGCX2BR Generalize lazy tabs
  • [200] 225GEK4N After editing a project/jobset, redirect back to the config tab
  • [201] JLICHVE6 * hydra: do not show build history if there are no previous builds
  • [202] 6WRGCITD Enable declarative projects.
  • [203] LFVXESGI Remove already disabled jobstatus code
  • [204] CMU3YKOU * Store the release name.
  • [205] BD3GRK4B * Get rid of "positive failures" and separate log phases.
  • [206] RFE6T5LG * Store jobset evaluations in the database explicitly. This includes
  • [207] G2T4WAHI Store the inputs of each evaluation in the database
  • [208] 37R34XJO * Negative caching: don't perform a build if a dependency already
  • [209] E4DESS7G Fixes NixOS/hydra#402 (#424)
  • [210] K22TMPH5 Make the info tables less compressed
  • [211] 5T44WFEZ Restore api/get-info
  • [212] W5OAZWPD Drop the errorMsg column in the Jobs table
  • [213] BIVZGPUT Optimise clickable rows
  • [214] CJKPW2G7 Hide the views tab for project that don't have them
  • [215] JD7AWXQG Remove now-unused SystemTypes table
  • [216] 7Z7HOZQ3 * Remove the triggers to simulate foreign key constraints on SQLite,
  • [217] E7FID72S Remove the BuildMachines and BuildMachinesSystemTypes tables
  • [218] IGR322YP sql: Generate models from postgresql
  • [219] SB2V735V Keep track of the database schema version
  • [220] OX6NYJDV Split viewing and editing a jobset
  • [221] ZQUPXSBM Tie custom channels into channel-contents.tt.
  • [222] 67P45PY4
  • [223] FHF6IZJQ * Basic release management: releases are now dynamically computed as
  • [224] TLZ2SPBR
  • [225] X27GNHDV * Basic job info in the database.
  • [226] DVNWJXWW * Generic declaration of build products.
  • [227] SHBLLAVH * More global substitution.
  • [228] 4CELXP7P Remove the longDescription field
  • [*] LBNVQXUB * Build the /build stuff in a separate controller.
  • [*] N22GPKYT * Put info about logs / build products in the DB.

Change contents

  • edit in doc/dev-notes.txt at line 27
    [7.346][7.346:347](),[7.347][9.1090:2142](),[9.1090][9.1090:2142]()
    * Creating a release set:
    insert into ReleaseSets(project, name) values('patchelf', 'unstable');
    insert into ReleaseSetJobs(isPrimary, project, release, job, attrs, description) values(1, 'patchelf', 'unstable', 'tarball', 'officialRelease=false', 'Source distribution');
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'unstable', 'build', 'system=i686-linux', 'Build on i686-linux');
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'unstable', 'build', 'system=x86_64-linux', 'Build on x86_64-linux');
    insert into ReleaseSetJobs(project, release, job, attrs, description, mayFail) values('patchelf', 'unstable', 'rpm_fedora9i386', '', 'Fedora 9 (i386)', 1);
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'unstable', 'rpm_fedora10i386', '', 'Fedora 10 (i386)');
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'unstable', 'deb_ubuntu804i386', '', 'Ubuntu 8.04 (i386)');
  • edit in doc/dev-notes.txt at line 28
    [9.2143][9.2143:3154]()
    insert into ReleaseSets(project, name) values('patchelf', 'stable');
    insert into ReleaseSetJobs(isPrimary, project, release, job, attrs, description) values(1, 'patchelf', 'stable', 'tarball', 'officialRelease=true', 'Source distribution');
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'stable', 'build', 'system=i686-linux', 'Build on i686-linux');
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'stable', 'build', 'system=x86_64-linux', 'Build on x86_64-linux');
    insert into ReleaseSetJobs(project, release, job, attrs, description, mayFail) values('patchelf', 'stable', 'rpm_fedora9i386', '', 'Fedora 9 (i386)', 1);
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'stable', 'rpm_fedora10i386', '', 'Fedora 10 (i386)');
    insert into ReleaseSetJobs(project, release, job, attrs, description) values('patchelf', 'stable', 'deb_ubuntu804i386', '', 'Ubuntu 8.04 (i386)');
  • edit in doc/manual/api.xml at line 69
    [5.1654][5.1654:1674]()
    "releases": [],
  • edit in doc/manual/api.xml at line 80
    [5.1935][5.1935:1955]()
    "releases": [],
  • replacement in doc/manual/api.xml at line 130
    [5.2942][5.2942:2979]()
    "owner": "eelco",
    "releases": []
    [5.2942]
    [5.2979]
    "owner": "eelco"
  • file deletion: Release.pm (----------)
    [9.188][9.1811:1845](),[9.1845][9.977:977]()
    package Hydra::Controller::Release;
    use strict;
    use warnings;
    use base 'Catalyst::Controller';
    use Hydra::Helper::Nix;
    use Hydra::Helper::CatalystUtils;
    sub release : Chained('/') PathPart('release') CaptureArgs(2) {
    my ($self, $c, $projectName, $releaseName) = @_;
    $c->stash->{project} = $c->model('DB::Projects')->find($projectName)
    or notFound($c, "Project $projectName doesn't exist.");
    $c->stash->{release} = $c->stash->{project}->releases->find({name => $releaseName})
    or notFound($c, "Release $releaseName doesn't exist.");
    }
    sub view : Chained('release') PathPart('') Args(0) {
    my ($self, $c) = @_;
    $c->stash->{template} = 'release.tt';
    }
    sub updateRelease {
    my ($c, $release) = @_;
    my $releaseName = trim $c->request->params->{name};
    error($c, "Invalid release name: $releaseName")
    unless $releaseName =~ /^$relNameRE$/;
    $release->update(
    { name => $releaseName
    , description => trim $c->request->params->{description}
    });
    }
    1;
    sub submit : Chained('release') PathPart('submit') Args(0) {
    my ($self, $c) = @_;
    requireProjectOwner($c, $c->stash->{project});
    if (($c->request->params->{action} || "") eq "delete") {
    $c->model('DB')->schema->txn_do(sub {
    $c->stash->{release}->delete;
    });
    $c->res->redirect($c->uri_for($c->controller('Project')->action_for('project'),
    [$c->stash->{project}->name]));
    } else {
    $c->model('DB')->schema->txn_do(sub {
    updateRelease($c, $c->stash->{release});
    });
    $c->res->redirect($c->uri_for($self->action_for("view"),
    [$c->stash->{project}->name, $c->stash->{release}->name]));
    }
    }
    }
    sub edit : Chained('release') PathPart('edit') Args(0) {
    my ($self, $c) = @_;
    requireProjectOwner($c, $c->stash->{project});
    $c->stash->{template} = 'edit-release.tt';
    $c->stash->{members} = [$c->stash->{release}->releasemembers->search({},
    {order_by => ["description"]})];
    $release->releasemembers->delete;
    foreach my $param (keys %{$c->request->params}) {
    next unless $param =~ /^member-(\d+)-description$/;
    my $buildId = $1;
    my $description = trim $c->request->params->{"member-$buildId-description"};
    $release->releasemembers->create({ build => $buildId, description => $description });
    }
    $c->stash->{members} = [$c->stash->{release}->releasemembers->search({},
    {order_by => ["description"]})];
  • edit in src/lib/Hydra/Controller/Build.pm at line 555
    [9.2831][9.2831:2833](),[9.2833][9.5642:5722](),[9.97][9.5642:5722](),[9.5722][9.172:234](),[9.172][9.172:234]()
    sub add_to_release : Chained('buildChain') PathPart('add-to-release') Args(0) {
    my ($self, $c) = @_;
    my $build = $c->stash->{build};
  • edit in src/lib/Hydra/Controller/Build.pm at line 556
    [9.630][9.239:285](),[9.239][9.239:285]()
    requireProjectOwner($c, $build->project);
  • edit in src/lib/Hydra/Controller/Build.pm at line 557
    [9.286][9.286:418](),[9.418][9.631:632](),[9.632][9.423:647](),[9.423][9.423:647](),[9.647][9.633:634](),[9.634][9.3883:4063](),[9.4063][9.635:636](),[9.36][9.635:636](),[9.648][9.648:745](),[9.745][9.637:638](),[9.638][9.506:585](),[9.585][9.639:640](),[9.823][9.639:640](),[9.640][9.5723:5806](),[9.221][9.221:223](),[9.321][9.321:322](),[9.358][9.643:644]()
    my $releaseName = trim $c->request->params->{name};
    my $release = $build->project->releases->find({name => $releaseName});
    error($c, "This project has no release named `$releaseName'.") unless $release;
    error($c, "This build is already a part of release `$releaseName'.")
    if $release->releasemembers->find({build => $build->id});
    foreach my $output ($build->buildoutputs) {
    error($c, "This build is no longer available.") unless isValidPath $output->path;
    registerRoot $output->path;
    }
    $release->releasemembers->create({build => $build->id, description => $build->description});
    $c->flash->{successMsg} = "Build added to project <tt>$releaseName</tt>.";
    $c->res->redirect($c->uri_for($self->action_for("build"), $c->req->captures));
    }
  • edit in src/lib/Hydra/Controller/JobsetEval.pm at line 130
    [4.228][9.0:4](),[9.3916][9.0:4](),[9.4][4.229:294](),[4.294][9.64:175](),[9.64][9.64:175](),[9.175][9.2212:2213](),[9.2213][9.180:289](),[9.180][9.180:289](),[9.289][9.0:114](),[9.114][9.260:355](),[9.197][9.391:410](),[9.355][9.391:410](),[9.391][9.391:410](),[9.410][8.266:308](),[8.308][9.452:975](),[9.452][9.452:975]()
    }
    sub release : Chained('evalChain') PathPart('release') Args(0) {
    my ($self, $c) = @_;
    my $eval = $c->stash->{eval};
    requireProjectOwner($c, $c->stash->{project});
    my @builds = $eval->builds;
    my $releaseName;
    $releaseName ||= $_->releasename foreach @builds;
    # If no release name has been defined by any of the builds, compose one of the project name and evaluation id
    $releaseName = $eval->get_column('project') . "-" . $eval->id unless defined $releaseName;
    my $release;
    $c->model('DB')->schema->txn_do(sub {
    $release = $c->stash->{project}->releases->create(
    { name => $releaseName
    , timestamp => time
    });
    foreach my $build (@builds) {
    $release->releasemembers->create(
    { build => $build->id
    , description => $build->description
    }) if $build->buildstatus == 0;
    }
    });
    $c->res->redirect($c->uri_for($c->controller('Release')->action_for('view'),
    [$c->stash->{project}->name, $release->name]));
  • edit in src/lib/Hydra/Controller/Project.pm at line 32
    [9.7207][9.0:116]()
    $c->stash->{releases} = [$c->stash->{project}->releases->search({},
    {order_by => ["timestamp DESC"]})];
  • edit in src/lib/Hydra/Controller/Project.pm at line 183
    [9.4][9.21046:21128](),[9.21128][9.81:233](),[9.81][9.81:233](),[9.233][9.200:204](),[9.200][9.200:204](),[9.204][9.21129:21225](),[9.325][9.274:299](),[9.21225][9.274:299](),[9.274][9.274:299](),[9.299][9.2246:2247](),[9.2247][9.331:452](),[9.331][9.331:452](),[9.452][8.446:488](),[8.488][9.494:975](),[9.494][9.494:975](),[9.975][9.348:352](),[9.348][9.348:352]()
    sub create_release : Chained('projectChain') PathPart('create-release') Args(0) {
    my ($self, $c) = @_;
    requireProjectOwner($c, $c->stash->{project});
    $c->stash->{template} = 'edit-release.tt';
    $c->stash->{create} = 1;
    }
    sub create_release_submit : Chained('projectChain') PathPart('create-release/submit') Args(0) {
    my ($self, $c) = @_;
    requireProjectOwner($c, $c->stash->{project});
    my $releaseName = $c->request->params->{name};
    my $release;
    $c->model('DB')->schema->txn_do(sub {
    # Note: $releaseName is validated in updateRelease, which will
    # abort the transaction if the name isn't valid.
    $release = $c->stash->{project}->releases->create(
    { name => $releaseName
    , timestamp => time
    });
    Hydra::Controller::Release::updateRelease($c, $release);
    });
    $c->res->redirect($c->uri_for($c->controller('Release')->action_for('view'),
    [$c->stash->{project}->name, $release->name]));
    }
  • file deletion: ReleaseMembers.pm (----------)
    [9.477][9.3177:3218](),[9.3218][9.1847:1847]()
    use utf8;
    package Hydra::Schema::ReleaseMembers;
    # Created by DBIx::Class::Schema::Loader
    # DO NOT MODIFY THE FIRST PART OF THIS FILE
    =head1 NAME
    Hydra::Schema::ReleaseMembers
    =cut
    use strict;
    use warnings;
    use base 'DBIx::Class::Core';
    =head1 COMPONENTS LOADED
    =over 4
    =item * L<Hydra::Component::ToJSON>
    =back
    =cut
    __PACKAGE__->load_components("+Hydra::Component::ToJSON");
    =head1 TABLE: C<releasemembers>
    =cut
    __PACKAGE__->table("releasemembers");
    =head1 ACCESSORS
    =head2 project
    data_type: 'text'
    is_foreign_key: 1
    is_nullable: 0
    =head2 release_
    data_type: 'text'
    is_foreign_key: 1
    is_nullable: 0
    =head2 build
    data_type: 'integer'
    is_foreign_key: 1
    is_nullable: 0
    =head2 description
    data_type: 'text'
    is_nullable: 1
    =cut
    __PACKAGE__->add_columns(
    "project",
    { data_type => "text", is_foreign_key => 1, is_nullable => 0 },
    "release_",
    { data_type => "text", is_foreign_key => 1, is_nullable => 0 },
    "build",
    { data_type => "integer", is_foreign_key => 1, is_nullable => 0 },
    "description",
    { data_type => "text", is_nullable => 1 },
    );
    =head1 PRIMARY KEY
    =over 4
    =item * L</project>
    =item * L</release_>
    =item * L</build>
    =back
    =cut
    __PACKAGE__->set_primary_key("project", "release_", "build");
    =head1 RELATIONS
    =head2 build
    Type: belongs_to
    Related object: L<Hydra::Schema::Builds>
    =cut
    __PACKAGE__->belongs_to(
    "build",
    "Hydra::Schema::Builds",
    { id => "build" },
    { is_deferrable => 0, on_delete => "NO ACTION", on_update => "NO ACTION" },
    );
    =head2 project
    Type: belongs_to
    Related object: L<Hydra::Schema::Projects>
    =cut
    __PACKAGE__->belongs_to(
    "project",
    "Hydra::Schema::Projects",
    { name => "project" },
    { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" },
    );
    =head2 release
    Type: belongs_to
    Related object: L<Hydra::Schema::Releases>
    =cut
    __PACKAGE__->belongs_to(
    "release",
    "Hydra::Schema::Releases",
    { name => "release_", project => "project" },
    { is_deferrable => 0, on_delete => "CASCADE", on_update => "CASCADE" },
    );
    # Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-02-06 12:22:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:k4z2YeB4gRAeAP6hmR93sQ
    1;
  • file deletion: Releases.pm (----------)
    [9.477][9.4450:4485](),[9.4485][9.3220:3220]()
    use utf8;
    package Hydra::Schema::Releases;
    # Created by DBIx::Class::Schema::Loader
    # DO NOT MODIFY THE FIRST PART OF THIS FILE
    =head1 NAME
    Hydra::Schema::Releases
    =cut
    use strict;
    use warnings;
    use base 'DBIx::Class::Core';
    =head1 COMPONENTS LOADED
    =over 4
    =item * L<Hydra::Component::ToJSON>
    =back
    =cut
    __PACKAGE__->load_components("+Hydra::Component::ToJSON");
    =cut
    __PACKAGE__->table("releases");
    =head1 ACCESSORS
    =head2 project
    data_type: 'text'
    is_foreign_key: 1
    is_nullable: 0
    =head2 name
    data_type: 'text'
    is_nullable: 0
    =head2 timestamp
    data_type: 'integer'
    is_nullable: 0
    =head2 description
    data_type: 'text'
    is_nullable: 1
    =cut
    __PACKAGE__->add_columns(
    "project",
    { data_type => "text", is_foreign_key => 1, is_nullable => 0 },
    "name",
    { data_type => "text", is_nullable => 0 },
    "timestamp",
    { data_type => "integer", is_nullable => 0 },
    "description",
    { data_type => "text", is_nullable => 1 },
    );
    =head1 PRIMARY KEY
    =over 4
    =item * L</project>
    =item * L</name>
    =back
    =cut
    __PACKAGE__->set_primary_key("project", "name");
    =head1 RELATIONS
    =head2 project
    Type: belongs_to
    Related object: L<Hydra::Schema::Projects>
    =cut
    __PACKAGE__->belongs_to(
    "project",
    "Hydra::Schema::Projects",
    { name => "project" },
    { is_deferrable => 0, on_delete => "CASCADE", on_update => "NO ACTION" },
    );
    =head2 releasemembers
    Type: has_many
    Related object: L<Hydra::Schema::ReleaseMembers>
    =cut
    __PACKAGE__->has_many(
    "releasemembers",
    "Hydra::Schema::ReleaseMembers",
    {
    "foreign.project" => "self.project",
    "foreign.release_" => "self.name",
    },
    undef,
    );
    # Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-02-06 12:22:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:b4M/tHOhsy234tgTf+wqjQ
    1;
    =head1 TABLE: C<releases>
  • edit in src/lib/Hydra/Schema/Builds.pm at line 531
    [9.1200][9.6192:6193](),[9.1387][9.6192:6193](),[9.1466][9.6192:6193](),[9.3422][9.6192:6193](),[9.10833][9.6192:6193](),[9.6192][9.6192:6193](),[9.6193][9.10834:10856](),[9.981][9.6193:6194](),[9.10856][9.6193:6194](),[9.6193][9.6193:6194](),[9.6194][9.982:998](),[9.998][9.10857:10906]()
    =head2 releasemembers
    Type: has_many
    Related object: L<Hydra::Schema::ReleaseMembers>
  • edit in src/lib/Hydra/Schema/Builds.pm at line 532
    [9.1051][9.1051:1080](),[9.1080][9.10907:10962](),[9.10962][9.1141:1177](),[9.1141][9.1141:1177](),[9.1177][9.3423:3432](),[9.3432][9.1177:1180](),[9.10969][9.1177:1180](),[9.1177][9.1177:1180](),[9.1180][9.3975:3976]()
    =cut
    __PACKAGE__->has_many(
    "releasemembers",
    "Hydra::Schema::ReleaseMembers",
    { "foreign.build" => "self.id" },
    undef,
    );
  • replacement in src/lib/Hydra/Schema/Builds.pm at line 561
    [9.3378][6.165:307]()
    # Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-02-06 12:34:25
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:EEXlcKN/ydXJ129vT0jTUw
    [9.3378]
    [9.4481]
    # Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-05-06 12:32:57
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:3IyFj/9Zf/hvmhBY4U/IBQ
  • edit in src/lib/Hydra/Schema/Projects.pm at line 246
    [9.3022][9.4810:4850](),[9.8132][9.4810:4850](),[9.25206][9.4810:4850](),[9.4810][9.4810:4850](),[9.4850][9.7094:7103](),[9.7103][9.4850:4853](),[9.25213][9.4850:4853](),[9.4850][9.4850:4853](),[9.4853][9.20960:20961](),[9.20961][9.25214:25236](),[9.25236][9.20977:20994](),[9.20977][9.20977:20994](),[9.20994][9.25237:25286](),[9.25286][9.21037:21044](),[9.21037][9.21037:21044](),[9.21044][9.4853:4876](),[9.4853][9.4853:4876](),[9.4876][9.25287:25342]()
    { "foreign.project" => "self.name" },
    undef,
    );
    =head2 releasemembers
    Type: has_many
    Related object: L<Hydra::Schema::ReleaseMembers>
    =cut
    __PACKAGE__->has_many(
    "releasemembers",
    "Hydra::Schema::ReleaseMembers",
  • edit in src/lib/Hydra/Schema/Projects.pm at line 249
    [9.2266][9.21045:21062]()
    =head2 releases
  • edit in src/lib/Hydra/Schema/Projects.pm at line 250
    [9.21063][9.21063:21129](),[9.21129][9.2266:2372](),[9.2266][9.2266:2372](),[9.2372][9.7114:7123](),[9.7123][9.2372:2375](),[9.25356][9.2372:2375](),[9.2372][9.2372:2375](),[9.2375][9.2107:2108]()
    Type: has_many
    Related object: L<Hydra::Schema::Releases>
    =cut
    __PACKAGE__->has_many(
    "releases",
    "Hydra::Schema::Releases",
    { "foreign.project" => "self.name" },
    undef,
    );
  • replacement in src/lib/Hydra/Schema/Projects.pm at line 276
    [9.7308][9.6629:6771]()
    # Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-02-06 12:22:36
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:pcF/8351zyo9VL6N5eimdQ
    [9.7308]
    [9.171]
    # Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-05-06 12:32:57
    # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:dEIVgrFGilPfITprs6nYuA
  • edit in src/lib/Hydra/Schema/Projects.pm at line 289
    [9.343][9.343:371]()
    releases => "name",
  • file deletion: release.tt (----------)
    [9.1486][9.2547:2581](),[9.2581][9.2200:2200]()
    [% WRAPPER layout.tt title="Release $release.name" %]
    [% PROCESS common.tt %]
    [% USE HTML %]
    <p><em>Released on [% INCLUDE renderDateTime timestamp =
    release.timestamp %].</em> <a class="btn" href="[% c.uri_for('/release' project.name release.name "edit") %]"><i class="icon-edit"></i></a></p>
    [% IF !members %]
    <p><em>No builds have been added to this release yet.</em></p>
    [% ELSE %]
    [% FOREACH m IN members %]
    <h3>
    <a href="[% c.uri_for('/build' m.build.id) %]">
    [% HTML.escape(m.description) %]
    </a>
    </h3>
    [% INCLUDE renderProductList build=m.build %]
    [% END %]
    [% END %]
    [% END %]
    [% PROCESS "product-list.tt" %]
  • file deletion: edit-release.tt (----------)
    [9.1486][9.5347:5386](),[9.5386][9.4487:4487]()
    [% WRAPPER layout.tt title=(create ? "New release" : "Edit release ${release.name}") %]
    [% PROCESS common.tt %]
    [% USE HTML %]
    <form class="form-horizontal" action="[% IF create %][% c.uri_for('/project' project.name 'create-release/submit') %][% ELSE %][% c.uri_for('/release' project.name release.name 'submit') %][% END %]" method="post">
    <fieldset>
    <div class="control-group">
    <label class="control-label">Identifier</label>
    <div class="controls">
    <input type="text" class="span3" name="name" [% HTML.attributes(value => release.name) %]/>
    </div>
    </div>
    <div class="control-group">
    <label class="control-label">Description</label>
    <div class="controls">
    <input type="text" class="span3" name="description" [% HTML.attributes(value => release.description) %]/>
    </div>
    </div>
    <h3>Release members</h3>
    <p><em>Note:</em> to add a build to this release, go to the build’s
    information page and click on “Add to release”.</p>
    [% FOREACH m IN members %]
    <div class="releaseMember control-group">
    <label class="control-label">Build [% m.build.id %] Label</label>
    <div class="controls">
    <input type="text" class="span3" name="member-[% m.build.id %]-description" [% HTML.attributes(value => m.description) %]/>
    <button class="btn btn-warning" type="button" onclick='$(this).parents(".releaseMember").remove()'><i class="icon-trash icon-white"></i></button>
    </div>
    </div>
    [% END %]
    <div class="form-actions">
    <button type="submit" class="btn btn-primary">
    <i class="icon-ok icon-white"></i>
    [%IF create %]Create[% ELSE %]Apply changes[% END %]
    </button>
    [% IF !create %]
    <button id="delete-release" type="submit" class="btn btn-danger" name="action" value="delete">
    <i class="icon-trash icon-white"></i>
    Delete this release
    </button>
    <script type="text/javascript">
    $("#delete-release").click(function() {
    return confirm("Are you sure you want to delete this release?");
    });
    </script>
    [% END %]
    </div>
    </fieldset>
    </form>
    [% END %]
  • edit in src/root/build.tt at line 139
    [9.3349][9.972:1165](),[9.972][9.972:1165]()
    [% END %]
    [% IF available && project.releases %]
    [% INCLUDE menuItem
    uri = "#add-to-release"
    title = "Add to release"
    modal = 1 %]
  • edit in src/root/build.tt at line 489
    [9.113][9.2840:2841](),[9.17966][9.2840:2841](),[9.2840][9.2840:2841](),[9.2841][9.14397:14404](),[9.8444][9.14397:14404]()
    </div>
  • edit in src/root/build.tt at line 490
    [9.471][9.471:472](),[9.472][9.0:843]()
    [% IF c.user_exists && available && project.releases %]
    <div id="add-to-release" class="modal hide fade" tabindex="-1" role="dialog" aria-hidden="true">
    <form class="form-horizontal" action="[% c.uri_for('/build' build.id 'add-to-release') %]" method="post">
    <div class="modal-body">
    <div class="control-group">
    <label class="control-label">Add to release</label>
    <div class="controls">
    <select class="span2" name="name">
    [% FOREACH r IN project.releases %]
    <option>[% HTML.escape(r.name) %]</option>
    [% END %]
    </select>
    </div>
    </div>
    </div>
    <div class="modal-footer">
    <button type="submit" class="btn btn-primary">Add</button>
    <button class="btn" data-dismiss="modal" aria-hidden="true">Cancel</button>
    </div>
    </form>
  • edit in src/root/build.tt at line 491
    [9.850][9.850:860]()
    [% END %]
  • edit in src/root/project.tt at line 17
    [9.4393][9.695:850](),[9.695][9.695:850]()
    [% INCLUDE menuItem title="Create release" icon="icon-plus" uri=c.uri_for(c.controller('Project').action_for('create_release'), c.req.captures) %]
  • edit in src/root/project.tt at line 23
    [9.415][9.203:270](),[9.2718][9.203:270]()
    <li><a href="#tabs-releases" data-toggle="tab">Releases</a></li>
  • edit in src/root/project.tt at line 96
    [9.272][9.272:478](),[9.478][9.3196:3197](),[9.636][9.3196:3197](),[9.6554][9.3196:3197](),[9.20686][9.3196:3197](),[9.29363][9.3196:3197](),[9.3196][9.3196:3197](),[9.3197][9.844:915](),[9.915][9.547:707](),[9.2121][9.547:707](),[9.547][9.547:707](),[9.707][9.2122:2271](),[9.2271][9.926:1068](),[9.926][9.926:1068](),[9.1083][9.1083:1084](),[9.1261][9.1261:1285](),[9.6700][9.36040:36041](),[9.36040][9.36040:36041]()
    <div id="tabs-releases" class="tab-pane">
    [% IF releases.size == 0 %]
    <p><em>This project has no releases yet.</em></p>
    [% ELSE %]
    <p>This project has made the following releases:</p>
    <table class="table table-condensed table-striped clickable-rows">
    <thead>
    <tr>
    <th>Name</th>
    <th>Date</th>
    </tr>
    </thead>
    <tbody>
    [% FOREACH release IN releases %]
    <tr>
    <td><a class="row-link" href="[% c.uri_for('/release' project.name release.name) %]"><tt>[% release.name %]</tt></a></td>
    <td>[% INCLUDE renderDateTime timestamp = release.timestamp %]</td>
    </tr>
    [% END %]
    </tbody>
    </table>
    [% END %]
    </div>
  • edit in src/script/hydra-update-gc-roots at line 75
    [9.221][9.720:824](),[9.302][9.720:824](),[9.1148][9.720:824](),[9.824][3.703:770](),[3.770][9.18577:18724](),[9.887][9.18577:18724](),[9.18724][9.1005:1007](),[9.1005][9.1005:1007]()
    # Keep every build in every release of every project.
    print STDERR "*** looking for release members\n";
    keepBuild($_, 0) foreach $db->resultset('Builds')->search_literal(
    "exists (select 1 from releasemembers where build = me.id)",
    { order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] });
  • replacement in src/sql/hydra.sql at line 381
    [9.4466][9.4466:4579]()
    -- the timestamp when we first saw the path have these contents, which
    -- may be used to generate release names.
    [9.4466]
    [9.4579]
    -- the timestamp when we first saw the path have these contents.
  • edit in src/sql/hydra.sql at line 453
    [9.4187][9.4187:4392](),[9.4392][9.2209:2210](),[9.13513][9.2209:2210](),[9.2210][9.4393:4429](),[9.4429][9.2210:2211](),[9.2210][9.2210:2211](),[9.2211][9.4430:5020](),[9.5020][9.2657:2662]()
    -- A release is a named set of builds. The ReleaseMembers table lists
    -- the builds that constitute each release.
    create table Releases (
    project text not null,
    name text not null,
    timestamp integer not null,
    description text,
    primary key (project, name),
    foreign key (project) references Projects(name) on delete cascade
    );
    create table ReleaseMembers (
    project text not null,
    release_ text not null,
    build integer not null,
    description text,
    primary key (project, release_, build),
    foreign key (project) references Projects(name) on delete cascade on update cascade,
    foreign key (project, release_) references Releases(project, name) on delete cascade on update cascade,
    foreign key (build) references Builds(id)
    );
  • edit in src/sql/hydra.sql at line 633
    [9.649][9.73:139]()
    create index IndexReleaseMembersOnBuild on ReleaseMembers(build);
  • edit in src/sql/update-dbix.pl at line 37
    [9.11069][9.11069:11157]()
    "releasemembers" => "ReleaseMembers",
    "releases" => "Releases",