aboutsummaryrefslogtreecommitdiff
path: root/src/template_func_proto.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-06-28 10:09:33 -0400
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-06-28 10:09:33 -0400
commit12fded0aa09d094799a901b72dd8adccac890696 (patch)
tree57f93228ff33365503f9392f948991ca6c7aad0f /src/template_func_proto.c
parentce10a7cdbe237fa689fb07670691c91fd081e705 (diff)
downloadstasis-12fded0aa09d094799a901b72dd8adccac890696.tar.gz
Implement get_github_release_notes_auto function that bases release note data off test contexts
Diffstat (limited to 'src/template_func_proto.c')
-rw-r--r--src/template_func_proto.c51
1 files changed, 49 insertions, 2 deletions
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(&notes_list, h1_title);
+ result += get_github_release_notes(api_token ? api_token : "anonymous",
+ repository,
+ test->version,
+ "HEAD",
+ &note);
+ if (note) {
+ strlist_append(&notes_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;
+}