about summary refs log blame commit diff
path: root/src/nix-store/xmlgraph.cc
blob: b6e1c1c4b873abc5afeccdaefbd5eb99b9a2d108 (plain) (tree)


































                                                                            
                                                           




                                                      
                      

                               

                                        
 

                                                          
 
                               
 
                           
                                                 
 







                                                      







                       
#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(ref<Store> store, 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";
}


}