Skip to content

Commit cca9de1

Browse files
Treat non-existent site-packages as empty (#2413)
## Summary It turns out this doesn't need to exist until something has been installed into it. See, e.g., #2402. Closes #2404.
1 parent bfddd72 commit cca9de1

File tree

5 files changed

+47
-7
lines changed

5 files changed

+47
-7
lines changed

.github/workflows/ci.yml

+29
Original file line numberDiff line numberDiff line change
@@ -480,3 +480,32 @@ jobs:
480480
- name: "Validate global Python install"
481481
shell: bash -el {0}
482482
run: python ./scripts/check_system_python.py --uv ./uv
483+
484+
system-test-amazonlinux:
485+
needs: build-binary-linux
486+
name: "check system | amazonlinux"
487+
runs-on: ubuntu-latest
488+
container: amazonlinux:2023
489+
steps:
490+
- name: "Install base requirements"
491+
run: |
492+
# Needed for `actions/checkout`
493+
yum install tar gzip which -y
494+
- uses: actions/checkout@v4
495+
496+
- name: "Install Python"
497+
run: yum install python3 python3-pip -y
498+
499+
- name: "Download binary"
500+
uses: actions/download-artifact@v4
501+
with:
502+
name: uv-linux-${{ github.sha }}
503+
504+
- name: "Prepare binary"
505+
run: chmod +x ./uv
506+
507+
- name: "Print Python path"
508+
run: echo $(which python3)
509+
510+
- name: "Validate global Python install"
511+
run: python3 scripts/check_system_python.py --uv ./uv

crates/uv-dispatch/src/lib.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -182,8 +182,7 @@ impl<'a> BuildContext for BuildDispatch<'a> {
182182
let tags = self.interpreter.tags()?;
183183

184184
// Determine the set of installed packages.
185-
let site_packages =
186-
SitePackages::from_executable(venv).context("Failed to list installed packages")?;
185+
let site_packages = SitePackages::from_executable(venv)?;
187186

188187
let Plan {
189188
local,

crates/uv-installer/src/site_packages.rs

+15-1
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,22 @@ impl<'a> SitePackages<'a> {
4242
let mut by_name = FxHashMap::default();
4343
let mut by_url = FxHashMap::default();
4444

45+
// Read the site-packages directory.
46+
let site_packages = match fs::read_dir(venv.site_packages()) {
47+
Ok(site_packages) => site_packages,
48+
Err(err) if err.kind() == std::io::ErrorKind::NotFound => {
49+
return Ok(Self {
50+
venv,
51+
distributions,
52+
by_name,
53+
by_url,
54+
});
55+
}
56+
Err(err) => return Err(err).context("Failed to read site-packages directory"),
57+
};
58+
4559
// Index all installed packages by name.
46-
for entry in fs::read_dir(venv.site_packages())? {
60+
for entry in site_packages {
4761
let entry = entry?;
4862
if entry.file_type()?.is_dir() {
4963
let path = entry.path();

crates/uv/src/commands/pip_install.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -143,8 +143,7 @@ pub(crate) async fn pip_install(
143143
let _lock = venv.lock()?;
144144

145145
// Determine the set of installed packages.
146-
let site_packages =
147-
SitePackages::from_executable(&venv).context("Failed to list installed packages")?;
146+
let site_packages = SitePackages::from_executable(&venv)?;
148147

149148
// If the requirements are already satisfied, we're done. Ideally, the resolver would be fast
150149
// enough to let us remove this check. But right now, for large environments, it's an order of

crates/uv/src/commands/pip_sync.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -157,8 +157,7 @@ pub(crate) async fn pip_sync(
157157
);
158158

159159
// Determine the set of installed packages.
160-
let site_packages =
161-
SitePackages::from_executable(&venv).context("Failed to list installed packages")?;
160+
let site_packages = SitePackages::from_executable(&venv)?;
162161

163162
// Resolve any editables.
164163
let resolved_editables = resolve_editables(

0 commit comments

Comments
 (0)