diff options
author | Joseph Hunkeler <jhunkeler@users.noreply.github.com> | 2024-10-14 12:47:03 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-14 12:47:03 -0400 |
commit | ca762e2fd21266e6ed7b800d135e386c2ec48861 (patch) | |
tree | 48978ff793f2a969df196cfa7700100e5c82a2f5 | |
parent | 20a4c8c1707055c6d53265213f2a2d6b834aa037 (diff) | |
parent | 26000fb8e6cc08c227d4463de60e28881179e5cb (diff) | |
download | stasis-ca762e2fd21266e6ed7b800d135e386c2ec48861.tar.gz |
Merge pull request #61 from jhunkeler/restructure-the-world
Restructure the world
-rw-r--r-- | include/artifactory.h | 1 | ||||
-rw-r--r-- | include/conda.h | 2 | ||||
-rw-r--r-- | include/core.h | 22 | ||||
-rw-r--r-- | include/core_mem.h | 3 | ||||
-rw-r--r-- | include/delivery.h | 9 | ||||
-rw-r--r-- | include/docker.h | 2 | ||||
-rw-r--r-- | include/download.h | 2 | ||||
-rw-r--r-- | include/envctl.h | 1 | ||||
-rw-r--r-- | include/ini.h | 1 | ||||
-rw-r--r-- | include/package.h | 30 | ||||
-rw-r--r-- | include/str.h | 1 | ||||
-rw-r--r-- | include/strlist.h | 5 | ||||
-rw-r--r-- | include/utils.h | 7 | ||||
-rw-r--r-- | src/CMakeLists.txt | 47 | ||||
-rw-r--r-- | src/cli/CMakeLists.txt | 2 | ||||
-rw-r--r-- | src/cli/stasis/CMakeLists.txt | 12 | ||||
-rw-r--r-- | src/cli/stasis/args.c | 102 | ||||
-rw-r--r-- | src/cli/stasis/args.h | 23 | ||||
-rw-r--r-- | src/cli/stasis/callbacks.c | 31 | ||||
-rw-r--r-- | src/cli/stasis/callbacks.h | 10 | ||||
-rw-r--r-- | src/cli/stasis/stasis_main.c (renamed from src/stasis_main.c) | 266 | ||||
-rw-r--r-- | src/cli/stasis/system_requirements.c | 82 | ||||
-rw-r--r-- | src/cli/stasis/system_requirements.h | 13 | ||||
-rw-r--r-- | src/cli/stasis/tpl.c | 46 | ||||
-rw-r--r-- | src/cli/stasis/tpl.h | 10 | ||||
-rw-r--r-- | src/cli/stasis_indexer/CMakeLists.txt | 6 | ||||
-rw-r--r-- | src/cli/stasis_indexer/stasis_indexer.c (renamed from src/stasis_indexer.c) | 3 | ||||
-rw-r--r-- | src/lib/CMakeLists.txt | 1 | ||||
-rw-r--r-- | src/lib/core/CMakeLists.txt | 38 | ||||
-rw-r--r-- | src/lib/core/artifactory.c (renamed from src/artifactory.c) | 2 | ||||
-rw-r--r-- | src/lib/core/conda.c (renamed from src/conda.c) | 1 | ||||
-rw-r--r-- | src/lib/core/copy.c (renamed from src/copy.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery.c (renamed from src/delivery.c) | 2 | ||||
-rw-r--r-- | src/lib/core/delivery_artifactory.c (renamed from src/delivery_artifactory.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_build.c (renamed from src/delivery_build.c) | 1 | ||||
-rw-r--r-- | src/lib/core/delivery_conda.c (renamed from src/delivery_conda.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_docker.c (renamed from src/delivery_docker.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_init.c (renamed from src/delivery_init.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_install.c (renamed from src/delivery_install.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_populate.c (renamed from src/delivery_populate.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_postprocess.c (renamed from src/delivery_postprocess.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_show.c (renamed from src/delivery_show.c) | 0 | ||||
-rw-r--r-- | src/lib/core/delivery_test.c (renamed from src/delivery_test.c) | 0 | ||||
-rw-r--r-- | src/lib/core/docker.c (renamed from src/docker.c) | 1 | ||||
-rw-r--r-- | src/lib/core/download.c (renamed from src/download.c) | 2 | ||||
-rw-r--r-- | src/lib/core/envctl.c (renamed from src/envctl.c) | 1 | ||||
-rw-r--r-- | src/lib/core/environment.c (renamed from src/environment.c) | 0 | ||||
-rw-r--r-- | src/lib/core/github.c (renamed from src/github.c) | 1 | ||||
-rw-r--r-- | src/lib/core/globals.c (renamed from src/globals.c) | 1 | ||||
-rw-r--r-- | src/lib/core/ini.c (renamed from src/ini.c) | 0 | ||||
-rw-r--r-- | src/lib/core/junitxml.c (renamed from src/junitxml.c) | 0 | ||||
-rw-r--r-- | src/lib/core/multiprocessing.c (renamed from src/multiprocessing.c) | 1 | ||||
-rw-r--r-- | src/lib/core/package.c | 41 | ||||
-rw-r--r-- | src/lib/core/recipe.c (renamed from src/recipe.c) | 0 | ||||
-rw-r--r-- | src/lib/core/relocation.c (renamed from src/relocation.c) | 0 | ||||
-rw-r--r-- | src/lib/core/rules.c (renamed from src/rules.c) | 0 | ||||
-rw-r--r-- | src/lib/core/str.c (renamed from src/str.c) | 0 | ||||
-rw-r--r-- | src/lib/core/strlist.c (renamed from src/strlist.c) | 1 | ||||
-rw-r--r-- | src/lib/core/system.c (renamed from src/system.c) | 0 | ||||
-rw-r--r-- | src/lib/core/template.c (renamed from src/template.c) | 0 | ||||
-rw-r--r-- | src/lib/core/template_func_proto.c (renamed from src/template_func_proto.c) | 2 | ||||
-rw-r--r-- | src/lib/core/utils.c (renamed from src/utils.c) | 1 | ||||
-rw-r--r-- | src/lib/core/wheel.c (renamed from src/wheel.c) | 0 | ||||
-rw-r--r-- | tests/test_artifactory.c | 2 | ||||
-rw-r--r-- | tests/test_conda.c | 2 | ||||
-rw-r--r-- | tests/test_docker.c | 2 | ||||
-rw-r--r-- | tests/test_download.c | 1 | ||||
-rw-r--r-- | tests/test_junitxml.c | 1 | ||||
-rw-r--r-- | tests/test_multiprocessing.c | 12 | ||||
-rw-r--r-- | tests/test_recipe.c | 2 | ||||
-rw-r--r-- | tests/test_wheel.c | 1 |
71 files changed, 520 insertions, 339 deletions
diff --git a/include/artifactory.h b/include/artifactory.h index c6e5c2b..e580886 100644 --- a/include/artifactory.h +++ b/include/artifactory.h @@ -5,6 +5,7 @@ #include <stdio.h> #include <stdlib.h> #include "core.h" +#include "download.h" //! JFrog Artifactory Authentication struct struct JFRT_Auth { diff --git a/include/conda.h b/include/conda.h index b26c7a3..1eb42f4 100644 --- a/include/conda.h +++ b/include/conda.h @@ -4,7 +4,9 @@ #include <stdio.h> #include <string.h> +#include <sys/utsname.h> #include "core.h" +#include "download.h" #define CONDA_INSTALL_PREFIX "conda" #define PYPI_INDEX_DEFAULT "https://pypi.org/simple" diff --git a/include/core.h b/include/core.h index 972e1ee..b0a1a11 100644 --- a/include/core.h +++ b/include/core.h @@ -4,6 +4,7 @@ #include <stdio.h> #include <stdlib.h> +#include <stdbool.h> #include <string.h> #include <limits.h> #include <unistd.h> @@ -22,27 +23,6 @@ #include "config.h" #include "core_mem.h" -#include "multiprocessing.h" -#include "envctl.h" -#include "template.h" -#include "utils.h" -#include "copy.h" -#include "ini.h" -#include "conda.h" -#include "environment.h" -#include "artifactory.h" -#include "docker.h" -#include "delivery.h" -#include "str.h" -#include "strlist.h" -#include "system.h" -#include "download.h" -#include "recipe.h" -#include "relocation.h" -#include "wheel.h" -#include "junitxml.h" -#include "github.h" -#include "template_func_proto.h" #define COE_CHECK_ABORT(COND, MSG) \ do {\ diff --git a/include/core_mem.h b/include/core_mem.h index 87a2a2f..bd50e9d 100644 --- a/include/core_mem.h +++ b/include/core_mem.h @@ -2,6 +2,9 @@ #ifndef STASIS_CORE_MEM_H #define STASIS_CORE_MEM_H +#include "environment.h" +#include "strlist.h" + #define guard_runtime_free(X) do { if (X) { runtime_free(X); X = NULL; } } while (0) #define guard_strlist_free(X) do { if ((*X)) { strlist_free(X); (*X) = NULL; } } while (0) #define guard_free(X) do { if (X) { free(X); X = NULL; } } while (0) diff --git a/include/delivery.h b/include/delivery.h index 15cde13..bd5137c 100644 --- a/include/delivery.h +++ b/include/delivery.h @@ -10,6 +10,15 @@ #include <fnmatch.h> #include <sys/statvfs.h> #include "core.h" +#include "copy.h" +#include "environment.h" +#include "conda.h" +#include "ini.h" +#include "artifactory.h" +#include "docker.h" +#include "wheel.h" +#include "multiprocessing.h" +#include "recipe.h" #define DELIVERY_PLATFORM_MAX 4 #define DELIVERY_PLATFORM_MAXLEN 65 diff --git a/include/docker.h b/include/docker.h index ff8a8d5..7585d86 100644 --- a/include/docker.h +++ b/include/docker.h @@ -2,6 +2,8 @@ #ifndef STASIS_DOCKER_H #define STASIS_DOCKER_H +#include "core.h" + //! Flag to squelch output from docker_exec() #define STASIS_DOCKER_QUIET 1 << 1 diff --git a/include/download.h b/include/download.h index 058812e..0b6311e 100644 --- a/include/download.h +++ b/include/download.h @@ -2,6 +2,8 @@ #ifndef STASIS_DOWNLOAD_H #define STASIS_DOWNLOAD_H +#include <stdlib.h> +#include <string.h> #include <curl/curl.h> size_t download_writer(void *fp, size_t size, size_t nmemb, void *stream); diff --git a/include/envctl.h b/include/envctl.h index 1536938..659cae3 100644 --- a/include/envctl.h +++ b/include/envctl.h @@ -3,6 +3,7 @@ #define STASIS_ENVCTL_H #include <stdlib.h> +#include "core.h" #define STASIS_ENVCTL_PASSTHRU 0 #define STASIS_ENVCTL_REQUIRED 1 << 1 diff --git a/include/ini.h b/include/ini.h index 3d0565b..557f157 100644 --- a/include/ini.h +++ b/include/ini.h @@ -5,6 +5,7 @@ #include <stdio.h> #include <stddef.h> #include <stdbool.h> +#include "template.h" #define INI_WRITE_RAW 0 ///< Dump INI data. Contents are not modified. #define INI_WRITE_PRESERVE 1 ///< Dump INI data. Template strings are diff --git a/include/package.h b/include/package.h new file mode 100644 index 0000000..eff1874 --- /dev/null +++ b/include/package.h @@ -0,0 +1,30 @@ +#ifndef STASIS_PACKAGE_H +#define STASIS_PACKAGE_H + +struct Package { + struct { + const char *name; + const char *version_spec; + const char *version; + } meta; + struct { + const char *uri; + unsigned handler; + } source; + struct { + struct Test *test; + size_t pass; + size_t fail; + size_t skip; + }; + unsigned state; +}; + +struct Package *stasis_package_init(void); +void stasis_package_set_name(struct Package *pkg, const char *name); +void stasis_package_set_version(struct Package *pkg, const char *version); +void stasis_package_set_version_spec(struct Package *pkg, const char *version_spec); +void stasis_package_set_uri(struct Package *pkg, const char *uri); +void stasis_package_set_handler(struct Package *pkg, unsigned handler); + +#endif //STASIS_PACKAGE_H diff --git a/include/str.h b/include/str.h index 4cf221d..7254225 100644 --- a/include/str.h +++ b/include/str.h @@ -9,6 +9,7 @@ #include <string.h> #include <stdarg.h> #include <ctype.h> +#include "relocation.h" #include "core.h" #define STASIS_SORT_ALPHA 1 << 0 diff --git a/include/strlist.h b/include/strlist.h index dd22a0a..cdbfc01 100644 --- a/include/strlist.h +++ b/include/strlist.h @@ -4,10 +4,15 @@ */ #ifndef STASIS_STRLIST_H #define STASIS_STRLIST_H + +typedef int (ReaderFn)(size_t line, char **); + #include <stdlib.h> +#include "core.h" #include "utils.h" #include "str.h" + struct StrList { size_t num_alloc; size_t num_inuse; diff --git a/include/utils.h b/include/utils.h index 4f7c3a4..4ade817 100644 --- a/include/utils.h +++ b/include/utils.h @@ -8,7 +8,12 @@ #include <unistd.h> #include <limits.h> #include <errno.h> +#include "core.h" +#include "copy.h" #include "system.h" +#include "strlist.h" +#include "utils.h" +#include "ini.h" #if defined(STASIS_OS_WINDOWS) #define PATH_ENV_VAR "path" @@ -25,8 +30,6 @@ #define STASIS_XML_PRETTY_PRINT_PROG "xmllint" #define STASIS_XML_PRETTY_PRINT_ARGS "--format" -typedef int (ReaderFn)(size_t line, char **); - /** * Change directory. Push path on directory stack. * diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5c5bc6e..bfee276 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -2,49 +2,6 @@ include_directories(${CMAKE_BINARY_DIR}/include) include_directories(${CMAKE_SOURCE_DIR}/include) include_directories(${PROJECT_BINARY_DIR}) -add_library(stasis_core STATIC - globals.c - str.c - strlist.c - ini.c - conda.c - environment.c - utils.c - system.c - download.c - delivery_postprocess.c - delivery_conda.c - delivery_docker.c - delivery_install.c - delivery_artifactory.c - delivery_test.c - delivery_build.c - delivery_show.c - delivery_populate.c - delivery_init.c - delivery.c - recipe.c - relocation.c - wheel.c - copy.c - artifactory.c - template.c - rules.c - docker.c - junitxml.c - github.c - template_func_proto.c - envctl.c - multiprocessing.c -) +add_subdirectory(lib) +add_subdirectory(cli) -add_executable(stasis - stasis_main.c -) -target_link_libraries(stasis PRIVATE stasis_core) -target_link_libraries(stasis PUBLIC LibXml2::LibXml2) -add_executable(stasis_indexer - stasis_indexer.c -) -target_link_libraries(stasis_indexer PRIVATE stasis_core) -install(TARGETS stasis stasis_indexer RUNTIME) diff --git a/src/cli/CMakeLists.txt b/src/cli/CMakeLists.txt new file mode 100644 index 0000000..92a21b7 --- /dev/null +++ b/src/cli/CMakeLists.txt @@ -0,0 +1,2 @@ +add_subdirectory(stasis) +add_subdirectory(stasis_indexer)
\ No newline at end of file diff --git a/src/cli/stasis/CMakeLists.txt b/src/cli/stasis/CMakeLists.txt new file mode 100644 index 0000000..ff7fd88 --- /dev/null +++ b/src/cli/stasis/CMakeLists.txt @@ -0,0 +1,12 @@ +include_directories(${CMAKE_SOURCE_DIR}) +add_executable(stasis + stasis_main.c + args.c + callbacks.c + system_requirements.c + tpl.c +) +target_link_libraries(stasis PRIVATE stasis_core) +target_link_libraries(stasis PUBLIC LibXml2::LibXml2) + +install(TARGETS stasis RUNTIME) diff --git a/src/cli/stasis/args.c b/src/cli/stasis/args.c new file mode 100644 index 0000000..ed11ab9 --- /dev/null +++ b/src/cli/stasis/args.c @@ -0,0 +1,102 @@ +#include "core.h" +#include "args.h" + +struct option long_options[] = { + {"help", no_argument, 0, 'h'}, + {"version", no_argument, 0, 'V'}, + {"continue-on-error", no_argument, 0, 'C'}, + {"config", required_argument, 0, 'c'}, + {"cpu-limit", required_argument, 0, 'l'}, + {"pool-status-interval", required_argument, 0, OPT_POOL_STATUS_INTERVAL}, + {"python", required_argument, 0, 'p'}, + {"verbose", no_argument, 0, 'v'}, + {"unbuffered", no_argument, 0, 'U'}, + {"update-base", no_argument, 0, OPT_ALWAYS_UPDATE_BASE}, + {"fail-fast", no_argument, 0, OPT_FAIL_FAST}, + {"overwrite", no_argument, 0, OPT_OVERWRITE}, + {"no-docker", no_argument, 0, OPT_NO_DOCKER}, + {"no-artifactory", no_argument, 0, OPT_NO_ARTIFACTORY}, + {"no-artifactory-build-info", no_argument, 0, OPT_NO_ARTIFACTORY_BUILD_INFO}, + {"no-testing", no_argument, 0, OPT_NO_TESTING}, + {"no-parallel", no_argument, 0, OPT_NO_PARALLEL}, + {"no-rewrite", no_argument, 0, OPT_NO_REWRITE_SPEC_STAGE_2}, + {0, 0, 0, 0}, +}; + +const char *long_options_help[] = { + "Display this usage statement", + "Display program version", + "Allow tests to fail", + "Read configuration file", + "Number of processes to spawn concurrently (default: cpus - 1)", + "Report task status every n seconds (default: 30)", + "Override version of Python in configuration", + "Increase output verbosity", + "Disable line buffering", + "Update conda installation prior to STASIS environment creation", + "On error, immediately terminate all tasks", + "Overwrite an existing release", + "Do not build docker images", + "Do not upload artifacts to Artifactory", + "Do not upload build info objects to Artifactory", + "Do not execute test scripts", + "Do not execute tests in parallel", + "Do not rewrite paths and URLs in output files", + NULL, +}; + +static int get_option_max_width(struct option option[]) { + int i = 0; + int max = 0; + const int indent = 4; + while (option[i].name != 0) { + int len = (int) strlen(option[i].name); + if (option[i].has_arg) { + len += indent; + } + if (len > max) { + max = len; + } + i++; + } + return max; +} + +void usage(char *progname) { + printf("usage: %s ", progname); + printf("[-"); + for (int x = 0; long_options[x].val != 0; x++) { + if (long_options[x].has_arg == no_argument && long_options[x].val <= 'z') { + putchar(long_options[x].val); + } + } + printf("] {DELIVERY_FILE}\n"); + + int width = get_option_max_width(long_options); + for (int x = 0; long_options[x].name != 0; x++) { + char tmp[STASIS_NAME_MAX] = {0}; + char output[sizeof(tmp)] = {0}; + char opt_long[50] = {0}; // --? [ARG]? + char opt_short[50] = {0}; // -? [ARG]? + + strcat(opt_long, "--"); + strcat(opt_long, long_options[x].name); + if (long_options[x].has_arg) { + strcat(opt_long, " ARG"); + } + + if (long_options[x].val <= 'z') { + strcat(opt_short, "-"); + opt_short[1] = (char) long_options[x].val; + if (long_options[x].has_arg) { + strcat(opt_short, " ARG"); + } + } else { + strcat(opt_short, " "); + } + + sprintf(tmp, " %%-%ds\t%%s\t\t%%s", width + 4); + sprintf(output, tmp, opt_long, opt_short, long_options_help[x]); + puts(output); + } +} diff --git a/src/cli/stasis/args.h b/src/cli/stasis/args.h new file mode 100644 index 0000000..932eac7 --- /dev/null +++ b/src/cli/stasis/args.h @@ -0,0 +1,23 @@ +#ifndef STASIS_ARGS_H +#define STASIS_ARGS_H + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> + +#define OPT_ALWAYS_UPDATE_BASE 1000 +#define OPT_NO_DOCKER 1001 +#define OPT_NO_ARTIFACTORY 1002 +#define OPT_NO_ARTIFACTORY_BUILD_INFO 1003 +#define OPT_NO_TESTING 1004 +#define OPT_OVERWRITE 1005 +#define OPT_NO_REWRITE_SPEC_STAGE_2 1006 +#define OPT_FAIL_FAST 1007 +#define OPT_NO_PARALLEL 1008 +#define OPT_POOL_STATUS_INTERVAL 1009 + +extern struct option long_options[]; +void usage(char *progname); + +#endif //STASIS_ARGS_H diff --git a/src/cli/stasis/callbacks.c b/src/cli/stasis/callbacks.c new file mode 100644 index 0000000..aeaa25d --- /dev/null +++ b/src/cli/stasis/callbacks.c @@ -0,0 +1,31 @@ +#include "callbacks.h" + +int callback_except_jf(const void *a, const void *b) { + const struct EnvCtl_Item *item = a; + const char *name = b; + + if (!globals.enable_artifactory) { + return STASIS_ENVCTL_RET_IGNORE; + } + + if (envctl_check_required(item->flags)) { + const char *content = getenv(name); + if (!content || isempty((char *) content)) { + return STASIS_ENVCTL_RET_FAIL; + } + } + + return STASIS_ENVCTL_RET_SUCCESS; +} + +int callback_except_gh(const void *a, const void *b) { + const struct EnvCtl_Item *item = a; + const char *name = b; + //printf("GH exception check: %s\n", name); + if (envctl_check_required(item->flags) && envctl_check_present(item, name)) { + return STASIS_ENVCTL_RET_SUCCESS; + } + + return STASIS_ENVCTL_RET_FAIL; +} + diff --git a/src/cli/stasis/callbacks.h b/src/cli/stasis/callbacks.h new file mode 100644 index 0000000..369ce56 --- /dev/null +++ b/src/cli/stasis/callbacks.h @@ -0,0 +1,10 @@ +#ifndef STASIS_CALLBACKS_H +#define STASIS_CALLBACKS_H + +#include "core.h" +#include "envctl.h" + +int callback_except_jf(const void *a, const void *b); +int callback_except_gh(const void *a, const void *b); + +#endif //STASIS_CALLBACKS_H diff --git a/src/stasis_main.c b/src/cli/stasis/stasis_main.c index eecc419..5325892 100644 --- a/src/stasis_main.c +++ b/src/cli/stasis/stasis_main.c @@ -2,215 +2,14 @@ #include <stdlib.h> #include <string.h> #include <limits.h> -#include <getopt.h> #include "core.h" +#include "delivery.h" -#define OPT_ALWAYS_UPDATE_BASE 1000 -#define OPT_NO_DOCKER 1001 -#define OPT_NO_ARTIFACTORY 1002 -#define OPT_NO_ARTIFACTORY_BUILD_INFO 1003 -#define OPT_NO_TESTING 1004 -#define OPT_OVERWRITE 1005 -#define OPT_NO_REWRITE_SPEC_STAGE_2 1006 -#define OPT_FAIL_FAST 1007 -#define OPT_NO_PARALLEL 1008 -#define OPT_POOL_STATUS_INTERVAL 1009 - -static struct option long_options[] = { - {"help", no_argument, 0, 'h'}, - {"version", no_argument, 0, 'V'}, - {"continue-on-error", no_argument, 0, 'C'}, - {"config", required_argument, 0, 'c'}, - {"cpu-limit", required_argument, 0, 'l'}, - {"pool-status-interval", required_argument, 0, OPT_POOL_STATUS_INTERVAL}, - {"python", required_argument, 0, 'p'}, - {"verbose", no_argument, 0, 'v'}, - {"unbuffered", no_argument, 0, 'U'}, - {"update-base", no_argument, 0, OPT_ALWAYS_UPDATE_BASE}, - {"fail-fast", no_argument, 0, OPT_FAIL_FAST}, - {"overwrite", no_argument, 0, OPT_OVERWRITE}, - {"no-docker", no_argument, 0, OPT_NO_DOCKER}, - {"no-artifactory", no_argument, 0, OPT_NO_ARTIFACTORY}, - {"no-artifactory-build-info", no_argument, 0, OPT_NO_ARTIFACTORY_BUILD_INFO}, - {"no-testing", no_argument, 0, OPT_NO_TESTING}, - {"no-parallel", no_argument, 0, OPT_NO_PARALLEL}, - {"no-rewrite", no_argument, 0, OPT_NO_REWRITE_SPEC_STAGE_2}, - {0, 0, 0, 0}, -}; - -const char *long_options_help[] = { - "Display this usage statement", - "Display program version", - "Allow tests to fail", - "Read configuration file", - "Number of processes to spawn concurrently (default: cpus - 1)", - "Report task status every n seconds (default: 30)", - "Override version of Python in configuration", - "Increase output verbosity", - "Disable line buffering", - "Update conda installation prior to STASIS environment creation", - "On error, immediately terminate all tasks", - "Overwrite an existing release", - "Do not build docker images", - "Do not upload artifacts to Artifactory", - "Do not upload build info objects to Artifactory", - "Do not execute test scripts", - "Do not execute tests in parallel", - "Do not rewrite paths and URLs in output files", - NULL, -}; - -static int get_option_max_width(struct option option[]) { - int i = 0; - int max = 0; - const int indent = 4; - while (option[i].name != 0) { - int len = (int) strlen(option[i].name); - if (option[i].has_arg) { - len += indent; - } - if (len > max) { - max = len; - } - i++; - } - return max; -} - -static void usage(char *progname) { - printf("usage: %s ", progname); - printf("[-"); - for (int x = 0; long_options[x].val != 0; x++) { - if (long_options[x].has_arg == no_argument && long_options[x].val <= 'z') { - putchar(long_options[x].val); - } - } - printf("] {DELIVERY_FILE}\n"); +// local includes +#include "args.h" +#include "system_requirements.h" +#include "tpl.h" - int width = get_option_max_width(long_options); - for (int x = 0; long_options[x].name != 0; x++) { - char tmp[STASIS_NAME_MAX] = {0}; - char output[sizeof(tmp)] = {0}; - char opt_long[50] = {0}; // --? [ARG]? - char opt_short[50] = {0}; // -? [ARG]? - - strcat(opt_long, "--"); - strcat(opt_long, long_options[x].name); - if (long_options[x].has_arg) { - strcat(opt_long, " ARG"); - } - - if (long_options[x].val <= 'z') { - strcat(opt_short, "-"); - opt_short[1] = (char) long_options[x].val; - if (long_options[x].has_arg) { - strcat(opt_short, " ARG"); - } - } else { - strcat(opt_short, " "); - } - - sprintf(tmp, " %%-%ds\t%%s\t\t%%s", width + 4); - sprintf(output, tmp, opt_long, opt_short, long_options_help[x]); - puts(output); - } -} - -static int callback_except_jf(const void *a, const void *b) { - const struct EnvCtl_Item *item = a; - const char *name = b; - - if (!globals.enable_artifactory) { - return STASIS_ENVCTL_RET_IGNORE; - } - - if (envctl_check_required(item->flags)) { - const char *content = getenv(name); - if (!content || isempty((char *) content)) { - return STASIS_ENVCTL_RET_FAIL; - } - } - - return STASIS_ENVCTL_RET_SUCCESS; -} - -static int callback_except_gh(const void *a, const void *b) { - const struct EnvCtl_Item *item = a; - const char *name = b; - //printf("GH exception check: %s\n", name); - if (envctl_check_required(item->flags) && envctl_check_present(item, name)) { - return STASIS_ENVCTL_RET_SUCCESS; - } - - return STASIS_ENVCTL_RET_FAIL; -} - -static void check_system_env_requirements() { - msg(STASIS_MSG_L1, "Checking environment\n"); - globals.envctl = envctl_init(); - envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "TMPDIR"); - envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_ROOT"); - envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_SYSCONFDIR"); - envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_CPU_COUNT"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REQUIRED | STASIS_ENVCTL_REDACT, callback_except_gh, "STASIS_GH_TOKEN"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REQUIRED, callback_except_jf, "STASIS_JF_ARTIFACTORY_URL"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_ACCESS_TOKEN"); - envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_JF_USER"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_PASSWORD"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_SSH_KEY_PATH"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_SSH_PASSPHRASE"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_CLIENT_CERT_CERT_PATH"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_CLIENT_CERT_KEY_PATH"); - envctl_register(&globals.envctl, STASIS_ENVCTL_REQUIRED, callback_except_jf, "STASIS_JF_REPO"); - envctl_do_required(globals.envctl, globals.verbose); -} - -static void check_system_requirements(struct Delivery *ctx) { - const char *tools_required[] = { - "rsync", - NULL, - }; - - msg(STASIS_MSG_L1, "Checking system requirements\n"); - for (size_t i = 0; tools_required[i] != NULL; i++) { - if (!find_program(tools_required[i])) { - msg(STASIS_MSG_L2 | STASIS_MSG_ERROR, "'%s' must be installed.\n", tools_required[i]); - exit(1); - } - } - - if (!globals.tmpdir && !ctx->storage.tmpdir) { - delivery_init_tmpdir(ctx); - } - - struct DockerCapabilities dcap; - if (!docker_capable(&dcap)) { - msg(STASIS_MSG_L2 | STASIS_MSG_WARN, "Docker is broken\n"); - msg(STASIS_MSG_L3, "Available: %s\n", dcap.available ? "Yes" : "No"); - msg(STASIS_MSG_L3, "Usable: %s\n", dcap.usable ? "Yes" : "No"); - msg(STASIS_MSG_L3, "Podman [Docker Emulation]: %s\n", dcap.podman ? "Yes" : "No"); - msg(STASIS_MSG_L3, "Build plugin(s): "); - if (dcap.usable) { - if (dcap.build & STASIS_DOCKER_BUILD) { - printf("build "); - } - if (dcap.build & STASIS_DOCKER_BUILD_X) { - printf("buildx "); - } - puts(""); - } else { - printf("N/A\n"); - } - - // disable docker builds - globals.enable_docker = false; - } -} - -static void check_requirements(struct Delivery *ctx) { - check_system_requirements(ctx); - check_system_env_requirements(); -} int main(int argc, char *argv[]) { struct Delivery ctx; @@ -336,45 +135,8 @@ int main(int argc, char *argv[]) { msg(STASIS_MSG_L1, "Setup\n"); - // Expose variables for use with the template engine - // NOTE: These pointers are populated by delivery_init() so please avoid using - // tpl_render() until then. - tpl_register("meta.name", &ctx.meta.name); - tpl_register("meta.version", &ctx.meta.version); - tpl_register("meta.codename", &ctx.meta.codename); - tpl_register("meta.mission", &ctx.meta.mission); - tpl_register("meta.python", &ctx.meta.python); - tpl_register("meta.python_compact", &ctx.meta.python_compact); - tpl_register("info.time_str_epoch", &ctx.info.time_str_epoch); - tpl_register("info.release_name", &ctx.info.release_name); - tpl_register("info.build_name", &ctx.info.build_name); - tpl_register("info.build_number", &ctx.info.build_number); - tpl_register("storage.tmpdir", &ctx.storage.tmpdir); - tpl_register("storage.output_dir", &ctx.storage.output_dir); - tpl_register("storage.delivery_dir", &ctx.storage.delivery_dir); - tpl_register("storage.conda_artifact_dir", &ctx.storage.conda_artifact_dir); - tpl_register("storage.wheel_artifact_dir", &ctx.storage.wheel_artifact_dir); - tpl_register("storage.build_sources_dir", &ctx.storage.build_sources_dir); - tpl_register("storage.build_docker_dir", &ctx.storage.build_docker_dir); - tpl_register("storage.results_dir", &ctx.storage.results_dir); - tpl_register("storage.tools_dir", &ctx.storage.tools_dir); - tpl_register("conda.installer_baseurl", &ctx.conda.installer_baseurl); - tpl_register("conda.installer_name", &ctx.conda.installer_name); - tpl_register("conda.installer_version", &ctx.conda.installer_version); - tpl_register("conda.installer_arch", &ctx.conda.installer_arch); - tpl_register("conda.installer_platform", &ctx.conda.installer_platform); - tpl_register("deploy.jfrog.repo", &globals.jfrog.repo); - tpl_register("deploy.jfrog.url", &globals.jfrog.url); - tpl_register("deploy.docker.registry", &ctx.deploy.docker.registry); - tpl_register("workaround.conda_reactivate", &globals.workaround.conda_reactivate); - - // Expose function(s) to the template engine - // Prototypes can be found in template_func_proto.h - tpl_register_func("get_github_release_notes", &get_github_release_notes_tplfunc_entrypoint, 3, NULL); - tpl_register_func("get_github_release_notes_auto", &get_github_release_notes_auto_tplfunc_entrypoint, 1, &ctx); - tpl_register_func("junitxml_file", &get_junitxml_file_entrypoint, 1, &ctx); - tpl_register_func("basetemp_dir", &get_basetemp_dir_entrypoint, 1, &ctx); - tpl_register_func("tox_run", &tox_run_entrypoint, 2, &ctx); + tpl_setup_vars(&ctx); + tpl_setup_funcs(&ctx); // Set up PREFIX/etc directory information // The user may manipulate the base directory path with STASIS_SYSCONFDIR @@ -482,19 +244,7 @@ int main(int argc, char *argv[]) { msg(STASIS_MSG_L2, "Configuring: %s\n", ctx.storage.conda_install_prefix); delivery_conda_enable(&ctx, ctx.storage.conda_install_prefix); - - char *pathvar = NULL; - pathvar = getenv("PATH"); - if (!pathvar) { - msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "PATH variable is not set. Cannot continue.\n"); - exit(1); - } else { - char pathvar_tmp[STASIS_BUFSIZ]; - sprintf(pathvar_tmp, "%s/bin:%s", ctx.storage.conda_install_prefix, pathvar); - setenv("PATH", pathvar_tmp, 1); - pathvar = NULL; - } - + check_pathvar(&ctx); // // Implied environment creation modes/actions diff --git a/src/cli/stasis/system_requirements.c b/src/cli/stasis/system_requirements.c new file mode 100644 index 0000000..4554b93 --- /dev/null +++ b/src/cli/stasis/system_requirements.c @@ -0,0 +1,82 @@ +#include "system_requirements.h" + +void check_system_env_requirements() { + msg(STASIS_MSG_L1, "Checking environment\n"); + globals.envctl = envctl_init(); + envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "TMPDIR"); + envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_ROOT"); + envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_SYSCONFDIR"); + envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_CPU_COUNT"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REQUIRED | STASIS_ENVCTL_REDACT, callback_except_gh, "STASIS_GH_TOKEN"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REQUIRED, callback_except_jf, "STASIS_JF_ARTIFACTORY_URL"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_ACCESS_TOKEN"); + envctl_register(&globals.envctl, STASIS_ENVCTL_PASSTHRU, NULL, "STASIS_JF_USER"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_PASSWORD"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_SSH_KEY_PATH"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_SSH_PASSPHRASE"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_CLIENT_CERT_CERT_PATH"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REDACT, NULL, "STASIS_JF_CLIENT_CERT_KEY_PATH"); + envctl_register(&globals.envctl, STASIS_ENVCTL_REQUIRED, callback_except_jf, "STASIS_JF_REPO"); + envctl_do_required(globals.envctl, globals.verbose); +} + +void check_system_requirements(struct Delivery *ctx) { + const char *tools_required[] = { + "rsync", + NULL, + }; + + msg(STASIS_MSG_L1, "Checking system requirements\n"); + for (size_t i = 0; tools_required[i] != NULL; i++) { + if (!find_program(tools_required[i])) { + msg(STASIS_MSG_L2 | STASIS_MSG_ERROR, "'%s' must be installed.\n", tools_required[i]); + exit(1); + } + } + + if (!globals.tmpdir && !ctx->storage.tmpdir) { + delivery_init_tmpdir(ctx); + } + + struct DockerCapabilities dcap; + if (!docker_capable(&dcap)) { + msg(STASIS_MSG_L2 | STASIS_MSG_WARN, "Docker is broken\n"); + msg(STASIS_MSG_L3, "Available: %s\n", dcap.available ? "Yes" : "No"); + msg(STASIS_MSG_L3, "Usable: %s\n", dcap.usable ? "Yes" : "No"); + msg(STASIS_MSG_L3, "Podman [Docker Emulation]: %s\n", dcap.podman ? "Yes" : "No"); + msg(STASIS_MSG_L3, "Build plugin(s): "); + if (dcap.usable) { + if (dcap.build & STASIS_DOCKER_BUILD) { + printf("build "); + } + if (dcap.build & STASIS_DOCKER_BUILD_X) { + printf("buildx "); + } + puts(""); + } else { + printf("N/A\n"); + } + + // disable docker builds + globals.enable_docker = false; + } +} + +void check_requirements(struct Delivery *ctx) { + check_system_requirements(ctx); + check_system_env_requirements(); +} + +char *check_pathvar(struct Delivery *ctx) { + char *pathvar = NULL; + pathvar = getenv("PATH"); + if (!pathvar) { + msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "PATH variable is not set. Cannot continue.\n"); + exit(1); + } else { + char pathvar_tmp[STASIS_BUFSIZ]; + sprintf(pathvar_tmp, "%s/bin:%s", ctx->storage.conda_install_prefix, pathvar); + setenv("PATH", pathvar_tmp, 1); + pathvar = NULL; + } +}
\ No newline at end of file diff --git a/src/cli/stasis/system_requirements.h b/src/cli/stasis/system_requirements.h new file mode 100644 index 0000000..4c2231a --- /dev/null +++ b/src/cli/stasis/system_requirements.h @@ -0,0 +1,13 @@ +#ifndef STASIS_SYSTEM_REQUIREMENTS_H +#define STASIS_SYSTEM_REQUIREMENTS_H + +#include "delivery.h" +#include "callbacks.h" +#include "envctl.h" + +void check_system_env_requirements(); +void check_system_requirements(struct Delivery *ctx); +void check_requirements(struct Delivery *ctx); +char *check_pathvar(struct Delivery *ctx); + +#endif //STASIS_SYSTEM_REQUIREMENTS_H diff --git a/src/cli/stasis/tpl.c b/src/cli/stasis/tpl.c new file mode 100644 index 0000000..08eb1f3 --- /dev/null +++ b/src/cli/stasis/tpl.c @@ -0,0 +1,46 @@ +#include "delivery.h" +#include "tpl.h" + +void tpl_setup_vars(struct Delivery *ctx) { + // Expose variables for use with the template engine + // NOTE: These pointers are populated by delivery_init() so please avoid using + // tpl_render() until then. + tpl_register("meta.name", &ctx->meta.name); + tpl_register("meta.version", &ctx->meta.version); + tpl_register("meta.codename", &ctx->meta.codename); + tpl_register("meta.mission", &ctx->meta.mission); + tpl_register("meta.python", &ctx->meta.python); + tpl_register("meta.python_compact", &ctx->meta.python_compact); + tpl_register("info.time_str_epoch", &ctx->info.time_str_epoch); + tpl_register("info.release_name", &ctx->info.release_name); + tpl_register("info.build_name", &ctx->info.build_name); + tpl_register("info.build_number", &ctx->info.build_number); + tpl_register("storage.tmpdir", &ctx->storage.tmpdir); + tpl_register("storage.output_dir", &ctx->storage.output_dir); + tpl_register("storage.delivery_dir", &ctx->storage.delivery_dir); + tpl_register("storage.conda_artifact_dir", &ctx->storage.conda_artifact_dir); + tpl_register("storage.wheel_artifact_dir", &ctx->storage.wheel_artifact_dir); + tpl_register("storage.build_sources_dir", &ctx->storage.build_sources_dir); + tpl_register("storage.build_docker_dir", &ctx->storage.build_docker_dir); + tpl_register("storage.results_dir", &ctx->storage.results_dir); + tpl_register("storage.tools_dir", &ctx->storage.tools_dir); + tpl_register("conda.installer_baseurl", &ctx->conda.installer_baseurl); + tpl_register("conda.installer_name", &ctx->conda.installer_name); + tpl_register("conda.installer_version", &ctx->conda.installer_version); + tpl_register("conda.installer_arch", &ctx->conda.installer_arch); + tpl_register("conda.installer_platform", &ctx->conda.installer_platform); + tpl_register("deploy.jfrog.repo", &globals.jfrog.repo); + tpl_register("deploy.jfrog.url", &globals.jfrog.url); + tpl_register("deploy.docker.registry", &ctx->deploy.docker.registry); + tpl_register("workaround.conda_reactivate", &globals.workaround.conda_reactivate); +} + +void tpl_setup_funcs(struct Delivery *ctx) { + // Expose function(s) to the template engine + // Prototypes can be found in template_func_proto.h + tpl_register_func("get_github_release_notes", &get_github_release_notes_tplfunc_entrypoint, 3, NULL); + tpl_register_func("get_github_release_notes_auto", &get_github_release_notes_auto_tplfunc_entrypoint, 1, ctx); + tpl_register_func("junitxml_file", &get_junitxml_file_entrypoint, 1, ctx); + tpl_register_func("basetemp_dir", &get_basetemp_dir_entrypoint, 1, ctx); + tpl_register_func("tox_run", &tox_run_entrypoint, 2, ctx); +}
\ No newline at end of file diff --git a/src/cli/stasis/tpl.h b/src/cli/stasis/tpl.h new file mode 100644 index 0000000..398f0fe --- /dev/null +++ b/src/cli/stasis/tpl.h @@ -0,0 +1,10 @@ +#ifndef STASIS_TPL_H +#define STASIS_TPL_H + +#include "template.h" +#include "template_func_proto.h" + +void tpl_setup_vars(struct Delivery *ctx); +void tpl_setup_funcs(struct Delivery *ctx); + +#endif //STASIS_TPL_H diff --git a/src/cli/stasis_indexer/CMakeLists.txt b/src/cli/stasis_indexer/CMakeLists.txt new file mode 100644 index 0000000..eae1394 --- /dev/null +++ b/src/cli/stasis_indexer/CMakeLists.txt @@ -0,0 +1,6 @@ +add_executable(stasis_indexer + stasis_indexer.c +) +target_link_libraries(stasis_indexer PRIVATE stasis_core) + +install(TARGETS stasis_indexer RUNTIME) diff --git a/src/stasis_indexer.c b/src/cli/stasis_indexer/stasis_indexer.c index 05b9e39..bd59920 100644 --- a/src/stasis_indexer.c +++ b/src/cli/stasis_indexer/stasis_indexer.c @@ -1,6 +1,7 @@ #include <getopt.h> #include <fnmatch.h> -#include "core.h" +#include "delivery.h" +#include "junitxml.h" static struct option long_options[] = { {"help", no_argument, 0, 'h'}, diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt new file mode 100644 index 0000000..82bfe4a --- /dev/null +++ b/src/lib/CMakeLists.txt @@ -0,0 +1 @@ +add_subdirectory(core)
\ No newline at end of file diff --git a/src/lib/core/CMakeLists.txt b/src/lib/core/CMakeLists.txt new file mode 100644 index 0000000..c569187 --- /dev/null +++ b/src/lib/core/CMakeLists.txt @@ -0,0 +1,38 @@ +include_directories(${PROJECT_BINARY_DIR}) + +add_library(stasis_core STATIC + globals.c + str.c + strlist.c + ini.c + conda.c + environment.c + utils.c + system.c + download.c + delivery_postprocess.c + delivery_conda.c + delivery_docker.c + delivery_install.c + delivery_artifactory.c + delivery_test.c + delivery_build.c + delivery_show.c + delivery_populate.c + delivery_init.c + delivery.c + recipe.c + relocation.c + wheel.c + copy.c + artifactory.c + template.c + rules.c + docker.c + junitxml.c + github.c + template_func_proto.c + envctl.c + multiprocessing.c +) + diff --git a/src/artifactory.c b/src/lib/core/artifactory.c index 6c4079a..6b9635d 100644 --- a/src/artifactory.c +++ b/src/lib/core/artifactory.c @@ -1,4 +1,4 @@ -#include "core.h" +#include "artifactory.h" extern struct STASIS_GLOBAL globals; diff --git a/src/conda.c b/src/lib/core/conda.c index e60abc7..35caf02 100644 --- a/src/conda.c +++ b/src/lib/core/conda.c @@ -2,7 +2,6 @@ // Created by jhunk on 5/14/23. // -#include <unistd.h> #include "conda.h" int micromamba(struct MicromambaInfo *info, char *command, ...) { diff --git a/src/copy.c b/src/lib/core/copy.c index f69a756..f69a756 100644 --- a/src/copy.c +++ b/src/lib/core/copy.c diff --git a/src/delivery.c b/src/lib/core/delivery.c index 07e04c8..e32ed4c 100644 --- a/src/delivery.c +++ b/src/lib/core/delivery.c @@ -1,4 +1,4 @@ -#include "core.h" +#include "delivery.h" void delivery_free(struct Delivery *ctx) { guard_free(ctx->system.arch); diff --git a/src/delivery_artifactory.c b/src/lib/core/delivery_artifactory.c index 27f4823..27f4823 100644 --- a/src/delivery_artifactory.c +++ b/src/lib/core/delivery_artifactory.c diff --git a/src/delivery_build.c b/src/lib/core/delivery_build.c index 3777a4c..b4d610a 100644 --- a/src/delivery_build.c +++ b/src/lib/core/delivery_build.c @@ -1,4 +1,3 @@ -#include <fnmatch.h> #include "delivery.h" int delivery_build_recipes(struct Delivery *ctx) { diff --git a/src/delivery_conda.c b/src/lib/core/delivery_conda.c index 93a06fc..93a06fc 100644 --- a/src/delivery_conda.c +++ b/src/lib/core/delivery_conda.c diff --git a/src/delivery_docker.c b/src/lib/core/delivery_docker.c index e1d7f60..e1d7f60 100644 --- a/src/delivery_docker.c +++ b/src/lib/core/delivery_docker.c diff --git a/src/delivery_init.c b/src/lib/core/delivery_init.c index e914f99..e914f99 100644 --- a/src/delivery_init.c +++ b/src/lib/core/delivery_init.c diff --git a/src/delivery_install.c b/src/lib/core/delivery_install.c index 76c3f4a..76c3f4a 100644 --- a/src/delivery_install.c +++ b/src/lib/core/delivery_install.c diff --git a/src/delivery_populate.c b/src/lib/core/delivery_populate.c index b37f677..b37f677 100644 --- a/src/delivery_populate.c +++ b/src/lib/core/delivery_populate.c diff --git a/src/delivery_postprocess.c b/src/lib/core/delivery_postprocess.c index 1a902e3..1a902e3 100644 --- a/src/delivery_postprocess.c +++ b/src/lib/core/delivery_postprocess.c diff --git a/src/delivery_show.c b/src/lib/core/delivery_show.c index adfa1be..adfa1be 100644 --- a/src/delivery_show.c +++ b/src/lib/core/delivery_show.c diff --git a/src/delivery_test.c b/src/lib/core/delivery_test.c index cb78f64..cb78f64 100644 --- a/src/delivery_test.c +++ b/src/lib/core/delivery_test.c diff --git a/src/docker.c b/src/lib/core/docker.c index 2d5e2cc..5834ef9 100644 --- a/src/docker.c +++ b/src/lib/core/docker.c @@ -1,4 +1,3 @@ -#include "core.h" #include "docker.h" diff --git a/src/download.c b/src/lib/core/download.c index f83adda..bfb323e 100644 --- a/src/download.c +++ b/src/lib/core/download.c @@ -2,8 +2,6 @@ // Created by jhunk on 10/5/23. // -#include <string.h> -#include <stdlib.h> #include "download.h" size_t download_writer(void *fp, size_t size, size_t nmemb, void *stream) { diff --git a/src/envctl.c b/src/lib/core/envctl.c index 78dd760..9037d9d 100644 --- a/src/envctl.c +++ b/src/lib/core/envctl.c @@ -1,5 +1,4 @@ #include "envctl.h" -#include "core.h" struct EnvCtl *envctl_init() { struct EnvCtl *result; diff --git a/src/environment.c b/src/lib/core/environment.c index 580062c..580062c 100644 --- a/src/environment.c +++ b/src/lib/core/environment.c diff --git a/src/github.c b/src/lib/core/github.c index 36e2e7c..c5e4534 100644 --- a/src/github.c +++ b/src/lib/core/github.c @@ -2,6 +2,7 @@ #include <stdlib.h> #include <string.h> #include "core.h" +#include "github.h" struct GHContent { char *data; diff --git a/src/globals.c b/src/lib/core/globals.c index 1b682cb..83465f1 100644 --- a/src/globals.c +++ b/src/lib/core/globals.c @@ -1,6 +1,7 @@ #include <stdlib.h> #include <stdbool.h> #include "core.h" +#include "envctl.h" const char *VERSION = "1.0.0"; const char *AUTHOR = "Joseph Hunkeler"; diff --git a/src/ini.c b/src/lib/core/ini.c index d44e1cc..d44e1cc 100644 --- a/src/ini.c +++ b/src/lib/core/ini.c diff --git a/src/junitxml.c b/src/lib/core/junitxml.c index c7d0834..c7d0834 100644 --- a/src/junitxml.c +++ b/src/lib/core/junitxml.c diff --git a/src/multiprocessing.c b/src/lib/core/multiprocessing.c index 2a1b350..484c566 100644 --- a/src/multiprocessing.c +++ b/src/lib/core/multiprocessing.c @@ -1,4 +1,5 @@ #include "core.h" +#include "multiprocessing.h" /// The sum of all tasks started by mp_task() size_t mp_global_task_count = 0; diff --git a/src/lib/core/package.c b/src/lib/core/package.c new file mode 100644 index 0000000..e34673b --- /dev/null +++ b/src/lib/core/package.c @@ -0,0 +1,41 @@ +#include <stdlib.h> +#include "package.h" +#include "core.h" + +struct Package *stasis_package_init() { + struct Package *result; + result = calloc(1, sizeof(*result)); + return result; +} + +void stasis_package_set_name(struct Package *pkg, const char *name) { + if (pkg->meta.name) { + guard_free(pkg->meta.name); + } + pkg->meta.name = strdup(name); +} + +void stasis_package_set_version(struct Package *pkg, const char *version) { + if (pkg->meta.version) { + guard_free(pkg->meta.version); + } + pkg->meta.version = strdup(version); +} + +void stasis_package_set_version_spec(struct Package *pkg, const char *version_spec) { + if (pkg->meta.version_spec) { + guard_free(pkg->meta.version_spec); + } + pkg->meta.version_spec = strdup(version_spec); +} + +void stasis_package_set_uri(struct Package *pkg, const char *uri) { + if (pkg->source.uri) { + guard_free(pkg->source.uri); + } + pkg->source.uri = uri; +} + +void stasis_package_set_handler(struct Package *pkg, unsigned handler) { + pkg->source.handler = handler; +}
\ No newline at end of file diff --git a/src/recipe.c b/src/lib/core/recipe.c index 833908c..833908c 100644 --- a/src/recipe.c +++ b/src/lib/core/recipe.c diff --git a/src/relocation.c b/src/lib/core/relocation.c index 852aca4..852aca4 100644 --- a/src/relocation.c +++ b/src/lib/core/relocation.c diff --git a/src/rules.c b/src/lib/core/rules.c index e42ee07..e42ee07 100644 --- a/src/rules.c +++ b/src/lib/core/rules.c diff --git a/src/str.c b/src/lib/core/str.c index 868a6c7..868a6c7 100644 --- a/src/str.c +++ b/src/lib/core/str.c diff --git a/src/strlist.c b/src/lib/core/strlist.c index 7a045f1..f0bffa8 100644 --- a/src/strlist.c +++ b/src/lib/core/strlist.c @@ -2,6 +2,7 @@ * String array convenience functions * @file strlist.c */ +#include "download.h" #include "strlist.h" #include "utils.h" diff --git a/src/system.c b/src/lib/core/system.c index 4e605ec..4e605ec 100644 --- a/src/system.c +++ b/src/lib/core/system.c diff --git a/src/template.c b/src/lib/core/template.c index a412fa8..a412fa8 100644 --- a/src/template.c +++ b/src/lib/core/template.c diff --git a/src/template_func_proto.c b/src/lib/core/template_func_proto.c index 9c325bb..3305b4d 100644 --- a/src/template_func_proto.c +++ b/src/lib/core/template_func_proto.c @@ -1,4 +1,6 @@ #include "template_func_proto.h" +#include "delivery.h" +#include "github.h" int get_github_release_notes_tplfunc_entrypoint(void *frame, void *data_out) { int result; diff --git a/src/utils.c b/src/lib/core/utils.c index 6381cea..89950df 100644 --- a/src/utils.c +++ b/src/lib/core/utils.c @@ -1,5 +1,6 @@ #include <stdarg.h> #include "core.h" +#include "utils.h" char *dirstack[STASIS_DIRSTACK_MAX]; const ssize_t dirstack_max = sizeof(dirstack) / sizeof(dirstack[0]); diff --git a/src/wheel.c b/src/lib/core/wheel.c index 4692d0a..4692d0a 100644 --- a/src/wheel.c +++ b/src/lib/core/wheel.c diff --git a/tests/test_artifactory.c b/tests/test_artifactory.c index 1a21f0e..2c732fa 100644 --- a/tests/test_artifactory.c +++ b/tests/test_artifactory.c @@ -1,4 +1,6 @@ #include "testing.h" +#include "artifactory.h" +#include "delivery.h" // Import private functions from core extern int delivery_init_platform(struct Delivery *ctx); diff --git a/tests/test_conda.c b/tests/test_conda.c index fc762e9..2ed869a 100644 --- a/tests/test_conda.c +++ b/tests/test_conda.c @@ -1,4 +1,6 @@ #include "testing.h" +#include "conda.h" +#include "delivery.h" char cwd_start[PATH_MAX]; char cwd_workspace[PATH_MAX]; diff --git a/tests/test_docker.c b/tests/test_docker.c index 04a73aa..6eec53c 100644 --- a/tests/test_docker.c +++ b/tests/test_docker.c @@ -1,4 +1,6 @@ #include "testing.h" +#include "docker.h" + struct DockerCapabilities cap_suite; void test_docker_capable() { diff --git a/tests/test_download.c b/tests/test_download.c index cee7683..ad8724e 100644 --- a/tests/test_download.c +++ b/tests/test_download.c @@ -1,4 +1,5 @@ #include "testing.h" +#include "download.h" void test_download() { struct testcase { diff --git a/tests/test_junitxml.c b/tests/test_junitxml.c index 9b2181e..7111249 100644 --- a/tests/test_junitxml.c +++ b/tests/test_junitxml.c @@ -1,4 +1,5 @@ #include "testing.h" +#include "junitxml.h" void test_junitxml_testsuite_read() { struct JUNIT_Testsuite *testsuite; diff --git a/tests/test_multiprocessing.c b/tests/test_multiprocessing.c index cd037d0..b9cd309 100644 --- a/tests/test_multiprocessing.c +++ b/tests/test_multiprocessing.c @@ -1,10 +1,14 @@ #include "testing.h" +#include "multiprocessing.h" static struct MultiProcessingPool *pool; char *commands[] = { - "true", - "uname -a", - "/bin/echo hello world", + "sleep 1; true", + "sleep 2; uname -a", + "sleep 3; /bin/echo hello world", + "sleep 4; true", + "sleep 5; uname -a", + "sleep 6; /bin/echo hello world", }; void test_mp_pool_init() { @@ -120,4 +124,4 @@ int main(int argc, char *argv[]) { }; STASIS_TEST_RUN(tests); STASIS_TEST_END_MAIN(); -}
\ No newline at end of file +} diff --git a/tests/test_recipe.c b/tests/test_recipe.c index 8e2c470..7c55cd5 100644 --- a/tests/test_recipe.c +++ b/tests/test_recipe.c @@ -1,4 +1,6 @@ #include "testing.h" +#include "relocation.h" +#include "recipe.h" static void make_local_recipe(const char *localdir) { char path[PATH_MAX] = {0}; diff --git a/tests/test_wheel.c b/tests/test_wheel.c index 16f60a3..6818b22 100644 --- a/tests/test_wheel.c +++ b/tests/test_wheel.c @@ -1,4 +1,5 @@ #include "testing.h" +#include "wheel.h" void test_get_wheel_file() { struct testcase { |