fix: warn and document when advanced attributes will have no impact due to __structuredAttrs
Backport of https://github.com/NixOS/nix/pull/10884.
Change-Id: I82cc2794730ae9f4a9b7df0185ed0aea83efb65a
This commit is contained in:
parent
66469fc281
commit
7fc481396c
|
@ -292,6 +292,12 @@ Derivations can declare some infrequently used optional attributes.
|
||||||
(associative) arrays. For example, the attribute `hardening.format = true`
|
(associative) arrays. For example, the attribute `hardening.format = true`
|
||||||
ends up as the Bash associative array element `${hardening[format]}`.
|
ends up as the Bash associative array element `${hardening[format]}`.
|
||||||
|
|
||||||
|
> **Warning**
|
||||||
|
>
|
||||||
|
> If set to `true`, other advanced attributes such as [`allowedReferences`](#adv-attr-allowedReferences), [`allowedReferences`](#adv-attr-allowedReferences), [`allowedRequisites`](#adv-attr-allowedRequisites),
|
||||||
|
[`disallowedReferences`](#adv-attr-disallowedReferences) and [`disallowedRequisites`](#adv-attr-disallowedRequisites), maxSize, and maxClosureSize.
|
||||||
|
will have no effect.
|
||||||
|
|
||||||
- [`outputChecks`]{#adv-attr-outputChecks}\
|
- [`outputChecks`]{#adv-attr-outputChecks}\
|
||||||
When using [structured attributes](#adv-attr-structuredAttrs), the `outputChecks`
|
When using [structured attributes](#adv-attr-structuredAttrs), the `outputChecks`
|
||||||
attribute allows defining checks per-output.
|
attribute allows defining checks per-output.
|
||||||
|
|
|
@ -249,6 +249,12 @@ EvalState::EvalState(
|
||||||
, sRight(symbols.create("right"))
|
, sRight(symbols.create("right"))
|
||||||
, sWrong(symbols.create("wrong"))
|
, sWrong(symbols.create("wrong"))
|
||||||
, sStructuredAttrs(symbols.create("__structuredAttrs"))
|
, sStructuredAttrs(symbols.create("__structuredAttrs"))
|
||||||
|
, sAllowedReferences(symbols.create("allowedReferences"))
|
||||||
|
, sAllowedRequisites(symbols.create("allowedRequisites"))
|
||||||
|
, sDisallowedReferences(symbols.create("disallowedReferences"))
|
||||||
|
, sDisallowedRequisites(symbols.create("disallowedRequisites"))
|
||||||
|
, sMaxSize(symbols.create("maxSize"))
|
||||||
|
, sMaxClosureSize(symbols.create("maxClosureSize"))
|
||||||
, sBuilder(symbols.create("builder"))
|
, sBuilder(symbols.create("builder"))
|
||||||
, sArgs(symbols.create("args"))
|
, sArgs(symbols.create("args"))
|
||||||
, sContentAddressed(symbols.create("__contentAddressed"))
|
, sContentAddressed(symbols.create("__contentAddressed"))
|
||||||
|
|
|
@ -162,7 +162,10 @@ public:
|
||||||
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
|
const Symbol sWith, sOutPath, sDrvPath, sType, sMeta, sName, sValue,
|
||||||
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
|
sSystem, sOverrides, sOutputs, sOutputName, sIgnoreNulls,
|
||||||
sFile, sLine, sColumn, sFunctor, sToString,
|
sFile, sLine, sColumn, sFunctor, sToString,
|
||||||
sRight, sWrong, sStructuredAttrs, sBuilder, sArgs,
|
sRight, sWrong, sStructuredAttrs,
|
||||||
|
sAllowedReferences, sAllowedRequisites, sDisallowedReferences, sDisallowedRequisites,
|
||||||
|
sMaxSize, sMaxClosureSize,
|
||||||
|
sBuilder, sArgs,
|
||||||
sContentAddressed, sImpure,
|
sContentAddressed, sImpure,
|
||||||
sOutputHash, sOutputHashAlgo, sOutputHashMode,
|
sOutputHash, sOutputHashAlgo, sOutputHashMode,
|
||||||
sRecurseForDerivations,
|
sRecurseForDerivations,
|
||||||
|
|
|
@ -1213,6 +1213,20 @@ drvName, Bindings * attrs, Value & v)
|
||||||
handleOutputs(ss);
|
handleOutputs(ss);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (i->name == state.sAllowedReferences)
|
||||||
|
warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'allowedReferences'; use 'outputChecks.<output>.allowedReferences' instead", drvName);
|
||||||
|
if (i->name == state.sAllowedRequisites)
|
||||||
|
warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'allowedRequisites'; use 'outputChecks.<output>.allowedRequisites' instead", drvName);
|
||||||
|
if (i->name == state.sDisallowedReferences)
|
||||||
|
warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedReferences'; use 'outputChecks.<output>.disallowedReferences' instead", drvName);
|
||||||
|
if (i->name == state.sDisallowedRequisites)
|
||||||
|
warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedRequisites'; use 'outputChecks.<output>.disallowedRequisites' instead", drvName);
|
||||||
|
if (i->name == state.sMaxSize)
|
||||||
|
warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'maxSize'; use 'outputChecks.<output>.maxSize' instead", drvName);
|
||||||
|
if (i->name == state.sMaxClosureSize)
|
||||||
|
warn("In a derivation named '%s', 'structuredAttrs' disables the effect of the derivation attribute 'maxClosureSize'; use 'outputChecks.<output>.maxClosureSize' instead", drvName);
|
||||||
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
auto s = state.coerceToString(pos, *i->value, context, context_below, true).toOwned();
|
auto s = state.coerceToString(pos, *i->value, context, context_below, true).toOwned();
|
||||||
drv.env.emplace(key, s);
|
drv.env.emplace(key, s);
|
||||||
|
|
|
@ -3116,6 +3116,24 @@ void LocalDerivationGoal::checkOutputs(const std::map<std::string, ValidPathInfo
|
||||||
};
|
};
|
||||||
|
|
||||||
if (auto structuredAttrs = parsedDrv->getStructuredAttrs()) {
|
if (auto structuredAttrs = parsedDrv->getStructuredAttrs()) {
|
||||||
|
if (get(*structuredAttrs, "allowedReferences")){
|
||||||
|
warn("'structuredAttrs' disables the effect of the top-level attribute 'allowedReferences'; use 'outputChecks' instead");
|
||||||
|
}
|
||||||
|
if (get(*structuredAttrs, "allowedRequisites")){
|
||||||
|
warn("'structuredAttrs' disables the effect of the top-level attribute 'allowedRequisites'; use 'outputChecks' instead");
|
||||||
|
}
|
||||||
|
if (get(*structuredAttrs, "disallowedRequisites")){
|
||||||
|
warn("'structuredAttrs' disables the effect of the top-level attribute 'disallowedRequisites'; use 'outputChecks' instead");
|
||||||
|
}
|
||||||
|
if (get(*structuredAttrs, "disallowedReferences")){
|
||||||
|
warn("'structuredAttrs' disables the effect of the top-level attribute 'disallowedReferences'; use 'outputChecks' instead");
|
||||||
|
}
|
||||||
|
if (get(*structuredAttrs, "maxSize")){
|
||||||
|
warn("'structuredAttrs' disables the effect of the top-level attribute 'maxSize'; use 'outputChecks' instead");
|
||||||
|
}
|
||||||
|
if (get(*structuredAttrs, "maxClosureSize")){
|
||||||
|
warn("'structuredAttrs' disables the effect of the top-level attribute 'maxClosureSize'; use 'outputChecks' instead");
|
||||||
|
}
|
||||||
if (auto outputChecks = get(*structuredAttrs, "outputChecks")) {
|
if (auto outputChecks = get(*structuredAttrs, "outputChecks")) {
|
||||||
if (auto output = get(*outputChecks, outputName)) {
|
if (auto output = get(*outputChecks, outputName)) {
|
||||||
Checks checks;
|
Checks checks;
|
||||||
|
|
|
@ -0,0 +1,6 @@
|
||||||
|
warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'allowedReferences'; use 'outputChecks.<output>.allowedReferences' instead
|
||||||
|
warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'allowedRequisites'; use 'outputChecks.<output>.allowedRequisites' instead
|
||||||
|
warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedReferences'; use 'outputChecks.<output>.disallowedReferences' instead
|
||||||
|
warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'disallowedRequisites'; use 'outputChecks.<output>.disallowedRequisites' instead
|
||||||
|
warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'maxClosureSize'; use 'outputChecks.<output>.maxClosureSize' instead
|
||||||
|
warning: In a derivation named 'eval-okay-derivation-legacy', 'structuredAttrs' disables the effect of the derivation attribute 'maxSize'; use 'outputChecks.<output>.maxSize' instead
|
1
tests/functional/lang/eval-okay-derivation-legacy.exp
Normal file
1
tests/functional/lang/eval-okay-derivation-legacy.exp
Normal file
|
@ -0,0 +1 @@
|
||||||
|
"/nix/store/mzgwvrjjir216ra58mwwizi8wj6y9ddr-eval-okay-derivation-legacy"
|
12
tests/functional/lang/eval-okay-derivation-legacy.nix
Normal file
12
tests/functional/lang/eval-okay-derivation-legacy.nix
Normal file
|
@ -0,0 +1,12 @@
|
||||||
|
(builtins.derivationStrict {
|
||||||
|
name = "eval-okay-derivation-legacy";
|
||||||
|
system = "x86_64-linux";
|
||||||
|
builder = "/dontcare";
|
||||||
|
__structuredAttrs = true;
|
||||||
|
allowedReferences = [ ];
|
||||||
|
disallowedReferences = [ ];
|
||||||
|
allowedRequisites = [ ];
|
||||||
|
disallowedRequisites = [ ];
|
||||||
|
maxSize = 1234;
|
||||||
|
maxClosureSize = 12345;
|
||||||
|
}).out
|
Loading…
Reference in a new issue