diff --git a/rust/hg-core/src/repo.rs b/rust/hg-core/src/repo.rs --- a/rust/hg-core/src/repo.rs +++ b/rust/hg-core/src/repo.rs @@ -43,6 +43,22 @@ } impl Repo { + /// tries to find a repository in current working directory and returns its + /// root path + pub fn try_find_repo_root() -> Result { + let current_directory = crate::utils::current_dir()?; + // ancestors() is inclusive: it first yields `current_directory` + // as-is. + for ancestor in current_directory.ancestors() { + if ancestor.join(".hg").is_dir() { + return Ok(ancestor.to_path_buf()); + } + } + return Err(RepoError::NotFound { + at: current_directory, + }); + } + /// Find a repository, either at the given path (which must contain a `.hg` /// sub-directory) or by searching the current directory and its /// ancestors. @@ -66,17 +82,12 @@ }) } } else { - let current_directory = crate::utils::current_dir()?; - // ancestors() is inclusive: it first yields `current_directory` - // as-is. - for ancestor in current_directory.ancestors() { - if ancestor.join(".hg").is_dir() { - return Self::new_at_path(ancestor.to_owned(), config); - } + let repo_root = Self::try_find_repo_root(); + if repo_root.is_ok() { + Self::new_at_path(repo_root.unwrap(), config) + } else { + Err(repo_root.unwrap_err()) } - Err(RepoError::NotFound { - at: current_directory, - }) } } diff --git a/rust/rhg/src/main.rs b/rust/rhg/src/main.rs --- a/rust/rhg/src/main.rs +++ b/rust/rhg/src/main.rs @@ -174,8 +174,7 @@ } else { let local_config = { if std::env::var_os("HGRCSKIPREPO").is_none() { - let current_dir = hg::utils::current_dir(); - if let Ok(current_dir_path) = current_dir { + if let Ok(current_dir_path) = Repo::try_find_repo_root() { let config_files = vec![ ConfigSource::AbsPath( current_dir_path.join(".hg/hgrc"),