mirror of
https://github.com/astral-sh/ruff.git
synced 2025-11-01 12:25:45 +00:00
[ty] Support --python=<symlink to executable> (#18827)
## Summary Fixes https://github.com/astral-sh/ty/issues/640. If a user passes `--python=<some-virtual-environment>/bin/python`, we must avoid canonicalizing the path until we've traversed upwards to find the `sys.prefix` directory (`<some-virtual-environment>`). On Unix systems, `<sys.prefix>/bin/python` is often a symlink to a system interpreter; if we resolve the symlink too easily then we'll add the system interpreter's `site-packages` directory as a search path rather than the virtual environment's directory. ## Test Plan I added an integration test to `crates/ty/tests/cli/python_environment.rs` which fails on `main`. I also manually tested locally that running `cargo run -p ty check foo.py --python=.venv/bin/python -vv` now prints this log to the terminal ``` 2025-06-20 18:35:24.57702 DEBUG Resolved site-packages directories for this virtual environment are: SitePackagesPaths({"/Users/alexw/dev/ruff/.venv/lib/python3.13/site-packages"}) ``` Whereas it previously resolved `site-packages` to my system intallation's `site-packages` directory
This commit is contained in:
parent
f32ae94bc3
commit
f24e650dfd
3 changed files with 123 additions and 57 deletions
|
|
@ -656,20 +656,46 @@ impl CliTest {
|
|||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn write_file(&self, path: impl AsRef<Path>, content: &str) -> anyhow::Result<()> {
|
||||
let path = path.as_ref();
|
||||
let path = self.project_dir.join(path);
|
||||
|
||||
fn ensure_parent_directory(path: &Path) -> anyhow::Result<()> {
|
||||
if let Some(parent) = path.parent() {
|
||||
std::fs::create_dir_all(parent)
|
||||
.with_context(|| format!("Failed to create directory `{}`", parent.display()))?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn write_file(&self, path: impl AsRef<Path>, content: &str) -> anyhow::Result<()> {
|
||||
let path = path.as_ref();
|
||||
let path = self.project_dir.join(path);
|
||||
|
||||
Self::ensure_parent_directory(&path)?;
|
||||
|
||||
std::fs::write(&path, &*ruff_python_trivia::textwrap::dedent(content))
|
||||
.with_context(|| format!("Failed to write file `{path}`", path = path.display()))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[cfg(unix)]
|
||||
pub(crate) fn write_symlink(
|
||||
&self,
|
||||
original: impl AsRef<Path>,
|
||||
link: impl AsRef<Path>,
|
||||
) -> anyhow::Result<()> {
|
||||
let link = link.as_ref();
|
||||
let link = self.project_dir.join(link);
|
||||
|
||||
let original = original.as_ref();
|
||||
let original = self.project_dir.join(original);
|
||||
|
||||
Self::ensure_parent_directory(&link)?;
|
||||
|
||||
std::os::unix::fs::symlink(original, &link)
|
||||
.with_context(|| format!("Failed to write symlink `{link}`", link = link.display()))?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn root(&self) -> &Path {
|
||||
&self.project_dir
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue