use crate::warning_println;
use std::path::PathBuf;
use std::process::{Command, Stdio};
pub fn get_python_native_path(uv_path: &String) -> String {
if uv_path.is_empty() {
#[cfg(not(target_os = "windows"))]
let find_executable = "which";
#[cfg(target_os = "windows")]
let find_executable = "where";
let output = Command::new(find_executable)
.arg("python3")
.output()
.unwrap();
if output.status.success() {
String::from_utf8(output.stdout)
.unwrap_or("".to_string())
.trim()
.to_string()
} else {
"".to_string()
}
} else {
"".to_string()
}
}
pub fn get_venv_path(
runtime_path: PathBuf,
uv_path: String,
python_native_path: String,
quiet: bool,
clean: bool,
files_to_clean: &mut Vec<PathBuf>,
) -> PathBuf {
let possible_venv_dir_names = ["venv", ".venv"];
possible_venv_dir_names
.iter()
.map(|name| runtime_path.join(name))
.find(|path| path.exists())
.unwrap_or_else(|| {
prepare_venv(
quiet,
&runtime_path,
&uv_path,
&python_native_path,
clean,
files_to_clean,
)
})
}
fn prepare_venv(
quiet: bool,
runtime_path: &PathBuf,
uv_path: &String,
python_native_path: &String,
clean: bool,
files_to_clean: &mut Vec<PathBuf>,
) -> PathBuf {
if !quiet {
warning_println!(
"No venv found in {}, will generate one",
runtime_path.display()
);
}
let new_venv_path = runtime_path.join(".venv");
let _ = Command::new(if uv_path.is_empty() {
&python_native_path
} else {
&uv_path
})
.args(["venv", &new_venv_path.to_str().unwrap()])
.stdout(if quiet {
Stdio::null()
} else {
Stdio::inherit()
})
.stderr(if quiet {
Stdio::null()
} else {
Stdio::inherit()
})
.output()
.unwrap();
if clean {
files_to_clean.push(new_venv_path.clone());
}
new_venv_path
}