aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-12 23:33:43 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-13 07:56:33 -0400
commitcaabc4f64889d5a4c47d6102b3aa1d3c80bbc107 (patch)
tree6859d20eec12b628ca77c07dee7e41e2e6a91f00 /src
parentcafb5e8a1751b2c951347d5d9188b2e0bee357be (diff)
Feature gate `DownstreamPlaceholder::unknownCaOutput`
This is a part of CA derivations that we forgot to put behind the experimental feature. This was caught by @fricklerhandwerk in https://github.com/NixOS/nix/pull/8369#discussion_r1258133719
Diffstat (limited to 'src')
-rw-r--r--src/libexpr/eval.cc5
-rw-r--r--src/libexpr/eval.hh5
-rw-r--r--src/libexpr/primops.cc25
-rw-r--r--src/libexpr/tests/derived-path.cc9
-rw-r--r--src/libstore/derivations.cc8
-rw-r--r--src/libstore/downstream-placeholder.cc4
-rw-r--r--src/libstore/downstream-placeholder.hh5
-rw-r--r--src/libstore/tests/downstream-placeholder.cc16
-rw-r--r--src/nix/app.cc11
9 files changed, 57 insertions, 31 deletions
diff --git a/src/libexpr/eval.cc b/src/libexpr/eval.cc
index be1bdb806..7071815d4 100644
--- a/src/libexpr/eval.cc
+++ b/src/libexpr/eval.cc
@@ -1068,14 +1068,15 @@ void EvalState::mkOutputString(
Value & value,
const StorePath & drvPath,
const std::string outputName,
- std::optional<StorePath> optOutputPath)
+ std::optional<StorePath> optOutputPath,
+ const ExperimentalFeatureSettings & xpSettings)
{
value.mkString(
optOutputPath
? store->printStorePath(*std::move(optOutputPath))
/* Downstream we would substitute this for an actual path once
we build the floating CA derivation */
- : DownstreamPlaceholder::unknownCaOutput(drvPath, outputName).render(),
+ : DownstreamPlaceholder::unknownCaOutput(drvPath, outputName, xpSettings).render(),
NixStringContext {
NixStringContextElem::Built {
.drvPath = drvPath,
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index 277e77ad5..7f11ce71d 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -689,12 +689,15 @@ public:
* be passed if and only if output store object is input-addressed.
* Will be printed to form string if passed, otherwise a placeholder
* will be used (see `DownstreamPlaceholder`).
+ *
+ * @param xpSettings Stop-gap to avoid globals during unit tests.
*/
void mkOutputString(
Value & value,
const StorePath & drvPath,
const std::string outputName,
- std::optional<StorePath> optOutputPath);
+ std::optional<StorePath> optOutputPath,
+ const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
void concatLists(Value & v, size_t nrLists, Value * * lists, const PosIdx pos, std::string_view errorCtx);
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index 8a61e57cc..5dab06f26 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -83,22 +83,21 @@ StringMap EvalState::realiseContext(const NixStringContext & context)
for (auto & d : drvs) buildReqs.emplace_back(DerivedPath { d });
store->buildPaths(buildReqs);
- /* Get all the output paths corresponding to the placeholders we had */
for (auto & drv : drvs) {
auto outputs = resolveDerivedPath(*store, drv);
for (auto & [outputName, outputPath] : outputs) {
- res.insert_or_assign(
- DownstreamPlaceholder::unknownCaOutput(drv.drvPath, outputName).render(),
- store->printStorePath(outputPath)
- );
- }
- }
-
- /* Add the output of this derivations to the allowed
- paths. */
- if (allowedPaths) {
- for (auto & [_placeholder, outputPath] : res) {
- allowPath(store->toRealPath(outputPath));
+ /* Add the output of this derivations to the allowed
+ paths. */
+ if (allowedPaths) {
+ allowPath(outputPath);
+ }
+ /* Get all the output paths corresponding to the placeholders we had */
+ if (experimentalFeatureSettings.isEnabled(Xp::CaDerivations)) {
+ res.insert_or_assign(
+ DownstreamPlaceholder::unknownCaOutput(drv.drvPath, outputName).render(),
+ store->printStorePath(outputPath)
+ );
+ }
}
}
diff --git a/src/libexpr/tests/derived-path.cc b/src/libexpr/tests/derived-path.cc
index 8210efef2..c713fe28a 100644
--- a/src/libexpr/tests/derived-path.cc
+++ b/src/libexpr/tests/derived-path.cc
@@ -37,8 +37,15 @@ RC_GTEST_FIXTURE_PROP(
prop_built_path_placeholder_round_trip,
(const StorePath & drvPath, const StorePathName & outputName))
{
+ /**
+ * We set these in tests rather than the regular globals so we don't have
+ * to worry about race conditions if the tests run concurrently.
+ */
+ ExperimentalFeatureSettings mockXpSettings;
+ mockXpSettings.set("experimental-features", "ca-derivations");
+
auto * v = state.allocValue();
- state.mkOutputString(*v, drvPath, outputName.name, std::nullopt);
+ state.mkOutputString(*v, drvPath, outputName.name, std::nullopt, mockXpSettings);
auto [d, _] = state.coerceToDerivedPathUnchecked(noPos, *v, "");
DerivedPath::Built b {
.drvPath = drvPath,
diff --git a/src/libstore/derivations.cc b/src/libstore/derivations.cc
index 6f63685d4..234d70ec5 100644
--- a/src/libstore/derivations.cc
+++ b/src/libstore/derivations.cc
@@ -878,9 +878,11 @@ std::optional<BasicDerivation> Derivation::tryResolve(
for (auto & [inputDrv, inputOutputs] : inputDrvs) {
for (auto & outputName : inputOutputs) {
if (auto actualPath = get(inputDrvOutputs, { inputDrv, outputName })) {
- inputRewrites.emplace(
- DownstreamPlaceholder::unknownCaOutput(inputDrv, outputName).render(),
- store.printStorePath(*actualPath));
+ if (experimentalFeatureSettings.isEnabled(Xp::CaDerivations)) {
+ inputRewrites.emplace(
+ DownstreamPlaceholder::unknownCaOutput(inputDrv, outputName).render(),
+ store.printStorePath(*actualPath));
+ }
resolved.inputSrcs.insert(*actualPath);
} else {
warn("output '%s' of input '%s' missing, aborting the resolving",
diff --git a/src/libstore/downstream-placeholder.cc b/src/libstore/downstream-placeholder.cc
index 1752738f2..d623c05e2 100644
--- a/src/libstore/downstream-placeholder.cc
+++ b/src/libstore/downstream-placeholder.cc
@@ -11,8 +11,10 @@ std::string DownstreamPlaceholder::render() const
DownstreamPlaceholder DownstreamPlaceholder::unknownCaOutput(
const StorePath & drvPath,
- std::string_view outputName)
+ std::string_view outputName,
+ const ExperimentalFeatureSettings & xpSettings)
{
+ xpSettings.require(Xp::CaDerivations);
auto drvNameWithExtension = drvPath.name();
auto drvName = drvNameWithExtension.substr(0, drvNameWithExtension.size() - 4);
auto clearText = "nix-upstream-output:" + std::string { drvPath.hashPart() } + ":" + outputPathName(drvName, outputName);
diff --git a/src/libstore/downstream-placeholder.hh b/src/libstore/downstream-placeholder.hh
index f0c0dee77..97f77e6b8 100644
--- a/src/libstore/downstream-placeholder.hh
+++ b/src/libstore/downstream-placeholder.hh
@@ -52,10 +52,13 @@ public:
*
* The derivation itself is known (we have a store path for it), but
* the output doesn't yet have a known store path.
+ *
+ * @param xpSettings Stop-gap to avoid globals during unit tests.
*/
static DownstreamPlaceholder unknownCaOutput(
const StorePath & drvPath,
- std::string_view outputName);
+ std::string_view outputName,
+ const ExperimentalFeatureSettings & xpSettings = experimentalFeatureSettings);
/**
* Create a placehold for the output of an unknown derivation.
diff --git a/src/libstore/tests/downstream-placeholder.cc b/src/libstore/tests/downstream-placeholder.cc
index ec3e1000f..fd29530ac 100644
--- a/src/libstore/tests/downstream-placeholder.cc
+++ b/src/libstore/tests/downstream-placeholder.cc
@@ -5,17 +5,24 @@
namespace nix {
TEST(DownstreamPlaceholder, unknownCaOutput) {
+ /**
+ * We set these in tests rather than the regular globals so we don't have
+ * to worry about race conditions if the tests run concurrently.
+ */
+ ExperimentalFeatureSettings mockXpSettings;
+ mockXpSettings.set("experimental-features", "ca-derivations");
+
ASSERT_EQ(
DownstreamPlaceholder::unknownCaOutput(
StorePath { "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo.drv" },
- "out").render(),
+ "out",
+ mockXpSettings).render(),
"/0c6rn30q4frawknapgwq386zq358m8r6msvywcvc89n6m5p2dgbz");
}
TEST(DownstreamPlaceholder, unknownDerivation) {
/**
- * We set these in tests rather than the regular globals so we don't have
- * to worry about race conditions if the tests run concurrently.
+ * Same reason as above
*/
ExperimentalFeatureSettings mockXpSettings;
mockXpSettings.set("experimental-features", "dynamic-derivations ca-derivations");
@@ -24,7 +31,8 @@ TEST(DownstreamPlaceholder, unknownDerivation) {
DownstreamPlaceholder::unknownDerivation(
DownstreamPlaceholder::unknownCaOutput(
StorePath { "g1w7hy3qg1w7hy3qg1w7hy3qg1w7hy3q-foo.drv.drv" },
- "out"),
+ "out",
+ mockXpSettings),
"out",
mockXpSettings).render(),
"/0gn6agqxjyyalf0dpihgyf49xq5hqxgw100f0wydnj6yqrhqsb3w");
diff --git a/src/nix/app.cc b/src/nix/app.cc
index e678b54f0..e0f68b4fc 100644
--- a/src/nix/app.cc
+++ b/src/nix/app.cc
@@ -22,11 +22,12 @@ StringPairs resolveRewrites(
StringPairs res;
for (auto & dep : dependencies)
if (auto drvDep = std::get_if<BuiltPathBuilt>(&dep.path))
- for (auto & [ outputName, outputPath ] : drvDep->outputs)
- res.emplace(
- DownstreamPlaceholder::unknownCaOutput(drvDep->drvPath, outputName).render(),
- store.printStorePath(outputPath)
- );
+ if (experimentalFeatureSettings.isEnabled(Xp::CaDerivations))
+ for (auto & [ outputName, outputPath ] : drvDep->outputs)
+ res.emplace(
+ DownstreamPlaceholder::unknownCaOutput(drvDep->drvPath, outputName).render(),
+ store.printStorePath(outputPath)
+ );
return res;
}