use tracing::info; use crate::repository::{Direction, OpenRepository}; use super::{GitRemote, RepoDetails}; #[tracing::instrument(skip_all)] pub fn validate(repository: &OpenRepository, repo_details: &RepoDetails) -> Result<()> { let Some(push_remote) = repository.find_default_remote(Direction::Push) else { return Err(Error::NoDefaultPushRemote); }; let Some(fetch_remote) = repository.find_default_remote(Direction::Fetch) else { return Err(Error::NoDefaultFetchRemote); }; let git_remote = repo_details.git_remote(); info!(config = %git_remote, push = %push_remote, fetch = %fetch_remote, "Check remotes match"); if git_remote != push_remote { return Err(Error::MismatchDefaultPushRemote { found: push_remote, expected: git_remote, }); } if git_remote != fetch_remote { return Err(Error::MismatchDefaultFetchRemote { found: fetch_remote, expected: git_remote, }); } Ok(()) } type Result = core::result::Result; #[derive(Debug, derive_more::Display)] pub enum Error { NoDefaultPushRemote, NoDefaultFetchRemote, NoUrlForDefaultPushRemote, NoHostnameForDefaultPushRemote, UnableToOpenRepo(String), Io(std::io::Error), #[display("MismatchDefaultPushRemote(found: {found}, expected: {expected})")] MismatchDefaultPushRemote { found: GitRemote, expected: GitRemote, }, #[display("MismatchDefaultFetchRemote(found: {found}, expected: {expected})")] MismatchDefaultFetchRemote { found: GitRemote, expected: GitRemote, }, } impl std::error::Error for Error {}