Skip to content

Commit 249e82e

Browse files
authored
Tweek conda search paths (#118)
1 parent b117938 commit 249e82e

File tree

5 files changed

+200
-55
lines changed

5 files changed

+200
-55
lines changed

crates/pet-conda/src/conda_rc.rs

Lines changed: 60 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use log::trace;
66
use pet_fs::path::expand_path;
77
use std::{
88
collections::HashSet,
9-
fs,
9+
env, fs,
1010
path::{Path, PathBuf},
1111
};
1212
use yaml_rust2::YamlLoader;
@@ -29,7 +29,7 @@ impl Condarc {
2929
// Search paths documented here
3030
// https://conda.io/projects/conda/en/latest/user-guide/configuration/use-condarc.html#searching-for-condarc
3131
// https://github.com/conda/conda/blob/3ae5d7cf6cbe2b0ff9532359456b7244ae1ea5ef/conda/base/constants.py#L28
32-
fn get_conda_rc_search_paths(env_vars: &EnvVariables) -> Vec<PathBuf> {
32+
pub fn get_conda_rc_search_paths(env_vars: &EnvVariables) -> Vec<PathBuf> {
3333
use crate::utils::change_root_of_path;
3434

3535
let mut search_paths: Vec<PathBuf> = vec![];
@@ -40,6 +40,22 @@ fn get_conda_rc_search_paths(env_vars: &EnvVariables) -> Vec<PathBuf> {
4040
"C:\\ProgramData\\conda\\.condarc",
4141
"C:\\ProgramData\\conda\\condarc",
4242
"C:\\ProgramData\\conda\\condarc.d",
43+
"C:\\ProgramData\\conda\\.mambarc",
44+
format!(
45+
"{}:\\ProgramData\\conda\\.condarc",
46+
env::var("SYSTEMDRIVE").unwrap_or("C".to_string())
47+
)
48+
.as_str(),
49+
format!(
50+
"{}:\\ProgramData\\conda\\condarc",
51+
env::var("SYSTEMDRIVE").unwrap_or("C".to_string())
52+
)
53+
.as_str(),
54+
format!(
55+
"{}:\\ProgramData\\conda\\condarc.d",
56+
env::var("SYSTEMDRIVE").unwrap_or("C".to_string())
57+
)
58+
.as_str(),
4359
]
4460
.iter()
4561
.map(PathBuf::from)
@@ -51,9 +67,11 @@ fn get_conda_rc_search_paths(env_vars: &EnvVariables) -> Vec<PathBuf> {
5167
"/etc/conda/.condarc",
5268
"/etc/conda/condarc",
5369
"/etc/conda/condarc.d",
70+
"/etc/conda/mambarc",
5471
"/var/lib/conda/.condarc",
5572
"/var/lib/conda/condarc",
5673
"/var/lib/conda/condarc.d",
74+
"/var/lib/conda/.mambarc",
5775
]
5876
.iter()
5977
.map(PathBuf::from)
@@ -63,17 +81,20 @@ fn get_conda_rc_search_paths(env_vars: &EnvVariables) -> Vec<PathBuf> {
6381
);
6482
}
6583
if let Some(ref conda_root) = env_vars.conda_root {
84+
let conda_root = expand_path(PathBuf::from(conda_root.clone()));
6685
search_paths.append(&mut vec![
67-
PathBuf::from(conda_root.clone()).join(".condarc"),
68-
PathBuf::from(conda_root.clone()).join("condarc"),
69-
PathBuf::from(conda_root.clone()).join(".condarc.d"),
86+
conda_root.join(".condarc"),
87+
conda_root.join("condarc"),
88+
conda_root.join(".condarc.d"),
89+
conda_root.join(".mambarc"),
7090
]);
7191
}
7292
if let Some(ref xdg_config_home) = env_vars.xdg_config_home {
7393
search_paths.append(&mut vec![
7494
PathBuf::from(xdg_config_home.clone()).join(".condarc"),
7595
PathBuf::from(xdg_config_home.clone()).join("condarc"),
7696
PathBuf::from(xdg_config_home.clone()).join(".condarc.d"),
97+
PathBuf::from(xdg_config_home.clone()).join(".mambarc"),
7798
]);
7899
}
79100
if let Some(ref home) = env_vars.home {
@@ -85,24 +106,33 @@ fn get_conda_rc_search_paths(env_vars: &EnvVariables) -> Vec<PathBuf> {
85106
home.join(".conda").join("condarc"),
86107
home.join(".conda").join("condarc.d"),
87108
home.join(".condarc"),
109+
home.join("condarc"),
110+
home.join("condarc.d"),
111+
home.join(".mambarc"),
88112
]);
89113
}
90114
if let Some(ref conda_prefix) = env_vars.conda_prefix {
115+
let conda_prefix = expand_path(PathBuf::from(conda_prefix.clone()));
91116
search_paths.append(&mut vec![
92-
PathBuf::from(conda_prefix.clone()).join(".condarc"),
93-
PathBuf::from(conda_prefix.clone()).join("condarc"),
94-
PathBuf::from(conda_prefix.clone()).join(".condarc.d"),
117+
conda_prefix.join(".condarc"),
118+
conda_prefix.join("condarc"),
119+
conda_prefix.join(".condarc.d"),
120+
conda_prefix.join(".mamabarc"),
95121
]);
96122
}
97123
if let Some(ref conda_dir) = env_vars.conda_dir {
124+
let conda_dir = expand_path(PathBuf::from(conda_dir.clone()));
98125
search_paths.append(&mut vec![
99-
PathBuf::from(conda_dir.clone()).join(".condarc"),
100-
PathBuf::from(conda_dir.clone()).join("condarc"),
101-
PathBuf::from(conda_dir.clone()).join(".condarc.d"),
126+
conda_dir.join(".condarc"),
127+
conda_dir.join("condarc"),
128+
conda_dir.join(".condarc.d"),
102129
]);
103130
}
104131
if let Some(ref condarc) = env_vars.condarc {
105-
search_paths.append(&mut vec![PathBuf::from(condarc)]);
132+
search_paths.append(&mut vec![expand_path(PathBuf::from(condarc))]);
133+
}
134+
if let Some(ref mambarc) = env_vars.mambarc {
135+
search_paths.append(&mut vec![expand_path(PathBuf::from(mambarc))]);
106136
}
107137

108138
let search_paths: HashSet<_> = search_paths.into_iter().collect();
@@ -157,15 +187,21 @@ fn get_conda_conda_rc_from_path(conda_rc: &PathBuf) -> Option<Condarc> {
157187
.map(|e| e.path())
158188
.filter(|p| p.is_file())
159189
{
160-
let file_name = path.file_name().unwrap().to_str().unwrap_or_default();
190+
let file_name = path
191+
.file_name()
192+
.unwrap()
193+
.to_str()
194+
.unwrap_or_default()
195+
.to_lowercase();
161196
let extension = path
162197
.extension()
163198
.unwrap_or_default()
164199
.to_str()
165-
.unwrap_or_default();
200+
.unwrap_or_default()
201+
.to_lowercase();
166202

167-
if POSSIBLE_CONDA_RC_FILES.contains(&file_name)
168-
|| SUPPORTED_EXTENSIONS.contains(&extension)
203+
if POSSIBLE_CONDA_RC_FILES.contains(&file_name.as_str())
204+
|| SUPPORTED_EXTENSIONS.contains(&extension.as_str())
169205
|| file_name.contains("condarc")
170206
{
171207
if let Some(ref mut cfg) = parse_conda_rc(&path) {
@@ -186,13 +222,14 @@ fn get_conda_conda_rc_from_path(conda_rc: &PathBuf) -> Option<Condarc> {
186222

187223
fn parse_conda_rc(conda_rc: &Path) -> Option<Condarc> {
188224
let reader = fs::read_to_string(conda_rc).ok()?;
189-
trace!("Possible conda_rc: {:?}", conda_rc);
190225
if let Some(cfg) = parse_conda_rc_contents(&reader) {
226+
trace!("conda_rc: {:?} with env_dirs {:?}", conda_rc, cfg.env_dirs);
191227
Some(Condarc {
192228
env_dirs: cfg.env_dirs,
193229
files: vec![conda_rc.to_path_buf()],
194230
})
195231
} else {
232+
trace!("Failed to parse or empty conda_rc: {:?}", conda_rc);
196233
Some(Condarc {
197234
env_dirs: vec![],
198235
files: vec![conda_rc.to_path_buf()],
@@ -220,7 +257,9 @@ fn parse_conda_rc_contents(contents: &str) -> Option<Condarc> {
220257
if item_str.is_empty() {
221258
continue;
222259
}
223-
env_dirs.push(expand_path(PathBuf::from(item_str.trim())));
260+
let env_dir = expand_path(PathBuf::from(item_str.trim()));
261+
trace!("env_dir: {:?} parsed as {:?}", item_str.trim(), env_dir);
262+
env_dirs.push(env_dir);
224263
}
225264
}
226265
if let Some(items) = doc["envs_path"].as_vec() {
@@ -229,7 +268,9 @@ fn parse_conda_rc_contents(contents: &str) -> Option<Condarc> {
229268
if item_str.is_empty() {
230269
continue;
231270
}
232-
env_dirs.push(expand_path(PathBuf::from(item_str.trim())));
271+
let env_dir = expand_path(PathBuf::from(item_str.trim()));
272+
trace!("env_path: {:?} parsed as {:?}", item_str.trim(), env_dir);
273+
env_dirs.push(env_dir);
233274
}
234275
}
235276
}

crates/pet-conda/src/env_variables.rs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,15 @@ pub struct EnvVariables {
2222
pub conda_dir: Option<String>,
2323
pub conda: Option<String>,
2424
pub conda_prefix: Option<String>,
25+
pub mamba_root_prefix: Option<String>,
2526
/// https://docs.conda.io/projects/conda/en/22.11.x/user-guide/configuration/use-condarc.html
2627
pub conda_envs_path: Option<String>,
2728
pub condarc: Option<String>,
29+
pub mambarc: Option<String>,
30+
// https://anaconda-project.readthedocs.io/en/latest/config.html
31+
pub anaconda_project_envs_path: Option<String>,
32+
// https://anaconda-project.readthedocs.io/en/latest/config.html
33+
pub project_dir: Option<String>,
2834
pub xdg_config_home: Option<String>,
2935
pub known_global_search_locations: Vec<PathBuf>,
3036
}
@@ -43,8 +49,12 @@ impl EnvVariables {
4349
conda_root: env.get_env_var("CONDA_ROOT".to_string()),
4450
conda: env.get_env_var("CONDA".to_string()),
4551
conda_prefix: env.get_env_var("CONDA_PREFIX".to_string()),
52+
mamba_root_prefix: env.get_env_var("MAMBA_ROOT_PREFIX".to_string()),
4653
conda_envs_path: env.get_env_var("CONDA_ENVS_PATH".to_string()),
54+
anaconda_project_envs_path: env.get_env_var("ANACONDA_PROJECT_ENVS_PATH".to_string()),
55+
project_dir: env.get_env_var("PROJECT_DIR".to_string()),
4756
condarc: env.get_env_var("CONDARC".to_string()),
57+
mambarc: env.get_env_var("MAMBARC".to_string()),
4858
xdg_config_home: env.get_env_var("XDG_CONFIG_HOME".to_string()),
4959
known_global_search_locations: env.get_know_global_search_locations(),
5060
}

0 commit comments

Comments
 (0)