aboutsummaryrefslogtreecommitdiff
path: root/src/conda.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/conda.c')
-rw-r--r--src/conda.c80
1 files changed, 74 insertions, 6 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;