Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 8 additions & 5 deletions src/libstore/build/derivation-check.cc
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,15 @@ void checkOutputs(
const StorePath & drvPath,
const decltype(Derivation::outputs) & drvOutputs,
const decltype(DerivationOptions<StorePath>::outputChecks) & outputChecks,
const std::map<std::string, ValidPathInfo> & outputs,
const std::map<std::string, ValidPathInfo> & newlyBuiltOutputs,
const std::map<std::string, StorePath> & alreadyRegisteredOutputs,
Activity & act)
{
std::map<StorePath, const ValidPathInfo &> outputsByPath;
for (auto & output : outputs)
for (auto & output : newlyBuiltOutputs)
outputsByPath.emplace(output.second.path, output.second);

for (auto & pair : outputs) {
for (auto & pair : newlyBuiltOutputs) {
// We can't use auto destructuring here because
// clang-tidy seems to complain about it.
const std::string & outputName = pair.first;
Expand Down Expand Up @@ -123,11 +124,13 @@ void checkOutputs(
overloaded{
[&](const StorePath & path) { spec.insert(path); },
[&](const OutputName & refOutputName) {
if (auto output = get(outputs, refOutputName))
if (auto output = get(newlyBuiltOutputs, refOutputName))
spec.insert(output->path);
else if (auto storePath = get(alreadyRegisteredOutputs, refOutputName))
spec.insert(*storePath);
else {
std::string outputsListing =
concatMapStringsSep(", ", outputs, [](auto & o) { return o.first; });
concatMapStringsSep(", ", newlyBuiltOutputs, [](auto & o) { return o.first; });
throw BuildError(
BuildResult::Failure::OutputRejected,
"derivation '%s' output check for '%s' contains output name '%s',"
Expand Down
3 changes: 2 additions & 1 deletion src/libstore/build/derivation-check.hh
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@ void checkOutputs(
const StorePath & drvPath,
const decltype(Derivation::outputs) & drvOutputs,
const decltype(DerivationOptions<StorePath>::outputChecks) & drvOptions,
const std::map<std::string, ValidPathInfo> & outputs,
const std::map<std::string, ValidPathInfo> & newlyBuiltOutputs,
const std::map<std::string, StorePath> & alreadyRegisteredOutputs,
Activity & act);

} // namespace nix
5 changes: 4 additions & 1 deletion src/libstore/unix/build/derivation-builder.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1654,6 +1654,8 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs()

OutputPathMap finalOutputs;

std::map<std::string, StorePath> alreadyRegisteredOutputs;

for (auto & outputName : sortedOutputNames) {
auto output = get(drv.outputs, outputName);
auto scratchPath = get(scratchOutputs, outputName);
Expand Down Expand Up @@ -1684,6 +1686,7 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs()
overloaded{
[&](const AlreadyRegistered & skippedFinalPath) -> std::optional<StorePathSet> {
finish(skippedFinalPath.path);
alreadyRegisteredOutputs.insert_or_assign(outputName, skippedFinalPath.path);
return std::nullopt;
},
[&](const PerhapsNeedToRegister & r) -> std::optional<StorePathSet> { return r.refs; },
Expand Down Expand Up @@ -2030,7 +2033,7 @@ SingleDrvOutputs DerivationBuilderImpl::registerOutputs()

/* Apply output checks. This includes checking of the wanted vs got
hash of fixed-outputs. */
checkOutputs(store, drvPath, drv.outputs, drvOptions.outputChecks, infos, *act);
checkOutputs(store, drvPath, drv.outputs, drvOptions.outputChecks, infos, alreadyRegisteredOutputs, *act);

if (buildMode == bmCheck) {
return {};
Expand Down
1 change: 1 addition & 0 deletions tests/functional/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,7 @@ suites = [
'impure-env.sh',
'debugger.sh',
'extra-sandbox-profile.sh',
'regression-reference-checks.sh',
'help.sh',
'symlinks.sh',
'external-builders.sh',
Expand Down
15 changes: 15 additions & 0 deletions tests/functional/regression-reference-checks.nix
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
with import ./config.nix;
mkDerivation {
name = "test";
__structuredAttrs = true;
outputs = [
"out"
"man"
];
outputChecks.out.disallowedReferences = [ "man" ];
buildCommand = ''
source $NIX_ATTRS_SH_FILE
mkdir ''${outputs[out]}
mkdir ''${outputs[man]}
'';
}
13 changes: 13 additions & 0 deletions tests/functional/regression-reference-checks.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#!/usr/bin/env bash

source common.sh

TODO_NixOS

clearStore

outpath="$(nix-build regression-reference-checks.nix -A out --no-out-link)"
nix-build regression-reference-checks.nix -A man --no-out-link

nix-store --delete "$outpath"
nix-build regression-reference-checks.nix -A out --no-out-link
Loading