Order venvs by distance to worktree root (#39067)

This is a follow up to #37510 and is also related to #38910.

Release Notes:

- Improved ordering of virtual environments, sort by distance to
worktree root.
This commit is contained in:
George Waters
2025-09-29 16:25:41 +00:00
committed by GitHub
parent 778ca84f85
commit 6e80fca0d5
+11 -6
View File
@@ -1008,6 +1008,16 @@ fn get_venv_parent_dir(env: &PythonEnvironment) -> Option<PathBuf> {
venv.parent().map(|parent| parent.to_path_buf())
}
fn wr_distance(wr: &PathBuf, venv: Option<&PathBuf>) -> usize {
if let Some(venv) = venv
&& let Ok(p) = venv.strip_prefix(wr)
{
p.components().count()
} else {
usize::MAX
}
}
#[async_trait]
impl ToolchainLister for PythonToolchainProvider {
async fn list(
@@ -1069,12 +1079,7 @@ impl ToolchainLister for PythonToolchainProvider {
let proj_ordering = || {
let lhs_project = lhs.project.clone().or_else(|| get_venv_parent_dir(lhs));
let rhs_project = rhs.project.clone().or_else(|| get_venv_parent_dir(rhs));
match (&lhs_project, &rhs_project) {
(Some(l), Some(r)) => (r == &wr).cmp(&(l == &wr)),
(Some(l), None) if l == &wr => Ordering::Less,
(None, Some(r)) if r == &wr => Ordering::Greater,
_ => Ordering::Equal,
}
wr_distance(&wr, lhs_project.as_ref()).cmp(&wr_distance(&wr, rhs_project.as_ref()))
};
// Compare environment priorities