diff options
| author | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-10-14 09:32:03 -0400 | 
|---|---|---|
| committer | Joseph Hunkeler <jhunkeler@gmail.com> | 2024-10-14 09:43:31 -0400 | 
| commit | 5a9688e9e78a25a42bddfc4388fb4ce3311ded74 (patch) | |
| tree | bcc1b54c3f8a7f1eab0d6b3e129f098721a41537 /src/delivery.c | |
| parent | b98088f7b7cfe4b08eb39fa1b6b86210cb6c08b8 (diff) | |
| download | stasis-5a9688e9e78a25a42bddfc4388fb4ce3311ded74.tar.gz | |
Refactor directory structure
* Move core library sources into src/lib/core
* Move command-line programs into src/cli
Diffstat (limited to 'src/delivery.c')
| -rw-r--r-- | src/delivery.c | 317 | 
1 files changed, 0 insertions, 317 deletions
diff --git a/src/delivery.c b/src/delivery.c deleted file mode 100644 index 07e04c8..0000000 --- a/src/delivery.c +++ /dev/null @@ -1,317 +0,0 @@ -#include "core.h" - -void delivery_free(struct Delivery *ctx) { -    guard_free(ctx->system.arch); -    GENERIC_ARRAY_FREE(ctx->system.platform); -    guard_free(ctx->meta.name); -    guard_free(ctx->meta.version); -    guard_free(ctx->meta.codename); -    guard_free(ctx->meta.mission); -    guard_free(ctx->meta.python); -    guard_free(ctx->meta.mission); -    guard_free(ctx->meta.python_compact); -    guard_free(ctx->meta.based_on); -    guard_runtime_free(ctx->runtime.environ); -    guard_free(ctx->storage.root); -    guard_free(ctx->storage.tmpdir); -    guard_free(ctx->storage.delivery_dir); -    guard_free(ctx->storage.tools_dir); -    guard_free(ctx->storage.package_dir); -    guard_free(ctx->storage.results_dir); -    guard_free(ctx->storage.output_dir); -    guard_free(ctx->storage.conda_install_prefix); -    guard_free(ctx->storage.conda_artifact_dir); -    guard_free(ctx->storage.conda_staging_dir); -    guard_free(ctx->storage.conda_staging_url); -    guard_free(ctx->storage.wheel_artifact_dir); -    guard_free(ctx->storage.wheel_staging_dir); -    guard_free(ctx->storage.wheel_staging_url); -    guard_free(ctx->storage.build_dir); -    guard_free(ctx->storage.build_recipes_dir); -    guard_free(ctx->storage.build_sources_dir); -    guard_free(ctx->storage.build_testing_dir); -    guard_free(ctx->storage.build_docker_dir); -    guard_free(ctx->storage.mission_dir); -    guard_free(ctx->storage.docker_artifact_dir); -    guard_free(ctx->storage.meta_dir); -    guard_free(ctx->storage.package_dir); -    guard_free(ctx->storage.cfgdump_dir); -    guard_free(ctx->info.time_str_epoch); -    guard_free(ctx->info.build_name); -    guard_free(ctx->info.build_number); -    guard_free(ctx->info.release_name); -    guard_free(ctx->conda.installer_baseurl); -    guard_free(ctx->conda.installer_name); -    guard_free(ctx->conda.installer_version); -    guard_free(ctx->conda.installer_platform); -    guard_free(ctx->conda.installer_arch); -    guard_free(ctx->conda.installer_path); -    guard_free(ctx->conda.tool_version); -    guard_free(ctx->conda.tool_build_version); -    guard_strlist_free(&ctx->conda.conda_packages); -    guard_strlist_free(&ctx->conda.conda_packages_defer); -    guard_strlist_free(&ctx->conda.pip_packages); -    guard_strlist_free(&ctx->conda.pip_packages_defer); -    guard_strlist_free(&ctx->conda.wheels_packages); - -    for (size_t i = 0; i < sizeof(ctx->tests) / sizeof(ctx->tests[0]); i++) { -        guard_free(ctx->tests[i].name); -        guard_free(ctx->tests[i].version); -        guard_free(ctx->tests[i].repository); -        guard_free(ctx->tests[i].repository_info_ref); -        guard_free(ctx->tests[i].repository_info_tag); -        guard_strlist_free(&ctx->tests[i].repository_remove_tags); -        guard_free(ctx->tests[i].script); -        guard_free(ctx->tests[i].build_recipe); -        // test-specific runtime variables -        guard_runtime_free(ctx->tests[i].runtime.environ); -    } - -    guard_free(ctx->rules.release_fmt); -    guard_free(ctx->rules.build_name_fmt); -    guard_free(ctx->rules.build_number_fmt); - -    guard_free(ctx->deploy.docker.test_script); -    guard_free(ctx->deploy.docker.registry); -    guard_free(ctx->deploy.docker.image_compression); -    guard_strlist_free(&ctx->deploy.docker.tags); -    guard_strlist_free(&ctx->deploy.docker.build_args); - -    for (size_t i = 0; i < sizeof(ctx->deploy.jfrog) / sizeof(ctx->deploy.jfrog[0]); i++) { -        guard_free(ctx->deploy.jfrog[i].repo); -        guard_free(ctx->deploy.jfrog[i].dest); -        guard_strlist_free(&ctx->deploy.jfrog[i].files); -    } - -    if (ctx->_stasis_ini_fp.delivery) { -        ini_free(&ctx->_stasis_ini_fp.delivery); -    } -    guard_free(ctx->_stasis_ini_fp.delivery_path); - -    if (ctx->_stasis_ini_fp.cfg) { -        // optional extras -        ini_free(&ctx->_stasis_ini_fp.cfg); -    } -    guard_free(ctx->_stasis_ini_fp.cfg_path); - -    if (ctx->_stasis_ini_fp.mission) { -        ini_free(&ctx->_stasis_ini_fp.mission); -    } -    guard_free(ctx->_stasis_ini_fp.mission_path); -} - -int delivery_format_str(struct Delivery *ctx, char **dest, const char *fmt) { -    size_t fmt_len = strlen(fmt); - -    if (!*dest) { -        *dest = calloc(STASIS_NAME_MAX, sizeof(**dest)); -        if (!*dest) { -            return -1; -        } -    } - -    for (size_t i = 0; i < fmt_len; i++) { -        if (fmt[i] == '%' && strlen(&fmt[i])) { -            i++; -            switch (fmt[i]) { -                case 'n':   // name -                    strcat(*dest, ctx->meta.name); -                    break; -                case 'c':   // codename -                    strcat(*dest, ctx->meta.codename); -                    break; -                case 'm':   // mission -                    strcat(*dest, ctx->meta.mission); -                    break; -                case 'r':   // revision -                    sprintf(*dest + strlen(*dest), "%d", ctx->meta.rc); -                    break; -                case 'R':   // "final"-aware revision -                    if (ctx->meta.final) -                        strcat(*dest, "final"); -                    else -                        sprintf(*dest + strlen(*dest), "%d", ctx->meta.rc); -                    break; -                case 'v':   // version -                    strcat(*dest, ctx->meta.version); -                    break; -                case 'P':   // python version -                    strcat(*dest, ctx->meta.python); -                    break; -                case 'p':   // python version major/minor -                    strcat(*dest, ctx->meta.python_compact); -                    break; -                case 'a':   // system architecture name -                    strcat(*dest, ctx->system.arch); -                    break; -                case 'o':   // system platform (OS) name -                    strcat(*dest, ctx->system.platform[DELIVERY_PLATFORM_RELEASE]); -                    break; -                case 't':   // unix epoch -                    sprintf(*dest + strlen(*dest), "%ld", ctx->info.time_now); -                    break; -                default:    // unknown formatter, write as-is -                    sprintf(*dest + strlen(*dest), "%c%c", fmt[i - 1], fmt[i]); -                    break; -            } -        } else {    // write non-format text -            sprintf(*dest + strlen(*dest), "%c", fmt[i]); -        } -    } -    return 0; -} - -void delivery_defer_packages(struct Delivery *ctx, int type) { -    struct StrList *dataptr = NULL; -    struct StrList *deferred = NULL; -    char *name = NULL; -    char cmd[PATH_MAX]; - -    memset(cmd, 0, sizeof(cmd)); - -    char mode[10]; -    if (DEFER_CONDA == type) { -        dataptr = ctx->conda.conda_packages; -        deferred = ctx->conda.conda_packages_defer; -        strcpy(mode, "conda"); -    } else if (DEFER_PIP == type) { -        dataptr = ctx->conda.pip_packages; -        deferred = ctx->conda.pip_packages_defer; -        strcpy(mode, "pip"); -    } else { -        SYSERROR("BUG: type %d does not map to a supported package manager!\n", type); -        exit(1); -    } -    msg(STASIS_MSG_L2, "Filtering %s packages by test definition...\n", mode); - -    struct StrList *filtered = NULL; -    filtered = strlist_init(); -    for (size_t i = 0; i < strlist_count(dataptr); i++) { -        int build_for_host = 0; - -        name = strlist_item(dataptr, i); -        if (!strlen(name) || isblank(*name) || isspace(*name)) { -            // no data -            continue; -        } - -        // Compile a list of packages that are *also* to be tested. -        char *spec_begin = strpbrk(name, "@~=<>!"); -        char *spec_end = spec_begin; -        char package_name[255] = {0}; - -        if (spec_end) { -            // A version is present in the package name. Jump past operator(s). -            while (*spec_end != '\0' && !isalnum(*spec_end)) { -                spec_end++; -            } -            strncpy(package_name, name, spec_begin - name); -        } else { -            strncpy(package_name, name, sizeof(package_name) - 1); -        } - -        msg(STASIS_MSG_L3, "package '%s': ", package_name); - -        // When spec is present in name, set tests->version to the version detected in the name -        for (size_t x = 0; x < sizeof(ctx->tests) / sizeof(ctx->tests[0]) && ctx->tests[x].name != NULL; x++) { -            struct Test *test = &ctx->tests[x]; -            char nametmp[1024] = {0}; - -            if (spec_end != NULL && spec_begin != NULL) { -                strncpy(nametmp, name, spec_begin - name); -            } else { -                strcpy(nametmp, name); -            } -            // Is the [test:NAME] in the package name? -            if (!strcmp(nametmp, test->name)) { -                // Override test->version when a version is provided by the (pip|conda)_package list item -                guard_free(test->version); -                if (spec_begin && spec_end) { -                    test->version = strdup(spec_end); -                } else { -                    // There are too many possible default branches nowadays: master, main, develop, xyz, etc. -                    // HEAD is a safe bet. -                    test->version = strdup("HEAD"); -                } - -                // Is the list item a git+schema:// URL? -                if (strstr(nametmp, "git+") && strstr(nametmp, "://")) { -                    char *xrepo = strstr(nametmp, "+"); -                    if (xrepo) { -                        xrepo++; -                        guard_free(test->repository); -                        test->repository = strdup(xrepo); -                        xrepo = NULL; -                    } -                    // Extract the name of the package -                    char *xbasename = path_basename(nametmp); -                    if (xbasename) { -                        // Replace the git+schema:// URL with the package name -                        strlist_set(&dataptr, i, xbasename); -                        name = strlist_item(dataptr, i); -                    } -                } - -                int upstream_exists = 0; -                if (DEFER_PIP == type) { -                    upstream_exists = pip_index_provides(PYPI_INDEX_DEFAULT, name); -                } else if (DEFER_CONDA == type) { -                    upstream_exists = conda_provides(name); -                } else { -                    fprintf(stderr, "\nUnknown package type: %d\n", type); -                    exit(1); -                } - -                if (upstream_exists < 0) { -                    fprintf(stderr, "%s's existence command failed for '%s'\n" -                        "(This may be due to a network/firewall issue!)\n", mode, name); -                    exit(1); -                } -                if (!upstream_exists) { -                    build_for_host = 1; -                } else { -                    build_for_host = 0; -                } - -                break; -            } -        } - -        if (build_for_host) { -            printf("BUILD FOR HOST\n"); -            strlist_append(&deferred, name); -        } else { -            printf("USE EXTERNAL\n"); -            strlist_append(&filtered, name); -        } -    } - -    if (!strlist_count(deferred)) { -        msg(STASIS_MSG_WARN | STASIS_MSG_L2, "No %s packages were filtered by test definitions\n", mode); -    } else { -        if (DEFER_CONDA == type) { -            strlist_free(&ctx->conda.conda_packages); -            ctx->conda.conda_packages = strlist_copy(filtered); -        } else if (DEFER_PIP == type) { -            strlist_free(&ctx->conda.pip_packages); -            ctx->conda.pip_packages = strlist_copy(filtered); -        } -    } -    if (filtered) { -        strlist_free(&filtered); -    } -} - -void delivery_gather_tool_versions(struct Delivery *ctx) { -    int status = 0; - -    // Extract version from tool output -    ctx->conda.tool_version = shell_output("conda --version", &status); -    if (ctx->conda.tool_version) -        strip(ctx->conda.tool_version); - -    ctx->conda.tool_build_version = shell_output("conda build --version", &status); -    if (ctx->conda.tool_build_version) -        strip(ctx->conda.tool_version); -} -  | 
