diff options
Diffstat (limited to 'vendor/gix/src/clone/fetch/mod.rs')
-rw-r--r-- | vendor/gix/src/clone/fetch/mod.rs | 85 |
1 files changed, 16 insertions, 69 deletions
diff --git a/vendor/gix/src/clone/fetch/mod.rs b/vendor/gix/src/clone/fetch/mod.rs index d663b47ea..59f820675 100644 --- a/vendor/gix/src/clone/fetch/mod.rs +++ b/vendor/gix/src/clone/fetch/mod.rs @@ -1,9 +1,8 @@ -use crate::{bstr::BString, clone::PrepareFetch, Repository}; +use crate::clone::PrepareFetch; /// The error returned by [`PrepareFetch::fetch_only()`]. #[derive(Debug, thiserror::Error)] #[allow(missing_docs)] -#[cfg(feature = "blocking-network-client")] pub enum Error { #[error(transparent)] Connect(#[from] crate::remote::connect::Error), @@ -15,6 +14,8 @@ pub enum Error { RemoteInit(#[from] crate::remote::init::Error), #[error("Custom configuration of remote to clone from failed")] RemoteConfiguration(#[source] Box<dyn std::error::Error + Send + Sync>), + #[error("Custom configuration of connection to use when cloning failed")] + RemoteConnection(#[source] Box<dyn std::error::Error + Send + Sync>), #[error(transparent)] RemoteName(#[from] crate::config::remote::symbolic_name::Error), #[error("Failed to load repo-local git configuration before writing")] @@ -26,7 +27,7 @@ pub enum Error { #[error("The remote HEAD points to a reference named {head_ref_name:?} which is invalid.")] InvalidHeadRef { source: gix_validate::refname::Error, - head_ref_name: BString, + head_ref_name: crate::bstr::BString, }, #[error("Failed to update HEAD with values from remote")] HeadUpdate(#[from] crate::reference::edit::Error), @@ -43,12 +44,11 @@ impl PrepareFetch { /// it was newly initialized. /// /// Note that all data we created will be removed once this instance drops if the operation wasn't successful. - #[cfg(feature = "blocking-network-client")] pub fn fetch_only<P>( &mut self, - progress: P, + mut progress: P, should_interrupt: &std::sync::atomic::AtomicBool, - ) -> Result<(Repository, crate::remote::fetch::Outcome), Error> + ) -> Result<(crate::Repository, crate::remote::fetch::Outcome), Error> where P: crate::Progress, P::SubProgress: 'static, @@ -100,14 +100,19 @@ impl PrepareFetch { ) .expect("valid") .to_owned(); - let pending_pack: remote::fetch::Prepare<'_, '_, _, _> = - remote.connect(remote::Direction::Fetch, progress)?.prepare_fetch({ + let pending_pack: remote::fetch::Prepare<'_, '_, _> = { + let mut connection = remote.connect(remote::Direction::Fetch)?; + if let Some(f) = self.configure_connection.as_mut() { + f(&mut connection).map_err(|err| Error::RemoteConnection(err))?; + } + connection.prepare_fetch(&mut progress, { let mut opts = self.fetch_options.clone(); if !opts.extra_refspecs.contains(&head_refspec) { opts.extra_refspecs.push(head_refspec) } opts - })?; + })? + }; if pending_pack.ref_map().object_hash != repo.object_hash() { unimplemented!("configure repository to expect a different object hash as advertised by the server") } @@ -121,7 +126,8 @@ impl PrepareFetch { .with_reflog_message(RefLogMessage::Override { message: reflog_message.clone(), }) - .receive(should_interrupt)?; + .with_shallow(self.shallow.clone()) + .receive(progress, should_interrupt)?; util::append_config_to_repo_config(repo, config); util::update_head( @@ -135,7 +141,6 @@ impl PrepareFetch { } /// Similar to [`fetch_only()`][Self::fetch_only()`], but passes ownership to a utility type to configure a checkout operation. - #[cfg(feature = "blocking-network-client")] pub fn fetch_then_checkout<P>( &mut self, progress: P, @@ -150,63 +155,5 @@ impl PrepareFetch { } } -/// Builder -impl PrepareFetch { - /// Set additional options to adjust parts of the fetch operation that are not affected by the git configuration. - #[cfg(any(feature = "async-network-client", feature = "blocking-network-client"))] - pub fn with_fetch_options(mut self, opts: crate::remote::ref_map::Options) -> Self { - self.fetch_options = opts; - self - } - /// Use `f` to apply arbitrary changes to the remote that is about to be used to fetch a pack. - /// - /// The passed in `remote` will be un-named and pre-configured to be a default remote as we know it from git-clone. - /// It is not yet present in the configuration of the repository, - /// but each change it will eventually be written to the configuration prior to performing a the fetch operation, - /// _all changes done in `f()` will be persisted_. - /// - /// It can also be used to configure additional options, like those for fetching tags. Note that - /// [with_fetch_tags()][crate::Remote::with_fetch_tags()] should be called here to configure the clone as desired. - /// Otherwise a clone is configured to be complete and fetches all tags, not only those reachable from all branches. - pub fn configure_remote( - mut self, - f: impl FnMut(crate::Remote<'_>) -> Result<crate::Remote<'_>, Box<dyn std::error::Error + Send + Sync>> + 'static, - ) -> Self { - self.configure_remote = Some(Box::new(f)); - self - } - - /// Set the remote's name to the given value after it was configured using the function provided via - /// [`configure_remote()`][Self::configure_remote()]. - /// - /// If not set here, it defaults to `origin` or the value of `clone.defaultRemoteName`. - pub fn with_remote_name(mut self, name: impl Into<BString>) -> Result<Self, crate::remote::name::Error> { - self.remote_name = Some(crate::remote::name::validated(name)?); - Ok(self) - } -} - -/// Consumption -impl PrepareFetch { - /// Persist the contained repository as is even if an error may have occurred when fetching from the remote. - pub fn persist(mut self) -> Repository { - self.repo.take().expect("present and consumed once") - } -} - -impl Drop for PrepareFetch { - fn drop(&mut self) { - if let Some(repo) = self.repo.take() { - std::fs::remove_dir_all(repo.work_dir().unwrap_or_else(|| repo.path())).ok(); - } - } -} - -impl From<PrepareFetch> for Repository { - fn from(prep: PrepareFetch) -> Self { - prep.persist() - } -} - #[cfg(feature = "blocking-network-client")] mod util; |