aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@gmail.com>2024-12-06 08:44:39 -0500
committerJoseph Hunkeler <jhunkeler@gmail.com>2024-12-06 08:44:39 -0500
commit41c76e0ca3f34fd46235bac6c2c9eac0497b28fb (patch)
treed45af285fa0e36af03da4d16c7221295d1686ec2
parent0c18b5b15ed6e78cc27580518ae29f20ff23da65 (diff)
downloadstasis-41c76e0ca3f34fd46235bac6c2c9eac0497b28fb.tar.gz
Improved markdown output and presentation
-rw-r--r--src/cli/stasis_indexer/helpers.c1
-rw-r--r--src/cli/stasis_indexer/junitxml_report.c176
-rw-r--r--src/cli/stasis_indexer/readmes.c18
3 files changed, 113 insertions, 82 deletions
diff --git a/src/cli/stasis_indexer/helpers.c b/src/cli/stasis_indexer/helpers.c
index 078be68..8279896 100644
--- a/src/cli/stasis_indexer/helpers.c
+++ b/src/cli/stasis_indexer/helpers.c
@@ -204,6 +204,7 @@ struct Delivery *get_latest_deliveries(struct Delivery ctx[], size_t nelem) {
}
latest = get_latest_rc(ctx, nelem);
+ qsort(ctx, nelem, sizeof(*ctx), sort_by_latest_rc);
for (size_t i = 0; i < nelem; i++) {
if (ctx[i].meta.rc == latest) {
result[n] = ctx[i];
diff --git a/src/cli/stasis_indexer/junitxml_report.c b/src/cli/stasis_indexer/junitxml_report.c
index 90cae3b..10c336d 100644
--- a/src/cli/stasis_indexer/junitxml_report.c
+++ b/src/cli/stasis_indexer/junitxml_report.c
@@ -30,101 +30,121 @@ int indexer_junitxml_report(struct Delivery ctx[], const size_t nelem) {
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);
struct StrList *archs = get_architectures(latest, nelem);
struct StrList *platforms = get_platforms(latest, nelem);
qsort(latest, latest_count, sizeof(*latest), callback_sort_deliveries_dynamic_cmpfn);
fprintf(indexfp, "# %s-%s Test Report\n\n", ctx->meta.name, ctx->meta.version);
- fprintf(indexfp, "## Current Release\n\n");
size_t no_printable_data = 0;
- 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] && latest[i]->system.platform) {
- if (strstr(latest[i]->system.platform[DELIVERY_PLATFORM_RELEASE], platform) &&
- strstr(latest[i]->system.arch, arch)) {
- have_combo = 1;
- break;
+
+ size_t delivery_count = get_latest_rc(latest, latest_count);
+ 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);
+
+ fprintf(indexfp, "## %s-%s\n\n", platform, arch);
+ for (size_t d = 0; d < delivery_count; d++) {
+ struct Delivery *current = &ctx[d];
+ if (current->meta.rc == (int) d + 1
+ && strcmp(current->system.arch, arch) != 0
+ && strcmp(current->system.platform[DELIVERY_PLATFORM_RELEASE], platform) != 0) {
+ continue;
}
- }
- }
- if (!have_combo) {
- continue;
- }
- fprintf(indexfp, "### %s-%s\n\n", platform, arch);
-
- fprintf(indexfp, "|Suite|Duration|Fail |Skip |Error |\n");
- fprintf(indexfp, "|:----|:------:|:------:|:---:|:----:|\n");
- for (size_t f = 0; f < strlist_count(file_listing); f++) {
- char *filename = strlist_item(file_listing, f);
- if (!endswith(filename, ".xml")) {
- continue;
- }
- if (strstr(filename, platform) && strstr(filename, arch)) {
- struct JUNIT_Testsuite *testsuite = junitxml_testsuite_read(filename);
- if (testsuite) {
- if (globals.verbose) {
- printf("%s: duration: %0.4f, failed: %d, skipped: %d, errors: %d\n", filename, testsuite->time, testsuite->failures, testsuite->skipped, testsuite->errors);
- }
- fprintf(indexfp, "|[%s](%s)|%0.4f|%d|%d|%d|\n", filename, filename, testsuite->time, testsuite->failures, testsuite->skipped, testsuite->errors);
- /*
- * TODO: Display failure/skip/error output.
- */
- char *bname = strdup(filename);
- bname[strlen(bname) - 4] = 0;
- char result_outfile[PATH_MAX] = {0};
- path_basename(bname);
- mkdir(bname, 0755);
- snprintf(result_outfile, sizeof(result_outfile) - 1, "%s/%s.md", bname, bname);
- FILE *resultfp = fopen(result_outfile, "w+");
- if (!resultfp) {
- SYSERROR("Unable to open %s for writing", result_outfile);
- return -1;
+ fprintf(indexfp, "### %s\n", current->info.release_name);
+ fprintf(indexfp, "\n|Suite|Duration|Fail |Skip |Error |\n");
+ fprintf(indexfp, "|:----|:------:|:------:|:---:|:----:|\n");
+ for (size_t f = 0; f < strlist_count(file_listing); f++) {
+ char *filename = strlist_item(file_listing, f);
+ if (!endswith(filename, ".xml")) {
+ continue;
}
- for (size_t i = 0; i < testsuite->_tc_inuse; i++) {
- if (testsuite->testcase[i]->tc_result_state_type) {
- const char *type_str = NULL;
- const int state = testsuite->testcase[i]->tc_result_state_type;
- const char *message = NULL;
- if (state == JUNIT_RESULT_STATE_FAILURE) {
- message = testsuite->testcase[i]->result_state.failure->message;
- type_str = "[FAILED]";
- } else if (state == JUNIT_RESULT_STATE_ERROR) {
- message = testsuite->testcase[i]->result_state.error->message;
- type_str = "[ERROR]";
- } else if (state == JUNIT_RESULT_STATE_SKIPPED) {
- message = testsuite->testcase[i]->result_state.skipped->message;
- type_str = "[SKIPPED]";
+ char pattern[PATH_MAX] = {0};
+ snprintf(pattern, sizeof(pattern) - 1, "*%s*", current->info.release_name);
+ if (!fnmatch(pattern, filename, 0) && strstr(filename, platform) &&
+ strstr(filename, arch)) {
+ struct JUNIT_Testsuite *testsuite = junitxml_testsuite_read(filename);
+ if (testsuite) {
+ if (globals.verbose) {
+ printf("%s: duration: %0.4f, failed: %d, skipped: %d, errors: %d\n", filename,
+ testsuite->time, testsuite->failures, testsuite->skipped,
+ testsuite->errors);
}
- fprintf(resultfp, "### %s %s :: %s\n", type_str, testsuite->testcase[i]->classname, testsuite->testcase[i]->name);
- fprintf(resultfp, "\nDuration: %0.04fs\n", testsuite->testcase[i]->time);
- fprintf(resultfp, "\n```\n%s\n```\n", message);
+
+ char *bname_tmp = strdup(filename);
+ char *bname = path_basename(bname_tmp);
+ bname[strlen(bname) - 4] = 0;
+ guard_free(bname_tmp);
+
+ char result_outfile[PATH_MAX] = {0};
+
+ char result_path[PATH_MAX] = {0};
+ //snprintf(result_path, sizeof(result_path) -1 , "%s/%s", platform, arch);
+ //mkdirs(result_path, 0755);
+
+ char *short_name_pattern = NULL;
+ asprintf(&short_name_pattern, "-%s", current->info.release_name);
+
+ char short_name[PATH_MAX] = {0};
+ strncpy(short_name, bname, sizeof(short_name) - 1);
+ replace_text(short_name, short_name_pattern, "", 0);
+ replace_text(short_name, "results-", "", 0);
+ guard_free(short_name_pattern);
+
+ fprintf(indexfp, "|[%s](%s.html)|%0.4f|%d|%d|%d|\n", short_name,
+ bname,
+ testsuite->time, testsuite->failures, testsuite->skipped,
+ testsuite->errors);
+
+ snprintf(result_outfile, sizeof(result_outfile) - strlen(bname) - 3, "%s.md",
+ bname);
+ FILE *resultfp = fopen(result_outfile, "w+");
+ if (!resultfp) {
+ SYSERROR("Unable to open %s for writing", result_outfile);
+ return -1;
+ }
+
+ for (size_t i = 0; i < testsuite->_tc_inuse; i++) {
+ if (testsuite->testcase[i]->tc_result_state_type) {
+ const char *type_str = NULL;
+ const int state = testsuite->testcase[i]->tc_result_state_type;
+ const char *message = NULL;
+ if (state == JUNIT_RESULT_STATE_FAILURE) {
+ message = testsuite->testcase[i]->result_state.failure->message;
+ type_str = "[FAILED]";
+ } else if (state == JUNIT_RESULT_STATE_ERROR) {
+ message = testsuite->testcase[i]->result_state.error->message;
+ type_str = "[ERROR]";
+ } else if (state == JUNIT_RESULT_STATE_SKIPPED) {
+ message = testsuite->testcase[i]->result_state.skipped->message;
+ type_str = "[SKIPPED]";
+ }
+ fprintf(resultfp, "### %s %s :: %s\n", type_str,
+ testsuite->testcase[i]->classname, testsuite->testcase[i]->name);
+ fprintf(resultfp, "\nDuration: %0.04fs\n", testsuite->testcase[i]->time);
+ fprintf(resultfp, "\n```\n%s\n```\n", message);
+ }
+ }
+ junitxml_testsuite_free(&testsuite);
+ fclose(resultfp);
+ } else {
+ fprintf(stderr, "bad test suite: %s: %s\n", strerror(errno), filename);
+ }
+ } else {
+ if (!no_printable_data) {
+ // Triggering for reasons unknown
+ //fprintf(indexfp, "|No data|-|-|-|-|-|-|\n");
+ no_printable_data++;
}
}
- junitxml_testsuite_free(&testsuite);
- fclose(resultfp);
- } else {
- fprintf(stderr, "bad test suite: %s: %s\n", strerror(errno), filename);
- }
- } else {
- if (!no_printable_data) {
- // Triggering for reasons unknown
- //fprintf(indexfp, "|No data|-|-|-|-|-|-|\n");
- no_printable_data++;
}
}
+ fprintf(indexfp, "\n");
+ no_printable_data = 0;
}
fprintf(indexfp, "\n");
- no_printable_data = 0;
- }
- fprintf(indexfp, "\n");
}
guard_strlist_free(&archs);
guard_strlist_free(&platforms);
diff --git a/src/cli/stasis_indexer/readmes.c b/src/cli/stasis_indexer/readmes.c
index c98ecfc..df3614e 100644
--- a/src/cli/stasis_indexer/readmes.c
+++ b/src/cli/stasis_indexer/readmes.c
@@ -36,9 +36,6 @@ int indexer_readmes(struct Delivery ctx[], const size_t nelem) {
continue;
}
fprintf(indexfp, "### %s-%s\n\n", platform, arch);
-
- fprintf(indexfp, "|Release|Info|Receipt|\n");
- fprintf(indexfp, "|:----:|:----:|:----:|\n");
for (size_t i = 0; i < nelem; i++) {
char link_name[PATH_MAX];
char readme_name[PATH_MAX];
@@ -52,13 +49,26 @@ int indexer_readmes(struct Delivery ctx[], const size_t nelem) {
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, "|[%s](%s)|[%s](%s)|[%s](%s)|\n", link_name, link_name, readme_name, readme_name, conf_name, conf_name_relative);
+ 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, "\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, "\n");
+
guard_strlist_free(&archs);
guard_strlist_free(&platforms);
fclose(indexfp);