From 078a975a68b7b9fe3d2ce45afdf7b6df1135557b Mon Sep 17 00:00:00 2001 From: Rusty Russell Date: Thu, 4 Nov 2010 20:44:00 +1030 Subject: [PATCH] ccanlint: add --target Much easier to run just a single test across the tree. --- tools/ccanlint/ccanlint.c | 57 ++++++++++++++++++++++++++++++++++----- tools/ccanlint/ccanlint.h | 2 +- 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/tools/ccanlint/ccanlint.c b/tools/ccanlint/ccanlint.c index 01a94758..f2c79795 100644 --- a/tools/ccanlint/ccanlint.c +++ b/tools/ccanlint/ccanlint.c @@ -30,6 +30,7 @@ #include #include #include +#include int verbose = 0; static LIST_HEAD(compulsory_tests); @@ -74,12 +75,12 @@ static const char *should_skip(struct manifest *m, struct ccanlint *i) if (btree_lookup(info_exclude, i->key)) return "excluded in _info file"; + if (i->skip) + return i->skip; + if (i->skip_fail) return "dependency failed"; - if (i->skip) - return "dependency was skipped"; - if (i->can_run) return i->can_run(m); return NULL; @@ -105,7 +106,7 @@ static bool run_test(struct ccanlint *i, if (skip) { skip: - if (verbose) + if (verbose && !streq(skip, "not relevant to target")) printf(" %s: skipped (%s)\n", i->name, skip); /* If we're skipping this because a prereq failed, we fail. */ @@ -115,7 +116,9 @@ static bool run_test(struct ccanlint *i, list_del(&i->list); list_add_tail(&finished_tests, &i->list); list_for_each(&i->dependencies, d, node) { - d->dependent->skip = true; + if (d->dependent->skip) + continue; + d->dependent->skip = "dependency was skipped"; d->dependent->skip_fail = i->skip_fail; } return true; @@ -169,7 +172,9 @@ static bool run_test(struct ccanlint *i, if (bad) { /* Skip any tests which depend on this one. */ list_for_each(&i->dependencies, d, node) { - d->dependent->skip = true; + if (d->dependent->skip) + continue; + d->dependent->skip = "dependency failed"; d->dependent->skip_fail = true; } } @@ -349,6 +354,32 @@ static void add_info_fails(struct ccan_file *info) } } +static bool depends_on(struct ccanlint *i, struct ccanlint *target) +{ + const struct dependent *d; + + if (i == target) + return true; + + list_for_each(&i->dependencies, d, node) { + if (depends_on(d->dependent, target)) + return true; + } + return false; +} + +/* O(N^2), who cares? */ +static void skip_unrelated_tests(struct ccanlint *target) +{ + struct ccanlint *i; + struct list_head *list; + + foreach_ptr(list, &compulsory_tests, &normal_tests) + list_for_each(list, i, list) + if (!depends_on(i, target)) + i->skip = "not relevant to target"; +} + int main(int argc, char *argv[]) { bool summary = false; @@ -356,7 +387,7 @@ int main(int argc, char *argv[]) struct manifest *m; struct ccanlint *i; const char *prefix = ""; - char *dir = talloc_getcwd(NULL), *base_dir = dir; + char *dir = talloc_getcwd(NULL), *base_dir = dir, *target = NULL; init_tests(); @@ -380,6 +411,9 @@ int main(int argc, char *argv[]) opt_register_arg("-t|--timeout ", opt_set_uintval, NULL, &timeout, "ignore (terminate) tests that are slower than this"); + opt_register_arg("--target ", opt_set_charp, + NULL, &target, + "only run one test (and its prerequisites)"); opt_register_noarg("-?|-h|--help", opt_usage_and_exit, "\nA program for checking and guiding development" " of CCAN modules.", @@ -407,6 +441,15 @@ int main(int argc, char *argv[]) talloc_asprintf(m, "%s/test", temp_dir(NULL))) != 0) err(1, "Creating test symlink in %s", temp_dir(NULL)); + if (target) { + struct ccanlint *test; + + test = find_test(target); + if (!test) + err(1, "Unknown test to run '%s'", target); + skip_unrelated_tests(test); + } + /* If you don't pass the compulsory tests, you get a score of 0. */ if (verbose) printf("Compulsory tests:\n"); diff --git a/tools/ccanlint/ccanlint.h b/tools/ccanlint/ccanlint.h index 679b00ac..8c2ee0e8 100644 --- a/tools/ccanlint/ccanlint.h +++ b/tools/ccanlint/ccanlint.h @@ -79,7 +79,7 @@ struct ccanlint { /* How many things do we (still) depend on? */ unsigned int num_depends; /* Did we skip a dependency? If so, must skip this, too. */ - bool skip; + const char *skip; /* Did we fail a dependency? If so, skip and mark as fail. */ bool skip_fail; /* Did the user want to keep these results? */ -- 2.39.2