Perform input rewrites only in LocalDerivationGoal

This commit is contained in:
Maximilian Bosch 2021-06-24 15:06:07 +02:00
parent 6f206549ba
commit 644415d391
No known key found for this signature in database
GPG key ID: 091DBF4D1FC46B8E
4 changed files with 14 additions and 12 deletions

View file

@ -1086,8 +1086,17 @@ void LocalDerivationGoal::initEnv()
void LocalDerivationGoal::writeStructuredAttrs() void LocalDerivationGoal::writeStructuredAttrs()
{ {
if (auto structAttrsJson = parsedDrv->prepareStructuredAttrs(inputRewrites, worker.store, inputPaths)) { if (auto structAttrsJson = parsedDrv->prepareStructuredAttrs(worker.store, inputPaths)) {
auto json = structAttrsJson.value(); auto json = structAttrsJson.value();
nlohmann::json rewritten;
for (auto & [i, v] : json["outputs"].get<nlohmann::json::object_t>()) {
/* The placeholder must have a rewrite, so we use it to cover both the
cases where we know or don't know the output path ahead of time. */
rewritten[i] = rewriteStrings(v, inputRewrites);
}
json["outputs"] = rewritten;
auto jsonSh = writeStructuredAttrsShell(json); auto jsonSh = writeStructuredAttrsShell(json);
writeFile(tmpDir + "/.attrs.sh", rewriteStrings(jsonSh, inputRewrites)); writeFile(tmpDir + "/.attrs.sh", rewriteStrings(jsonSh, inputRewrites));

View file

@ -124,7 +124,7 @@ bool ParsedDerivation::substitutesAllowed() const
} }
static std::regex shVarName("[A-Za-z_][A-Za-z0-9_]*"); static std::regex shVarName("[A-Za-z_][A-Za-z0-9_]*");
std::optional<nlohmann::json> ParsedDerivation::prepareStructuredAttrs(std::optional<StringMap> inputRewrites, Store & store, const StorePathSet & inputPaths) std::optional<nlohmann::json> ParsedDerivation::prepareStructuredAttrs(Store & store, const StorePathSet & inputPaths)
{ {
auto structuredAttrs = getStructuredAttrs(); auto structuredAttrs = getStructuredAttrs();
if (!structuredAttrs) return std::nullopt; if (!structuredAttrs) return std::nullopt;
@ -134,14 +134,7 @@ std::optional<nlohmann::json> ParsedDerivation::prepareStructuredAttrs(std::opti
/* Add an "outputs" object containing the output paths. */ /* Add an "outputs" object containing the output paths. */
nlohmann::json outputs; nlohmann::json outputs;
for (auto & i : drv.outputs) { for (auto & i : drv.outputs) {
if (inputRewrites) { outputs[i.first] = hashPlaceholder(i.first);
/* The placeholder must have a rewrite, so we use it to cover both the
cases where we know or don't know the output path ahead of time. */
outputs[i.first] = rewriteStrings(hashPlaceholder(i.first), inputRewrites.value());
} else {
/* This case is only relevant for the nix-shell */
outputs[i.first] = hashPlaceholder(i.first);
}
} }
json["outputs"] = outputs; json["outputs"] = outputs;

View file

@ -37,7 +37,7 @@ public:
bool substitutesAllowed() const; bool substitutesAllowed() const;
std::optional<nlohmann::json> prepareStructuredAttrs(std::optional<StringMap> inputRewrites, Store & store, const StorePathSet & inputPaths); std::optional<nlohmann::json> prepareStructuredAttrs(Store & store, const StorePathSet & inputPaths);
}; };
std::string writeStructuredAttrsShell(nlohmann::json & json); std::string writeStructuredAttrsShell(nlohmann::json & json);

View file

@ -444,7 +444,7 @@ static void main_nix_build(int argc, char * * argv)
drv drv
); );
if (auto structAttrs = parsedDrv.prepareStructuredAttrs(std::nullopt, *store, inputs)) { if (auto structAttrs = parsedDrv.prepareStructuredAttrs(*store, inputs)) {
auto json = structAttrs.value(); auto json = structAttrs.value();
structuredAttrsRC = writeStructuredAttrsShell(json); structuredAttrsRC = writeStructuredAttrsShell(json);