#include "graphml.hh" #include "util.hh" #include "store-api.hh" #include "derivations.hh" #include using std::cout; namespace nix { static inline std::string_view xmlQuote(std::string_view s) { // Luckily, store paths shouldn't contain any character that needs to be // quoted. return s; } static string symbolicName(const std::string & p) { return string(p, p.find('-') + 1); } static string makeEdge(std::string_view src, std::string_view dst) { return fmt(" \n", xmlQuote(src), xmlQuote(dst)); } static string makeNode(const ValidPathInfo & info) { return fmt( " \n" " %2%\n" " %3%\n" " %4%\n" " \n", info.path.to_string(), info.narSize, symbolicName(std::string(info.path.name())), (info.path.isDerivation() ? "derivation" : "output-path")); } void printGraphML(ref store, StorePathSet && roots) { StorePathSet workList(std::move(roots)); StorePathSet doneSet; std::pair ret; cout << "\n" << "\n" << "" << "" << "" << "\n"; while (!workList.empty()) { auto path = std::move(workList.extract(workList.begin()).value()); ret = doneSet.insert(path); if (ret.second == false) continue; auto info = store->queryPathInfo(path); cout << makeNode(*info); for (auto & p : info->referencesPossiblyToSelf()) { if (p != path) { workList.insert(p); cout << makeEdge(path.to_string(), p.to_string()); } } } cout << "\n"; cout << "\n"; } }