aboutsummaryrefslogtreecommitdiff
path: root/src/libstore/path-with-outputs.cc
diff options
context:
space:
mode:
authorJohn Ericson <John.Ericson@Obsidian.Systems>2021-03-02 03:50:41 +0000
committerJohn Ericson <John.Ericson@Obsidian.Systems>2021-04-05 08:33:00 -0400
commit255d145ba7ac907d1cba8d088da556b591627756 (patch)
tree3fe8f3721b4416699b3a1f9ddf2a5c7d17c4471f /src/libstore/path-with-outputs.cc
parent32f4454b9fa3ac30d58e738ece322eb19a0728ba (diff)
Use `BuildableReq` for `buildPaths` and `ensurePath`
This avoids an ambiguity where the `StorePathWithOutputs { drvPath, {} }` could mean "build `brvPath`" or "substitute `drvPath`" depending on context. It also brings the internals closer in line to the new CLI, by generalizing the `Buildable` type is used there and makes that distinction already. In doing so, relegate `StorePathWithOutputs` to being a type just for backwards compatibility (CLI and RPC).
Diffstat (limited to 'src/libstore/path-with-outputs.cc')
-rw-r--r--src/libstore/path-with-outputs.cc35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/libstore/path-with-outputs.cc b/src/libstore/path-with-outputs.cc
index a898ad09c..353286ac6 100644
--- a/src/libstore/path-with-outputs.cc
+++ b/src/libstore/path-with-outputs.cc
@@ -1,3 +1,4 @@
+#include "path-with-outputs.hh"
#include "store-api.hh"
namespace nix {
@@ -10,6 +11,40 @@ std::string StorePathWithOutputs::to_string(const Store & store) const
}
+BuildableReq StorePathWithOutputs::toBuildableReq() const
+{
+ if (!outputs.empty() || path.isDerivation())
+ return BuildableReqFromDrv { path, outputs };
+ else
+ return BuildableOpaque { path };
+}
+
+
+std::vector<BuildableReq> toBuildableReqs(const std::vector<StorePathWithOutputs> ss)
+{
+ std::vector<BuildableReq> reqs;
+ for (auto & s : ss) reqs.push_back(s.toBuildableReq());
+ return reqs;
+}
+
+
+std::variant<StorePathWithOutputs, StorePath> StorePathWithOutputs::tryFromBuildableReq(const BuildableReq & p)
+{
+ return std::visit(overloaded {
+ [&](BuildableOpaque bo) -> std::variant<StorePathWithOutputs, StorePath> {
+ if (bo.path.isDerivation()) {
+ // drv path gets interpreted as "build", not "get drv file itself"
+ return bo.path;
+ }
+ return StorePathWithOutputs { bo.path };
+ },
+ [&](BuildableReqFromDrv bfd) -> std::variant<StorePathWithOutputs, StorePath> {
+ return StorePathWithOutputs { bfd.drvPath, bfd.outputs };
+ },
+ }, p);
+}
+
+
std::pair<std::string_view, StringSet> parsePathWithOutputs(std::string_view s)
{
size_t n = s.find("!");