about summary refs log tree commit diff
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2017-09-14T09·17+0200
committerEelco Dolstra <edolstra@gmail.com>2017-09-14T09·17+0200
commit1c58ad2ffa698d17b7be56eab69a40ace64d0e21 (patch)
treecb2213c04416de639d86600d357d2c6b9fb9d6fc
parent359ede1d729964862d823d54e416d36291a02d79 (diff)
nix why-depends: Fix showing self-references
-rw-r--r--src/nix/why-depends.cc24
1 files changed, 16 insertions, 8 deletions
diff --git a/src/nix/why-depends.cc b/src/nix/why-depends.cc
index a6750ac95cac..f31469cbc96c 100644
--- a/src/nix/why-depends.cc
+++ b/src/nix/why-depends.cc
@@ -1,6 +1,4 @@
 #include "command.hh"
-#include "common-args.hh"
-#include "shared.hh"
 #include "store-api.hh"
 #include "progress-bar.hh"
 #include "fs-accessor.hh"
@@ -59,9 +57,17 @@ struct CmdWhyDepends : SourceExprCommand
     {
         return {
             Example{
-                "To show which files in Hello's closure depend on Glibc:",
+                "To show one path through the dependency graph leading from Hello to Glibc:",
                 "nix why-depends nixpkgs.hello nixpkgs.glibc"
             },
+            Example{
+                "To show all files and paths in the dependency graph leading from Thunderbird to libX11:",
+                "nix why-depends --all nixpkgs.thunderbird nixpkgs.xorg.libX11"
+            },
+            Example{
+                "To show why Glibc depends on itself:",
+                "nix why-depends nixpkgs.glibc nixpkgs.glibc"
+            },
         };
     }
 
@@ -141,9 +147,9 @@ struct CmdWhyDepends : SourceExprCommand
            and `dependency`. */
         std::function<void(Node &, const string &, const string &)> printNode;
 
-        const string treeConn = "├───";
-        const string treeLast = "└───";
-        const string treeLine = "│   ";
+        const string treeConn = "╠═══";
+        const string treeLast = "╚═══";
+        const string treeLine = "║   ";
         const string treeNull = "    ";
 
         struct BailOut { };
@@ -156,7 +162,9 @@ struct CmdWhyDepends : SourceExprCommand
                 firstPad != "" ? "=> " : "",
                 node.path);
 
-            if (node.path == dependencyPath && !all) throw BailOut();
+            if (node.path == dependencyPath && !all
+                && packagePath != dependencyPath)
+                throw BailOut();
 
             if (node.visited) return;
             node.visited = true;
@@ -167,7 +175,7 @@ struct CmdWhyDepends : SourceExprCommand
             std::set<std::string> hashes;
 
             for (auto & ref : node.refs) {
-                if (ref == node.path) continue;
+                if (ref == node.path && packagePath != dependencyPath) continue;
                 auto & node2 = graph.at(ref);
                 if (node2.dist == inf) continue;
                 refs.emplace(node2.dist, &node2);