# Old manifest: 5134799f28107a33f996867629a4093772269987 # New manifest: 0c15dacd98a3ec6db72521ea16b6429e8865686c # Summary of changes: # # patch commands.cc # from 84d12bff7762559e470c80a69ff8bafde993bad1 # to 66d1839d897885e1a713c2602eddb0ffb5289c45 # --- commands.cc +++ commands.cc @@ -2505,7 +2505,118 @@ guard.commit(); } +CMD(agraphviz, "debug", "", "dump ancestry graph to stdout, in graphviz format") +{ + transaction_guard guard(app.db); + set nodes; + multimap branches; + vector< pair > edges; + + vector< manifest > certs; + app.db.get_manifest_certs(ancestor_cert_name, certs); + + for(vector< manifest >::iterator i = certs.begin(); + i != certs.end(); ++i) + { + cert_value tv; + decode_base64(i->inner().value, tv); + nodes.insert(tv()); + nodes.insert(i->inner().ident()); + edges.push_back(make_pair(tv(), i->inner().ident())); + } + + app.db.get_manifest_certs(branch_cert_name, certs); + for(vector< manifest >::iterator i = certs.begin(); + i != certs.end(); ++i) + { + cert_value tv; + decode_base64(i->inner().value, tv); + nodes.insert(i->inner().ident()); // in case no edges were connected + branches.insert(make_pair(i->inner().ident(), tv())); + } + + app.db.get_manifest_certs(author_cert_name, certs); + for(vector< manifest >::iterator i = certs.begin(); + i != certs.end(); ++i) + { + cert_value tv; + decode_base64(i->inner().value, tv); + branches.insert(make_pair(i->inner().ident(), tv())); + } + + app.db.get_manifest_certs(date_cert_name, certs); + for(vector< manifest >::iterator i = certs.begin(); + i != certs.end(); ++i) + { + cert_value tv; + decode_base64(i->inner().value, tv); + branches.insert(make_pair(i->inner().ident(), tv())); + } + + app.db.get_manifest_certs(changelog_cert_name, certs); + for(vector< manifest >::iterator i = certs.begin(); + i != certs.end(); ++i) + { + cert_value tv; + decode_base64(i->inner().value, tv); + string changelog = tv(); + string abbrevlog = ""; + int linecount = 0; + char lastchar = "\n"; + for (size_t n = 0; n < changelog.size(); n++) { + switch (changelog[n]) { + case '\n': + if (linecount > 2) { + abbrevlog += "\\n..."; + goto donerewrite; + } + if (lastchar == '\n') { + continue; + } + abbrevlog += "\\n"; + linecount ++; + break; + case '"': + abbrevlog += "\\\""; + break; + default: + abbrevlog += changelog[n]; + } + lastchar = changelog[n]; + } +donerewrite: + + + branches.insert(make_pair(i->inner().ident(), abbrevlog)); + } + + cout << "digraph \"monotone graph\" {" << endl; + + for (set::iterator i = nodes.begin(); i != nodes.end(); + ++i) + { + cout << "\"" << *i << "\" [ label = \"" << *i; + pair::const_iterator, + multimap::const_iterator> pair = + branches.equal_range(*i); + for (multimap::const_iterator j = pair.first; + j != pair.second; ++j) + { + cout << "\\n" << j->second; + } + cout << "\" ];" << endl; + } + for (vector< pair >::iterator i = edges.begin(); i != edges.end(); + ++i) + { + cout << "\"" << i->first << "\" -> \"" << i->second << "\";" << endl; + } + cout << "}" << endl << endl; // close graph + guard.commit(); +} + + CMD(rcs_import, "rcs", "RCSFILE...", "import all versions in RCS files") { if (args.size() < 1)