use std::ffi::{OsStr, OsString};
use crate::bstr::{BString, ByteVec};
pub fn agent() -> &'static str {
concat!("oxide-", env!("CARGO_PKG_VERSION"))
}
pub fn args_os() -> impl Iterator<Item = OsString> {
args_os_opt(cfg!(target_vendor = "apple"))
}
pub fn args_os_opt(precompose_unicode: bool) -> impl Iterator<Item = OsString> {
std::env::args_os().map(move |arg| {
if precompose_unicode {
gix_utils::str::precompose_os_string(arg.into()).into_owned()
} else {
arg
}
})
}
pub fn os_str_to_bstring(input: &OsStr) -> Option<BString> {
Vec::from_os_string(input.into()).map(Into::into).ok()
}
pub mod collate {
#[allow(clippy::empty_docs)]
pub mod fetch {
#[derive(Debug, thiserror::Error)]
#[allow(missing_docs)]
pub enum Error<E: std::error::Error + Send + Sync + 'static = std::convert::Infallible> {
#[error(transparent)]
Open(#[from] crate::open::Error),
#[error(transparent)]
FindExistingReference(#[from] crate::reference::find::existing::Error),
#[error(transparent)]
RemoteInit(#[from] crate::remote::init::Error),
#[error(transparent)]
FindExistingRemote(#[from] crate::remote::find::existing::Error),
#[error(transparent)]
#[cfg(feature = "credentials")]
CredentialHelperConfig(#[from] crate::config::credential_helpers::Error),
#[cfg(any(feature = "blocking-network-client", feature = "async-network-client"))]
#[error(transparent)]
Connect(#[from] crate::remote::connect::Error),
#[cfg(any(feature = "blocking-network-client", feature = "async-network-client"))]
#[error(transparent)]
PrepareFetch(#[from] crate::remote::fetch::prepare::Error),
#[cfg(any(feature = "blocking-network-client", feature = "async-network-client"))]
#[error(transparent)]
Fetch(#[from] crate::remote::fetch::Error),
#[error(transparent)]
Other(E),
}
#[cfg(any(feature = "async-network-client", feature = "blocking-network-client"))]
impl<E> crate::protocol::transport::IsSpuriousError for Error<E>
where
E: std::error::Error + Send + Sync + 'static,
{
fn is_spurious(&self) -> bool {
match self {
Error::Open(_)
| Error::CredentialHelperConfig(_)
| Error::RemoteInit(_)
| Error::FindExistingReference(_)
| Error::FindExistingRemote(_)
| Error::Other(_) => false,
Error::Connect(err) => err.is_spurious(),
Error::PrepareFetch(err) => err.is_spurious(),
Error::Fetch(err) => err.is_spurious(),
}
}
}
impl<E> Error<E>
where
E: std::error::Error + Send + Sync + 'static,
{
pub fn is_corrupted(&self) -> bool {
match self {
Error::Open(crate::open::Error::NotARepository { .. } | crate::open::Error::Config(_)) => true,
#[cfg(any(feature = "async-network-client", feature = "blocking-network-client"))]
Error::PrepareFetch(crate::remote::fetch::prepare::Error::RefMap(
crate::remote::ref_map::Error::GatherTransportConfig { .. }
| crate::remote::ref_map::Error::ConfigureCredentials(_),
)) => true,
#[cfg(any(feature = "async-network-client", feature = "blocking-network-client"))]
Error::Fetch(
crate::remote::fetch::Error::PackThreads(_)
| crate::remote::fetch::Error::PackIndexVersion(_)
| crate::remote::fetch::Error::RemovePackKeepFile { .. }
| crate::remote::fetch::Error::Negotiate(_),
) => true,
_ => false,
}
}
}
}
}