about summary refs log tree commit diff
path: root/src/libexpr
diff options
context:
space:
mode:
authorEelco Dolstra <eelco.dolstra@logicblox.com>2012-07-26T19·14-0400
committerEelco Dolstra <eelco.dolstra@logicblox.com>2012-07-26T19·14-0400
commit8c7910083976e255300efa797030448f5a1cb864 (patch)
treeafbd7a37d0724feb408a2d025364ed3938b5673a /src/libexpr
parentaa115e22df1c80e8878237a9e704d7d70783a243 (diff)
parent3a4623afbbc1bff85bde33167d36e8c5a4a3df0d (diff)
Merge branch 'master' into no-manifests
Diffstat (limited to 'src/libexpr')
-rw-r--r--src/libexpr/attr-path.hh9
-rw-r--r--src/libexpr/common-opts.hh7
-rw-r--r--src/libexpr/eval-inline.hh7
-rw-r--r--src/libexpr/eval.hh6
-rw-r--r--src/libexpr/get-drvs.hh6
-rw-r--r--src/libexpr/names.hh11
-rw-r--r--src/libexpr/nixexpr.hh6
-rw-r--r--src/libexpr/primops.cc26
-rw-r--r--src/libexpr/symbol-table.hh5
-rw-r--r--src/libexpr/value-to-xml.hh5
-rw-r--r--src/libexpr/value.hh5
11 files changed, 35 insertions, 58 deletions
diff --git a/src/libexpr/attr-path.hh b/src/libexpr/attr-path.hh
index b106da5ef8..d3aad74611 100644
--- a/src/libexpr/attr-path.hh
+++ b/src/libexpr/attr-path.hh
@@ -1,20 +1,13 @@
-#ifndef __ATTR_PATH_H
-#define __ATTR_PATH_H
+#pragma once
 
 #include "eval.hh"
 
 #include <string>
 #include <map>
 
-
 namespace nix {
 
-    
 void findAlongAttrPath(EvalState & state, const string & attrPath,
     Bindings & autoArgs, Expr * e, Value & v);
 
-    
 }
-
-
-#endif /* !__ATTR_PATH_H */
diff --git a/src/libexpr/common-opts.hh b/src/libexpr/common-opts.hh
index c28641e901..e2e3fe7717 100644
--- a/src/libexpr/common-opts.hh
+++ b/src/libexpr/common-opts.hh
@@ -1,9 +1,7 @@
-#ifndef __COMMON_OPTS_H
-#define __COMMON_OPTS_H
+#pragma once
 
 #include "eval.hh"
 
-
 namespace nix {
 
 /* Some common option parsing between nix-env and nix-instantiate. */
@@ -17,6 +15,3 @@ bool parseSearchPathArg(const string & arg, Strings::iterator & i,
 Path lookupFileArg(EvalState & state, string s);
 
 }
-
-
-#endif /* !__COMMON_OPTS_H */
diff --git a/src/libexpr/eval-inline.hh b/src/libexpr/eval-inline.hh
index 6026a7d110..57a9e4c63c 100644
--- a/src/libexpr/eval-inline.hh
+++ b/src/libexpr/eval-inline.hh
@@ -1,5 +1,4 @@
-#ifndef __EVAL_INLINE_H
-#define __EVAL_INLINE_H
+#pragma once
 
 #include "eval.hh"
 
@@ -8,7 +7,6 @@
 
 namespace nix {
 
-
 LocalNoInlineNoReturn(void throwEvalError(const char * s))
 {
     throw EvalError(s);
@@ -55,7 +53,4 @@ inline void EvalState::forceList(Value & v)
         throwTypeError("value is %1% while a list was expected", showType(v));
 }
 
-
 }
-
-#endif /* !__EVAL_INLINE_H */
diff --git a/src/libexpr/eval.hh b/src/libexpr/eval.hh
index bab9303b08..5103ae8cef 100644
--- a/src/libexpr/eval.hh
+++ b/src/libexpr/eval.hh
@@ -1,5 +1,4 @@
-#ifndef __EVAL_H
-#define __EVAL_H
+#pragma once
 
 #include "value.hh"
 #include "nixexpr.hh"
@@ -256,6 +255,3 @@ string showType(const Value & v);
 
 
 }
-
-
-#endif /* !__EVAL_H */
diff --git a/src/libexpr/get-drvs.hh b/src/libexpr/get-drvs.hh
index 1e5d0a817c..25d8baa559 100644
--- a/src/libexpr/get-drvs.hh
+++ b/src/libexpr/get-drvs.hh
@@ -1,5 +1,4 @@
-#ifndef __GET_DRVS_H
-#define __GET_DRVS_H
+#pragma once
 
 #include "eval.hh"
 
@@ -83,6 +82,3 @@ void getDerivations(EvalState & state, Value & v, const string & pathPrefix,
 
  
 }
