diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:41:41 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-05-04 12:41:41 +0000 |
commit | 10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87 (patch) | |
tree | bdffd5d80c26cf4a7a518281a204be1ace85b4c1 /vendor/gix/src/remote/init.rs | |
parent | Releasing progress-linux version 1.70.0+dfsg1-9~progress7.99u1. (diff) | |
download | rustc-10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87.tar.xz rustc-10ee2acdd26a7f1298c6f6d6b7af9b469fe29b87.zip |
Merging upstream version 1.70.0+dfsg2.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'vendor/gix/src/remote/init.rs')
-rw-r--r-- | vendor/gix/src/remote/init.rs | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/vendor/gix/src/remote/init.rs b/vendor/gix/src/remote/init.rs new file mode 100644 index 000000000..bba116946 --- /dev/null +++ b/vendor/gix/src/remote/init.rs @@ -0,0 +1,116 @@ +use std::convert::TryInto; + +use gix_refspec::RefSpec; + +use crate::{config, remote, Remote, Repository}; + +mod error { + use crate::bstr::BString; + + /// The error returned by [`Repository::remote_at(…)`][crate::Repository::remote_at()]. + #[derive(Debug, thiserror::Error)] + #[allow(missing_docs)] + pub enum Error { + #[error(transparent)] + Url(#[from] gix_url::parse::Error), + #[error("The rewritten {kind} url {rewritten_url:?} failed to parse")] + RewrittenUrlInvalid { + kind: &'static str, + rewritten_url: BString, + source: gix_url::parse::Error, + }, + } +} +pub use error::Error; + +use crate::bstr::BString; + +/// Initialization +impl<'repo> Remote<'repo> { + #[allow(clippy::too_many_arguments)] + pub(crate) fn from_preparsed_config( + name_or_url: Option<BString>, + url: Option<gix_url::Url>, + push_url: Option<gix_url::Url>, + fetch_specs: Vec<RefSpec>, + push_specs: Vec<RefSpec>, + should_rewrite_urls: bool, + fetch_tags: remote::fetch::Tags, + repo: &'repo Repository, + ) -> Result<Self, Error> { + debug_assert!( + url.is_some() || push_url.is_some(), + "BUG: fetch or push url must be set at least" + ); + let (url_alias, push_url_alias) = should_rewrite_urls + .then(|| rewrite_urls(&repo.config, url.as_ref(), push_url.as_ref())) + .unwrap_or(Ok((None, None)))?; + Ok(Remote { + name: name_or_url.map(Into::into), + url, + url_alias, + push_url, + push_url_alias, + fetch_specs, + push_specs, + fetch_tags, + repo, + }) + } + + pub(crate) fn from_fetch_url<Url, E>( + url: Url, + should_rewrite_urls: bool, + repo: &'repo Repository, + ) -> Result<Self, Error> + where + Url: TryInto<gix_url::Url, Error = E>, + gix_url::parse::Error: From<E>, + { + let url = url.try_into().map_err(|err| Error::Url(err.into()))?; + let (url_alias, _) = should_rewrite_urls + .then(|| rewrite_urls(&repo.config, Some(&url), None)) + .unwrap_or(Ok((None, None)))?; + Ok(Remote { + name: None, + url: Some(url), + url_alias, + push_url: None, + push_url_alias: None, + fetch_specs: Vec::new(), + push_specs: Vec::new(), + fetch_tags: Default::default(), + repo, + }) + } +} + +pub(crate) fn rewrite_url( + config: &config::Cache, + url: Option<&gix_url::Url>, + direction: remote::Direction, +) -> Result<Option<gix_url::Url>, Error> { + url.and_then(|url| config.url_rewrite().longest(url, direction)) + .map(|url| { + gix_url::parse(url.as_ref()).map_err(|err| Error::RewrittenUrlInvalid { + kind: match direction { + remote::Direction::Fetch => "fetch", + remote::Direction::Push => "push", + }, + source: err, + rewritten_url: url, + }) + }) + .transpose() +} + +pub(crate) fn rewrite_urls( + config: &config::Cache, + url: Option<&gix_url::Url>, + push_url: Option<&gix_url::Url>, +) -> Result<(Option<gix_url::Url>, Option<gix_url::Url>), Error> { + let url_alias = rewrite_url(config, url, remote::Direction::Fetch)?; + let push_url_alias = rewrite_url(config, push_url, remote::Direction::Push)?; + + Ok((url_alias, push_url_alias)) +} |