VCG6KNUXD2O4AFRCHIHI4HYKKDNMUGUFFXI72HOTTOOLJMOV7BCAC VG4QG336SCZNWAXJERI3N5FO6PUAYFJV24CLI27ADUFPO74RVJKQC FTPCV25MOLQUNR5CAR453W7T7QTUZRLPLEOSDZ5HSDFAXQZVHOYQC GS4SFHCPF76AX2U4NLLJGUISF6Y4AHYWEW3GLTDCKVDDXLSIGXUQC JIJDYWPYMZZNFBCWYSYR72RNEW5MSI26MJ5UXXIU7DDX25IBR3CQC UOINKJ2JBCRTZPFTAXDPRJOEUWWPJ43IGVWLRIRLIGHLBMWDOGDQC LZVO64YG43JD7YMZSCTZNOBS5ROZA4FMPKJW2YOMHX2V5PTGBVWQC WRIU3S5EO3RB3IM5PUDNHLOOMUPD5UKWNUL4YMAKD3C6O4KELJCAC LBNVQXUBEZ45SOTGVXK5UEZXIAIZTJLWZNUYFI4JZ6J65N3KPDVQC FPK5LF53CFUEKFYJ3IYXT4UTVC6IITWJOCFATMC4PLHEUP5SIEAAC GJFYEU3SVP7TDSYXVZEYGKN4NVWSZX4754PPPTOYPRHUO5RMDWPQC OOQ2D3KCLFPYNAN253PHWLBQMB6OMO2KYQWQXLTP65SQAYZWQ5LAC 3XTHEUMP2ZOMPQWE3S5QWHIHCEJNEXGDPQB3JUVZFPS3RFMY455QC QMW24O5S43MYF5ZTBULUEZNDW2FKJ3QP2GL46P6B2SVGSQLVEACAC CQTN62OHT4DY35E2MJEG7GFTVNEE5KRDMV6ASBQLBHN7BUDK7WHAC JAH3UPWAVSHXIPNGL6PROQPZBYZHPJNFONWBDZX4HCX646USZXUQC PHNLYPKB5SJJAHAICS6QEMRNCREPG7SC2MQRLTQMQLWGXM427S3QC RXVJFQ5AV3WME4HDVBPSRCALQTXROT4KQPOQVO6KTWTBNZIZZGPAC JOYONH2KARKK2Z72WQW6DZ4B6WT47Z4VHOHGL7KM3B6RT3CBAMLQC XHVZXX6NVBQCZQ2GL2AQ6QDIJMERIY6OF74KSTQL67BGXG3TFIXQC A52HEFHQNVNF2OUSWDSUYVVXLYR2UFCGOORPCN27CJJYA4UDJA3AC 5NO7NCKTMM5ZW7JYOETUFOSWK2ACTXWDZGJAFXZN6L3OF6BFTNOQC D5QIOJGPKQJIYBUCSC3MFJ3TXLPNZ2XMI37GXMFRVRFWWR2VMTFAC PZL3SZM3U3BYJX2RGYXC6NMBG7WQHFWHSYDYXZ7Q5VZA3EDYVPIQC JARRBLZDQ2JZWY7IUVPTOT7WJMBPMLFLF2MGLVGOYROAAISYGLSAC OEPUOUNBNTHTFZVDXREGBQCKFRCWMVP2MDVK4OA47VK2DBKEWVYAC 6KIJX24R5RRDR2UQMUAWHF3N6V6DKKL5URYSLB7IT4J5C3RO4G2AC YFPZ46YK4BOI6VH2H3F757UEGEYONURUAEDAYEIBLRY33PLSSO4AC CS2CB4EQ2XURPOEAZWVEX5QOEQB2SBBBJROGJJ4FOHEI5B3KMTXAC 3PNG7NIBQQURUUPRVQXYL342OT7JUUYOMY2JJNP6YDX7SYJDZMYAC J5UVLXOK6EDIL5I7VKWH4V2QDS4DPD7FHRK6XBWSXFRQS4JKXFZQC QNDXPVCIRJRPFTYNRDCQC5KORSYB5FPX7IAM6UGACWCU6HWYT6CAC N22GPKYTOLZLBGTGDATQDVZ4R5APZEAOIA7L32X4UXBH4XNI7MWAC }sub clone : Chained('buildChain') PathPart('clone') Args(0) {my ($self, $c) = @_;my $build = $c->stash->{build};requireProjectOwner($c, $build->project);$c->stash->{template} = 'clone-build.tt';
requireProjectOwner($c, $build->project);my ($nixExprPath, $nixExprInputName) = Hydra::Controller::Jobset::nixExprPathFromParams $c;# When the expression is in a .scm file, assume it's a Guile + Guix# build expression.my $exprType =$c->request->params->{"nixexprpath"} =~ /.scm$/ ? "guile" : "nix";my $jobName = trim $c->request->params->{"jobname"};error($c, "Invalid job name: $jobName") if $jobName !~ /^$jobNameRE$/;my $inputInfo = {};foreach my $param (keys %{$c->request->params}) {next unless $param =~ /^input-(\w+)-name$/;my $baseName = $1;my ($inputName, $inputType) =Hydra::Controller::Jobset::checkInput($c, $baseName);my $inputValue = Hydra::Controller::Jobset::checkInputValue($c, $inputType, $c->request->params->{"input-$baseName-value"});eval {# !!! fetchInput can take a long time, which might cause# the current HTTP request to time out. So maybe this# should be done asynchronously. But then error reporting# becomes harder.my $info = fetchInput($c->hydra_plugins, $c->model('DB'), $build->project, $build->jobset,$inputName, $inputType, $inputValue);push @{$$inputInfo{$inputName}}, $info if defined $info;};error($c, $@) if $@;}my ($jobs, $nixExprInput) = evalJobs($inputInfo, $exprType, $nixExprInputName, $nixExprPath);my $job;foreach my $j (@{$jobs->{job}}) {print STDERR $j->{jobName}, "\n";if ($j->{jobName} eq $jobName) {error($c, "Nix expression returned multiple builds for job $jobName.")if $job;$job = $j;}}error($c, "Nix expression did not return a job named $jobName.") unless $job;my %currentBuilds;my $newBuild = checkBuild($c->model('DB'), $build->jobset,$inputInfo, $nixExprInput, $job, \%currentBuilds, undef, {}, $c->hydra_plugins);error($c, "This build has already been performed.") unless $newBuild;$c->flash->{successMsg} = "Build " . $newBuild->id . " added to the queue.";$c->res->redirect($c->uri_for($c->controller('Root')->action_for('queue')));}
[% WRAPPER layout.tt title="Clone build ${build.id}" %][% PROCESS common.tt %][% USE HTML %][% edit=1 %]<p>Cloning allows you to perform a build with modified inputs.</p><form action="[% c.uri_for('/build' build.id 'clone' 'submit') %]" method="post"><h2>Nix expression</h2><p>Evaluate job <tt><input type="text" class="string"name="jobname" [% HTML.attributes(value => build.job.name) %]/></tt> in Nix expression <tt><input type="text" class="string"name="nixexprpath" [% HTML.attributes(value => build.nixexprpath) %]/></tt> in input <tt><input type="text" class="string"name="nixexprinput" [% HTML.attributes(value => build.nixexprinput)%] /></tt>.</p><h2>Build inputs</h2><table class="table table-condensed table-striped"><thead><tr><th>Name</th><th>Type</th><th>Value</th></tr></thead><tbody>[% FOREACH input IN build.inputs %]<tr><td><tt>[% input.name %]<input type="hidden" [% HTML.attributes(name => "input-$input.name-name" value => input.name) %] /></tt></td><td>[% INCLUDE renderSelection curValue=input.type param="input-$input.name-type" options=inputTypes %]</td><td><tt><input type="text" class="string" name="input-[% input.name %]-value"[% IF input.type == "build" || input.type == "sysbuild" %][% build = input.dependency %][% HTML.attributes(value => build.project.name _ ':' _ build.jobset.name _ ':' _ build.job.name _ '[id="'_ build.id _ '"]' ) %][% ELSE %][% HTML.attributes(value => input.value || input.uri) %][% END %] /></tt></td></tr>[% END %]</tbody></table></form>[% END %]<p><button type="submit"><img alt="Add" src="[% c.uri_for("/static/images/success.gif") %]" />Add to queue</button></p>