aboutsummaryrefslogtreecommitdiff
path: root/src/conda.c
diff options
context:
space:
mode:
authorJoseph Hunkeler <jhunkeler@users.noreply.github.com>2024-08-20 10:45:09 -0400
committerGitHub <noreply@github.com>2024-08-20 10:45:09 -0400
commit0eda05963f3c70c3969ddd2aa72926b871ef4b07 (patch)
treef38b6fd60a36b82e1247ff60ef28e694cd9517ff /src/conda.c
parenta7568dc03c1c6851ff6c690e8e35ade9a3199c4a (diff)
downloadstasis-0eda05963f3c70c3969ddd2aa72926b871ef4b07.tar.gz
Pypi existence check (#30)
* Add python_package_exists() function * Poll pypi.org or compatible index to see if a package exists * Returns non-zero on success * Implements python_package_exists() in delivery_defer_packages() * Implements python_package_exists() in delivery_defer_packages() * Bugfix: Avoid incorrect package selection * With large package lists that contain multiple packages starting with the same strstr() would pick the first match * This adds a temporary name variable that strcmp() can check against. * Message correction: * Change "release" to "testing" in testing environment failure message * Amend message to fit the flow of the output * Disable outdated conda notifications * The latest version isn't always the greatest. Don't give the end-user any ideas. Just use whatever the installer provides... quietly * Rename python_package_exists to pip_index_provides * Document the function prototype * Add missing comments in micromamba structure * Ensure the temporary output file does not linger
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;