aboutsummaryrefslogtreecommitdiff
path: root/src/nix/make-content-addressable.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix/make-content-addressable.cc')
-rw-r--r--src/nix/make-content-addressable.cc40
1 files changed, 22 insertions, 18 deletions
diff --git a/src/nix/make-content-addressable.cc b/src/nix/make-content-addressable.cc
index 5b99b5084..524d467c2 100644
--- a/src/nix/make-content-addressable.cc
+++ b/src/nix/make-content-addressable.cc
@@ -29,34 +29,36 @@ struct CmdMakeContentAddressable : StorePathsCommand
},
};
}
- void run(ref<Store> store, Paths storePaths) override
+ void run(ref<Store> store, StorePaths storePaths) override
{
- auto paths = store->topoSortPaths(PathSet(storePaths.begin(), storePaths.end()));
+ auto paths = store->topoSortPaths(storePathsToSet(storePaths));
- paths.reverse();
+ std::reverse(paths.begin(), paths.end());
- std::map<Path, Path> remappings;
+ std::map<StorePath, StorePath> remappings;
for (auto & path : paths) {
+ auto pathS = store->printStorePath(path);
auto oldInfo = store->queryPathInfo(path);
- auto oldHashPart = storePathToHash(path);
- auto name = storePathToName(path);
+ auto oldHashPart = storePathToHash(pathS);
StringSink sink;
store->narFromPath(path, sink);
StringMap rewrites;
- ValidPathInfo info;
+ StorePathSet references;
+ bool hasSelfReference = false;
for (auto & ref : oldInfo->references) {
if (ref == path)
- info.references.insert("self");
+ hasSelfReference = true;
else {
- auto replacement = get(remappings, ref, ref);
+ auto i = remappings.find(ref);
+ auto replacement = i != remappings.end() ? i->second.clone() : ref.clone();
// FIXME: warn about unremapped paths?
- info.references.insert(replacement);
if (replacement != ref)
- rewrites[storePathToHash(ref)] = storePathToHash(replacement);
+ rewrites.insert_or_assign(store->printStorePath(ref), store->printStorePath(replacement));
+ references.insert(std::move(replacement));
}
}
@@ -65,24 +67,26 @@ struct CmdMakeContentAddressable : StorePathsCommand
HashModuloSink hashModuloSink(htSHA256, oldHashPart);
hashModuloSink((unsigned char *) sink.s->data(), sink.s->size());
- info.narHash = hashModuloSink.finish().first;
+ auto narHash = hashModuloSink.finish().first;
+
+ ValidPathInfo info(store->makeFixedOutputPath(true, narHash, path.name(), references, hasSelfReference));
+ info.references = std::move(references);
+ if (hasSelfReference) info.references.insert(info.path.clone());
+ info.narHash = narHash;
info.narSize = sink.s->size();
- replaceInSet(info.references, path, std::string("self"));
- info.path = store->makeFixedOutputPath(true, info.narHash, name, info.references);
- replaceInSet(info.references, std::string("self"), info.path);
info.ca = makeFixedOutputCA(true, info.narHash);
- printError("rewrote '%s' to '%s'", path, info.path);
+ printError("rewrote '%s' to '%s'", pathS, store->printStorePath(info.path));
auto source = sinkToSource([&](Sink & nextSink) {
- RewritingSink rsink2(oldHashPart, storePathToHash(info.path), nextSink);
+ RewritingSink rsink2(oldHashPart, storePathToHash(store->printStorePath(info.path)), nextSink);
rsink2((unsigned char *) sink.s->data(), sink.s->size());
rsink2.flush();
});
store->addToStore(info, *source);
- remappings[path] = info.path;
+ remappings.insert_or_assign(std::move(path), std::move(info.path));
}
}
};