aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/get-drvs.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-11-24 18:07:29 +0100
committerEelco Dolstra <edolstra@gmail.com>2017-11-24 18:08:35 +0100
commit90948a4e3a64492b7d117d93657221fa7b598e6e (patch)
treed339dad0dd12db1132d3484a6cad199c13a78b82 /src/libexpr/get-drvs.cc
parent0fc3e581e0585e377d4b42e343b0487606add547 (diff)
nix-shell/nix-build: Support .drv files again
Fixes #1663. Also handle '!<output-name>' (#1694).
Diffstat (limited to 'src/libexpr/get-drvs.cc')
-rw-r--r--src/libexpr/get-drvs.cc28
1 files changed, 28 insertions, 0 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index d5bc42352..d38ed2df3 100644
--- a/src/libexpr/get-drvs.cc
+++ b/src/libexpr/get-drvs.cc
@@ -1,6 +1,7 @@
#include "get-drvs.hh"
#include "util.hh"
#include "eval-inline.hh"
+#include "derivations.hh"
#include <cstring>
#include <regex>
@@ -15,6 +16,33 @@ DrvInfo::DrvInfo(EvalState & state, const string & attrPath, Bindings * attrs)
}
+DrvInfo::DrvInfo(EvalState & state, ref<Store> store, const std::string & drvPathWithOutputs)
+ : state(&state), attrs(nullptr), attrPath("")
+{
+ auto spec = parseDrvPathWithOutputs(drvPathWithOutputs);
+
+ drvPath = spec.first;
+
+ auto drv = store->derivationFromPath(drvPath);
+
+ name = storePathToName(drvPath);
+
+ if (spec.second.size() > 1)
+ throw Error("building more than one derivation output is not supported, in '%s'", drvPathWithOutputs);
+
+ outputName =
+ spec.second.empty()
+ ? get(drv.env, "outputName", "out")
+ : *spec.second.begin();
+
+ auto i = drv.outputs.find(outputName);
+ if (i == drv.outputs.end())
+ throw Error("derivation '%s' does not have output '%s'", drvPath, outputName);
+
+ outPath = i->second.path;
+}
+
+
string DrvInfo::queryName() const
{
if (name == "" && attrs) {