X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Fccanlint.c;h=5b45f4d2f2b2ca7294f7e2859d76cd7409e63b19;hp=58ca1f537d7d0d3f5d75058b534edac722016d3c;hb=f9423c171395571f9880286190d9cf63da147668;hpb=dde924399b8e16de3e2426af8a44b4fde95c5f48 diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index 58ca1f53..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, @@ -497,7 +537,7 @@ int main(int argc, char *argv[]) test = find_test(target); if (!test) - err(1, "Unknown test to run '%s'", target); + errx(1, "Unknown test to run '%s'", target); skip_unrelated_tests(test); }