Make nix why-depends quieter by default

Unless `--precise` is passed, make `nix why-depends` only show the
dependencies between the store paths, without introspecting them to
find the actual references.

This also makes it ~3x faster
This commit is contained in:
regnat 2022-01-19 14:15:45 +01:00
parent 2ad2678c0b
commit dd7c2e0695
4 changed files with 34 additions and 11 deletions

View file

@ -31,6 +31,7 @@ struct CmdWhyDepends : SourceExprCommand
{ {
std::string _package, _dependency; std::string _package, _dependency;
bool all = false; bool all = false;
bool precise = false;
CmdWhyDepends() CmdWhyDepends()
{ {
@ -56,6 +57,12 @@ struct CmdWhyDepends : SourceExprCommand
.description = "Show all edges in the dependency graph leading from *package* to *dependency*, rather than just a shortest path.", .description = "Show all edges in the dependency graph leading from *package* to *dependency*, rather than just a shortest path.",
.handler = {&all, true}, .handler = {&all, true},
}); });
addFlag({
.longName = "precise",
.description = "For each edge of the graph, inspect the parent node to display the exact location in the path that causes the dependency",
.handler = {&precise, true},
});
} }
std::string description() override std::string description() override
@ -158,11 +165,19 @@ struct CmdWhyDepends : SourceExprCommand
auto pathS = store->printStorePath(node.path); auto pathS = store->printStorePath(node.path);
assert(node.dist != inf); assert(node.dist != inf);
if (precise) {
logger->cout("%s%s%s%s" ANSI_NORMAL, logger->cout("%s%s%s%s" ANSI_NORMAL,
firstPad, firstPad,
node.visited ? "\e[38;5;244m" : "", node.visited ? "\e[38;5;244m" : "",
firstPad != "" ? "" : "", firstPad != "" ? "" : "",
pathS); pathS);
} else {
logger->cout("%s%s%s%s" ANSI_NORMAL,
firstPad,
node.visited ? "\e[38;5;244m" : "",
firstPad != "" ? treeLast : "",
pathS);
}
if (node.path == dependencyPath && !all if (node.path == dependencyPath && !all
&& packagePath != dependencyPath) && packagePath != dependencyPath)
@ -237,7 +252,7 @@ struct CmdWhyDepends : SourceExprCommand
// FIXME: should use scanForReferences(). // FIXME: should use scanForReferences().
visitPath(pathS); if (precise) visitPath(pathS);
for (auto & ref : refs) { for (auto & ref : refs) {
std::string hash(ref.second->path.hashPart()); std::string hash(ref.second->path.hashPart());

View file

@ -4,7 +4,7 @@
mkdir $out mkdir $out
echo $(cat $input1/foo)$(cat $input2/bar) > $out/foobar echo $(cat $input1/foo)$(cat $input2/bar) > $out/foobar
ln -s $input2 $out/input-2 ln -s $input2 $out/reference-to-input-2
# Self-reference. # Self-reference.
ln -s $out $out/self ln -s $out $out/self

View file

@ -18,7 +18,7 @@ if nix-store --gc --print-dead | grep -E $outPath$; then false; fi
nix-store --gc --print-dead nix-store --gc --print-dead
inUse=$(readLink $outPath/input-2) inUse=$(readLink $outPath/reference-to-input-2)
if nix-store --delete $inUse; then false; fi if nix-store --delete $inUse; then false; fi
test -e $inUse test -e $inUse
@ -35,7 +35,7 @@ nix-collect-garbage
# Check that the root and its dependencies haven't been deleted. # Check that the root and its dependencies haven't been deleted.
cat $outPath/foobar cat $outPath/foobar
cat $outPath/input-2/bar cat $outPath/reference-to-input-2/bar
# Check that the derivation has been GC'd. # Check that the derivation has been GC'd.
if test -e $drvPath; then false; fi if test -e $drvPath; then false; fi

View file

@ -9,5 +9,13 @@ cd $TEST_HOME
nix-build ./dependencies.nix -A input0_drv -o dep nix-build ./dependencies.nix -A input0_drv -o dep
nix-build ./dependencies.nix -o toplevel nix-build ./dependencies.nix -o toplevel
nix why-depends ./toplevel ./dep | FAST_WHY_DEPENDS_OUTPUT=$(nix why-depends ./toplevel ./dep)
grep input-2 PRECISE_WHY_DEPENDS_OUTPUT=$(nix why-depends ./toplevel ./dep --precise)
# Both outputs should show that `input-2` is in the dependency chain
echo "$FAST_WHY_DEPENDS_OUTPUT" | grep -q input-2
echo "$PRECISE_WHY_DEPENDS_OUTPUT" | grep -q input-2
# But only the “precise” one should refere to `reference-to-input-2`
echo "$FAST_WHY_DEPENDS_OUTPUT" | (! grep -q reference-to-input-2)
echo "$PRECISE_WHY_DEPENDS_OUTPUT" | grep -q reference-to-input-2