-
Notifications
You must be signed in to change notification settings - Fork 38
pyenv-win version detection fails when PYENV/PYENV_ROOT env vars not set #316
Copy link
Copy link
Closed
Labels
bugIssue identified by VS Code Team member as probable bugIssue identified by VS Code Team member as probable bug
Description
Bug Description
On Windows, when pyenv-win is installed at the default home location (~/.pyenv/pyenv-win/) but the PYENV_ROOT or PYENV environment variables are not set, the version detection in get_pyenv_manager_version() fails because it only uses get_pyenv_dir(environment) which requires those env vars to be present.
Location
crates/pet-pyenv/src/manager.rs:
#[cfg(windows)]
fn get_pyenv_manager_version(
_pyenv_binary_path: &Path,
environment: &EnvVariables,
) -> Option<String> {
// In windows, the version is stored in the `.pyenv/.version` file
let pyenv_dir = get_pyenv_dir(environment)?; // <-- Returns None if env vars not set
let mut version_file = pyenv_dir.join(".version");
// ...
}The function get_pyenv_dir() in environment_locations.rs:
pub fn get_pyenv_dir(env_vars: &EnvVariables) -> Option<PathBuf> {
match &env_vars.pyenv_root {
Some(dir) => Some(PathBuf::from(dir)),
None => env_vars.pyenv.as_ref().map(PathBuf::from), // Returns None if neither env var is set
}
}Expected Behavior
If the env vars are not set, the version detection should fall back to checking the home-based default path ~/.pyenv/.version.
Suggested Fix
#[cfg(windows)]
fn get_pyenv_manager_version(
_pyenv_binary_path: &Path,
environment: &EnvVariables,
) -> Option<String> {
// In windows, the version is stored in the `.pyenv/.version` file
// Try env var path first, then fall back to home directory
let pyenv_dir = get_pyenv_dir(environment)
.or_else(|| get_home_pyenv_dir(environment)?.parent().map(PathBuf::from));
let pyenv_dir = pyenv_dir?;
let mut version_file = pyenv_dir.join(".version");
if !version_file.exists() {
// We might have got the path `~/.pyenv/pyenv-win`
version_file = pyenv_dir.parent()?.join(".version");
if !version_file.exists() {
return None;
}
}
let version = fs::read_to_string(version_file).ok()?;
Some(
PYENV_VERSION_FROM_VERSION_FILE
.captures(&version)?
.get(1)?
.as_str()
.to_string(),
)
}Related Issue
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
bugIssue identified by VS Code Team member as probable bugIssue identified by VS Code Team member as probable bug