From: Joey Adams Date: Thu, 6 Jan 2011 20:35:51 +0000 (-0500) Subject: ccanlint: added --test-dep-graph option X-Git-Url: https://git.ozlabs.org/?p=ccan;a=commitdiff_plain;h=0ea24c2371174de37c61fe9af37201f21a67f50e;hp=5f4051eaef69310d43dfdc66bb60a5979638d74c ccanlint: added --test-dep-graph option This option prints the dependency graph of ccanlint's tests in Graphviz .dot format. Sample usage: ccanlint --test-dep-graph | dot -Tpng > out.png && eog out.png --- diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index ee34dd71..5b45f4d2 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -344,6 +344,44 @@ static char *list_tests(void *arg) exit(0); } +static void test_dgraph_vertices(struct list_head *tests, const char *style) +{ + const struct ccanlint *i; + + list_for_each(tests, i, list) { + /* + * todo: escape labels in case ccanlint test keys have + * characters interpreted as GraphViz syntax. + */ + printf("\t\"%p\" [label=\"%s\"%s]\n", i, i->key, style); + } +} + +static void test_dgraph_edges(struct list_head *tests) +{ + const struct ccanlint *i; + const struct dependent *d; + + list_for_each(tests, i, list) + list_for_each(&i->dependencies, d, node) + printf("\t\"%p\" -> \"%p\"\n", d->dependent, i); +} + +static char *test_dependency_graph(void *arg) +{ + puts("digraph G {"); + + test_dgraph_vertices(&compulsory_tests, ", style=filled, fillcolor=yellow"); + test_dgraph_vertices(&normal_tests, ""); + + test_dgraph_edges(&compulsory_tests); + test_dgraph_edges(&normal_tests); + + puts("}"); + + exit(0); +} + /* Remove empty lines. */ static char **collapse(char **lines, unsigned int *nump) { @@ -451,6 +489,8 @@ int main(int argc, char *argv[]) "do not compile anything"); opt_register_noarg("-l|--list-tests", list_tests, NULL, "list tests ccanlint performs (and exit)"); + opt_register_noarg("--test-dep-graph", test_dependency_graph, NULL, + "print dependency graph of tests in Graphviz .dot format"); opt_register_arg("-k|--keep ", keep_test, NULL, NULL, "keep results of (can be used multiple times)"); opt_register_noarg("--summary|-s", opt_set_bool, &summary,