From ec7fb826eeef9055480c72cee5903f42afaa3c14 Mon Sep 17 00:00:00 2001 From: Michal Trybus Date: Thu, 2 Apr 2026 18:29:37 +0200 Subject: [PATCH] Improve error handling when scanning remotes (#84) Extra changes: - failure to find remote url -> continue to next remote (instead of err), - failure in Gerrit::new (cache error) -> err immediately (the next remote is unlikely to succeed). --- src/gerrit.rs | 8 ++++---- src/git.rs | 38 ++++++++++++++++++++++++-------------- 2 files changed, 28 insertions(+), 18 deletions(-) diff --git a/src/gerrit.rs b/src/gerrit.rs index b673038..e2ef574 100644 --- a/src/gerrit.rs +++ b/src/gerrit.rs @@ -553,11 +553,11 @@ pub struct GerritGitRemote { } impl GerritGitRemote { - pub fn from_remote(remote: &str, url: &str) -> miette::Result { - Ok(Self { + pub fn from_gerrit(remote: &str, gerrit: Gerrit) -> Self { + Self { remote: remote.to_owned(), - inner: GerritProject::parse_from_remote_url(url).and_then(Gerrit::new)?, - }) + inner: gerrit, + } } pub fn restack_this(&mut self) -> miette::Result<()> { diff --git a/src/git.rs b/src/git.rs index e4a68c9..b29fd66 100644 --- a/src/git.rs +++ b/src/git.rs @@ -11,7 +11,9 @@ use regex::Regex; use crate::change_id::ChangeId; use crate::commit_hash::CommitHash; use crate::format_bulleted_list; +use crate::gerrit::Gerrit; use crate::gerrit::GerritGitRemote; +use crate::gerrit_project::GerritProject; /// `git` CLI wrapper. #[derive(Debug, Default)] @@ -175,28 +177,36 @@ impl Git { } for remote in self.remotes()? { - if let Some(remote_name) = gerrit_remote_name { - if remote_name != remote { - tracing::debug!(remote, "Skipping remote"); + if gerrit_remote_name.is_some_and(|remote_name| remote_name != remote) { + tracing::debug!(remote, "Skipping remote"); + continue; + } + let url = match self.remote_url(&remote) { + Ok(url) => url, + Err(error) => { + tracing::debug!(?error, remote, "Failed to get remote URL"); continue; } - } - - let url = self.remote_url(&remote)?; - + }; tried.push(url.clone()); - match GerritGitRemote::from_remote(&remote, &url) { - Ok(gerrit) => { - return Ok(gerrit); - } + let project = match GerritProject::parse_from_remote_url(&url) { + Ok(project) => project, Err(error) => { tracing::debug!(remote, url, ?error, "Failed to parse remote URL"); + continue; } - } + }; + let gerrit = Gerrit::new(project).inspect_err(|error| { + tracing::debug!(remote, url, ?error, "Failed to create gerrit project"); + })?; + return Ok(GerritGitRemote::from_gerrit(&remote, gerrit)); } - - Err(miette!("Failed to parse Gerrit configuration from Git remotes. Tried to parse these remotes:\n{}", format_bulleted_list(tried))) + Err(miette!( + "Failed to parse Gerrit configuration from Git remotes. \ + Tried to parse these remotes:\n{}", + format_bulleted_list(tried) + )) } pub fn cherry_pick(&self, commitish: &str) -> miette::Result<()> {