aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@users.noreply.github.com>2024-08-15 10:07:05 -0400
committerGitHub <noreply@github.com>2024-08-15 10:07:05 -0400
commitcc5fa8b386200cce03ef8a081acccc92dc44ddfb (patch)
treef9b600cafb8e55a035292387b2c1ba90145a1f5a
parent7c061ae7c293de0b52bad6a9d51a326005c4395c (diff)
downloadstasis-cc5fa8b386200cce03ef8a081acccc92dc44ddfb.tar.gz
Support git+schema style strings in package list (#24)
-rw-r--r--src/delivery.c57
1 files changed, 41 insertions, 16 deletions
diff --git a/src/delivery.c b/src/delivery.c
index 2b5e781..4a92b92 100644
--- a/src/delivery.c
+++ b/src/delivery.c
@@ -414,8 +414,10 @@ void validate_delivery_ini(struct INIFILE *ini) {
name = &name[1];
}
//ini_has_key_required(ini, section->key, "version");
- ini_has_key_required(ini, section->key, "repository");
- ini_has_key_required(ini, section->key, "script");
+ //ini_has_key_required(ini, section->key, "repository");
+ if (globals.enable_testing) {
+ ini_has_key_required(ini, section->key, "script");
+ }
}
}
@@ -1450,7 +1452,7 @@ void delivery_defer_packages(struct Delivery *ctx, int type) {
// Compile a list of packages that are *also* to be tested.
char *version;
- char *spec_begin = strpbrk(name, "~=<>!");
+ char *spec_begin = strpbrk(name, "@~=<>!");
char *spec_end = spec_begin;
if (spec_end) {
// A version is present in the package name. Jump past operator(s).
@@ -1459,22 +1461,45 @@ void delivery_defer_packages(struct Delivery *ctx, int type) {
}
}
- // When spec is present in name, set ctx->tests[x].version to the version detected in the name
- for (size_t x = 0; x < sizeof(ctx->tests) / sizeof(ctx->tests[0]); x++) {
+ // When spec is present in name, set tests->version to the version detected in the name
+ for (size_t x = 0; x < sizeof(ctx->tests) / sizeof(ctx->tests[0]) && ctx->tests[x].name != NULL; x++) {
+ struct Test *test = &ctx->tests[x];
version = NULL;
- if (ctx->tests[x].name) {
- if (strstr(name, ctx->tests[x].name)) {
- guard_free(ctx->tests[x].version);
- if (spec_begin && spec_end) {
- *spec_begin = '\0';
- ctx->tests[x].version = strdup(spec_end);
- } else {
- ctx->tests[x].version = strdup("HEAD");
+
+ // Is the [test:NAME] in the package name?
+ if (strstr(name, test->name)) {
+ // Override test->version when a version is provided by the (pip|conda)_package list item
+ guard_free(test->version);
+ if (spec_begin && spec_end) {
+ *spec_begin = '\0';
+ test->version = strdup(spec_end);
+ } else {
+ // There are too many possible default branches nowadays: master, main, develop, xyz, etc.
+ // HEAD is a safe bet.
+ test->version = strdup("HEAD");
+ }
+ version = test->version;
+
+ // Is the list item a git+schema:// URL?
+ if (strstr(name, "git+") && strstr(name, "://")) {
+ char *xrepo = strstr(name, "+");
+ if (xrepo) {
+ xrepo++;
+ guard_free(test->repository);
+ test->repository = strdup(xrepo);
+ xrepo = NULL;
+ }
+ // Extract the name of the package
+ char *xbasename = path_basename(name);
+ if (xbasename) {
+ // Replace the git+schema:// URL with the package name
+ strlist_set(&dataptr, i, xbasename);
+ name = strlist_item(dataptr, i);
}
- version = ctx->tests[x].version;
- ignore_pkg = 1;
- break;
}
+
+ ignore_pkg = 1;
+ break;
}
}