aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/build/local-derivation-goal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/libstore/build/local-derivation-goal.cc')
-rw-r--r--src/libstore/build/local-derivation-goal.cc52
1 files changed, 32 insertions, 20 deletions
diff --git a/src/libstore/build/local-derivation-goal.cc b/src/libstore/build/local-derivation-goal.cc
index c9086fc67..9b6645222 100644
--- a/src/libstore/build/local-derivation-goal.cc
+++ b/src/libstore/build/local-derivation-goal.cc
@@ -2310,26 +2310,35 @@ void LocalDerivationGoal::registerOutputs()
auto newInfoFromCA = [&](const DerivationOutputCAFloating outputHash) -> ValidPathInfo {
auto & st = outputStats.at(outputName);
- if (outputHash.method == FileIngestionMethod::Flat) {
+ if (outputHash.method == ContentAddressMethod { FileIngestionMethod::Flat } ||
+ outputHash.method == ContentAddressMethod { TextHashMethod {} })
+ {
/* The output path should be a regular file without execute permission. */
if (!S_ISREG(st.st_mode) || (st.st_mode & S_IXUSR) != 0)
throw BuildError(
"output path '%1%' should be a non-executable regular file "
- "since recursive hashing is not enabled (outputHashMode=flat)",
+ "since recursive hashing is not enabled (one of outputHashMode={flat,text} is true)",
actualPath);
}
rewriteOutput();
/* FIXME optimize and deduplicate with addToStore */
std::string oldHashPart { scratchPath.hashPart() };
HashModuloSink caSink { outputHash.hashType, oldHashPart };
- switch (outputHash.method) {
- case FileIngestionMethod::Recursive:
- dumpPath(actualPath, caSink);
- break;
- case FileIngestionMethod::Flat:
- readFile(actualPath, caSink);
- break;
- }
+ std::visit(overloaded {
+ [&](TextHashMethod _) {
+ readFile(actualPath, caSink);
+ },
+ [&](FileIngestionMethod m2) {
+ switch (m2) {
+ case FileIngestionMethod::Recursive:
+ dumpPath(actualPath, caSink);
+ break;
+ case FileIngestionMethod::Flat:
+ readFile(actualPath, caSink);
+ break;
+ }
+ },
+ }, outputHash.method);
auto got = caSink.finish().first;
HashModuloSink narSink { htSHA256, oldHashPart };
dumpPath(actualPath, narSink);
@@ -2338,13 +2347,10 @@ void LocalDerivationGoal::registerOutputs()
worker.store,
{
.name = outputPathName(drv->name, outputName),
- .info = FixedOutputInfo {
- {
- .method = outputHash.method,
- .hash = got,
- },
- rewriteRefs(),
- },
+ .info = contentAddressFromMethodHashAndRefs(
+ outputHash.method,
+ std::move(got),
+ rewriteRefs()),
},
narHashAndSize.first,
};
@@ -2386,13 +2392,14 @@ void LocalDerivationGoal::registerOutputs()
return newInfo0;
},
[&](DerivationOutputCAFixed dof) {
+ auto wanted = getContentAddressHash(dof.ca);
+
auto newInfo0 = newInfoFromCA(DerivationOutputCAFloating {
- .method = dof.hash.method,
- .hashType = dof.hash.hash.type,
+ .method = getContentAddressMethod(dof.ca),
+ .hashType = wanted.type,
});
/* Check wanted hash */
- Hash & wanted = dof.hash.hash;
assert(newInfo0.ca);
auto got = getContentAddressHash(*newInfo0.ca);
if (wanted != got) {
@@ -2405,6 +2412,11 @@ void LocalDerivationGoal::registerOutputs()
wanted.to_string(SRI, true),
got.to_string(SRI, true)));
}
+ if (static_cast<const PathReferences<StorePath> &>(newInfo0) != PathReferences<StorePath> {})
+ delayedException = std::make_exception_ptr(
+ BuildError("illegal path references in fixed-output derivation '%s'",
+ worker.store.printStorePath(drvPath)));
+
return newInfo0;
},
[&](DerivationOutputCAFloating dof) {