From 9cd51c8a57d45e7c0fe6ee735c7b5edaa9062fb9 Mon Sep 17 00:00:00 2001 From: Charlie Marsh Date: Thu, 7 Nov 2024 19:50:55 -0500 Subject: [PATCH] Add dedicated cache method for creating build directories (#8910) ## Summary Based on feedback from https://github.com/astral-sh/uv/pull/8905/files#r1833531812. --- crates/uv-build-frontend/src/lib.rs | 2 +- crates/uv-cache/src/lib.rs | 10 ++++++++-- crates/uv-distribution/src/source/mod.rs | 8 ++++---- crates/uv/src/commands/project/environment.rs | 2 +- crates/uv/src/commands/project/run.rs | 8 ++++---- 5 files changed, 18 insertions(+), 12 deletions(-) diff --git a/crates/uv-build-frontend/src/lib.rs b/crates/uv-build-frontend/src/lib.rs index bc0567661..297b10a68 100644 --- a/crates/uv-build-frontend/src/lib.rs +++ b/crates/uv-build-frontend/src/lib.rs @@ -261,7 +261,7 @@ impl SourceBuild { level: BuildOutput, concurrent_builds: usize, ) -> Result { - let temp_dir = build_context.cache().environment()?; + let temp_dir = build_context.cache().venv_dir()?; let source_tree = if let Some(subdir) = subdirectory { source.join(subdir) diff --git a/crates/uv-cache/src/lib.rs b/crates/uv-cache/src/lib.rs index ac9fb3ec0..8090be155 100644 --- a/crates/uv-cache/src/lib.rs +++ b/crates/uv-cache/src/lib.rs @@ -188,8 +188,14 @@ impl Cache { self.bucket(CacheBucket::Archive).join(id) } - /// Create an ephemeral Python environment in the cache. - pub fn environment(&self) -> io::Result { + /// Create a temporary directory to be used as a Python virtual environment. + pub fn venv_dir(&self) -> io::Result { + fs_err::create_dir_all(self.bucket(CacheBucket::Builds))?; + tempfile::tempdir_in(self.bucket(CacheBucket::Builds)) + } + + /// Create a temporary directory to be used for executing PEP 517 source distribution builds. + pub fn build_dir(&self) -> io::Result { fs_err::create_dir_all(self.bucket(CacheBucket::Builds))?; tempfile::tempdir_in(self.bucket(CacheBucket::Builds)) } diff --git a/crates/uv-distribution/src/source/mod.rs b/crates/uv-distribution/src/source/mod.rs index 489f8cd26..70a2333b2 100644 --- a/crates/uv-distribution/src/source/mod.rs +++ b/crates/uv-distribution/src/source/mod.rs @@ -1720,10 +1720,10 @@ impl<'a, T: BuildContext> SourceDistributionBuilder<'a, T> { } // Build into a temporary directory, to prevent partial builds. - let build = self + let temp_dir = self .build_context .cache() - .environment() + .build_dir() .map_err(Error::CacheWrite)?; // Build the wheel. @@ -1748,13 +1748,13 @@ impl<'a, T: BuildContext> SourceDistributionBuilder<'a, T> { ) .await .map_err(Error::Build)? - .wheel(build.path()) + .wheel(temp_dir.path()) .await .map_err(Error::Build)?; // Move the wheel to the cache. rename_with_retry( - build.path().join(&disk_filename), + temp_dir.path().join(&disk_filename), cache_shard.join(&disk_filename), ) .await diff --git a/crates/uv/src/commands/project/environment.rs b/crates/uv/src/commands/project/environment.rs index 7a5eb8e17..e90c8abbb 100644 --- a/crates/uv/src/commands/project/environment.rs +++ b/crates/uv/src/commands/project/environment.rs @@ -98,7 +98,7 @@ impl CachedEnvironment { } // Create the environment in the cache, then relocate it to its content-addressed location. - let temp_dir = cache.environment()?; + let temp_dir = cache.venv_dir()?; let venv = uv_virtualenv::create_venv( temp_dir.path(), interpreter, diff --git a/crates/uv/src/commands/project/run.rs b/crates/uv/src/commands/project/run.rs index e656635a6..fc8651a91 100644 --- a/crates/uv/src/commands/project/run.rs +++ b/crates/uv/src/commands/project/run.rs @@ -323,7 +323,7 @@ pub(crate) async fn run( Some(environment.into_interpreter()) } else { // Create a virtual environment. - temp_dir = cache.environment()?; + temp_dir = cache.venv_dir()?; let environment = uv_virtualenv::create_venv( temp_dir.path(), interpreter, @@ -538,7 +538,7 @@ pub(crate) async fn run( } // Create a virtual environment - temp_dir = cache.environment()?; + temp_dir = cache.venv_dir()?; uv_virtualenv::create_venv( temp_dir.path(), interpreter, @@ -741,7 +741,7 @@ pub(crate) async fn run( debug!("Creating isolated virtual environment"); // If we're isolating the environment, use an ephemeral virtual environment. - temp_dir = cache.environment()?; + temp_dir = cache.venv_dir()?; let venv = uv_virtualenv::create_venv( temp_dir.path(), interpreter, @@ -791,7 +791,7 @@ pub(crate) async fn run( Some(match spec.filter(|spec| !spec.is_empty()) { None => { // Create a virtual environment - temp_dir = cache.environment()?; + temp_dir = cache.venv_dir()?; uv_virtualenv::create_venv( temp_dir.path(), base_interpreter.clone(),