diff options
author | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-06-21 07:55:38 +0000 |
---|---|---|
committer | Eelco Dolstra <e.dolstra@tudelft.nl> | 2010-06-21 07:55:38 +0000 |
commit | bf87cc44b4484df74388b526c89884fea166ab7f (patch) | |
tree | 18a9a0e77d2e2a027eac094b3cdb43d6dd988cf4 /src/nix-store | |
parent | d1f6c0cbe39b509545f809f08cbd580859f38e34 (diff) | |
parent | b57189174f6e11c3e9e0f7c65c08a72f689fe194 (diff) | |
download | guix-bf87cc44b4484df74388b526c89884fea166ab7f.tar.gz |
* Sync with the trunk.
Diffstat (limited to 'src/nix-store')
-rw-r--r-- | src/nix-store/Makefile.am | 5 | ||||
-rw-r--r-- | src/nix-store/dotgraph.cc | 2 | ||||
-rw-r--r-- | src/nix-store/help.txt | 1 | ||||
-rw-r--r-- | src/nix-store/nix-store.cc | 14 | ||||
-rw-r--r-- | src/nix-store/xmlgraph.cc | 71 | ||||
-rw-r--r-- | src/nix-store/xmlgraph.hh | 12 |
6 files changed, 101 insertions, 4 deletions
diff --git a/src/nix-store/Makefile.am b/src/nix-store/Makefile.am index e0ba809dcb..44ff54674a 100644 --- a/src/nix-store/Makefile.am +++ b/src/nix-store/Makefile.am @@ -1,6 +1,9 @@ bin_PROGRAMS = nix-store -nix_store_SOURCES = nix-store.cc dotgraph.cc dotgraph.hh help.txt +nix_store_SOURCES = \ + nix-store.cc dotgraph.cc dotgraph.hh help.txt \ + xmlgraph.cc xmlgraph.hh + nix_store_LDADD = ../libmain/libmain.la ../libstore/libstore.la ../libutil/libutil.la \ ../boost/format/libformat.la diff --git a/src/nix-store/dotgraph.cc b/src/nix-store/dotgraph.cc index 83df9e9cd0..72146eb68e 100644 --- a/src/nix-store/dotgraph.cc +++ b/src/nix-store/dotgraph.cc @@ -52,13 +52,13 @@ static string symbolicName(const string & path) } +#if 0 string pathLabel(const Path & nePath, const string & elemPath) { return (string) nePath + "-" + elemPath; } -#if 0 void printClosure(const Path & nePath, const StoreExpr & fs) { PathSet workList(fs.closure.roots); diff --git a/src/nix-store/help.txt b/src/nix-store/help.txt index 8022bf7c71..342281b338 100644 --- a/src/nix-store/help.txt +++ b/src/nix-store/help.txt @@ -42,6 +42,7 @@ Query flags: --referrers-closure: print all paths (in)directly refering to the path --tree: print a tree showing the dependency graph of the path --graph: print a dot graph rooted at given path + --xml: emit an XML representation of the graph rooted at the given path --hash: print the SHA-256 hash of the contents of the path --roots: print the garbage collector roots that point to the path diff --git a/src/nix-store/nix-store.cc b/src/nix-store/nix-store.cc index 3b34b9dae6..b6ece30ce0 100644 --- a/src/nix-store/nix-store.cc +++ b/src/nix-store/nix-store.cc @@ -6,6 +6,7 @@ #include "archive.hh" #include "shared.hh" #include "dotgraph.hh" +#include "xmlgraph.hh" #include "local-store.hh" #include "util.hh" #include "help.txt.hh" @@ -226,7 +227,7 @@ static void opQuery(Strings opFlags, Strings opArgs) { enum { qOutputs, qRequisites, qReferences, qReferrers , qReferrersClosure, qDeriver, qBinding, qHash - , qTree, qGraph, qResolve, qRoots } query = qOutputs; + , qTree, qGraph, qXml, qResolve, qRoots } query = qOutputs; bool useOutput = false; bool includeOutputs = false; bool forceRealise = false; @@ -249,6 +250,7 @@ static void opQuery(Strings opFlags, Strings opArgs) else if (*i == "--hash") query = qHash; else if (*i == "--tree") query = qTree; else if (*i == "--graph") query = qGraph; + else if (*i == "--xml") query = qXml; else if (*i == "--resolve") query = qResolve; else if (*i == "--roots") query = qRoots; else if (*i == "--use-output" || *i == "-u") useOutput = true; @@ -327,7 +329,15 @@ static void opQuery(Strings opFlags, Strings opArgs) PathSet roots; foreach (Strings::iterator, i, opArgs) roots.insert(maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise)); - printDotGraph(roots); + printDotGraph(roots); + break; + } + + case qXml: { + PathSet roots; + foreach (Strings::iterator, i, opArgs) + roots.insert(maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise)); + printXmlGraph(roots); break; } diff --git a/src/nix-store/xmlgraph.cc b/src/nix-store/xmlgraph.cc new file mode 100644 index 0000000000..1b3ad3d28a --- /dev/null +++ b/src/nix-store/xmlgraph.cc @@ -0,0 +1,71 @@ +#include "xmlgraph.hh" +#include "util.hh" +#include "store-api.hh" + +#include <iostream> + + +using std::cout; + +namespace nix { + + +static inline const string & xmlQuote(const string & s) +{ + // Luckily, store paths shouldn't contain any character that needs to be + // quoted. + return s; +} + + +static string makeEdge(const string & src, const string & dst) +{ + format f = format(" <edge src=\"%1%\" dst=\"%2%\"/>\n") + % xmlQuote(src) % xmlQuote(dst); + return f.str(); +} + + +static string makeNode(const string & id) +{ + format f = format(" <node name=\"%1%\"/>\n") % xmlQuote(id); + return f.str(); +} + + +void printXmlGraph(const PathSet & roots) +{ + PathSet workList(roots); + PathSet doneSet; + + cout << "<?xml version='1.0' encoding='utf-8'?>\n" + << "<nix>\n"; + + while (!workList.empty()) { + Path path = *(workList.begin()); + workList.erase(path); + + if (doneSet.find(path) != doneSet.end()) continue; + doneSet.insert(path); + + cout << makeNode(path); + + PathSet references; + store->queryReferences(path, references); + + for (PathSet::iterator i = references.begin(); + i != references.end(); ++i) + { + if (*i != path) { + workList.insert(*i); + cout << makeEdge(*i, path); + } + } + + } + + cout << "</nix>\n"; +} + + +} diff --git a/src/nix-store/xmlgraph.hh b/src/nix-store/xmlgraph.hh new file mode 100644 index 0000000000..2f9908c436 --- /dev/null +++ b/src/nix-store/xmlgraph.hh @@ -0,0 +1,12 @@ +#ifndef __XMLGRAPH_H +#define __XMLGRAPH_H + +#include "types.hh" + +namespace nix { + +void printXmlGraph(const PathSet & roots); + +} + +#endif /* !__XMLGRAPH_H */ |