aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@users.noreply.github.com>2024-08-08 12:45:05 -0400
committerGitHub <noreply@github.com>2024-08-08 12:45:05 -0400
commitc9579598c5a1b49f7fe8e353623175bf8f3cc236 (patch)
treecf7ef75a4bea7b16713a172d17b82a0c1ad9904b
parent99edcf7b998a1ac83b75ef3cc117c5b91c874782 (diff)
downloadstasis-c9579598c5a1b49f7fe8e353623175bf8f3cc236.tar.gz
Return of the INI refactor (#20)
* Continuation of #19 * Fixes always_update_base_environment override bug added by PR #19 * Finish type hinting implementation * ini_getval_* functions now able to affect rendering mode using INI_READ_RAW and INI_READ_RENDER * Created pointers to deeply nested structures to increase readability * Output from ini_write() is more consistent, with fewer errant spaces and line feeds * Fixes accidental regression in #19. INIVAL_TYPE_STR_ARRAY never produced an array of pointers to char. This needs to be corrected in the future. i.e. It has always generated a new-line delimited string, not a StrList, or array. * Fix strlist_append_tokenize * original pointer is no longer modified * token strings are stripped of leading space before appending to the list * Use defines instead of magic numbers * delivery_init: add render_mode argument * test_conda: Add render mode * test_ini: Add render mode * Only add conda packages and wheels to the image * docker images are saved to the packages directory and will be consumed by the image if present. * Render template variables after bootstrapping the delivery
-rw-r--r--include/delivery.h5
-rw-r--r--include/ini.h40
-rw-r--r--mission/generic/Dockerfile.in2
-rw-r--r--mission/hst/Dockerfile.in2
-rw-r--r--mission/jwst/Dockerfile.in2
-rw-r--r--mission/roman/Dockerfile.in2
-rw-r--r--src/delivery.c146
-rw-r--r--src/ini.c211
-rw-r--r--src/stasis_main.c2
-rw-r--r--src/strlist.c5
-rw-r--r--src/utils.c2
-rw-r--r--tests/rt_generic.sh2
-rw-r--r--tests/test_conda.c2
-rw-r--r--tests/test_ini.c5
14 files changed, 228 insertions, 200 deletions
diff --git a/include/delivery.h b/include/delivery.h
index 969c803..067cd0b 100644
--- a/include/delivery.h
+++ b/include/delivery.h
@@ -191,12 +191,11 @@ struct Delivery {
/**
* Initializes a Deliver structure
* @param ctx pointer to Delivery context
- * @param ini pointer to INIFILE describing a delivery
- * @param cfg pointer to INIFILE describing extra configuration data
+ * @param render_mode INI_READ_RAW or INI_READ_RENDER
* @return `0` on success
* @return Non-zero on error
*/
-int delivery_init(struct Delivery *ctx);
+int delivery_init(struct Delivery *ctx, int render_mode);
/**
* Free memory allocated by delivery_init()
diff --git a/include/ini.h b/include/ini.h
index 5c840f5..2992a37 100644
--- a/include/ini.h
+++ b/include/ini.h
@@ -7,6 +7,8 @@
#define INI_WRITE_RAW 0 ///< Dump INI data. Contents are not modified.
#define INI_WRITE_PRESERVE 1 ///< Dump INI data. Template strings are
+#define INI_READ_RAW 0 ///< Dump INI data. Contents are not modified.
+#define INI_READ_RENDER 1 ///< Dump INI data. Template strings are
#define INI_SETVAL_APPEND 0
#define INI_SETVAL_REPLACE 1
#define INI_SEARCH_EXACT 0
@@ -219,7 +221,7 @@ struct INIData *ini_getall(struct INIFILE *ini, char *section_name);
* @return 0 on success
* @return Non-zero on error
*/
-int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, union INIVal *result);
+int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, int flags, union INIVal *result);
/**
* Write INIFILE sections and data to a file stream
@@ -235,22 +237,22 @@ int ini_write(struct INIFILE *ini, FILE **stream, unsigned mode);
*/
void ini_free(struct INIFILE **ini);
-int ini_getval_int(struct INIFILE *ini, char *section_name, char *key, int *state);
-unsigned int ini_getval_uint(struct INIFILE *ini, char *section_name, char *key, int *state);
-long ini_getval_long(struct INIFILE *ini, char *section_name, char *key, int *state);
-unsigned long ini_getval_ulong(struct INIFILE *ini, char *section_name, char *key, int *state);
-long long ini_getval_llong(struct INIFILE *ini, char *section_name, char *key, int *state);
-unsigned long long ini_getval_ullong(struct INIFILE *ini, char *section_name, char *key, int *state);
-float ini_getval_float(struct INIFILE *ini, char *section_name, char *key, int *state);
-double ini_getval_double(struct INIFILE *ini, char *section_name, char *key, int *state);
-bool ini_getval_bool(struct INIFILE *ini, char *section_name, char *key, int *state);
-short ini_getval_short(struct INIFILE *ini, char *section_name, char *key, int *state);
-unsigned short ini_getval_ushort(struct INIFILE *ini, char *section_name, char *key, int *state);
-char ini_getval_char(struct INIFILE *ini, char *section_name, char *key, int *state);
-unsigned char ini_getval_uchar(struct INIFILE *ini, char *section_name, char *key, int *state);
-char *ini_getval_char_p(struct INIFILE *ini, char *section_name, char *key, int *state);
-char *ini_getval_str(struct INIFILE *ini, char *section_name, char *key, int *state);
-char **ini_getval_char_array_p(struct INIFILE *ini, char *section_name, char *key, int *state);
-char **ini_getval_str_array(struct INIFILE *ini, char *section_name, char *key, int *state);
-struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char *key, char *tok, int *state);
+int ini_getval_int(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+unsigned int ini_getval_uint(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+long ini_getval_long(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+unsigned long ini_getval_ulong(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+long long ini_getval_llong(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+unsigned long long ini_getval_ullong(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+float ini_getval_float(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+double ini_getval_double(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+bool ini_getval_bool(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+short ini_getval_short(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+unsigned short ini_getval_ushort(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+char ini_getval_char(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+unsigned char ini_getval_uchar(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+char *ini_getval_char_p(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+char *ini_getval_str(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+char *ini_getval_char_array_p(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+char *ini_getval_str_array(struct INIFILE *ini, char *section_name, char *key, int flags, int *state);
+struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char *key, char *tok, int flags, int *state);
#endif //STASIS_INI_H
diff --git a/mission/generic/Dockerfile.in b/mission/generic/Dockerfile.in
index c3c826a..2b3827c 100644
--- a/mission/generic/Dockerfile.in
+++ b/mission/generic/Dockerfile.in
@@ -61,7 +61,7 @@ RUN curl -q -OSsL ${DIST_URL}/${DIST_INSTALLER} \
ENV PATH="${DIST_PATH}/bin:${PATH}"
# Get delivery snapshot
ADD ${SNAPSHOT_INPUT} ${HOME}/SNAPSHOT.yml
-ADD ${SNAPSHOT_PKGDIR} ${HOME}/packages
+ADD ${SNAPSHOT_PKGDIR}/conda ${SNAPSHOT_PKGDIR}/wheels ${HOME}/packages
RUN chown -R developer: ${HOME}
USER developer
RUN conda config --set auto_update_conda false \
diff --git a/mission/hst/Dockerfile.in b/mission/hst/Dockerfile.in
index c3c826a..2b3827c 100644
--- a/mission/hst/Dockerfile.in
+++ b/mission/hst/Dockerfile.in
@@ -61,7 +61,7 @@ RUN curl -q -OSsL ${DIST_URL}/${DIST_INSTALLER} \
ENV PATH="${DIST_PATH}/bin:${PATH}"
# Get delivery snapshot
ADD ${SNAPSHOT_INPUT} ${HOME}/SNAPSHOT.yml
-ADD ${SNAPSHOT_PKGDIR} ${HOME}/packages
+ADD ${SNAPSHOT_PKGDIR}/conda ${SNAPSHOT_PKGDIR}/wheels ${HOME}/packages
RUN chown -R developer: ${HOME}
USER developer
RUN conda config --set auto_update_conda false \
diff --git a/mission/jwst/Dockerfile.in b/mission/jwst/Dockerfile.in
index c3c826a..2b3827c 100644
--- a/mission/jwst/Dockerfile.in
+++ b/mission/jwst/Dockerfile.in
@@ -61,7 +61,7 @@ RUN curl -q -OSsL ${DIST_URL}/${DIST_INSTALLER} \
ENV PATH="${DIST_PATH}/bin:${PATH}"
# Get delivery snapshot
ADD ${SNAPSHOT_INPUT} ${HOME}/SNAPSHOT.yml
-ADD ${SNAPSHOT_PKGDIR} ${HOME}/packages
+ADD ${SNAPSHOT_PKGDIR}/conda ${SNAPSHOT_PKGDIR}/wheels ${HOME}/packages
RUN chown -R developer: ${HOME}
USER developer
RUN conda config --set auto_update_conda false \
diff --git a/mission/roman/Dockerfile.in b/mission/roman/Dockerfile.in
index c3c826a..2b3827c 100644
--- a/mission/roman/Dockerfile.in
+++ b/mission/roman/Dockerfile.in
@@ -61,7 +61,7 @@ RUN curl -q -OSsL ${DIST_URL}/${DIST_INSTALLER} \
ENV PATH="${DIST_PATH}/bin:${PATH}"
# Get delivery snapshot
ADD ${SNAPSHOT_INPUT} ${HOME}/SNAPSHOT.yml
-ADD ${SNAPSHOT_PKGDIR} ${HOME}/packages
+ADD ${SNAPSHOT_PKGDIR}/conda ${SNAPSHOT_PKGDIR}/wheels ${HOME}/packages
RUN chown -R developer: ${HOME}
USER developer
RUN conda config --set auto_update_conda false \
diff --git a/src/delivery.c b/src/delivery.c
index 1b16f39..ce6e804 100644
--- a/src/delivery.c
+++ b/src/delivery.c
@@ -343,7 +343,7 @@ int delivery_init_platform(struct Delivery *ctx) {
return 0;
}
-static int populate_mission_ini(struct Delivery **ctx) {
+static int populate_mission_ini(struct Delivery **ctx, int render_mode) {
int err = 0;
struct INIFILE *ini;
@@ -370,13 +370,13 @@ static int populate_mission_ini(struct Delivery **ctx) {
}
(*ctx)->_stasis_ini_fp.mission_path = strdup(missionfile);
- (*ctx)->rules.release_fmt = ini_getval_str(ini, "meta", "release_fmt", &err);
+ (*ctx)->rules.release_fmt = ini_getval_str(ini, "meta", "release_fmt", render_mode, &err);
// Used for setting artifactory build info
- (*ctx)->rules.build_name_fmt = ini_getval_str(ini, "meta", "build_name_fmt", &err);
+ (*ctx)->rules.build_name_fmt = ini_getval_str(ini, "meta", "build_name_fmt", render_mode, &err);
// Used for setting artifactory build info
- (*ctx)->rules.build_number_fmt = ini_getval_str(ini, "meta", "build_number_fmt", &err);
+ (*ctx)->rules.build_number_fmt = ini_getval_str(ini, "meta", "build_number_fmt", render_mode, &err);
return 0;
}
@@ -432,7 +432,7 @@ void validate_delivery_ini(struct INIFILE *ini) {
}
}
-static int populate_delivery_ini(struct Delivery *ctx) {
+static int populate_delivery_ini(struct Delivery *ctx, int render_mode) {
union INIVal val;
struct INIFILE *ini = ctx->_stasis_ini_fp.delivery;
struct INIData *rtdata;
@@ -451,34 +451,34 @@ static int populate_delivery_ini(struct Delivery *ctx) {
ctx->runtime.environ = rt;
int err = 0;
- ctx->meta.mission = ini_getval_str(ini, "meta", "mission", &err);
+ ctx->meta.mission = ini_getval_str(ini, "meta", "mission", render_mode, &err);
if (!strcasecmp(ctx->meta.mission, "hst")) {
- ctx->meta.codename = ini_getval_str(ini, "meta", "codename", &err);
+ ctx->meta.codename = ini_getval_str(ini, "meta", "codename", render_mode, &err);
} else {
ctx->meta.codename = NULL;
}
- ctx->meta.version = ini_getval_str(ini, "meta", "version", &err);
- ctx->meta.name = ini_getval_str(ini, "meta", "name", &err);
- ctx->meta.rc = ini_getval_int(ini, "meta", "rc", &err);
- ctx->meta.final = ini_getval_bool(ini, "meta", "final", &err);
- ctx->meta.based_on = ini_getval_str(ini, "meta", "based_on", &err);
+ ctx->meta.version = ini_getval_str(ini, "meta", "version", render_mode, &err);
+ ctx->meta.name = ini_getval_str(ini, "meta", "name", render_mode, &err);
+ ctx->meta.rc = ini_getval_int(ini, "meta", "rc", render_mode, &err);
+ ctx->meta.final = ini_getval_bool(ini, "meta", "final", render_mode, &err);
+ ctx->meta.based_on = ini_getval_str(ini, "meta", "based_on", render_mode, &err);
if (!ctx->meta.python) {
- ctx->meta.python = ini_getval_str(ini, "meta", "python", &err);
+ ctx->meta.python = ini_getval_str(ini, "meta", "python", render_mode, &err);
guard_free(ctx->meta.python_compact);
ctx->meta.python_compact = to_short_version(ctx->meta.python);
} else {
ini_setval(&ini, INI_SETVAL_REPLACE, "meta", "python", ctx->meta.python);
}
- ctx->conda.installer_name = ini_getval_str(ini, "conda", "installer_name", &err);
- ctx->conda.installer_version = ini_getval_str(ini, "conda", "installer_version", &err);
- ctx->conda.installer_platform = ini_getval_str(ini, "conda", "installer_platform", &err);
- ctx->conda.installer_arch = ini_getval_str(ini, "conda", "installer_arch", &err);
- ctx->conda.installer_baseurl = ini_getval_str(ini, "conda", "installer_baseurl", &err);
- ctx->conda.conda_packages = ini_getval_strlist(ini, "conda", "conda_packages", " "LINE_SEP, &err);
+ ctx->conda.installer_name = ini_getval_str(ini, "conda", "installer_name", render_mode, &err);
+ ctx->conda.installer_version = ini_getval_str(ini, "conda", "installer_version", render_mode, &err);
+ ctx->conda.installer_platform = ini_getval_str(ini, "conda", "installer_platform", render_mode, &err);
+ ctx->conda.installer_arch = ini_getval_str(ini, "conda", "installer_arch", render_mode, &err);
+ ctx->conda.installer_baseurl = ini_getval_str(ini, "conda", "installer_baseurl", render_mode, &err);
+ ctx->conda.conda_packages = ini_getval_strlist(ini, "conda", "conda_packages", " "LINE_SEP, render_mode, &err);
if (ctx->conda.conda_packages->data && ctx->conda.conda_packages->data[0] && strpbrk(ctx->conda.conda_packages->data[0], " \t")) {
normalize_space(ctx->conda.conda_packages->data[0]);
@@ -487,7 +487,7 @@ static int populate_delivery_ini(struct Delivery *ctx) {
ini_setval(&ini, INI_SETVAL_REPLACE, "conda", "conda_packages", pip_packages_replacement);
guard_free(pip_packages_replacement);
guard_strlist_free(&ctx->conda.conda_packages);
- ctx->conda.conda_packages = ini_getval_strlist(ini, "conda", "conda_packages", LINE_SEP, &err);
+ ctx->conda.conda_packages = ini_getval_strlist(ini, "conda", "conda_packages", LINE_SEP, render_mode, &err);
}
for (size_t i = 0; i < strlist_count(ctx->conda.conda_packages); i++) {
@@ -497,7 +497,7 @@ static int populate_delivery_ini(struct Delivery *ctx) {
}
}
- ctx->conda.pip_packages = ini_getval_strlist(ini, "conda", "pip_packages", LINE_SEP, &err);
+ ctx->conda.pip_packages = ini_getval_strlist(ini, "conda", "pip_packages", LINE_SEP, render_mode, &err);
if (ctx->conda.pip_packages->data && ctx->conda.pip_packages->data[0] && strpbrk(ctx->conda.pip_packages->data[0], " \t")) {
normalize_space(ctx->conda.pip_packages->data[0]);
replace_text(ctx->conda.pip_packages->data[0], " ", LINE_SEP, 0);
@@ -505,7 +505,7 @@ static int populate_delivery_ini(struct Delivery *ctx) {
ini_setval(&ini, INI_SETVAL_REPLACE, "conda", "pip_packages", pip_packages_replacement);
guard_free(pip_packages_replacement);
guard_strlist_free(&ctx->conda.pip_packages);
- ctx->conda.pip_packages = ini_getval_strlist(ini, "conda", "pip_packages", LINE_SEP, &err);
+ ctx->conda.pip_packages = ini_getval_strlist(ini, "conda", "pip_packages", LINE_SEP, render_mode, &err);
}
for (size_t i = 0; i < strlist_count(ctx->conda.pip_packages); i++) {
@@ -516,7 +516,7 @@ static int populate_delivery_ini(struct Delivery *ctx) {
}
// Delivery metadata consumed
- populate_mission_ini(&ctx);
+ populate_mission_ini(&ctx, render_mode);
if (ctx->info.release_name) {
guard_free(ctx->info.release_name);
@@ -556,12 +556,12 @@ static int populate_delivery_ini(struct Delivery *ctx) {
}
conv_str(&test->name, val);
- test->version = ini_getval_str(ini, section_name, "version", &err);
- test->repository = ini_getval_str(ini, section_name, "repository", &err);
- test->script = ini_getval_str(ini, section_name, "script", &err);
- test->repository_remove_tags = ini_getval_strlist(ini, section_name, "repository_remove_tags", LINE_SEP, &err);
- test->build_recipe = ini_getval_str(ini, section_name, "build_recipe", &err);
- test->runtime.environ = ini_getval_strlist(ini, section_name, "runtime", LINE_SEP, &err);
+ test->version = ini_getval_str(ini, section_name, "version", render_mode, &err);
+ test->repository = ini_getval_str(ini, section_name, "repository", render_mode, &err);
+ test->script = ini_getval_str(ini, section_name, "script", render_mode, &err);
+ test->repository_remove_tags = ini_getval_strlist(ini, section_name, "repository_remove_tags", LINE_SEP, render_mode, &err);
+ test->build_recipe = ini_getval_str(ini, section_name, "build_recipe", render_mode, &err);
+ test->runtime.environ = ini_getval_strlist(ini, section_name, "runtime", LINE_SEP, render_mode, &err);
z++;
}
}
@@ -573,20 +573,20 @@ static int populate_delivery_ini(struct Delivery *ctx) {
struct JFrog *jfrog = &deploy->jfrog[z];
// Artifactory base configuration
- jfrog->upload_ctx.workaround_parent_only = ini_getval_bool(ini, section_name, "workaround_parent_only", &err);
- jfrog->upload_ctx.exclusions = ini_getval_str(ini, section_name, "exclusions", &err);
- jfrog->upload_ctx.explode = ini_getval_bool(ini, section_name, "explode", &err);
- jfrog->upload_ctx.recursive = ini_getval_bool(ini, section_name, "recursive", &err);
- jfrog->upload_ctx.retries = ini_getval_int(ini, section_name, "retries", &err);
- jfrog->upload_ctx.retry_wait_time = ini_getval_int(ini, section_name, "retry_wait_time", &err);
- jfrog->upload_ctx.detailed_summary = ini_getval_bool(ini, section_name, "detailed_summary", &err);
- jfrog->upload_ctx.quiet = ini_getval_bool(ini, section_name, "quiet", &err);
- jfrog->upload_ctx.regexp = ini_getval_bool(ini, section_name, "regexp", &err);
- jfrog->upload_ctx.spec = ini_getval_str(ini, section_name, "spec", &err);
- jfrog->upload_ctx.flat = ini_getval_bool(ini, section_name, "flat", &err);
- jfrog->repo = ini_getval_str(ini, section_name, "repo", &err);
- jfrog->dest = ini_getval_str(ini, section_name, "dest", &err);
- jfrog->files = ini_getval_strlist(ini, section_name, "dest", LINE_SEP, &err);
+ jfrog->upload_ctx.workaround_parent_only = ini_getval_bool(ini, section_name, "workaround_parent_only", render_mode, &err);
+ jfrog->upload_ctx.exclusions = ini_getval_str(ini, section_name, "exclusions", render_mode, &err);
+ jfrog->upload_ctx.explode = ini_getval_bool(ini, section_name, "explode", render_mode, &err);
+ jfrog->upload_ctx.recursive = ini_getval_bool(ini, section_name, "recursive", render_mode, &err);
+ jfrog->upload_ctx.retries = ini_getval_int(ini, section_name, "retries", render_mode, &err);
+ jfrog->upload_ctx.retry_wait_time = ini_getval_int(ini, section_name, "retry_wait_time", render_mode, &err);
+ jfrog->upload_ctx.detailed_summary = ini_getval_bool(ini, section_name, "detailed_summary", render_mode, &err);
+ jfrog->upload_ctx.quiet = ini_getval_bool(ini, section_name, "quiet", render_mode, &err);
+ jfrog->upload_ctx.regexp = ini_getval_bool(ini, section_name, "regexp", render_mode, &err);
+ jfrog->upload_ctx.spec = ini_getval_str(ini, section_name, "spec", render_mode, &err);
+ jfrog->upload_ctx.flat = ini_getval_bool(ini, section_name, "flat", render_mode, &err);
+ jfrog->repo = ini_getval_str(ini, section_name, "repo", render_mode, &err);
+ jfrog->dest = ini_getval_str(ini, section_name, "dest", render_mode, &err);
+ jfrog->files = ini_getval_strlist(ini, section_name, "files", LINE_SEP, render_mode, &err);
z++;
}
}
@@ -597,44 +597,44 @@ static int populate_delivery_ini(struct Delivery *ctx) {
if (startswith(ini->section[i]->key, "deploy:docker")) {
struct Docker *docker = &deploy->docker;
- docker->registry = ini_getval_str(ini, section_name, "registry", &err);
- docker->image_compression = ini_getval_str(ini, section_name, "image_compression", &err);
- docker->test_script = ini_getval_str(ini, section_name, "test_script", &err);
- docker->build_args = ini_getval_strlist(ini, section_name, "build_args", LINE_SEP, &err);
- docker->tags = ini_getval_strlist(ini, section_name, "tags", LINE_SEP, &err);
+ docker->registry = ini_getval_str(ini, section_name, "registry", render_mode, &err);
+ docker->image_compression = ini_getval_str(ini, section_name, "image_compression", render_mode, &err);
+ docker->test_script = ini_getval_str(ini, section_name, "test_script", render_mode, &err);
+ docker->build_args = ini_getval_strlist(ini, section_name, "build_args", LINE_SEP, render_mode, &err);
+ docker->tags = ini_getval_strlist(ini, section_name, "tags", LINE_SEP, render_mode, &err);
}
}
return 0;
}
-static int populate_delivery_cfg(struct Delivery *ctx) {
+static int populate_delivery_cfg(struct Delivery *ctx, int render_mode) {
struct INIFILE *cfg = ctx->_stasis_ini_fp.cfg;
if (!cfg) {
return -1;
}
int err = 0;
- ctx->storage.conda_staging_dir = ini_getval_str(cfg, "default", "conda_staging_dir", &err);
- ctx->storage.conda_staging_url = ini_getval_str(cfg, "default", "conda_staging_url", &err);
- ctx->storage.wheel_staging_dir = ini_getval_str(cfg, "default", "wheel_staging_dir", &err);
- ctx->storage.wheel_staging_url = ini_getval_str(cfg, "default", "wheel_staging_url", &err);
- globals.conda_fresh_start = ini_getval_bool(cfg, "default", "conda_fresh_start", &err);
+ ctx->storage.conda_staging_dir = ini_getval_str(cfg, "default", "conda_staging_dir", render_mode, &err);
+ ctx->storage.conda_staging_url = ini_getval_str(cfg, "default", "conda_staging_url", render_mode, &err);
+ ctx->storage.wheel_staging_dir = ini_getval_str(cfg, "default", "wheel_staging_dir", render_mode, &err);
+ ctx->storage.wheel_staging_url = ini_getval_str(cfg, "default", "wheel_staging_url", render_mode, &err);
+ globals.conda_fresh_start = ini_getval_bool(cfg, "default", "conda_fresh_start", render_mode, &err);
if (!globals.continue_on_error) {
- globals.continue_on_error = ini_getval_bool(cfg, "default", "continue_on_error", &err);
+ globals.continue_on_error = ini_getval_bool(cfg, "default", "continue_on_error", render_mode, &err);
}
- if (globals.always_update_base_environment) {
- globals.always_update_base_environment = ini_getval_bool(cfg, "default", "always_update_base_environment", &err);
+ if (!globals.always_update_base_environment) {
+ globals.always_update_base_environment = ini_getval_bool(cfg, "default", "always_update_base_environment", render_mode, &err);
}
- globals.conda_install_prefix = ini_getval_str(cfg, "default", "conda_install_prefix", &err);
- globals.conda_packages = ini_getval_strlist(cfg, "default", "conda_packages", LINE_SEP, &err);
- globals.pip_packages = ini_getval_strlist(cfg, "default", "pip_packages", LINE_SEP, &err);
+ globals.conda_install_prefix = ini_getval_str(cfg, "default", "conda_install_prefix", render_mode, &err);
+ globals.conda_packages = ini_getval_strlist(cfg, "default", "conda_packages", LINE_SEP, render_mode, &err);
+ globals.pip_packages = ini_getval_strlist(cfg, "default", "pip_packages", LINE_SEP, render_mode, &err);
- globals.jfrog.jfrog_artifactory_base_url = ini_getval_str(cfg, "jfrog_cli_download", "url", &err);
- globals.jfrog.jfrog_artifactory_product = ini_getval_str(cfg, "jfrog_cli_download", "product", &err);
- globals.jfrog.cli_major_ver = ini_getval_str(cfg, "jfrog_cli_download", "version_series", &err);
- globals.jfrog.version = ini_getval_str(cfg, "jfrog_cli_download", "version", &err);
- globals.jfrog.remote_filename = ini_getval_str(cfg, "jfrog_cli_download", "filename", &err);
- globals.jfrog.url = ini_getval_str(cfg, "deploy:artifactory", "url", &err);
- globals.jfrog.repo = ini_getval_str(cfg, "deploy:artifactory", "repo", &err);
+ globals.jfrog.jfrog_artifactory_base_url = ini_getval_str(cfg, "jfrog_cli_download", "url", render_mode, &err);
+ globals.jfrog.jfrog_artifactory_product = ini_getval_str(cfg, "jfrog_cli_download", "product", render_mode, &err);
+ globals.jfrog.cli_major_ver = ini_getval_str(cfg, "jfrog_cli_download", "version_series", render_mode, &err);
+ globals.jfrog.version = ini_getval_str(cfg, "jfrog_cli_download", "version", render_mode, &err);
+ globals.jfrog.remote_filename = ini_getval_str(cfg, "jfrog_cli_download", "filename", render_mode, &err);
+ globals.jfrog.url = ini_getval_str(cfg, "deploy:artifactory", "url", render_mode, &err);
+ globals.jfrog.repo = ini_getval_str(cfg, "deploy:artifactory", "repo", render_mode, &err);
return 0;
}
@@ -661,8 +661,8 @@ int *bootstrap_build_info(struct Delivery *ctx) {
local._stasis_ini_fp.cfg = ini_open(ctx->_stasis_ini_fp.cfg_path);
local._stasis_ini_fp.delivery = ini_open(ctx->_stasis_ini_fp.delivery_path);
delivery_init_platform(&local);
- populate_delivery_cfg(&local);
- populate_delivery_ini(&local);
+ populate_delivery_cfg(&local, INI_READ_RAW);
+ populate_delivery_ini(&local, INI_READ_RAW);
populate_info(&local);
ctx->info.build_name = strdup(local.info.build_name);
ctx->info.build_number = strdup(local.info.build_number);
@@ -674,9 +674,9 @@ int *bootstrap_build_info(struct Delivery *ctx) {
return 0;
}
-int delivery_init(struct Delivery *ctx) {
+int delivery_init(struct Delivery *ctx, int render_mode) {
populate_info(ctx);
- populate_delivery_cfg(ctx);
+ populate_delivery_cfg(ctx, INI_READ_RENDER);
// Set artifactory URL via environment variable if possible
char *jfurl = getenv("STASIS_JF_ARTIFACTORY_URL");
@@ -718,7 +718,7 @@ int delivery_init(struct Delivery *ctx) {
// Prevent git from paginating output
setenv("GIT_PAGER", "", 1);
- populate_delivery_ini(ctx);
+ populate_delivery_ini(ctx, render_mode);
if (ctx->deploy.docker.tags) {
for (size_t i = 0; i < strlist_count(ctx->deploy.docker.tags); i++) {
@@ -1940,7 +1940,7 @@ int delivery_mission_render_files(struct Delivery *ctx) {
msg(STASIS_MSG_L2, "%s\n", data.src);
int err = 0;
- data.dest = ini_getval_str(cfg, section_name, "destination", &err);
+ data.dest = ini_getval_str(cfg, section_name, "destination", INI_READ_RENDER, &err);
char *contents;
struct stat st;
diff --git a/src/ini.c b/src/ini.c
index bddfdcd..dfbd817 100644
--- a/src/ini.c
+++ b/src/ini.c
@@ -112,7 +112,7 @@ struct INIData *ini_getall(struct INIFILE *ini, char *section_name) {
return result;
}
-int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, union INIVal *result) {
+int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, int flags, union INIVal *result) {
char *token = NULL;
char tbuf[STASIS_BUFSIZ];
char *tbufp = tbuf;
@@ -123,77 +123,83 @@ int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, uni
return -1;
}
- char *render = tpl_render(data->value);
- if (render) {
- guard_free(data->value);
- data->value = render;
+ char *data_copy = strdup(data->value);
+ if (flags == INI_READ_RENDER) {
+ char *render = tpl_render(data_copy);
+ if (render && strcmp(render, data_copy) != 0) {
+ guard_free(data_copy);
+ data_copy = render;
+ } else {
+ guard_free(render);
+ }
}
- lstrip(data->value);
+ lstrip(data_copy);
switch (type) {
case INIVAL_TYPE_CHAR:
- result->as_char = (char) strtol(data->value, NULL, 10);
+ result->as_char = (char) strtol(data_copy, NULL, 10);
break;
case INIVAL_TYPE_UCHAR:
- result->as_uchar = (unsigned char) strtoul(data->value, NULL, 10);
+ result->as_uchar = (unsigned char) strtoul(data_copy, NULL, 10);
break;
case INIVAL_TYPE_SHORT:
- result->as_short = (short) strtol(data->value, NULL, 10);
+ result->as_short = (short) strtol(data_copy, NULL, 10);
break;
case INIVAL_TYPE_USHORT:
- result->as_ushort = (unsigned short) strtoul(data->value, NULL, 10);
+ result->as_ushort = (unsigned short) strtoul(data_copy, NULL, 10);
break;
case INIVAL_TYPE_INT:
- result->as_int = (int) strtol(data->value, NULL, 10);
+ result->as_int = (int) strtol(data_copy, NULL, 10);
break;
case INIVAL_TYPE_UINT:
- result->as_uint = (unsigned int) strtoul(data->value, NULL, 10);
+ result->as_uint = (unsigned int) strtoul(data_copy, NULL, 10);
break;
case INIVAL_TYPE_LONG:
- result->as_long = (long) strtol(data->value, NULL, 10);
+ result->as_long = (long) strtol(data_copy, NULL, 10);
break;
case INIVAL_TYPE_ULONG:
- result->as_ulong = (unsigned long) strtoul(data->value, NULL, 10);
+ result->as_ulong = (unsigned long) strtoul(data_copy, NULL, 10);
break;
case INIVAL_TYPE_LLONG:
- result->as_llong = (long long) strtoll(data->value, NULL, 10);
+ result->as_llong = (long long) strtoll(data_copy, NULL, 10);
break;
case INIVAL_TYPE_ULLONG:
- result->as_ullong = (unsigned long long) strtoull(data->value, NULL, 10);
+ result->as_ullong = (unsigned long long) strtoull(data_copy, NULL, 10);
break;
case INIVAL_TYPE_DOUBLE:
- result->as_double = (double) strtod(data->value, NULL);
+ result->as_double = (double) strtod(data_copy, NULL);
break;
case INIVAL_TYPE_FLOAT:
- result->as_float = (float) strtod(data->value, NULL);
+ result->as_float = (float) strtod(data_copy, NULL);
break;
case INIVAL_TYPE_STR:
- result->as_char_p = strdup(data->value);
+ result->as_char_p = strdup(data_copy);
if (!result->as_char_p) {
return -1;
}
- lstrip(result->as_char_p);
break;
case INIVAL_TYPE_STR_ARRAY:
- strcpy(tbufp, data->value);
- char *value = NULL;
- size_t lines = num_chars(tbufp, '\n');
- value = calloc(strlen(tbufp) + lines + 1, sizeof(*value));
- if (!value) {
+ strcpy(tbufp, data_copy);
+ guard_free(data_copy);
+ data_copy = calloc(STASIS_BUFSIZ, sizeof(*data_copy));
+ if (!data_copy) {
return -1;
}
while ((token = strsep(&tbufp, "\n")) != NULL) {
- lstrip(token);
- strcat(value, token);
- strcat(value, "\n");
+ //lstrip(token);
+ if (!isempty(token)) {
+ strcat(data_copy, token);
+ strcat(data_copy, "\n");
+ }
}
- result->as_char_p = value;
+ strip(data_copy);
+ result->as_char_p = strdup(data_copy);
break;
case INIVAL_TYPE_BOOL:
result->as_bool = false;
- if ((!strcmp(data->value, "true") || !strcmp(data->value, "True")) ||
- (!strcmp(data->value, "yes") || !strcmp(data->value, "Yes")) ||
- strtol(data->value, NULL, 10)) {
+ if ((!strcmp(data_copy, "true") || !strcmp(data_copy, "True")) ||
+ (!strcmp(data_copy, "yes") || !strcmp(data_copy, "Yes")) ||
+ strtol(data_copy, NULL, 10)) {
result->as_bool = true;
}
break;
@@ -201,103 +207,104 @@ int ini_getval(struct INIFILE *ini, char *section_name, char *key, int type, uni
memset(result, 0, sizeof(*result));
break;
}
+ guard_free(data_copy);
return 0;
}
#define getval_returns(t) return result.t
-#define getval_setup(t) \
+#define getval_setup(t, f) \
union INIVal result; \
int state_local = 0; \
- state_local = ini_getval(ini, section_name, key, t, &result); \
+ state_local = ini_getval(ini, section_name, key, t, f, &result); \
if (state != NULL) { \
*state = state_local; \
}
-int ini_getval_int(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_INT)
+int ini_getval_int(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_INT, flags)
getval_returns(as_int);
}
-unsigned int ini_getval_uint(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_UINT)
+unsigned int ini_getval_uint(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_UINT, flags)
getval_returns(as_uint);
}
-long ini_getval_long(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_LONG)
+long ini_getval_long(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_LONG, flags)
getval_returns(as_long);
}
-unsigned long ini_getval_ulong(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_ULONG)
+unsigned long ini_getval_ulong(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_ULONG, flags)
getval_returns(as_ulong);
}
-long long ini_getval_llong(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_LLONG)
+long long ini_getval_llong(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_LLONG, flags)
getval_returns(as_llong);
}
-unsigned long long ini_getval_ullong(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_ULLONG)
+unsigned long long ini_getval_ullong(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_ULLONG, flags)
getval_returns(as_ullong);
}
-float ini_getval_float(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_FLOAT)
+float ini_getval_float(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_FLOAT, flags)
getval_returns(as_float);
}
-double ini_getval_double(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_DOUBLE)
+double ini_getval_double(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_DOUBLE, flags)
getval_returns(as_double);
}
-bool ini_getval_bool(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_BOOL)
+bool ini_getval_bool(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_BOOL, flags)
getval_returns(as_bool);
}
-short ini_getval_short(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_SHORT)
+short ini_getval_short(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_SHORT, flags)
getval_returns(as_short);
}
-unsigned short ini_getval_ushort(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_USHORT)
+unsigned short ini_getval_ushort(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_USHORT, flags)
getval_returns(as_ushort);
}
-char ini_getval_char(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_CHAR)
+char ini_getval_char(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_CHAR, flags)
getval_returns(as_char);
}
-unsigned char ini_getval_uchar(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_UCHAR)
+unsigned char ini_getval_uchar(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_UCHAR, flags)
getval_returns(as_uchar);
}
-char *ini_getval_char_p(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_STR)
+char *ini_getval_char_p(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_STR, flags)
getval_returns(as_char_p);
}
-char *ini_getval_str(struct INIFILE *ini, char *section_name, char *key, int *state) {
- return ini_getval_char_p(ini, section_name, key, state);
+char *ini_getval_str(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ return ini_getval_char_p(ini, section_name, key, flags, state);
}
-char **ini_getval_char_array_p(struct INIFILE *ini, char *section_name, char *key, int *state) {
- getval_setup(INIVAL_TYPE_STR_ARRAY)
- getval_returns(as_char_array_p);
+char *ini_getval_char_array_p(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_STR_ARRAY, flags)
+ getval_returns(as_char_p);
}
-char **ini_getval_str_array(struct INIFILE *ini, char *section_name, char *key, int *state) {
- return ini_getval_char_array_p(ini, section_name, key, state);
+char *ini_getval_str_array(struct INIFILE *ini, char *section_name, char *key, int flags, int *state) {
+ return ini_getval_char_array_p(ini, section_name, key, flags, state);
}
-struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char *key, char *tok, int *state) {
- getval_setup(INIVAL_TYPE_STR_ARRAY)
+struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char *key, char *tok, int flags, int *state) {
+ getval_setup(INIVAL_TYPE_STR_ARRAY, flags)
struct StrList *list;
list = strlist_init();
strlist_append_tokenize(list, result.as_char_p, tok);
@@ -305,7 +312,7 @@ struct StrList *ini_getval_strlist(struct INIFILE *ini, char *section_name, char
return list;
}
-int ini_data_append(struct INIFILE **ini, char *section_name, char *key, char *value) {
+int ini_data_append(struct INIFILE **ini, char *section_name, char *key, char *value, unsigned int hint) {
struct INISection *section = ini_section_search(ini, INI_SEARCH_EXACT, section_name);
if (section == NULL) {
return 1;
@@ -324,6 +331,7 @@ int ini_data_append(struct INIFILE **ini, char *section_name, char *key, char *v
SYSERROR("Unable to allocate %zu bytes for section data", sizeof(*data[0]));
return -1;
}
+ data[section->data_count]->type_hint = hint;
data[section->data_count]->key = key ? strdup(key) : strdup("");
if (!data[section->data_count]->key) {
SYSERROR("Unable to allocate data key%s", "");
@@ -361,7 +369,7 @@ int ini_setval(struct INIFILE **ini, unsigned type, char *section_name, char *ke
}
if (ini_has_key(*ini, section_name, key)) {
if (!type) {
- if (ini_data_append(ini, section_name, key, value)) {
+ if (ini_data_append(ini, section_name, key, value, 0)) {
// append failed
return -1;
}
@@ -410,30 +418,48 @@ int ini_write(struct INIFILE *ini, FILE **stream, unsigned mode) {
return -1;
}
for (size_t x = 0; x < ini->section_count; x++) {
- fprintf(*stream, "[%s]" LINE_SEP, ini->section[x]->key);
+ struct INISection *section = ini->section[x];
+ char *section_name = section->key;
+ fprintf(*stream, "[%s]" LINE_SEP, section_name);
+
for (size_t y = 0; y < ini->section[x]->data_count; y++) {
+ struct INIData *data = section->data[y];
char outvalue[STASIS_BUFSIZ];
+ char *key = data->key;
+ char *value = data->value;
+ unsigned *hint = &data->type_hint;
memset(outvalue, 0, sizeof(outvalue));
- if (ini->section[x]->data[y]->value) {
- char **parts = split(ini->section[x]->data[y]->value, LINE_SEP, 0);
+
+ if (key && value) {
+ int err = 0;
+ char *xvalue = NULL;
+ if (*hint == INIVAL_TYPE_STR_ARRAY) {
+ xvalue = ini_getval_str_array(ini, section_name, key, (int) mode, &err);
+ value = xvalue;
+ } else {
+ xvalue = ini_getval_str(ini, section_name, key, (int) mode, &err);
+ value = xvalue;
+ }
+ char **parts = split(value, LINE_SEP, 0);
size_t parts_total = 0;
for (; parts && parts[parts_total] != NULL; parts_total++);
for (size_t p = 0; parts && parts[p] != NULL; p++) {
char *render = NULL;
if (mode == INI_WRITE_PRESERVE) {
render = tpl_render(parts[p]);
- replace_text(render, "\n", "\n ", 0);
} else {
render = parts[p];
}
- if (p == 0) {
- sprintf(outvalue, "%s" LINE_SEP, render);
- } else {
- if (!isspace(render[0])) {
- sprintf(outvalue + strlen(outvalue), " %s" LINE_SEP, render);
- } else {
+
+ if (*hint == INIVAL_TYPE_STR_ARRAY) {
+ int leading_space = isspace(*render);
+ if (leading_space) {
sprintf(outvalue + strlen(outvalue), "%s" LINE_SEP, render);
+ } else {
+ sprintf(outvalue + strlen(outvalue), " %s" LINE_SEP, render);
}
+ } else {
+ sprintf(outvalue + strlen(outvalue), "%s", render);
}
if (mode == INI_WRITE_PRESERVE) {
guard_free(render);
@@ -442,7 +468,8 @@ int ini_write(struct INIFILE *ini, FILE **stream, unsigned mode) {
GENERIC_ARRAY_FREE(parts);
strip(outvalue);
strcat(outvalue, LINE_SEP);
- fprintf(*stream, "%s = %s%s", ini->section[x]->data[y]->key, ini->section[x]->data[y]->type_hint || parts_total > 1 ? LINE_SEP " " : "", outvalue);
+ fprintf(*stream, "%s = %s%s", ini->section[x]->data[y]->key, *hint == INIVAL_TYPE_STR_ARRAY ? LINE_SEP : "", outvalue);
+ guard_free(value);
} else {
fprintf(*stream, "%s = %s", ini->section[x]->data[y]->key, ini->section[x]->data[y]->value);
}
@@ -487,13 +514,6 @@ void ini_free(struct INIFILE **ini) {
guard_free((*ini));
}
-static void ini_data_set_hint(struct INIFILE **ini, char *section_name, char *key, int hint) {
- struct INIData *data = ini_data_get(*ini, section_name, key);
- if (data) {
- data->type_hint = hint;
- }
-}
-
struct INIFILE *ini_open(const char *filename) {
FILE *fp;
char line[STASIS_BUFSIZ] = {0};
@@ -519,6 +539,7 @@ struct INIFILE *ini_open(const char *filename) {
return NULL;
}
+ unsigned hint = 0;
int multiline_data = 0;
int no_data = 0;
char inikey[2][255];
@@ -617,11 +638,13 @@ struct INIFILE *ini_open(const char *filename) {
}
if (isempty(value)) {
//printf("%s is probably long raw data\n", key);
- ini_data_set_hint(&ini, current_section, key, INIVAL_TYPE_STR_ARRAY);
+ //ini_data_set_hint(&ini, current_section, key, INIVAL_TYPE_STR_ARRAY);
+ hint = INIVAL_TYPE_STR_ARRAY;
multiline_data = 1;
no_data = 1;
} else {
//printf("%s is probably short data\n", key);
+ hint = INIVAL_TYPE_STR;
multiline_data = 0;
}
strip(value);
@@ -638,10 +661,10 @@ struct INIFILE *ini_open(const char *filename) {
unquote(value);
if (!multiline_data) {
reading_value = 0;
- ini_data_append(&ini, current_section, key, value);
+ ini_data_append(&ini, current_section, key, value, hint);
continue;
}
- ini_data_append(&ini, current_section, key, value);
+ ini_data_append(&ini, current_section, key, value, hint);
reading_value = 1;
}
}
diff --git a/src/stasis_main.c b/src/stasis_main.c
index b6ffc1d..4c47672 100644
--- a/src/stasis_main.c
+++ b/src/stasis_main.c
@@ -390,7 +390,7 @@ int main(int argc, char *argv[]) {
}
msg(STASIS_MSG_L2, "Initializing delivery context\n");
- if (delivery_init(&ctx)) {
+ if (delivery_init(&ctx, INI_READ_RENDER)) {
msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "Failed to initialize delivery context\n");
exit(1);
}
diff --git a/src/strlist.c b/src/strlist.c
index bdacb5a..d1bb926 100644
--- a/src/strlist.c
+++ b/src/strlist.c
@@ -174,13 +174,16 @@ void strlist_append_strlist(struct StrList *pStrList1, struct StrList *pStrList2
return;
}
- token = split(str, delim, 0);
+ char *tmp = strdup(str);
+ token = split(tmp, delim, 0);
if (token) {
for (size_t i = 0; token[i] != NULL; i++) {
+ lstrip(token[i]);
strlist_append(&pStrList, token[i]);
}
GENERIC_ARRAY_FREE(token);
}
+ guard_free(tmp);
}
/**
diff --git a/src/utils.c b/src/utils.c
index f721581..70430e1 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -645,7 +645,7 @@ int fix_tox_conf(const char *filename, char **result) {
if (data) {
int err = 0;
char *key = data->key;
- char *value = ini_getval_str(toxini, section->key, data->key, &err);
+ char *value = ini_getval_str(toxini, section->key, data->key, INI_READ_RENDER, &err);
if (key && value) {
if (startswith(value, "pytest") && !strstr(value, "{posargs}")) {
strip(value);
diff --git a/tests/rt_generic.sh b/tests/rt_generic.sh
index 600e501..df39dbd 100644
--- a/tests/rt_generic.sh
+++ b/tests/rt_generic.sh
@@ -39,7 +39,7 @@ pushd "$ws"
echo
echo "#### Contents ####"
- files=$(find stasis/*/output -type f \( -name '*.yml' -o -name '*.md' -o -name '*.stasis' \) | sort)
+ files=$(find stasis/*/output -type f \( -name '*.yml' -o -name '*.md' -o -name '*.stasis' -o -name '*.ini' \) | sort)
for x in $files; do
echo
echo "FILENAME: $x"
diff --git a/tests/test_conda.c b/tests/test_conda.c
index 49cf48b..72217fc 100644
--- a/tests/test_conda.c
+++ b/tests/test_conda.c
@@ -169,7 +169,7 @@ int main(int argc, char *argv[]) {
setenv("LANG", "C", 1);
bootstrap_build_info(&ctx);
- delivery_init(&ctx);
+ delivery_init(&ctx, INI_READ_RENDER);
STASIS_TEST_RUN(tests);
diff --git a/tests/test_ini.c b/tests/test_ini.c
index 5958cfd..7fb13a0 100644
--- a/tests/test_ini.c
+++ b/tests/test_ini.c
@@ -73,6 +73,7 @@ void test_ini_has_key() {
}
void test_ini_setval_getval() {
+ int render_mode = INI_READ_RENDER;
const char *filename = "ini_open.ini";
const char *data = "[default]\na=1\nb=2\nc=3\n[section name here]\ntest=true\n";
struct INIFILE *ini;
@@ -82,12 +83,12 @@ void test_ini_setval_getval() {
ini = ini_open(filename);
union INIVal val;
STASIS_ASSERT(ini_setval(&ini, INI_SETVAL_REPLACE, "default", "a", "changed") == 0, "failed to set value");
- STASIS_ASSERT(ini_getval(ini, "default", "a", INIVAL_TYPE_STR, &val) == 0, "failed to get value");
+ STASIS_ASSERT(ini_getval(ini, "default", "a", INIVAL_TYPE_STR, render_mode, &val) == 0, "failed to get value");
STASIS_ASSERT(strcmp(val.as_char_p, "a") != 0, "unexpected value loaded from modified variable");
STASIS_ASSERT(strcmp(val.as_char_p, "changed") == 0, "unexpected value loaded from modified variable");
STASIS_ASSERT(ini_setval(&ini, INI_SETVAL_APPEND, "default", "a", " twice") == 0, "failed to set value");
- STASIS_ASSERT(ini_getval(ini, "default", "a", INIVAL_TYPE_STR, &val) == 0, "failed to get value");
+ STASIS_ASSERT(ini_getval(ini, "default", "a", INIVAL_TYPE_STR, render_mode, &val) == 0, "failed to get value");
STASIS_ASSERT(strcmp(val.as_char_p, "changed") != 0, "unexpected value loaded from modified variable");
STASIS_ASSERT(strcmp(val.as_char_p, "changed twice") == 0, "unexpected value loaded from modified variable");
ini_free(&ini);