git-next/crates/git/src/validation/remotes.rs

74 lines
2.1 KiB
Rust
Raw Normal View History

use git_next_config::RemoteUrl;
use tracing::info;
use crate as git;
#[tracing::instrument(skip_all)]
pub fn validate_default_remotes(
open_repository: &dyn git::repository::OpenRepositoryLike,
repo_details: &git::RepoDetails,
) -> Result<()> {
let push_remote = open_repository
2024-06-09 10:21:09 +01:00
.find_default_remote(git::repository::Direction::Push)
.ok_or_else(|| Error::NoDefaultPushRemote)?;
let fetch_remote = open_repository
2024-06-09 10:21:09 +01:00
.find_default_remote(git::repository::Direction::Fetch)
.ok_or_else(|| Error::NoDefaultFetchRemote)?;
let Some(remote_url) = repo_details.remote_url() else {
return Err(git::validation::remotes::Error::UnableToOpenRepo(
"Unable to build forge url".to_string(),
));
};
info!(config = %remote_url, push = %push_remote, fetch = %fetch_remote, "Check remotes match");
if remote_url != push_remote {
return Err(Error::MismatchDefaultPushRemote {
found: push_remote,
expected: remote_url,
});
}
if remote_url != fetch_remote {
return Err(Error::MismatchDefaultFetchRemote {
found: fetch_remote,
expected: remote_url,
});
}
Ok(())
}
type Result<T> = core::result::Result<T, Error>;
#[derive(Debug, thiserror::Error)]
pub enum Error {
#[error("no default push remote")]
NoDefaultPushRemote,
#[error("no default fetch remote")]
NoDefaultFetchRemote,
#[error("no url for default push remote")]
NoUrlForDefaultPushRemote,
#[error("no hostname for default push remote")]
NoHostnameForDefaultPushRemote,
#[error("unable to open repo: {0}")]
UnableToOpenRepo(String),
#[error("io")]
Io(#[from] std::io::Error),
#[error("MismatchDefaultPushRemote(found: {found}, expected: {expected})")]
MismatchDefaultPushRemote {
found: RemoteUrl,
expected: RemoteUrl,
},
#[error("MismatchDefaultFetchRemote(found: {found}, expected: {expected})")]
MismatchDefaultFetchRemote {
found: RemoteUrl,
expected: RemoteUrl,
},
#[error("Unable to open repo")]
GixOpen(#[from] gix::open::Error),
}