aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-12-07 18:09:20 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-12-07 18:09:20 -0500
commitb677e21d0b996f8aef760f4c8330712107dad217 (patch)
tree431843d7b015f329f7c45f748c3905f432ef1f0d
parent3475952db1f6e22f861077a0aac5435175df3975 (diff)
downloadstasis-b677e21d0b996f8aef760f4c8330712107dad217.tar.gz
Show current release followed by all available releases
* Include link to archived docker image (i.e. curl -L [..] | docker load)
-rw-r--r--src/cli/stasis_indexer/readmes.c147
1 files changed, 87 insertions, 60 deletions
diff --git a/src/cli/stasis_indexer/readmes.c b/src/cli/stasis_indexer/readmes.c
index df3614e..77b5178 100644
--- a/src/cli/stasis_indexer/readmes.c
+++ b/src/cli/stasis_indexer/readmes.c
@@ -2,84 +2,111 @@
#include "readmes.h"
int indexer_readmes(struct Delivery ctx[], const size_t nelem) {
- struct Delivery *latest = NULL;
- latest = get_latest_deliveries(ctx, nelem);
+ struct Delivery *latest_deliveries = get_latest_deliveries(ctx, nelem);
+ if (!latest_deliveries) {
+ if (errno) {
+ return -1;
+ }
+ return 0;
+ }
char indexfile[PATH_MAX] = {0};
sprintf(indexfile, "%s/README.md", ctx->storage.delivery_dir);
- if (!pushd(ctx->storage.delivery_dir)) {
- FILE *indexfp = fopen(indexfile, "w+");
- if (!indexfp) {
- fprintf(stderr, "Unable to open %s for writing\n", indexfile);
- return -1;
- }
- struct StrList *archs = get_architectures(latest, nelem);
- struct StrList *platforms = get_platforms(latest, nelem);
+ FILE *indexfp = fopen(indexfile, "w+");
+ if (!indexfp) {
+ fprintf(stderr, "Unable to open %s for writing\n", indexfile);
+ return -1;
+ }
+ struct StrList *archs = get_architectures(latest_deliveries, nelem);
+ struct StrList *platforms = get_platforms(latest_deliveries, nelem);
- fprintf(indexfp, "# %s-%s\n\n", ctx->meta.name, ctx->meta.version);
- fprintf(indexfp, "## Current Release\n\n");
- for (size_t p = 0; p < strlist_count(platforms); p++) {
- char *platform = strlist_item(platforms, p);
- for (size_t a = 0; a < strlist_count(archs); a++) {
- char *arch = strlist_item(archs, a);
- int have_combo = 0;
- for (size_t i = 0; i < nelem; i++) {
- if (latest[i].system.platform) {
- if (strstr(latest[i].system.platform[DELIVERY_PLATFORM_RELEASE], platform) &&
- strstr(latest[i].system.arch, arch)) {
- have_combo = 1;
- }
+ fprintf(indexfp, "# %s-%s\n\n", ctx->meta.name, ctx->meta.version);
+ fprintf(indexfp, "## Current Release\n\n");
+ for (size_t p = 0; p < strlist_count(platforms); p++) {
+ char *platform = strlist_item(platforms, p);
+ for (size_t a = 0; a < strlist_count(archs); a++) {
+ char *arch = strlist_item(archs, a);
+ int have_combo = 0;
+ for (size_t i = 0; i < nelem; i++) {
+ if (latest_deliveries[i].system.platform) {
+ if (strstr(latest_deliveries[i].system.platform[DELIVERY_PLATFORM_RELEASE], platform) &&
+ strstr(latest_deliveries[i].system.arch, arch)) {
+ have_combo = 1;
}
}
- if (!have_combo) {
+ }
+ if (!have_combo) {
+ continue;
+ }
+ fprintf(indexfp, "### %s-%s\n\n", platform, arch);
+ for (size_t i = 0; i < nelem; i++) {
+ char link_name[PATH_MAX] = {0};
+ char readme_name[PATH_MAX] = {0};
+ char conf_name[PATH_MAX] = {0};
+ char conf_name_relative[PATH_MAX] = {0};
+ if (!latest_deliveries[i].meta.name) {
continue;
}
- fprintf(indexfp, "### %s-%s\n\n", platform, arch);
- for (size_t i = 0; i < nelem; i++) {
- char link_name[PATH_MAX];
- char readme_name[PATH_MAX];
- char conf_name[PATH_MAX];
- char conf_name_relative[PATH_MAX];
- if (!latest[i].meta.name) {
- continue;
- }
- sprintf(link_name, "latest-py%s-%s-%s.yml", latest[i].meta.python_compact, latest[i].system.platform[DELIVERY_PLATFORM_RELEASE], latest[i].system.arch);
- sprintf(readme_name, "README-py%s-%s-%s.md", latest[i].meta.python_compact, latest[i].system.platform[DELIVERY_PLATFORM_RELEASE], latest[i].system.arch);
- sprintf(conf_name, "%s.ini", latest[i].info.release_name);
- sprintf(conf_name_relative, "../config/%s.ini", latest[i].info.release_name);
- if (strstr(link_name, platform) && strstr(link_name, arch)) {
- fprintf(indexfp, "- Info: [README](%s)\n", readme_name);
- fprintf(indexfp, "- Release: [Conda Environment YAML](%s)\n", link_name);
- fprintf(indexfp, "- Receipt: [STASIS input file](%s)\n", conf_name_relative);
+ sprintf(link_name, "latest-py%s-%s-%s.yml", latest_deliveries[i].meta.python_compact, latest_deliveries[i].system.platform[DELIVERY_PLATFORM_RELEASE], latest_deliveries[i].system.arch);
+ sprintf(readme_name, "README-py%s-%s-%s.md", latest_deliveries[i].meta.python_compact, latest_deliveries[i].system.platform[DELIVERY_PLATFORM_RELEASE], latest_deliveries[i].system.arch);
+ sprintf(conf_name, "%s.ini", latest_deliveries[i].info.release_name);
+ sprintf(conf_name_relative, "../config/%s.ini", latest_deliveries[i].info.release_name);
+ if (strstr(link_name, platform) && strstr(link_name, arch)) {
+ fprintf(indexfp, "- Info: [README](%s)\n", readme_name);
+ fprintf(indexfp, "- Release: [Conda Environment YAML](%s)\n", link_name);
+ fprintf(indexfp, "- Receipt: [STASIS input file](%s)\n", conf_name_relative);
+ fprintf(indexfp, "- Docker: ");
+ struct StrList *docker_images = get_docker_images(&latest_deliveries[i], "");
+ if (docker_images
+ && strlist_count(docker_images)
+ && !strcmp(latest_deliveries[i].system.platform[DELIVERY_PLATFORM_RELEASE], "linux")) {
+ fprintf(indexfp, "[Archive](../packages/docker/%s)\n", path_basename(strlist_item(docker_images, 0)));
+ guard_free(docker_images);
+ } else {
+ fprintf(indexfp, "N/A\n");
}
}
- fprintf(indexfp, "\n");
}
fprintf(indexfp, "\n");
}
+ fprintf(indexfp, "\n");
+ }
- fprintf(indexfp, "## Releases\n");
- for (size_t i = 0; ctx[i].meta.name != NULL; i++) {
- struct Delivery *current = &ctx[i];
- fprintf(indexfp, "### %s\n", current->info.release_name);
- fprintf(indexfp, "- Info: [README](README-%s.html)\n", current->info.release_name);
- fprintf(indexfp, "- Release: [Conda Environment YAML](%s.yml)\n", current->info.release_name);
- fprintf(indexfp, "- Receipt: [STASIS input file](%s.ini)\n", current->info.release_name);
+ fprintf(indexfp, "## Releases\n");
+ for (size_t i = 0; ctx[i].meta.name != NULL; i++) {
+ struct Delivery *current = &ctx[i];
+ fprintf(indexfp, "### %s\n", current->info.release_name);
+ fprintf(indexfp, "- Info: [README](README-%s.html)\n", current->info.release_name);
+ fprintf(indexfp, "- Release: [Conda Environment YAML](%s.yml)\n", current->info.release_name);
+ fprintf(indexfp, "- Receipt: [STASIS input file](../config/%s.ini)\n", current->info.release_name);
+ fprintf(indexfp, "- Docker: \n");
+
+ char *pattern = NULL;
+ asprintf(&pattern, "*%s*", current->info.build_number);
+ if (!pattern) {
+ SYSERROR("%s", "Unable to allocate bytes for pattern");
+ return -1;
}
- fprintf(indexfp, "\n");
- guard_strlist_free(&archs);
- guard_strlist_free(&platforms);
- fclose(indexfp);
- popd();
- } else {
- fprintf(stderr, "Unable to enter delivery directory: %s\n", ctx->storage.delivery_dir);
- guard_free(latest);
- return -1;
+ struct StrList *docker_images = get_docker_images(current, pattern);
+ if (docker_images
+ && strlist_count(docker_images)
+ && !strcmp(current->system.platform[DELIVERY_PLATFORM_RELEASE], "linux")) {
+ fprintf(indexfp, "[Archive](../packages/docker/%s)\n", path_basename(strlist_item(docker_images, 0)));
+ guard_free(docker_images);
+ } else {
+ fprintf(indexfp, "N/A\n");
+ }
+ guard_free(pattern);
}
+ fprintf(indexfp, "\n");
+
+ guard_strlist_free(&archs);
+ guard_strlist_free(&platforms);
+ fclose(indexfp);
- // "latest" is an array of pointers to ctxs[]. Do not free the contents of the array.
- guard_free(latest);
+ // "latest_deliveries" is an array of pointers to ctxs[]. Do not free the contents of the array.
+ guard_free(latest_deliveries);
return 0;
}