From 12fded0aa09d094799a901b72dd8adccac890696 Mon Sep 17 00:00:00 2001 From: Joseph Hunkeler Date: Fri, 28 Jun 2024 10:09:33 -0400 Subject: Implement get_github_release_notes_auto function that bases release note data off test contexts --- src/template_func_proto.c | 51 +++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 2 deletions(-) (limited to 'src/template_func_proto.c') diff --git a/src/template_func_proto.c b/src/template_func_proto.c index 459a3a6..8618a2e 100644 --- a/src/template_func_proto.c +++ b/src/template_func_proto.c @@ -1,8 +1,8 @@ #include "template_func_proto.h" -int get_github_release_notes_tplfunc_entrypoint(void *frame, void *ptr) { +int get_github_release_notes_tplfunc_entrypoint(void *frame, void *data_out) { int result; - char **output = (char **) ptr; + char **output = (char **) data_out; struct tplfunc_frame *f = (struct tplfunc_frame *) frame; char *api_token = getenv("STASIS_GITHUB_TOKEN"); if (!api_token) { @@ -16,3 +16,50 @@ int get_github_release_notes_tplfunc_entrypoint(void *frame, void *ptr) { return result; } +int get_github_release_notes_auto_tplfunc_entrypoint(void *frame, void *data_out) { + int result = 0; + char **output = (char **) data_out; + struct tplfunc_frame *f = (struct tplfunc_frame *) frame; + char *api_token = getenv("STASIS_GITHUB_TOKEN"); + if (!api_token) { + api_token = getenv("GITHUB_TOKEN"); + } + + const struct Delivery *ctx = (struct Delivery *) f->data_in; + struct StrList *notes_list = strlist_init(); + for (size_t i = 0; i < sizeof(ctx->tests) / sizeof(*ctx->tests); i++) { + // Get test context + const struct Test *test = &ctx->tests[i]; + if (test->name && test->version && test->repository) { + char *repository = strdup(test->repository); + char *match = strstr(repository, "spacetelescope/"); + // Cull repository URL + if (match) { + replace_text(repository, "https://github.com/", "", 0); + if (endswith(repository, ".git")) { + replace_text(repository, ".git", "", 0); + } + // Record release notes for version relative to HEAD + // Using HEAD, GitHub returns the previous tag + char *note = NULL; + char h1_title[NAME_MAX] = {0}; + sprintf(h1_title, "# %s", test->name); + strlist_append(¬es_list, h1_title); + result += get_github_release_notes(api_token ? api_token : "anonymous", + repository, + test->version, + "HEAD", + ¬e); + if (note) { + strlist_append(¬es_list, note); + guard_free(note); + } + } + } + } + // Return all notes as a single string + if (strlist_count(notes_list)) { + *output = join(notes_list->data, "\n\n"); + } + return result; +} -- cgit