about summary refs log tree commit diff
path: root/src/nix-env/nix-env.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/nix-env/nix-env.cc')
-rw-r--r--src/nix-env/nix-env.cc17
1 files changed, 14 insertions, 3 deletions
diff --git a/src/nix-env/nix-env.cc b/src/nix-env/nix-env.cc
index 6cbd06f8d27f..4cc5484cc452 100644
--- a/src/nix-env/nix-env.cc
+++ b/src/nix-env/nix-env.cc
@@ -115,18 +115,29 @@ static void getAllExprs(EvalState & state,
     const Path & path, ATermMap & attrs)
 {
     Strings names = readDirectory(path);
+    StringSet namesSorted(names.begin(), names.end());
 
-    for (Strings::iterator i = names.begin(); i != names.end(); ++i) {
+    foreach (StringSet::iterator, i, namesSorted) {
         Path path2 = path + "/" + *i;
         
         struct stat st;
         if (stat(path2.c_str(), &st) == -1)
             continue; // ignore dangling symlinks in ~/.nix-defexpr
         
-        if (isNixExpr(path2))
-            attrs.set(toATerm(*i), makeAttrRHS(
+        if (isNixExpr(path2)) {
+            /* Strip off the `.nix' filename suffix (if applicable),
+               otherwise the attribute cannot be selected with the
+               `-A' option.  Useful if you want to stick a Nix
+               expression directly in ~/.nix-defexpr. */
+            string attrName = *i;
+            if (hasSuffix(attrName, ".nix"))
+                attrName = string(attrName, 0, attrName.size() - 4);
+            attrs.set(toATerm(attrName), makeAttrRHS(
                     parseExprFromFile(state, absPath(path2)), makeNoPos()));
+        }
         else
+            /* `path2' is a directory (with no default.nix in it);
+               recurse into it. */
             getAllExprs(state, path2, attrs);
     }
 }