aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEelco Dolstra <edolstra@gmail.com>2020-05-28 12:15:39 +0200
committerEelco Dolstra <edolstra@gmail.com>2020-05-28 12:15:39 +0200
commitc3eff22f46cc05ddae4f648413ab115edb817ef9 (patch)
treef58144f9f5949a8477a31fb53eeba201fa9c1c61 /src
parent6286272371434dc597da793417787ecd3cb14cc9 (diff)
parent934cc802f3c0c894ef7ef3924bbf24f46eb82c96 (diff)
Merge branch 'store-visited' of https://github.com/mkenigs/nix into flakes
Diffstat (limited to 'src')
-rw-r--r--src/nix/flake.cc12
1 files changed, 9 insertions, 3 deletions
diff --git a/src/nix/flake.cc b/src/nix/flake.cc
index d255bdda5..59bb40110 100644
--- a/src/nix/flake.cc
+++ b/src/nix/flake.cc
@@ -158,20 +158,26 @@ struct CmdFlakeListInputs : FlakeCommand, MixJSON
else {
logger->stdout("%s", flake.flake.lockedRef);
+ std::unordered_set<std::shared_ptr<Node>> visited;
+
std::function<void(const Node & node, const std::string & prefix)> recurse;
recurse = [&](const Node & node, const std::string & prefix)
{
for (const auto & [i, input] : enumerate(node.inputs)) {
- //auto tree2 = tree.child(i + 1 == inputs.inputs.size());
+ bool firstVisit = visited.insert(input.second).second;
bool last = i + 1 == node.inputs.size();
+ auto lockedNode = std::dynamic_pointer_cast<const LockedNode>(input.second);
+
logger->stdout("%s" ANSI_BOLD "%s" ANSI_NORMAL ": %s",
prefix + (last ? treeLast : treeConn), input.first,
- std::dynamic_pointer_cast<const LockedNode>(input.second)->lockedRef);
- recurse(*input.second, prefix + (last ? treeNull : treeLine));
+ lockedNode ? lockedNode->lockedRef : flake.flake.lockedRef);
+
+ if (firstVisit) recurse(*input.second, prefix + (last ? treeNull : treeLine));
}
};
+ visited.insert(flake.lockFile.root);
recurse(*flake.lockFile.root, "");
}
}