aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@users.noreply.github.com>2024-10-14 12:47:03 -0400
committerGitHub <noreply@github.com>2024-10-14 12:47:03 -0400
commitca762e2fd21266e6ed7b800d135e386c2ec48861 (patch)
tree48978ff793f2a969df196cfa7700100e5c82a2f5
parent20a4c8c1707055c6d53265213f2a2d6b834aa037 (diff)
parent26000fb8e6cc08c227d4463de60e28881179e5cb (diff)
downloadstasis-ca762e2fd21266e6ed7b800d135e386c2ec48861.tar.gz
Merge pull request #61 from jhunkeler/restructure-the-world
Restructure the world
-rw-r--r--include/artifactory.h1
-rw-r--r--include/conda.h2
-rw-r--r--include/core.h22
-rw-r--r--include/core_mem.h3
-rw-r--r--include/delivery.h9
-rw-r--r--include/docker.h2
-rw-r--r--include/download.h2
-rw-r--r--include/envctl.h1
-rw-r--r--include/ini.h1
-rw-r--r--include/package.h30
-rw-r--r--include/str.h1
-rw-r--r--include/strlist.h5
-rw-r--r--include/utils.h7
-rw-r--r--src/CMakeLists.txt47
-rw-r--r--src/cli/CMakeLists.txt2
-rw-r--r--src/cli/stasis/CMakeLists.txt12
-rw-r--r--src/cli/stasis/args.c102
-rw-r--r--src/cli/stasis/args.h23
-rw-r--r--src/cli/stasis/callbacks.c31
-rw-r--r--src/cli/stasis/callbacks.h10
-rw-r--r--src/cli/stasis/stasis_main.c (renamed from src/stasis_main.c)266
-rw-r--r--src/cli/stasis/system_requirements.c82
-rw-r--r--src/cli/stasis/system_requirements.h13
-rw-r--r--src/cli/stasis/tpl.c46
-rw-r--r--src/cli/stasis/tpl.h10
-rw-r--r--src/cli/stasis_indexer/CMakeLists.txt6
-rw-r--r--src/cli/stasis_indexer/stasis_indexer.c (renamed from src/stasis_indexer.c)3
-rw-r--r--src/lib/CMakeLists.txt1
-rw-r--r--src/lib/core/CMakeLists.txt38
-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.c41
-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.c2
-rw-r--r--tests/test_conda.c2
-rw-r--r--tests/test_docker.c2
-rw-r--r--tests/test_download.c1
-rw-r--r--tests/test_junitxml.c1
-rw-r--r--tests/test_multiprocessing.c12
-rw-r--r--tests/test_recipe.c2
-rw-r--r--tests/test_wheel.c1
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 {