From 9eac01363760031d74ec07c6f053011eea7dff20 Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Fri, 20 Jun 2025 10:15:21 +0200 Subject: [PATCH] Fix clone directory copying --- Cargo.lock | 7 +++++++ binaries/daemon/src/lib.rs | 2 ++ libraries/core/Cargo.toml | 1 + libraries/core/src/build/git.rs | 28 ++++++++++++++++++++++++---- 4 files changed, 34 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 3847931d..502cde60 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2991,6 +2991,7 @@ dependencies = [ "dora-message", "dunce", "eyre", + "fs_extra", "git2", "itertools 0.14.0", "log", @@ -4328,6 +4329,12 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "fs_extra" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c" + [[package]] name = "fsevent-sys" version = "4.1.0" diff --git a/binaries/daemon/src/lib.rs b/binaries/daemon/src/lib.rs index c108410d..14df635c 100644 --- a/binaries/daemon/src/lib.rs +++ b/binaries/daemon/src/lib.rs @@ -998,6 +998,8 @@ impl Daemon { base_working_dir, uv, }; + self.git_manager.clear_planned_builds(session_id); + let nodes = dataflow_descriptor.resolve_aliases_and_set_defaults()?; let mut tasks = Vec::new(); diff --git a/libraries/core/Cargo.toml b/libraries/core/Cargo.toml index 11450c29..41f2e112 100644 --- a/libraries/core/Cargo.toml +++ b/libraries/core/Cargo.toml @@ -30,3 +30,4 @@ dunce = "1.0.5" itertools = "0.14" url = { version = "2.5.4", optional = true } git2 = { workspace = true, optional = true } +fs_extra = "1.3.0" diff --git a/libraries/core/src/build/git.rs b/libraries/core/src/build/git.rs index 3a27e4e1..7e06f2e0 100644 --- a/libraries/core/src/build/git.rs +++ b/libraries/core/src/build/git.rs @@ -144,6 +144,10 @@ impl GitManager { let path = path.join(commit_hash); Ok(dunce::simplified(&path).to_owned()) } + + pub fn clear_planned_builds(&mut self, session_id: SessionId) { + self.prepared_builds.remove(&session_id); + } } pub struct GitFolder { @@ -155,7 +159,7 @@ impl GitFolder { pub async fn prepare(self, logger: &mut impl BuildLogger) -> eyre::Result { let GitFolder { reuse } = self; - eprintln!("reuse: {reuse:?}"); + tracing::info!("reuse: {reuse:?}"); let clone_dir = match reuse { ReuseOptions::NewClone { target_dir, @@ -208,9 +212,25 @@ impl GitFolder { target_dir, commit_hash, } => { - tokio::fs::copy(&from, &target_dir) - .await - .context("failed to copy repo clone")?; + let from_clone = from.clone(); + let to = target_dir.clone(); + tokio::task::spawn_blocking(move || { + std::fs::create_dir_all(&to) + .context("failed to create directory for copying git repo")?; + fs_extra::dir::copy( + &from_clone, + &to, + &fs_extra::dir::CopyOptions::new().content_only(true), + ) + .with_context(|| { + format!( + "failed to copy repo clone from `{}` to `{}`", + from_clone.display(), + to.display() + ) + }) + }) + .await??; logger .log_message(