makeContentAddressed: Add single path helper

This commit is contained in:
Robert Hensing 2023-06-05 11:37:41 +02:00
parent 8dca95386c
commit 55888633dd
3 changed files with 27 additions and 7 deletions

View file

@ -94,14 +94,12 @@ static void prim_fetchClosure(EvalState & state, const PosIdx pos, Value * * arg
if (enableRewriting) { if (enableRewriting) {
if (!toPath || !state.store->isValidPath(*toPath)) { if (!toPath || !state.store->isValidPath(*toPath)) {
auto remappings = makeContentAddressed(*fromStore, *state.store, { *fromPath }); auto rewrittenPath = makeContentAddressed(*fromStore, *state.store, *fromPath);
auto i = remappings.find(*fromPath); if (toPath && *toPath != rewrittenPath)
assert(i != remappings.end());
if (toPath && *toPath != i->second)
throw Error({ throw Error({
.msg = hintfmt("rewriting '%s' to content-addressed form yielded '%s', while '%s' was expected", .msg = hintfmt("rewriting '%s' to content-addressed form yielded '%s', while '%s' was expected",
state.store->printStorePath(*fromPath), state.store->printStorePath(*fromPath),
state.store->printStorePath(i->second), state.store->printStorePath(rewrittenPath),
state.store->printStorePath(*toPath)), state.store->printStorePath(*toPath)),
.errPos = state.positions[pos] .errPos = state.positions[pos]
}); });
@ -111,7 +109,7 @@ static void prim_fetchClosure(EvalState & state, const PosIdx pos, Value * * arg
"rewriting '%s' to content-addressed form yielded '%s'; " "rewriting '%s' to content-addressed form yielded '%s'; "
"please set this in the 'toPath' attribute passed to 'fetchClosure'", "please set this in the 'toPath' attribute passed to 'fetchClosure'",
state.store->printStorePath(*fromPath), state.store->printStorePath(*fromPath),
state.store->printStorePath(i->second)), state.store->printStorePath(rewrittenPath)),
.errPos = state.positions[pos] .errPos = state.positions[pos]
}); });
} }

View file

@ -80,4 +80,15 @@ std::map<StorePath, StorePath> makeContentAddressed(
return remappings; return remappings;
} }
StorePath makeContentAddressed(
Store & srcStore,
Store & dstStore,
const StorePath & fromPath)
{
auto remappings = makeContentAddressed(srcStore, dstStore, StorePathSet { fromPath });
auto i = remappings.find(fromPath);
assert(i != remappings.end());
return i->second;
}
} }

View file

@ -5,9 +5,20 @@
namespace nix { namespace nix {
/** Rewrite a closure of store paths to be completely content addressed.
*/
std::map<StorePath, StorePath> makeContentAddressed( std::map<StorePath, StorePath> makeContentAddressed(
Store & srcStore, Store & srcStore,
Store & dstStore, Store & dstStore,
const StorePathSet & storePaths); const StorePathSet & rootPaths);
/** Rewrite a closure of a store path to be completely content addressed.
*
* This is a convenience function for the case where you only have one root path.
*/
StorePath makeContentAddressed(
Store & srcStore,
Store & dstStore,
const StorePath & rootPath);
} }