aboutsummaryrefslogtreecommitdiff
path: root/src/libcmd/built-path.cc
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-12 22:22:44 -0400
committerJohn Ericson <John.Ericson@Obsidian.Systems>2023-07-12 23:01:10 -0400
commit2c3fb0eb33d205d1937b7ed801bdb36bb301d1a8 (patch)
treed4840df3fbc1145cd779092d288296f037313eed /src/libcmd/built-path.cc
parentcafb5e8a1751b2c951347d5d9188b2e0bee357be (diff)
Move `BuiltPath` to its own header/C++ file in libcmd
It is less important, and used less widely, than `DerivedPath`.
Diffstat (limited to 'src/libcmd/built-path.cc')
-rw-r--r--src/libcmd/built-path.cc67
1 files changed, 67 insertions, 0 deletions
diff --git a/src/libcmd/built-path.cc b/src/libcmd/built-path.cc
new file mode 100644
index 000000000..db9c440e3
--- /dev/null
+++ b/src/libcmd/built-path.cc
@@ -0,0 +1,67 @@
+#include "built-path.hh"
+#include "derivations.hh"
+#include "store-api.hh"
+
+#include <nlohmann/json.hpp>
+
+#include <optional>
+
+namespace nix {
+
+nlohmann::json BuiltPath::Built::toJSON(ref<Store> store) const {
+ nlohmann::json res;
+ res["drvPath"] = store->printStorePath(drvPath);
+ for (const auto& [output, path] : outputs) {
+ res["outputs"][output] = store->printStorePath(path);
+ }
+ return res;
+}
+
+StorePathSet BuiltPath::outPaths() const
+{
+ return std::visit(
+ overloaded{
+ [](const BuiltPath::Opaque & p) { return StorePathSet{p.path}; },
+ [](const BuiltPath::Built & b) {
+ StorePathSet res;
+ for (auto & [_, path] : b.outputs)
+ res.insert(path);
+ return res;
+ },
+ }, raw()
+ );
+}
+
+RealisedPath::Set BuiltPath::toRealisedPaths(Store & store) const
+{
+ RealisedPath::Set res;
+ std::visit(
+ overloaded{
+ [&](const BuiltPath::Opaque & p) { res.insert(p.path); },
+ [&](const BuiltPath::Built & p) {
+ auto drvHashes =
+ staticOutputHashes(store, store.readDerivation(p.drvPath));
+ for (auto& [outputName, outputPath] : p.outputs) {
+ if (experimentalFeatureSettings.isEnabled(
+ Xp::CaDerivations)) {
+ auto drvOutput = get(drvHashes, outputName);
+ if (!drvOutput)
+ throw Error(
+ "the derivation '%s' has unrealised output '%s' (derived-path.cc/toRealisedPaths)",
+ store.printStorePath(p.drvPath), outputName);
+ auto thisRealisation = store.queryRealisation(
+ DrvOutput{*drvOutput, outputName});
+ assert(thisRealisation); // We’ve built it, so we must
+ // have the realisation
+ res.insert(*thisRealisation);
+ } else {
+ res.insert(outputPath);
+ }
+ }
+ },
+ },
+ raw());
+ return res;
+}
+
+}