about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2019-10-09T13·36+0200
committerEelco Dolstra <edolstra@gmail.com>2019-10-09T14·22+0200
commit1d5cb6ad4839a50a96c27c94f19adcb97b6391af (patch)
tree57f14df2925fddb402875b9806d8a45af672041a
parent22d4ea7a989d26b86fc27706dfea0abd2fb52c52 (diff)
getSourceExpr(): Handle channels
Fixes #1892.
Fixes #1865.
Fixes #3119.

(cherry picked from commit e6e61f0a54dac0174df996e93fcfedcac7769ab4)
-rw-r--r--src/nix/installables.cc31
1 files changed, 16 insertions, 15 deletions
diff --git a/src/nix/installables.cc b/src/nix/installables.cc
index 0c1ad3ab3db0..52f9778fc6d3 100644
--- a/src/nix/installables.cc
+++ b/src/nix/installables.cc
@@ -45,25 +45,26 @@ Value * SourceExprCommand::getSourceExpr(EvalState & state)
 
         std::unordered_set<std::string> seen;
 
-        for (auto & i : searchPath) {
-            if (i.first == "") continue;
-            if (seen.count(i.first)) continue;
-            seen.insert(i.first);
-#if 0
-            auto res = state.resolveSearchPathElem(i);
-            if (!res.first) continue;
-            if (!pathExists(res.second)) continue;
-            mkApp(*state.allocAttr(*vSourceExpr, state.symbols.create(i.first)),
-                state.getBuiltin("import"),
-                mkString(*state.allocValue(), res.second));
-#endif
+        auto addEntry = [&](const std::string & name) {
+            if (name == "") return;
+            if (!seen.insert(name).second) return;
             Value * v1 = state.allocValue();
             mkPrimOpApp(*v1, state.getBuiltin("findFile"), state.getBuiltin("nixPath"));
             Value * v2 = state.allocValue();
-            mkApp(*v2, *v1, mkString(*state.allocValue(), i.first));
-            mkApp(*state.allocAttr(*vSourceExpr, state.symbols.create(i.first)),
+            mkApp(*v2, *v1, mkString(*state.allocValue(), name));
+            mkApp(*state.allocAttr(*vSourceExpr, state.symbols.create(name)),
                 state.getBuiltin("import"), *v2);
-        }
+        };
+
+        for (auto & i : searchPath)
+            /* Hack to handle channels. */
+            if (i.first.empty() && pathExists(i.second + "/manifest.nix")) {
+                for (auto & j : readDirectory(i.second))
+                    if (j.name != "manifest.nix"
+                        && pathExists(fmt("%s/%s/default.nix", i.second, j.name)))
+                        addEntry(j.name);
+            } else
+                addEntry(i.first);
 
         vSourceExpr->attrs->sort();
     }