This requires turning the outPath columns in the Builds and BuildSteps tables into separate tables, and so requires a schema upgrade.
PMNWRTGJ4GVSMSSAWSUD57B26PCRAHMZIQ5SIWJIK7A74ENKEQLAC 5YKSN2MJENI6H5IN4VB4GXA52AZXECGY7PLRO7MRGNC7WLQCZFGAC 36TOESVE7VTGO3GHASDYRDSAUFUP6LAQMAWB7237L3G3OVZARSOQC DGZE7ZRAFD5W2NZILJB34B4EQKI274YBFW2SXWODEPW2GJ6KE62AC 32LK6HFVX2KAUEY7KMNU7D25TVUW6R7EYRKUPQYBGC5XLZ2B5O7QC SKQXOQ7TGZDS7LR4WMFG6MNK7WW4WN4GXG4YCFFI77MU6ARVYUCQC ZXJSQF6BWICW7YQJJLZVUVVWEUUDCCJOZ4QXHE765ZVQAEUIQLKQC FP72ASZXLTAOTK6PQNAMW7H6FDLBI2HZIUCTDAFJ3WPIEVKZGEFQC YISCM3G35J5KHV6CQHX5GWH65W4J4BBWWNLXCGTYU6ZBQITNQ7AAC E2X5OTFSRCIHBIYH2CA4D5CWYILPTGVTZ6OWHQV4NSRYQZRMU3IQC WQXF2T3DFC2K72OVX46TUQ4IMZNJ5BSBQ7L7AVI7QL54DXCBEKLQC EX4FXA5TRG4UK4NASBDNYKW242ROLB42KE6S4I5AKV56LW6CBLHAC A63IHCMXH3F4V56HDXJLJVVHKXRSJCJMT2PWXXI2IW3J734J6SGQC 4LWGZL33NOCTVZXUZZM5P6BRBHDUMEAJPVPNB52PN3UZVC7DMSZAC 4N5APGRGHTKFMEJ7THSJX6TSYYAP3BUZQG73AJBKCQLXOOEHPATQC YGRLM2SKOIPP4M24VYZTRREELKICDFKXL7ZHHR54BR5HVRCDOP6AC 7YCFGMZBCWDOOO3DHSJ3ZWPUWFMEO6OLQGDZWLULAPER3YZOYUJAC HXBXDEFK2VLXZIWUXAQ765NHKYQ5FYS43IKMU2DJ755L26TQ6IFQC FPK5LF53CFUEKFYJ3IYXT4UTVC6IITWJOCFATMC4PLHEUP5SIEAAC AKAZKCR6GFCZQBR2ZJSZEI3SXW4S25V7X7JGHUYNUITQQSAVAF5AC 5NO7NCKTMM5ZW7JYOETUFOSWK2ACTXWDZGJAFXZN6L3OF6BFTNOQC XHVZXX6NVBQCZQ2GL2AQ6QDIJMERIY6OF74KSTQL67BGXG3TFIXQC BHZXGT2HWAMFNVBUDG7VR5HNA2SUJBUSMWB7EHTECB4QJ5HVYANAC U7G4EEQCKLDY5BKJ6KA5U5S5LOOEX53ESDHVAIDJUA2OBAX7T2UQC 7DWCXNC72OO3M4YGNVV4KM775CUSPBHEFFNMRIA2XAZTQCXYHBRQC HSVVEKTY2U5XJ4ZDHF43YEQXRPRWNZLZDDD4W7JFJ55UWD7CEFBQC LBNVQXUBEZ45SOTGVXK5UEZXIAIZTJLWZNUYFI4JZ6J65N3KPDVQC UWVMQIAC2HQNSG2JQOPZGUOCQ5V2JFP2F7RCTF3WJLK7NHSD5PAAC OD5FSS5AJ3XRTV5Q4UQQF6JMBT6UUL7UUOMPPUBNOM6ZMVIHW35QC BEKA3TMM2QZ7FXCHAVKZ56EIHAS23APIKH3S72BHJ457NZ73W3EQC MOX7XJ2E3XISXA7V7T4W6GEAGECGWBZ4PYSLTYBVVR4VAKOI33CQC ZILILXXKP4Z64UGIXIPTQ3KXPV76LFGSXVFLMLCO2HJBCQ5GP6AQC A52HEFHQNVNF2OUSWDSUYVVXLYR2UFCGOORPCN27CJJYA4UDJA3AC HPEG2RHVNHOPB5T4ZRXANIRBMVOVY3B5GFETJRYOTDJFVAYH2TQAC Y6AHH4THYQA43V77L43YM42DYRPCMDSWLUV4NKWAQYMPL4NTUIPQC H47WLVATPA42U4UQEPR2O736DZMVGRW33ENHW6YZY3EKYFPFUUBQC 2R7GHSA4NUXPRWRPVXYDYWFIVVJGSUWUI2IPJGFN6ILZIAZGXGCAC GJFYEU3SVP7TDSYXVZEYGKN4NVWSZX4754PPPTOYPRHUO5RMDWPQC XDDCO6CHPWGXFV3RSMMUYY45DTXJXQNYYHUT2PCYAGRODK43MD6AC CQTN62OHT4DY35E2MJEG7GFTVNEE5KRDMV6ASBQLBHN7BUDK7WHAC BPVJBR2PWGL3LA2GVDKURHA6RUQZGNKV4QVLHQXYBHPSNCM26E5AC NEWDDAOFCDLYBXQCZNQ2GDH7HPAHVN3YRDL52ZYEMVA4YH6LBDXAC LZO3C2KIACZ3HN72RBGWWIT5ED4RJMYKI3SAHXT6RIUPHDFL3STQC KRVD4EW7JPDBJJKOD7TM2PATKNKOFMEJESWP5RCISNAI2ZNK424QC Z6MDQIGODVE7RXX5U5D64EEC2ZDEZ36Z4ZMPFYIHWBG42IXUDYFQC T273UOB7WVB3NK52EBN65FQR6XP746D3BZM5SOYXEV6NCARIRYOQC U4TD3AIQXBJFFUORTMIC4IHZTVBORRKL2TZ2FSP4G665ECZOEMNAC ARD6Z67TDHK2XMW47CSVOXXF327YGOMYK3EAXTSVVXNDAFQYNO5AC OOQ2D3KCLFPYNAN253PHWLBQMB6OMO2KYQWQXLTP65SQAYZWQ5LAC EDRUQ4UK643SUCYMMTS2JS4N3BHARLKRDWRH3QAYWDMWRAMPNAOQC A22P7HCOGNO3XEQWBNEG2VHTGUB2GKQ75Q6JDMPQNQCLFHE7XBFAC KQS7DSKJHTEHALCPTXMWRX2IBOVC5BWU7RWJ4GP5A2JJSBR7HPKAC INNOEHO6CTW75YEEGNLUKISQEMOAE4P2C2SEVHEKOVIFHADWY4OAC 2WRTOU2Z2R3MWLRZCKK3ZZ2C5LJBH6GNJT77NETVA22Y23DUIX5QC QMW24O5S43MYF5ZTBULUEZNDW2FKJ3QP2GL46P6B2SVGSQLVEACAC 3XTHEUMP2ZOMPQWE3S5QWHIHCEJNEXGDPQB3JUVZFPS3RFMY455QC FM4O2L4MNPCHWRDRHKGKSH5TFFX6R2RMCPEQ3XCECA6UVLJPLUVQC BMSQD2ZH3T37RNPRKKKNF5DTJEGBLY4YR2BZDKP7PXJGS3ZBBLWAC JOYONH2KARKK2Z72WQW6DZ4B6WT47Z4VHOHGL7KM3B6RT3CBAMLQC RXVJFQ5AV3WME4HDVBPSRCALQTXROT4KQPOQVO6KTWTBNZIZZGPAC QS4OX6Z7OC46ZBRSEGQQAVKIMXRHDDRXS32EJI6DGN37AXH23K3QC TOTSL2RBMUMYPWZMM4E6HTBEMUPI3USC67HBLGUIGHP5GFFEPQ3AC OSVLMLCQQ52E47CX7TZAIFZSO4VVGRHWJTZY2G23YUPMDCKURTYAC 5EIPRLDD7XE6BZQPU4C43IAE53AVZP7HGE54GYJA3OYQRXCT6FSQC 2GK5DOU7ODF4WBSN3QTD3WIO52VTL2LOAXKGCDEMMAQPTEO4A4HAC BDSD2JLV4V4I52SE7MCZLYNDC4XU27ZNH7TYKLT7CA7YR5WRMQBAC AFTXA575C6JTVLVXTYJUKQGPLBO3NFORLO5XDSPHNL44HXLRH4TAC JM3DPYOMVNMCL5GMEYC3Y4NDRGTNIFBBFTPGPVT66GPENVPU7EVQC CLJQCY2XHIDNNMFBJ5PK3GQEN6RFALEFKXBJRWZPEIKR4PR5ZQ5AC SB2V735VJ2CDHGCXRUA5FOYHDRXQFVOZ3KXC3YKXWRNW6DIX7RXQC AHTEIK7GGPHUC3AXIJ2NX4TI3RLX65XYKGAIIC6MC2S6I6QPWTAAC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC L2E6EVE2RVFVDCUNRJ4CZYSQNS2DZUA5DTBETHBDUQUV2KQQRAOQC RFE6T5LGBFFNEPHZOPF4UNMFC2L4CGD5TPAMOXDLRPH3TZJ43UBAC VVOAXWH4EKVYSDOOKDQN3FHU2JRNNKEG7G4E7YRB7HEVYXHVP63QC 3PNG7NIBQQURUUPRVQXYL342OT7JUUYOMY2JJNP6YDX7SYJDZMYAC 2QA4Y4G3VK3CGBMWET2LROJTZRFVR5G2Y6GXUCIOCGZB7YQ3L7FAC LVJKRTIK5WOWWAZ454B4DCCGETOIQJK5TLOWMZVNY2B4AEGF2GMAC I42G2Z7PKDALZKM526VU253MZORF54KFJ3VNGXVE76LRH2RGNORQC ON4DDIBZQI34VOYOCVK5EAHYIY6M6JANW7SK4CCJWGIFYK55J2BQC UXVDOUBJHQF3MB2GDKHJYRZ6PWHZE3R2JEZYQBT5NQXUYSZW56LAC 5Y3XOQBR7E4EQZMDHSJ5UPMOTA7GPXSVF2BUKLPBRLHCU3VKT6ZAC SMCOU72FKTPFNCDXFJAILVUWFE4DY33CJJE4436H5POKENFFDFFAC ZWCTAZGLJZQNTYWTC2XQUKMILJF6JGDL5IND6QNYWK4FIGMLRFXAC YTSIRIMKV2EN6CMO6LFX5J3NBJJYWBJKYDU3Z53CGXCIWP3FYI2QC ODNCGFQ5FPKFI624BVMLW7PJ2EFJOR3TY66OCZM42UNNTWBCF2TQC ZI535LI6PJMKSOBJE33B3RRZ5S2JVTR3XPUDTSXJW6BZNTAHS3GQC AX5EQJO3M5Q22ITBSOSZSOLLZ4HJTLSKVFWGHNBKH7NTNGXXYCXQC B72GLND4UQKSGNGIY4FA6HLQNFS42SKRXV5NHTHADUJRU73NELAAC GNIEG2GCT6BUYHY2WXUAQVKHSYB6TVQT52O5GEY6COLKFK4ODCCQC 2B63JW6FYYHPV4JKU7K6RDTFH76JYUCFO23GAFZXAUHFGQTODOZQC 22JB5HNESA5OX5ABFISGCJCO6R7GF3AUTXDHGAT3PM7IDVIBKWWAC IK53RV4VGOHLCZGQCCIKPB45M3C7M7YMNBOJFBGZJ4LWIZNU4QNQC X5OIC5FFAUJDDVTBXUEVTLXHMT4PI2HSLO6YK7NPJLZHHRQIL3KAC GAIBDEZZPZ52ASD3GK3WUYG3NOB27MLQ5GGIGKLAD6JQ4UATTT3AC LL36GPHADRAVU6XM5J2QXBSG5YXXETVTIA3EAINY67W7ECMKN6IQC JFZNAYJXKCMXYHGCLTRH7Q6TOFGJ4BT6332GONCWVYRLNMDDG3KAC GPRYAAFPVGMT7TMZILMR22FFUBB436CDM5GYVQJ7GL2H6J7WFH5QC 7YBYT2LQML2PKEO6UO4444AGSASS664UCDXW2YO3ALB7THQHCEBQC CXRCPDSQEWHSZNCJIORUAINH5I2FFFQ7AVUQOB62REGROLROPE7QC FHAVPTZ6GYCZMMPIJN2VPGBACK66NENWCFJMTAOW6464WNCJPVOQC QUTWJR7PQZ3DBPC4G2AFXOKPPGFZQLE5RLXHAOFTLMXIT2QPF4TQC OG7BEM57MXPCG56IT5GODPFG77KZXWPXZ7OVZPWQQ56CRJ7KUE2QC ZTQEU5QSAJYC66QQABJLVR7EEZWEIW6UMQMSIEP2KRZH5PGEB53QC 37R34XJOGMP3E3DD4RGGRX5LBW2LGB6J3E6XOXLWSU2QEIWBEM4QC 2IEFMER5QDRKX5KMGFKS4G4T7SWHEUKKLEZCHWV2X7PF4UVHBRJQC BOFOHCPK7UVE3TUEL4NNOQXN2EQGN6N3ITJWTCOJK5Q6MSHYSOSQC 3E6IP3R3JGH76PNGG7RCADV65KOV24HQXPXNLVVYIQ46AVYJRG3AC D7NXMCONBBKA5GLRTUGI3XOTEK3TXHN26UQT4Z5CBIG7CILIQSEAC LQNBKF3DKVYK3NPDGK7OLOTIWIF4HR3EKLRYNLZJB4G3NMIVBCEAC 3BKF6P72K4YGWSQD5PO6PKNM3KXGFLONB3SONKRZR4DJHH3W3PSAC BD3GRK4BQUGRQGTAILUITIH3RRSVUH6AKINVMMKYLBAAHAAUSB4AC AS5PAYLIRJWB4JGU6N7WKILONGDIGCKNKS4ZSLRYCNGMUAP3AQSAC G5A7TZVIRTVTI7P5SESOC567QEYSM4SKBZJNYHBXNCTUV53WSZIAC NLJJZVHO3UXBURL2P7VGGCVUOMKFUYT3UX5JXQU3FFFAHUGEKO3AC 5O6E5SU5YQ4JIXLWGHTSAJO4UAMRN65GAZLYMVBMRLFS2F6X7AKAC 6US6LEC7V7LUTMPXOWGU7D4PQAFOG2AKNW4VBPSENNBEDMTBJCVQC 57Y7RG2A2JCZ73GPA3HBANDDDJYPXP2FFGSQ2H5SUMJJRBBWY65QC 64K7R4Y6IE4HYE36LMENATBEHOGZ6RNSGJSIZFZGZOLJXM6RRMBAC RBHHV7P7MMFXUNWCJFNYKLGVLG2NQEDUKJ2IUCZ3WFMHH3SZRUHQC CMU3YKOUUB6VNP54NVYUKFHI3A46YAAANNYOZSHCUJIQOQEZ3GCAC UVNQPK3TO3WNRYCHV66SECURHJEKYSDLREKG3T2JVC5YLE2EHA5QC G3IUM7VLQ4B3N3432X6EMKUJO6NYMXSS5AAYJ6CX4GLXCYXSUWDQC WZ3AEJ67LOG5L335AAC2BDLIJPIU4VSCGBMATBHDZC26ECRS5A6AC KJQWSRCCQEKF64L4NYYZ7VKAF2YEPYXXTRW6BI464P6Q6KU34TQAC HLYVEJX74DMSDR7VTGSLZCLUKQDZFDIK4FFDV4S27UPBN5JH4KDQC 4X6NS66QDWR4S4ZZFKN2QOJQII5ZYIMTDYRHK25N6NJSROVLHJ6QC ONAQU4BRGYO6MGPGIQIK5KF4JE4TBJMFFBU5XBKFTYQ5RPW7FOYQC 6KJXJB7NZ5XJ3WGUWKFNT6LMBNYJN3IPHZ7B7H654D5B6LPOL5QAC IN272KZWHENW2TCR3LWQ6OZAEESJL5S7AEL3GYLJTWHJUDE6HADAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC 5DSF5KWYCNFCWHDWAJDWQOFQML2AJIV7CESESP7HVTU4LVEEEYEQC PHX2HIVGHHKCAX6VNN2WXD4LRGSA74KQMJCCTMHK7HS6JPELVECAC PP4LPADGGHINHEWAGRLKABDCXM7TK5Z5RWIHG7FVJYAALMHRY5JQC 2M7J26V4WXJTOVN7TIOMOLUD2QA4LNTFLNOUTJWKL4XEGE6W2GKQC 6QRHXIM3XHCDLSIIBEGETDV67V6LTV55QMHC64ZPBMLTAECM5N3QC E2TOU3L66CH5DA4XPATQM5YM63SFXX63V7SDOIGS4ND3GR7HQALAC ->search({}, { columns => [@buildListColumns, 'drvpath', 'outpath', 'description', 'homepage'] });
->search({}, { join => ["buildoutputs"], columns => [@buildListColumns, 'drvpath', 'description', 'homepage'], '+select' => ['buildoutputs.path', 'buildoutputs.name'], '+as' => ['outpath', 'outname'] });
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};
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 };
(my $cachedBuildStep) = $c->model('DB::BuildSteps')->search({ outpath => $build->outpath }, {});
my $path = ($build->buildoutputs)[0]->path or die;my $cachedBuildStep = findBuildStepByOutPath($self, $c, $path,$build->buildstatus == 0 || $build->buildstatus == 6 ? 0 : 1);
my $buildStep;($buildStep) = $c->model('DB::BuildSteps')->search({ outpath => $p }, {}) ;my %dep = ( buildstep => $buildStep, path => $p ) ;
next unless $p =~ /\.drv$/;my ($buildStep) = findBuildStepByDrvPath($self, $c, $p, 0);my %dep = ( buildstep => $buildStep, path => $p );
my $buildStep;($buildStep) = $c->model('DB::BuildSteps')->search({ outpath => $p }, {}) ;my %dep = ( buildstep => $buildStep, path => $p ) ;
my ($buildStep) = findBuildStepByOutPath($self, $c, $p, 0);my %dep = ( buildstep => $buildStep, path => $p );
notFound($c, "Path " . $build->outpath . " is no longer available.")unless isValidPath($build->outpath);
foreach my $out ($build->buildoutputs) {notFound($c, "Path " . $out->path . " is no longer available.")unless isValidPath($out->path);}
$c->stash->{channelBuilds} = $c->model('DB::Builds')->search({id => $build->id});
$c->stash->{channelBuilds} = $c->model('DB::Builds')->search({ id => $build->id },{ join => ["buildoutputs"], '+select' => ['buildoutputs.path', 'buildoutputs.name'], '+as' => ['outpath', 'outname'] });
->search({ finished => 1, buildstatus => 0 }, { columns => [@buildListColumns, 'drvpath', 'outpath', 'description', 'homepage'] });
->search({ finished => 1, buildstatus => 0 },{ columns => [@buildListColumns, 'drvpath', 'description', 'homepage'], join => ["buildoutputs"], '+select' => ['buildoutputs.path', 'buildoutputs.name'], '+as' => ['outpath', 'outname'] });
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;}
return undef unless -f "$outPath/nix-support/hydra-release-name";my $releaseName = read_file("$outPath/nix-support/hydra-release-name");chomp $releaseName;
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;
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;
$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});
$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;
my $jobName = $buildInfo->{jobName};my $drvPath = $buildInfo->{drvPath};my $outPath = $buildInfo->{outPath};
# 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;
# 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?
# 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?
{ project => $project->name, jobset => $jobset->name, job => $job->name, outPath => $outPath },{ rows => 1, columns => ['id'] });
{ project => $project->name, jobset => $jobset->name, job => $job->name,name => $firstOutputName, path => $firstOutputPath },{ rows => 1, columns => ['id'], join => ['buildoutputs'] });
if (isValidPath($outPath)) {
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) {
my $paths = "";foreach my $bs ($build->buildsteps) {$paths = $paths . " " . $bs->outpath;}
my $r = `nix-store --clear-failed-paths @paths`;
__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
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-22 13:34:39# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:wPBFqpUWncuD9xki8Pbnvg
# Created by DBIx::Class::Schema::Loader v0.07033 @ 2013-01-30 16:22:11# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:YBdqPWScG4dtGx+U3dJcwA
__PACKAGE__->has_one("actualBuildStep","Hydra::Schema::BuildSteps",{ 'foreign.outpath' => 'self.outpath', 'foreign.build' => 'self.id'},);
#__PACKAGE__->has_one(# "actualBuildStep",# "Hydra::Schema::BuildSteps",# { 'foreign.outpath' => 'self.outpath'# , 'foreign.build' => 'self.id'# },#);
foreach my $name (keys %{$c->stash->{nixPkgs}}) {my $build = $c->stash->{nixPkgs}->{$name}->{build};$res .= " # $name\n";
foreach my $pkg (@{$c->stash->{nixPkgs}}) {my $build = $pkg->{build};$res .= " # $pkg->{name}\n";
<p>Showing builds [% (page - 1) * resultsPerPage + 1 %] - [% (page - 1) * resultsPerPage + builds.size %]out of [% total %] in order of descending timestamp.</p>
<p>Showing builds [% (page - 1) * resultsPerPage + 1 %] - [% (page - 1) * resultsPerPage + builds.size %] out of [% total %] in order of descending timestamp.</p>
<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>
<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>
[% 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 %]
[% INCLUDE renderDuration duration = build.stoptime - build.starttime %]; finished at [% INCLUDE renderDateTime timestamp = build.stoptime %]
<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>
<tr><td><b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]</tt></td></tr>
<tr><td><b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %]</tt> to <tt>[% INCLUDE renderShortInputValue input=bi2 %]</tt></td></tr>
<b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %] to [% INCLUDE renderShortInputValue input=bi2 %]</tt>
<b>[% bi1.name %]</b></td><td><tt>[% INCLUDE renderShortInputValue input=bi1 %]</tt> to <tt>[% INCLUDE renderShortInputValue input=bi2 %]</tt>
if (isValidPath($outPath)) {my ($deriver, $hash, $time, $narSize, $refs) = queryPathInfo($outPath, 0);$size = $narSize;
txn_do($db, sub {if ($buildStatus == 0) {
my @closure = computeFSClosure(0, 0, $outPath);foreach my $path (@closure) {my ($deriver, $hash, $time, $narSize, $refs) = queryPathInfo($path, 0);$closuresize += $narSize;}}
my $size = 0;my $closureSize = 0;my $releaseName;
txn_do($db, sub {my $releaseName = getReleaseName($outPath);
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);}
if (isValidPath($build->outpath)) {addRoot $build->outpath;} else {print STDERR " warning: output ", $build->outpath, " has disappeared\n" if $build->finished;
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;}
if (isValidPath($build->drvpath)) {addRoot $build->drvpath;} else {print STDERR " warning: derivation ", $build->drvpath, " has disappeared\n";}
if (isValidPath($build->drvpath)) {addRoot $build->drvpath;} else {print STDERR " warning: derivation ", $build->drvpath, " has disappeared\n";}
"exists (select 1 from releasemembers where build = me.id)", { order_by => ["project", "jobset", "job", "id"] });
"exists (select 1 from releasemembers where build = me.id)",{ order_by => ["project", "jobset", "job", "id"], columns => [ @columns ] });
# If the jobset has been hidden and disabled for more than one week, than# don't keep its builds anymore.
# If the jobset has been hidden and disabled for more than one# week, then don't keep its builds anymore.
print STDERR "*** looking for the $keepnr most recent successful builds of each job in jobset ",$project->name, ":", $jobset->name, "\n";
# 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";
keepBuild $_ foreach $jobset->builds->search({ 'me.id' => { 'in' => \[ "select b2.id from Builds b2 join " ." (select distinct job, system, coalesce( " .
keepBuild $_ foreach $jobset->builds->search({ 'me.id' => { 'in' => \[ "select b2.id from Builds b2 join " ." (select distinct job, system, coalesce( " .
" 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 ] });
" 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 ] });
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);
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
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