-
-
-#endif /* !__GET_DRVS_H */
diff --git a/src/libexpr/names.hh b/src/libexpr/names.hh
index e189302d6d..ebe113e82a 100644
--- a/src/libexpr/names.hh
+++ b/src/libexpr/names.hh
@@ -1,12 +1,9 @@
-#ifndef __NAMES_H
-#define __NAMES_H
+#pragma once
 
 #include "types.hh"
 
-
 namespace nix {
 
-
 struct DrvName
 {
     string fullName;
@@ -19,15 +16,9 @@ struct DrvName
     bool matches(DrvName & n);
 };
 
-
 typedef list<DrvName> DrvNames;
 
-
 int compareVersions(const string & v1, const string & v2);
 DrvNames drvNamesFromArgs(const Strings & opArgs);
 
-
 }
-
-
-#endif /* !__NAMES_H */
diff --git a/src/libexpr/nixexpr.hh b/src/libexpr/nixexpr.hh
index 6eb771a726..4c1a0bb2d5 100644
--- a/src/libexpr/nixexpr.hh
+++ b/src/libexpr/nixexpr.hh
@@ -1,5 +1,4 @@
-#ifndef __NIXEXPR_H
-#define __NIXEXPR_H
+#pragma once
 
 #include "value.hh"
 #include "symbol-table.hh"
@@ -290,6 +289,3 @@ struct StaticEnv
 
 
 }
-
-
-#endif /* !__NIXEXPR_H */
diff --git a/src/libexpr/primops.cc b/src/libexpr/primops.cc
index f20c2f2879..5c011c43e3 100644
--- a/src/libexpr/primops.cc
+++ b/src/libexpr/primops.cc
@@ -65,7 +65,31 @@ static void prim_import(EvalState & state, Value * * args, Value & v)
             }
     }
 
-    state.evalFile(path, v);
+    if (isStorePath(path) && store->isValidPath(path) && isDerivation(path)) {
+        Derivation drv = parseDerivation(readFile(path));
+        Value & w = *state.allocValue();
+        state.mkAttrs(w, 1 + drv.outputs.size());
+        mkString(*state.allocAttr(w, state.sDrvPath), path, singleton<PathSet>("=" + path));
+        state.mkList(*state.allocAttr(w, state.symbols.create("outputs")), drv.outputs.size());
+        unsigned int outputs_index = 0;
+
+        Value * outputsVal = w.attrs->find(state.symbols.create("outputs"))->value;
+        foreach (DerivationOutputs::iterator, i, drv.outputs) {
+            mkString(*state.allocAttr(w, state.symbols.create(i->first)),
+                i->second.path, singleton<PathSet>("!" + i->first + "!" + path));
+            mkString(*(outputsVal->list.elems[outputs_index++] = state.allocValue()),
+                i->first);
+        }
+        w.attrs->sort();
+        Value fun;
+        state.mkThunk_(fun,
+            state.parseExprFromFile(state.findFile("nix/imported-drv-to-derivation.nix")));
+        state.forceFunction(fun);
+        mkApp(v, fun, w);
+        state.forceAttrs(v);
+    } else {
+        state.evalFile(path, v);
+    }
 }
 
 
diff --git a/src/libexpr/symbol-table.hh b/src/libexpr/symbol-table.hh
index 976117a20a..143fc495b0 100644
--- a/src/libexpr/symbol-table.hh
+++ b/src/libexpr/symbol-table.hh
@@ -1,5 +1,4 @@
-#ifndef __SYMBOL_TABLE_H
-#define __SYMBOL_TABLE_H
+#pragma once
 
 #include "config.h"
 
@@ -88,5 +87,3 @@ public:
 };
 
 }
-
-#endif /* !__SYMBOL_TABLE_H */
diff --git a/src/libexpr/value-to-xml.hh b/src/libexpr/value-to-xml.hh
index 3ebc989ffa..97657327ed 100644
--- a/src/libexpr/value-to-xml.hh
+++ b/src/libexpr/value-to-xml.hh
@@ -1,5 +1,4 @@
-#ifndef __VALUE_TO_XML_H
-#define __VALUE_TO_XML_H
+#pragma once
 
 #include "nixexpr.hh"
 #include "eval.hh"
@@ -13,5 +12,3 @@ void printValueAsXML(EvalState & state, bool strict, bool location,
     Value & v, std::ostream & out, PathSet & context);
     
 }
-
-#endif /* !__VALUE_TO_XML_H */
diff --git a/src/libexpr/value.hh b/src/libexpr/value.hh
index 41512d40b1..c9ec236c47 100644
--- a/src/libexpr/value.hh
+++ b/src/libexpr/value.hh
@@ -1,5 +1,4 @@
-#ifndef __VALUE_H
-#define __VALUE_H
+#pragma once
 
 #include "symbol-table.hh"
 
@@ -151,5 +150,3 @@ void mkPath(Value & v, const char * s);
 
 
 }
-
-#endif /* !__VALUE_H */