// use crate::{ git::{self, repository::open::OpenRepositoryLike}, RemoteUrl, }; use tracing::info; #[tracing::instrument(skip_all)] pub fn validate_default_remotes( open_repository: &dyn OpenRepositoryLike, repo_details: &git::RepoDetails, ) -> Result<()> { let push_remote = open_repository .find_default_remote(git::repository::Direction::Push) .ok_or_else(|| Error::NoDefaultPushRemote)?; let fetch_remote = open_repository .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.matches(&push_remote) { return Err(Error::MismatchDefaultPushRemote { found: push_remote, expected: remote_url, }); } if !remote_url.matches(&fetch_remote) { return Err(Error::MismatchDefaultFetchRemote { found: fetch_remote, expected: remote_url, }); } Ok(()) } type Result = core::result::Result; #[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), }