aboutsummaryrefslogtreecommitdiff
path: root/src/libexpr/get-drvs.cc
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-07-17 19:02:56 +0200
committerEelco Dolstra <edolstra@gmail.com>2017-07-20 13:33:13 +0200
commit90825dea518ea078f0783a72cc471a5b3716d198 (patch)
treeb6f6fed6e8c7a96a6769344060409f19a56290b9 /src/libexpr/get-drvs.cc
parent3162ad5ff497b92fc25cd3f397eaff01d67340cc (diff)
Add "nix search" command
Diffstat (limited to 'src/libexpr/get-drvs.cc')
-rw-r--r--src/libexpr/get-drvs.cc44
1 files changed, 33 insertions, 11 deletions
diff --git a/src/libexpr/get-drvs.cc b/src/libexpr/get-drvs.cc
index 4200e8fd6..b7e16de7f 100644
--- a/src/libexpr/get-drvs.cc
+++ b/src/libexpr/get-drvs.cc
@@ -9,7 +9,34 @@
namespace nix {
-string DrvInfo::queryDrvPath()
+DrvInfo::DrvInfo(EvalState & state, const string & attrPath, Bindings * attrs)
+ : state(&state), attrs(attrs), attrPath(attrPath)
+{
+}
+
+
+string DrvInfo::queryName() const
+{
+ if (name == "" && attrs) {
+ auto i = attrs->find(state->sName);
+ if (i == attrs->end()) throw TypeError("derivation name missing");
+ name = state->forceStringNoCtx(*i->value);
+ }
+ return name;
+}
+
+
+string DrvInfo::querySystem() const
+{
+ if (system == "" && attrs) {
+ auto i = attrs->find(state->sSystem);
+ system = i == attrs->end() ? "unknown" : state->forceStringNoCtx(*i->value, *i->pos);
+ }
+ return system;
+}
+
+
+string DrvInfo::queryDrvPath() const
{
if (drvPath == "" && attrs) {
Bindings::iterator i = attrs->find(state->sDrvPath);
@@ -20,7 +47,7 @@ string DrvInfo::queryDrvPath()
}
-string DrvInfo::queryOutPath()
+string DrvInfo::queryOutPath() const
{
if (outPath == "" && attrs) {
Bindings::iterator i = attrs->find(state->sOutPath);
@@ -76,7 +103,7 @@ DrvInfo::Outputs DrvInfo::queryOutputs(bool onlyOutputsToInstall)
}
-string DrvInfo::queryOutputName()
+string DrvInfo::queryOutputName() const
{
if (outputName == "" && attrs) {
Bindings::iterator i = attrs->find(state->sOutputName);
@@ -225,17 +252,12 @@ static bool getDerivation(EvalState & state, Value & v,
if (done.find(v.attrs) != done.end()) return false;
done.insert(v.attrs);
- Bindings::iterator i = v.attrs->find(state.sName);
- /* !!! We really would like to have a decent back trace here. */
- if (i == v.attrs->end()) throw TypeError("derivation name missing");
+ DrvInfo drv(state, attrPath, v.attrs);
- Bindings::iterator i2 = v.attrs->find(state.sSystem);
-
- DrvInfo drv(state, state.forceStringNoCtx(*i->value), attrPath,
- i2 == v.attrs->end() ? "unknown" : state.forceStringNoCtx(*i2->value, *i2->pos),
- v.attrs);
+ drv.queryName();
drvs.push_back(drv);
+
return false;
} catch (AssertionError & e) {