diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/conda.c | 80 | ||||
| -rw-r--r-- | src/delivery.c | 15 | ||||
| -rw-r--r-- | src/stasis_main.c | 2 | 
3 files changed, 88 insertions, 9 deletions
| diff --git a/src/conda.c b/src/conda.c index 6ed96c7..ff55f14 100644 --- a/src/conda.c +++ b/src/conda.c @@ -79,6 +79,73 @@ int pip_exec(const char *args) {      return system(command);  } +int pip_index_provides(const char *index_url, const char *name, const char *version) { +    char cmd[PATH_MAX] = {0}; +    char name_local[255]; +    char version_local[255] = {0}; +    char spec[255] = {0}; + +    if (isempty((char *) name) < 0) { +        // no package name means nothing to do. +        return -1; +    } + +    // Fix up the package name +    strncpy(name_local, name, sizeof(name_local) - 1); +    tolower_s(name_local); +    lstrip(name_local); +    strip(name_local); + +    if (version) { +        // Fix up the package version +        strncpy(version_local, version, sizeof(version_local) - 1); +        tolower_s(version_local); +        lstrip(version_local); +        strip(version_local); +        sprintf(spec, "==%s", version); +    } + +    char logfile[] = "/tmp/STASIS-package_exists.XXXXXX"; +    int logfd = mkstemp(logfile); +    if (logfd < 0) { +        perror(logfile); +        remove(logfile);    // fail harmlessly if not present +        return -1; +    } + + +    int status = 0; +    struct Process proc; +    memset(&proc, 0, sizeof(proc)); +    proc.redirect_stderr = 1; +    strcpy(proc.f_stdout, logfile); + +    // Do an installation in dry-run mode to see if the package exists in the given index. +    snprintf(cmd, sizeof(cmd) - 1, "python -m pip install --dry-run --no-deps --index-url=%s %s%s", index_url, name_local, spec); +    status = shell(&proc, cmd); + +    // Print errors only when shell() itself throws one +    // If some day we want to see the errors thrown by pip too, use this condition instead:  (status != 0) +    if (status < 0) { +        FILE *fp = fdopen(logfd, "r"); +        if (!fp) { +            remove(logfile); +            return -1; +        } else { +            char line[BUFSIZ] = {0}; +            fflush(stdout); +            fflush(stderr); +            while (fgets(line, sizeof(line) - 1, fp) != NULL) { +                fprintf(stderr, "%s", line); +            } +            fflush(stderr); +            fclose(fp); +        } +    } +    remove(logfile); +    return proc.returncode == 0; +} +  int conda_exec(const char *args) {      char command[PATH_MAX];      const char *mamba_commands[] = { @@ -275,12 +342,13 @@ int conda_setup_headless() {      }      // Configure conda for headless CI -    conda_exec("config --system --set auto_update_conda false");    // never update conda automatically -    conda_exec("config --system --set always_yes true");            // never prompt for input -    conda_exec("config --system --set safety_checks disabled");     // speedup -    conda_exec("config --system --set rollback_enabled false");     // speedup -    conda_exec("config --system --set report_errors false");        // disable data sharing -    conda_exec("config --system --set solver libmamba");            // use a real solver +    conda_exec("config --system --set auto_update_conda false");     // never update conda automatically +    conda_exec("config --system --set notify_outdated_conda false"); // never notify about outdated conda version +    conda_exec("config --system --set always_yes true");             // never prompt for input +    conda_exec("config --system --set safety_checks disabled");      // speedup +    conda_exec("config --system --set rollback_enabled false");      // speedup +    conda_exec("config --system --set report_errors false");         // disable data sharing +    conda_exec("config --system --set solver libmamba");             // use a real solver      char cmd[PATH_MAX];      size_t total = 0; diff --git a/src/delivery.c b/src/delivery.c index e69ce2f..524dd0a 100644 --- a/src/delivery.c +++ b/src/delivery.c @@ -1466,8 +1466,14 @@ void delivery_defer_packages(struct Delivery *ctx, int type) {              struct Test *test = &ctx->tests[x];              version = NULL; +            char nametmp[1024] = {0}; +            if (spec_end != NULL && spec_begin != NULL) { +                strncpy(nametmp, name, spec_begin - name); +            } else { +                strcpy(nametmp, name); +            }              // Is the [test:NAME] in the package name? -            if (strstr(name, test->name)) { +            if (!strcmp(nametmp, test->name)) {                  // Override test->version when a version is provided by the (pip|conda)_package list item                  guard_free(test->version);                  if (spec_begin && spec_end) { @@ -1498,7 +1504,12 @@ void delivery_defer_packages(struct Delivery *ctx, int type) {                      }                  } -                ignore_pkg = 1; +                if (DEFER_PIP == type && pip_index_provides(PYPI_INDEX_DEFAULT, name, version)) { +                    fprintf(stderr, "(%s present on index %s): ", version, PYPI_INDEX_DEFAULT); +                    ignore_pkg = 0; +                } else { +                    ignore_pkg = 1; +                }                  break;              }          } diff --git a/src/stasis_main.c b/src/stasis_main.c index cf07b3a..7ea465c 100644 --- a/src/stasis_main.c +++ b/src/stasis_main.c @@ -482,7 +482,7 @@ int main(int argc, char *argv[]) {              exit(1);          }          if (conda_env_create(env_name_testing, ctx.meta.python, NULL)) { -            msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "failed to create release environment\n"); +            msg(STASIS_MSG_ERROR | STASIS_MSG_L2, "failed to create testing environment\n");              exit(1);          }      } | 
