has_info.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. #include <tools/ccanlint/ccanlint.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <limits.h>
  7. #include <errno.h>
  8. #include <stdlib.h>
  9. #include <stdio.h>
  10. #include <err.h>
  11. #include <string.h>
  12. #include <ccan/noerr/noerr.h>
  13. #include <ccan/talloc/talloc.h>
  14. static void *check_has_info(struct manifest *m, unsigned int *timeleft)
  15. {
  16. if (m->info_file)
  17. return NULL;
  18. return m;
  19. }
  20. static const char *describe_has_info(struct manifest *m, void *check_result)
  21. {
  22. return "You have no _info file.\n\n"
  23. "The file _info contains the metadata for a ccan package: things\n"
  24. "like the dependencies, the documentation for the package as a whole\n"
  25. "and license information.\n";
  26. }
  27. static const char template[] =
  28. "#include <string.h>\n"
  29. "#include \"config.h\"\n"
  30. "\n"
  31. "/**\n"
  32. " * %s - YOUR-ONE-LINE-DESCRIPTION-HERE\n"
  33. " *\n"
  34. " * This code ... YOUR-BRIEF-SUMMARY-HERE\n"
  35. " *\n"
  36. " * Example:\n"
  37. " * FULLY-COMPILABLE-INDENTED-TRIVIAL-BUT-USEFUL-EXAMPLE-HERE\n"
  38. " */\n"
  39. "int main(int argc, char *argv[])\n"
  40. "{\n"
  41. " /* Expect exactly one argument */\n"
  42. " if (argc != 2)\n"
  43. " return 1;\n"
  44. "\n"
  45. " if (strcmp(argv[1], \"depends\") == 0) {\n"
  46. " PRINTF-CCAN-PACKAGES-YOU-NEED-ONE-PER-LINE-IF-ANY\n"
  47. " return 0;\n"
  48. " }\n"
  49. "\n"
  50. " return 1;\n"
  51. "}\n";
  52. static void create_info_template(struct manifest *m, void *check_result)
  53. {
  54. FILE *info;
  55. const char *filename;
  56. if (!ask("Should I create a template _info file for you?"))
  57. return;
  58. filename = talloc_asprintf(m, "%s/%s", m->dir, "_info");
  59. info = fopen(filename, "w");
  60. if (!info)
  61. err(1, "Trying to create a template _info in %s", filename);
  62. if (fprintf(info, template, m->basename) < 0) {
  63. unlink_noerr(filename);
  64. err(1, "Writing template into %s", filename);
  65. }
  66. fclose(info);
  67. }
  68. struct ccanlint has_info = {
  69. .key = "info",
  70. .name = "Module has _info file",
  71. .check = check_has_info,
  72. .describe = describe_has_info,
  73. .handle = create_info_template,
  74. };
  75. REGISTER_TEST(has_info, NULL);