Add XML output to `nix-store'.
* src/nix-store/Makefile.am (nix_store_SOURCES): Add `xmlgraph.cc' and `xmlgraph.hh'. * src/nix-store/help.txt (Operations): Document `--xml'. * src/nix-store/nix-store.cc (opQuery): Handle `--xml'. * src/nix-store/xmlgraph.cc, src/nix-store/xmlgraph.hh: New files.
This commit is contained in:
		
							parent
							
								
									da52f8bea0
								
							
						
					
					
						commit
						8bcdd36f10
					
				
					 5 changed files with 100 additions and 3 deletions
				
			
		|  | @ -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 @ADDITIONAL_NETWORK_LIBS@ | ||||
| 
 | ||||
|  |  | |||
|  | @ -39,6 +39,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 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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; | ||||
|  | @ -331,6 +333,14 @@ static void opQuery(Strings opFlags, Strings opArgs) | |||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case qXml: { | ||||
|             PathSet roots; | ||||
|             foreach (Strings::iterator, i, opArgs) | ||||
|                 roots.insert(maybeUseOutput(followLinksToStorePath(*i), useOutput, forceRealise)); | ||||
|             printXmlGraph(roots); | ||||
|             break; | ||||
|         } | ||||
| 
 | ||||
|         case qResolve: { | ||||
|             foreach (Strings::iterator, i, opArgs) | ||||
|                 cout << format("%1%\n") % followLinksToStorePath(*i); | ||||
|  |  | |||
							
								
								
									
										71
									
								
								src/nix-store/xmlgraph.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								src/nix-store/xmlgraph.cc
									
										
									
									
									
										Normal file
									
								
							|  | @ -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"; | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										12
									
								
								src/nix-store/xmlgraph.hh
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								src/nix-store/xmlgraph.hh
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,12 @@ | |||
| #ifndef __XMLGRAPH_H | ||||
| #define __XMLGRAPH_H | ||||
| 
 | ||||
| #include "types.hh" | ||||
| 
 | ||||
| namespace nix { | ||||
| 
 | ||||
| void printXmlGraph(const PathSet & roots); | ||||
| 
 | ||||
| } | ||||
| 
 | ||||
| #endif /* !__XMLGRAPH_H */ | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue