diff options
Diffstat (limited to 'vendor/gix/src/remote/build.rs')
-rw-r--r-- | vendor/gix/src/remote/build.rs | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/vendor/gix/src/remote/build.rs b/vendor/gix/src/remote/build.rs new file mode 100644 index 000000000..10c216537 --- /dev/null +++ b/vendor/gix/src/remote/build.rs @@ -0,0 +1,84 @@ +use std::convert::TryInto; + +use crate::{bstr::BStr, remote, Remote}; + +/// Builder methods +impl Remote<'_> { + /// Set the `url` to be used when pushing data to a remote. + pub fn push_url<Url, E>(self, url: Url) -> Result<Self, remote::init::Error> + where + Url: TryInto<gix_url::Url, Error = E>, + gix_url::parse::Error: From<E>, + { + self.push_url_inner(url, true) + } + + /// Set the `url` to be used when pushing data to a remote, without applying rewrite rules in case these could be faulty, + /// eliminating one failure mode. + pub fn push_url_without_url_rewrite<Url, E>(self, url: Url) -> Result<Self, remote::init::Error> + where + Url: TryInto<gix_url::Url, Error = E>, + gix_url::parse::Error: From<E>, + { + self.push_url_inner(url, false) + } + + /// Configure how tags should be handled when fetching from the remote. + pub fn with_fetch_tags(mut self, tags: remote::fetch::Tags) -> Self { + self.fetch_tags = tags; + self + } + + fn push_url_inner<Url, E>(mut self, push_url: Url, should_rewrite_urls: bool) -> Result<Self, remote::init::Error> + where + Url: TryInto<gix_url::Url, Error = E>, + gix_url::parse::Error: From<E>, + { + let push_url = push_url + .try_into() + .map_err(|err| remote::init::Error::Url(err.into()))?; + self.push_url = push_url.into(); + + let (_, push_url_alias) = should_rewrite_urls + .then(|| remote::init::rewrite_urls(&self.repo.config, None, self.push_url.as_ref())) + .unwrap_or(Ok((None, None)))?; + self.push_url_alias = push_url_alias; + + Ok(self) + } + + /// Add `specs` as refspecs for `direction` to our list if they are unique, or ignore them otherwise. + pub fn with_refspecs<Spec>( + mut self, + specs: impl IntoIterator<Item = Spec>, + direction: remote::Direction, + ) -> Result<Self, gix_refspec::parse::Error> + where + Spec: AsRef<BStr>, + { + use remote::Direction::*; + let new_specs = specs + .into_iter() + .map(|spec| { + gix_refspec::parse( + spec.as_ref(), + match direction { + Push => gix_refspec::parse::Operation::Push, + Fetch => gix_refspec::parse::Operation::Fetch, + }, + ) + .map(|s| s.to_owned()) + }) + .collect::<Result<Vec<_>, _>>()?; + let specs = match direction { + Push => &mut self.push_specs, + Fetch => &mut self.fetch_specs, + }; + for spec in new_specs { + if !specs.contains(&spec) { + specs.push(spec); + } + } + Ok(self) + } +} |