X-Git-Url: http://git.ozlabs.org/?p=ccan;a=blobdiff_plain;f=tools%2Fccanlint%2Ftests%2Fhas_info_documentation.c;h=ee89df9fc12398473ae24c059fd6724d0159205f;hp=8a506aba85253596975462dd1532038d30d6e79c;hb=ad3f309e3c13d6b88864aab146895c9df9bc6e5b;hpb=570c9c555f076e74f46141bb42b5d1d7ac89f632 diff --git a/tools/ccanlint/tests/has_info_documentation.c b/tools/ccanlint/tests/has_info_documentation.c index 8a506aba..ee89df9f 100644 --- a/tools/ccanlint/tests/has_info_documentation.c +++ b/tools/ccanlint/tests/has_info_documentation.c @@ -1,5 +1,6 @@ #include #include +#include #include #include #include @@ -14,39 +15,7 @@ #include #include -struct info_docs -{ - bool summary; - bool description; - bool example; -}; - -static void *check_has_info_documentation(struct manifest *m) -{ - struct list_head *infodocs = get_ccan_file_docs(m->info_file); - struct doc_section *d; - struct info_docs id = { false, false, false }; - - list_for_each(infodocs, d, list) { - if (!streq(d->function, m->basename)) - continue; - if (streq(d->type, "summary")) - id.summary = true; - if (streq(d->type, "description")) - id.description = true; - if (streq(d->type, "example")) - id.example = true; - } - - if (id.summary && id.description && id.example) - return NULL; - return talloc_memdup(m, &id, sizeof(id)); -} - -/* This is defined below. */ -extern struct ccanlint has_info_documentation; - -static void create_info_template_doc(struct manifest *m, void *check_result) +static void create_info_template_doc(struct manifest *m, struct score *score) { int fd = open("_info.new", O_WRONLY|O_CREAT|O_EXCL, 0666); FILE *new; @@ -81,50 +50,50 @@ static void create_info_template_doc(struct manifest *m, void *check_result) unlink_noerr("_info.new"); err(1, "Closing _info.new"); } - if (rename("_info.new", "_info") != 0) { + if (!move_file("_info.new", "_info")) { unlink_noerr("_info.new"); err(1, "Renaming _info.new to _info"); } } -static const char *describe_has_info_documentation(struct manifest *m, - void *check_result) +static void check_has_info_documentation(struct manifest *m, + bool keep, + unsigned int *timeleft, + struct score *score) { - struct info_docs *id = check_result; - char *reason = talloc_strdup(m, ""); + struct list_head *infodocs = get_ccan_file_docs(m->info_file); + struct doc_section *d; + bool summary = false, description = false; - if (!id->summary) { - has_info_documentation.handle = create_info_template_doc; - reason = talloc_asprintf_append(reason, - "Your _info file has no module documentation.\n\n" - "CCAN modules use /**-style comments for documentation: the\n" - "overall documentation belongs in the _info metafile.\n"); + list_for_each(infodocs, d, list) { + if (!streq(d->function, m->basename)) + continue; + if (streq(d->type, "summary")) + summary = true; + if (streq(d->type, "description")) + description = true; } - if (!id->description) - reason = talloc_asprintf_append(reason, - "Your _info file has no module description.\n\n" + + if (summary && description) { + score->score = score->total; + score->pass = true; + } else if (!summary) { + score->error = "_info file has no module documentation.\n\n" + "CCAN modules use /**-style comments for documentation: the\n" + "overall documentation belongs in the _info metafile.\n"; + has_info_documentation.handle = create_info_template_doc; + } else if (!description) { + score->error = "_info file has no module description.\n\n" "The lines after the first summary line in the _info file\n" "documentation should describe the purpose and use of the\n" - "overall package\n"); - if (!id->example) - reason = talloc_asprintf_append(reason, - "Your _info file has no module example.\n\n" - "There should be an Example: section of the _info documentation\n" - "which provides a concise toy program which uses your module\n"); - return reason; -} - -static unsigned int has_info_documentation_score(struct manifest *m, - void *check_result) -{ - struct info_docs *id = check_result; - return id->summary + id->description + id->example; + "overall package\n"; + } } struct ccanlint has_info_documentation = { - .name = "Documentation in _info file", - .total_score = 3, - .score = has_info_documentation_score, + .key = "info-documentation", + .name = "Module has documentation in _info", .check = check_has_info_documentation, - .describe = describe_has_info_documentation, }; + +REGISTER_TEST(has_info_documentation, NULL);