From 8d67794da1b1307c3d117058f85649b05fe7c554 Mon Sep 17 00:00:00 2001 From: Matthew Kenigsberg Date: Thu, 21 May 2020 16:58:02 -0600 Subject: [PATCH] handle circular flake dependencies in list-inputs --- src/nix/flake.cc | 12 +++++++++--- 1 file 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> visited; + std::function 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(input.second); + logger->stdout("%s" ANSI_BOLD "%s" ANSI_NORMAL ": %s", prefix + (last ? treeLast : treeConn), input.first, - std::dynamic_pointer_cast(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, ""); } }