summaryrefslogtreecommitdiffstats
path: root/vendor/gix/src/remote/build.rs
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/gix/src/remote/build.rs')
-rw-r--r--vendor/gix/src/remote/build.rs84
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)
+ }
+}