diff options
Diffstat (limited to 'third_party/nix/src/nix-store/dotgraph.cc')
-rw-r--r-- | third_party/nix/src/nix-store/dotgraph.cc | 100 |
1 files changed, 41 insertions, 59 deletions
diff --git a/third_party/nix/src/nix-store/dotgraph.cc b/third_party/nix/src/nix-store/dotgraph.cc index abdfa5e58f93..daec3da311d4 100644 --- a/third_party/nix/src/nix-store/dotgraph.cc +++ b/third_party/nix/src/nix-store/dotgraph.cc @@ -1,56 +1,41 @@ #include "dotgraph.hh" -#include "util.hh" -#include "store-api.hh" - #include <iostream> - +#include "store-api.hh" +#include "util.hh" using std::cout; namespace nix { +static string dotQuote(const string& s) { return "\"" + s + "\""; } -static string dotQuote(const string & s) -{ - return "\"" + s + "\""; +static string nextColour() { + static int n = 0; + static string colours[] = {"black", "red", "green", + "blue", "magenta", "burlywood"}; + return colours[n++ % (sizeof(colours) / sizeof(string))]; } - -static string nextColour() -{ - static int n = 0; - static string colours[] = - { "black", "red", "green", "blue" - , "magenta", "burlywood" }; - return colours[n++ % (sizeof(colours) / sizeof(string))]; +static string makeEdge(const string& src, const string& dst) { + format f = format("%1% -> %2% [color = %3%];\n") % dotQuote(src) % + dotQuote(dst) % dotQuote(nextColour()); + return f.str(); } - -static string makeEdge(const string & src, const string & dst) -{ - format f = format("%1% -> %2% [color = %3%];\n") - % dotQuote(src) % dotQuote(dst) % dotQuote(nextColour()); - return f.str(); -} - - -static string makeNode(const string & id, const string & label, - const string & colour) -{ - format f = format("%1% [label = %2%, shape = box, " - "style = filled, fillcolor = %3%];\n") - % dotQuote(id) % dotQuote(label) % dotQuote(colour); - return f.str(); +static string makeNode(const string& id, const string& label, + const string& colour) { + format f = format( + "%1% [label = %2%, shape = box, " + "style = filled, fillcolor = %3%];\n") % + dotQuote(id) % dotQuote(label) % dotQuote(colour); + return f.str(); } - -static string symbolicName(const string & path) -{ - string p = baseNameOf(path); - return string(p, p.find('-') + 1); +static string symbolicName(const string& path) { + string p = baseNameOf(path); + return string(p, p.find('-') + 1); } - #if 0 string pathLabel(const Path & nePath, const string & elemPath) { @@ -92,29 +77,27 @@ void printClosure(const Path & nePath, const StoreExpr & fs) } #endif +void printDotGraph(ref<Store> store, const PathSet& roots) { + PathSet workList(roots); + PathSet doneSet; -void printDotGraph(ref<Store> store, const PathSet & roots) -{ - PathSet workList(roots); - PathSet doneSet; + cout << "digraph G {\n"; - cout << "digraph G {\n"; + while (!workList.empty()) { + Path path = *(workList.begin()); + workList.erase(path); - while (!workList.empty()) { - Path path = *(workList.begin()); - workList.erase(path); + if (doneSet.find(path) != doneSet.end()) continue; + doneSet.insert(path); - if (doneSet.find(path) != doneSet.end()) continue; - doneSet.insert(path); + cout << makeNode(path, symbolicName(path), "#ff0000"); - cout << makeNode(path, symbolicName(path), "#ff0000"); - - for (auto & p : store->queryPathInfo(path)->references) { - if (p != path) { - workList.insert(p); - cout << makeEdge(p, path); - } - } + for (auto& p : store->queryPathInfo(path)->references) { + if (p != path) { + workList.insert(p); + cout << makeEdge(p, path); + } + } #if 0 StoreExpr ne = storeExprFromPath(path); @@ -146,10 +129,9 @@ void printDotGraph(ref<Store> store, const PathSet & roots) cout << makeNode(path, label, colour); #endif - } + } - cout << "}\n"; + cout << "}\n"; } - -} +} // namespace nix |