forked from lix-project/lix
makeContentAddressed: Add single path helper
This commit is contained in:
parent
8dca95386c
commit
55888633dd
|
@ -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]
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue