]> git.ozlabs.org Git - ccan/blobdiff - tools/ccanlint/tests/license_comment.c
ccanlint: offer to insert license comments where they're missing.
[ccan] / tools / ccanlint / tests / license_comment.c
index 18a60813fdead9db0a5ef47fc6a4bc55a2fa784c..9548d87cbb17af759c5e173e8ab0966990168b54 100644 (file)
@@ -57,10 +57,49 @@ static void check_license_comment(struct manifest *m,
        }
 }
 
+static void add_license_comment(struct manifest *m, struct score *score)
+{
+       struct file_error *e;
+       const char *license_desc = get_license_oneliner(score, m->license);
+       char *files = tal_strdup(score, ""), *q;
+
+       list_for_each(&score->per_file_errors, e, list)
+               tal_append_fmt(&files, "  %s\n", e->file->name);
+
+       q = tal_fmt(score, "The following files don't have a comment:\n%s\n"
+                   "Should I prepend '%s'?", files, license_desc);
+       if (!ask(q))
+               return;
+
+       list_for_each(&score->per_file_errors, e, list) {
+               char *tmpname;
+               FILE *out;
+               unsigned int i;
+
+               tmpname = temp_file(score, ".licensed", e->file->name);
+               out = fopen(tmpname, "w");
+               if (!out)
+                       err(1, "Opening %s", tmpname);
+               if (fprintf(out, "%s\n", license_desc) < 0)
+                       err(1, "Writing %s", tmpname);
+
+               for (i = 0; e->file->lines[i]; i++)
+                       if (fprintf(out, "%s\n", e->file->lines[i]) < 0)
+                               err(1, "Writing %s", tmpname);
+
+               if (fclose(out) != 0)
+                       err(1, "Closing %s", tmpname);
+
+               if (!move_file(tmpname, e->file->fullname))
+                       err(1, "Moving %s to %s", tmpname, e->file->fullname);
+       }
+}
+
 struct ccanlint license_comment = {
        .key = "license_comment",
        .name = "Source and header files refer to LICENSE",
        .check = check_license_comment,
+       .handle = add_license_comment,
        .needs = "license_exists"
 };
 REGISTER_TEST(license_comment);