Remove the "releases" feature
[?]
May 6, 2020, 10:39 AM
N74SRHS6XG3M4II7HDCJZKFF6RFXEVGBUN3DN4FUEMELHYCGMHLQCDependencies
- [2]
ZQS3ZNA3Fix broken redirect when editing a release - [3]
SLBM7H4Qhydra-update-gc-roots: Keep derivations of failed builds - [4]
6S3ZLOZLReturn JSON for /eval - [5]
GRMV5GEWAdds documentation for the external API (#441) - [6]
ICRGXEPIBuilds.jobset_id: make not-null - [7]
75BCCX2TGet rid of dependency to SQLite - [8]
CUFVKLLARemove 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]
HPEG2RHVMerge the BuildResultInfo table into the Builds table - [14]
6HWIUOSUAvoid fetching Projects/Jobsets just to get the name column - [15]
SJPEC375Builds: 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]
RYTQLATYKeep 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]
5DSDXORDhydra: missing plain.tt - [22]
2BUX775I* More release -> view. - [23]
UICHT2PSAdd a search feature - [24]
ZI535LI6* hydra: 'new' UI for project/jobset/job/build - [25]
U4TD3AIQAdd support for viewing jobset evaluations - [26]
SU566LI3* Sort releases. - [27]
VJHIHMEH* Store the meta.longDescription and meta.license attributes in the - [28]
RO7REZL3Remove unnecessary Javascript code - [29]
4NTIBJ74Implement DELETE for jobsets and use it in the web interface - [30]
SMTMFEKEhydra: add missing templates - [31]
LSZLZHJYAllow users to edit their own settings - [32]
RXVJFQ5AEvaluator 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]
KJQWSRCCSpeed up hydra-update-gc-roots - [36]
EFWN7JBV* Added a status page that shows all the currently executing build steps. - [37]
IWUYFG5TControllers: allows lazy tabs to return custom errors. - [38]
SMCOU72Fhydra: add some admin for adding/enabling/etc build machines - [39]
6GEU36HWRemove obsolete CSS classes - [40]
TCXFZZFN* hydra: make chart zoomable and clickable - [41]
W6DC6K4I* Happy Javascript hacking. - [42]
SYAIW23XAdd missing file - [43]
PMNWRTGJAdd multiple output support - [44]
EYNG4EL4* Regenerate the bindings from a clean sqlite database. - [45]
WE5Q2NVIAllow build to be bumped to the front of the queue via the web interface - [46]
AS2OXLRM* Editing releases. - [47]
UDS5VIT6Lazy load the metrics tab - [48]
VH5ZABDRAdd a page to show the latest evaluations for the entire server - [49]
D7PL2VWUMove more actions from the top bar - [50]
G6HJY2V4 - [51]
TRDGNILTRemove unused file - [52]
JJT5QG3Kremove revision from cached cvs inputs, and added missing files - [53]
KOTB7BKV - [54]
AWMM5OGVUse delete instead of delete_all - [55]
K63JYJDHCompose 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]
SZPBGW2NFix a race condition in hydra-update-gc-roots - [59]
YU6CND7CRemove support for views - [60]
KKJNJHO5Update bootstrap to 2.0.3 - [61]
ZVTSOVHN* Support Subversion checkouts. - [62]
2VBQRQ2QFix some XML well-formedness problems - [63]
JIJDYWPYRemove the Build menu from the top bar - [64]
UOINKJ2JAdd an action to cancel all builds in a jobset eval - [65]
ASIRNHAHLoad the dependency tabs on demand - [66]
77BG3TYKUse c.req.captures - [67]
S6OISBQ3* Mark the "current" builds in a jobset, i.e. those corresponding to - [68]
QTC3SYBMJobset 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]
RSEGBU6CHydra/20: Jobset clone feature - [71]
D7X6XTKQIntegrate 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]
J3RYO2CURemove the jobs status page - [75]
26PYNDXVRemove the errorMsg column from the Builds table - [76]
6DMDTQ7MAdd 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]
VG4QG336Remove tablesorter - [81]
3D3F5I74Fix 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]
YTIDBFGUDrop 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]
VBWHG272Re-add the history tab (store size and build time), now as lazy-loaded tab on build page. - [90]
JTHWA6AMRename aggregate members to constituents - [91]
2GUAKGTBFix indentation of build.tt - [92]
ZB3JV52WAdd a "My jobsets" tab to the dashboard - [93]
3QWDDLBRAdd support for logging in via a Google account - [94]
FV2M6MOThydra: use autoconf/-make - [95]
G2WXEQHERemove the Errors page - [96]
HZWUT4YNAllow users to reproduce builds on their own systems - [97]
NEQ4BISOAdd bootstrap.zip - [98]
JY7BXXOPSplit viewing and editing a project - [99]
OW6XV2YS* Allow a view result to be saved as a release. - [100]
KXGOUX7P* Creating releases. - [101]
PHJF4FUTAdd missing files - [102]
NABL63FI* hydra: project members can do stuff that the owner can do - [103]
KQZQI2WNAllow creating a release from an evaluation - [104]
SZYDW2DGhydra: added some user admin - [105]
5SHCWE7X* Prevent repeated evaluation of a jobset with the same inputs. This - [106]
KSBB33REAdd a dashboard - [107]
64IV56HIReplace bootstrap tarball - [108]
3HZY24CX* Make jobsets viewable under - [109]
ACFFJUANhydra-update-gc-roots: Keep more evals - [110]
JTRG7RDQadd 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]
QUMWPGCUAdd 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]
W3XAFDK6Remove obsolete/broken timeline feature - [117]
4D4U5IPY* Allow jobsets to be disabled. - [118]
T5BIOVJEAdd support for tracking custom metrics - [119]
36M6DGITShow the runtime/build dependencies in the build page - [120]
BVOPAMLS - [121]
S5PV6IIM* Represent jobs explicitly in the DB. - [122]
JOVVHIJXRemove all entry points to modify machines - [123]
BB2KXLXZMove the build time chart to the job page - [124]
6FRLEP4Pfirst try for timeline of last 24 hours in hydra - [125]
CLJQCY2X* Store info about all the build actions and allow them to be - [126]
4S5JF5JPUse latest DBIx::Class::Schema::Loader - [127]
TPNHTE5VRemove obsolete Builds columns and provide accurate "Running builds" - [128]
ITJWNQEZUpdate Hydra schema, otherwise hydra-notify will not work. - [129]
U72VNKRURemove unused file - [130]
L2E6EVE2* Merged the Build and Job tables. - [131]
SJLEZFC4check getHydraPath in stead of Envvar HYDRA_DBI directly - [132]
VCG6KNUXRemove the "clone build" feature - [133]
ZEHSSVFG - [134]
KN3VYE5P* Cleaned up the foreign key constraints. - [135]
TX7Q4RASAdd page showing latest build steps - [136]
WYN733ST* Store build duration, handle cached builds. - [137]
XTKCALUAMake "Add to release" a modal dialog - [138]
FTPCV25MStore aggregate members in the database - [139]
D5QIOJGP* Move everything up one directory. - [140]
3JBUMW3Eforgot to commit a file - [141]
2R7GHSA4* hydra: added initial version of build graph - [142]
3ZCEPLNO - [143]
IK53RV4V - [144]
R5D7DZPE - [145]
E2TOU3L6* More indices. - [146]
BKOIYITRadded some json responses - [147]
4HPT4SDDRevert "Remove now-unused SystemTypes table" - [148]
R2PON6R7Allow non-admin users to see the machine status page - [149]
OR5SJ42YShow releases in a tab on the project page - [150]
QAUDQPWGAdd a more concise queue page - [151]
QQ4STW3Smissing file - [152]
7ECJWNVXCleanup Project model - [153]
JM3DPYOMgenerated schema with new dbix class schema loader, grrrrrr - [154]
Q5HZWFCYAdd support for darcs repositories. - [155]
WDKFN4B2Make sign in a modal dialog box rather than a separate page - [156]
TQKGQ5R3 - [157]
UMEKGOSYUpdate flot to 0.8.3 - [158]
IN272KZW* Automatically keep all builds in the latest successful release in - [159]
EYAA7MJYhydra-server: Support logs in S3 - [160]
MOX7XJ2EMerge the BuildSchedulingInfo table into the Builds table - [161]
BHZXGT2H* Channels: provide an index page that lists all the packages in the - [162]
ZFEN2MAOSimplify jobset cloning - [163]
LZVO64YGMerge 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]
FD76WVTQmissing file - [168]
34DPX2OR* Create some more indices on tables that have a foreign key reference - [169]
XJRJ4J7MAdd user registration - [170]
44AGCSXKUse a proper spinning wheel icon - [171]
FPK5LF53* Put the project-related actions in a separate controller. Put the - [172]
3PNG7NIBRemove 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]
2G63HKCHFix some wellformedness issues - [177]
T273UOB7Support obtaining the contents of an evaluation as a channel - [178]
PCD3ZH6ZPartially revert 1c20cfdf2403feb78cef515faf15c04d5c9f17bd - [179]
4X6NS66Q* Keep the most recent builds for each job. - [180]
WHAFVCEI - [181]
UUGBVEGY* Development notes. - [182]
P3M6UFMPMerge remote-tracking branch 'origin/master' into flake - [183]
YAPITGB3* Boolean inputs. - [184]
WNQRX7QBDoh - [185]
RJICSUYG* Align the apply/delete buttons. - [186]
BXHG3HYLWhen renaming a jobset, add a redirect from the old name - [187]
ZWCTAZGLadded newsitems, added some admin options to clear various caches. - [188]
RX7USXWQjobset: Add a new "channels" tab. - [189]
JARRBLZDBootstrapify the Hydra forms (except the project and jobset edit pages) - [190]
FANTYCR7Materialize the number of finished builds - [191]
PZL3SZM3Give 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]
VVOAXWH4fix wrong dbix:class:loader generation - [196]
53IMJNBBAdd isChannel column and meta attribute. - [197]
AK2UZDS2Jobset page: Add a new tab to show job status in a matrix - [198]
Y6AHH4THRemove the logfile and logSize columns from the database - [199]
QCGCX2BRGeneralize lazy tabs - [200]
225GEK4NAfter 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]
6WRGCITDEnable declarative projects. - [203]
LFVXESGIRemove 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]
G2T4WAHIStore the inputs of each evaluation in the database - [208]
37R34XJO* Negative caching: don't perform a build if a dependency already - [209]
E4DESS7GFixes NixOS/hydra#402 (#424) - [210]
K22TMPH5Make the info tables less compressed - [211]
5T44WFEZRestore api/get-info - [212]
W5OAZWPDDrop the errorMsg column in the Jobs table - [213]
BIVZGPUTOptimise clickable rows - [214]
CJKPW2G7Hide the views tab for project that don't have them - [215]
JD7AWXQGRemove now-unused SystemTypes table - [216]
7Z7HOZQ3* Remove the triggers to simulate foreign key constraints on SQLite, - [217]
E7FID72SRemove the BuildMachines and BuildMachinesSystemTypes tables - [218]
IGR322YPsql: Generate models from postgresql - [219]
SB2V735VKeep track of the database schema version - [220]
OX6NYJDVSplit viewing and editing a jobset - [221]
ZQUPXSBMTie 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]
4CELXP7PRemove 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
* 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
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
"releases": [], - edit in doc/manual/api.xml at line 80
"releases": [], - replacement in doc/manual/api.xml at line 130
"owner": "eelco","releases": []"owner": "eelco" - file deletion: Release.pm
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
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
$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
use utf8;package Hydra::Schema::ReleaseMembers;# Created by DBIx::Class::Schema::Loader# DO NOT MODIFY THE FIRST PART OF THIS FILE=head1 NAMEHydra::Schema::ReleaseMembers=cutuse 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 projectdata_type: 'text'is_foreign_key: 1is_nullable: 0=head2 release_data_type: 'text'is_foreign_key: 1is_nullable: 0=head2 builddata_type: 'integer'is_foreign_key: 1is_nullable: 0=head2 descriptiondata_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 buildType: belongs_toRelated 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 projectType: belongs_toRelated 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 releaseType: belongs_toRelated 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:k4z2YeB4gRAeAP6hmR93sQ1; - file deletion: Releases.pm
use utf8;package Hydra::Schema::Releases;# Created by DBIx::Class::Schema::Loader# DO NOT MODIFY THE FIRST PART OF THIS FILE=head1 NAMEHydra::Schema::Releases=cutuse 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 projectdata_type: 'text'is_foreign_key: 1is_nullable: 0=head2 namedata_type: 'text'is_nullable: 0=head2 timestampdata_type: 'integer'is_nullable: 0=head2 descriptiondata_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 projectType: belongs_toRelated 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 releasemembersType: has_manyRelated 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+wqjQ1;=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 releasemembersType: has_manyRelated 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
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-02-06 12:34:25# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:EEXlcKN/ydXJ129vT0jTUw# 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 releasemembersType: has_manyRelated object: L<Hydra::Schema::ReleaseMembers>=cut__PACKAGE__->has_many("releasemembers","Hydra::Schema::ReleaseMembers", - edit in src/lib/Hydra/Schema/Projects.pm at line 249
=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_manyRelated 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
# Created by DBIx::Class::Schema::Loader v0.07049 @ 2020-02-06 12:22:36# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:pcF/8351zyo9VL6N5eimdQ# 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
releases => "name", - file deletion: release.tt
[% 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
[% 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’sinformation 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
[% END %][% IF available && project.releases %][% INCLUDE menuItemuri = "#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
[% 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
[% END %] - edit in src/root/project.tt at line 17
[% 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
<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
-- the timestamp when we first saw the path have these contents, which-- may be used to generate release names.-- 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
create index IndexReleaseMembersOnBuild on ReleaseMembers(build); - edit in src/sql/update-dbix.pl at line 37
"releasemembers" => "ReleaseMembers","releases" => "Releases",