use crate::{bstr::BString, clone::PrepareFetch, Repository}; /// Builder impl PrepareFetch { /// 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, Box> + '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) -> Result { self.remote_name = Some(crate::remote::name::validated(name)?); Ok(self) } /// Make this clone a shallow one with the respective choice of shallow-ness. pub fn with_shallow(mut self, shallow: crate::remote::fetch::Shallow) -> Self { self.shallow = shallow; 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 for Repository { fn from(prep: PrepareFetch) -> Self { prep.persist() } }