Mercurial > public > mercurial-scm > hg
comparison rust/hg-core/src/repo.rs @ 46503:d8730ff51d5a
rhg: Add support for -R and --repository command-line arguments
Differential Revision: https://phab.mercurial-scm.org/D9970
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Mon, 08 Feb 2021 21:37:30 +0100 |
parents | d7685105e504 |
children | a25033eb43b5 |
comparison
equal
deleted
inserted
replaced
46502:95d37db31479 | 46503:d8730ff51d5a |
---|---|
1 use crate::config::{Config, ConfigError, ConfigParseError}; | 1 use crate::config::{Config, ConfigError, ConfigParseError}; |
2 use crate::errors::{HgError, IoResultExt}; | 2 use crate::errors::{HgError, IoResultExt}; |
3 use crate::requirements; | 3 use crate::requirements; |
4 use crate::utils::current_dir; | |
4 use crate::utils::files::get_path_from_bytes; | 5 use crate::utils::files::get_path_from_bytes; |
5 use memmap::{Mmap, MmapOptions}; | 6 use memmap::{Mmap, MmapOptions}; |
6 use std::collections::HashSet; | 7 use std::collections::HashSet; |
7 use std::path::{Path, PathBuf}; | 8 use std::path::{Path, PathBuf}; |
8 | 9 |
16 } | 17 } |
17 | 18 |
18 #[derive(Debug, derive_more::From)] | 19 #[derive(Debug, derive_more::From)] |
19 pub enum RepoError { | 20 pub enum RepoError { |
20 NotFound { | 21 NotFound { |
21 current_directory: PathBuf, | 22 at: PathBuf, |
22 }, | 23 }, |
23 #[from] | 24 #[from] |
24 ConfigParseError(ConfigParseError), | 25 ConfigParseError(ConfigParseError), |
25 #[from] | 26 #[from] |
26 Other(HgError), | 27 Other(HgError), |
42 } | 43 } |
43 | 44 |
44 impl Repo { | 45 impl Repo { |
45 /// Search the current directory and its ancestores for a repository: | 46 /// Search the current directory and its ancestores for a repository: |
46 /// a working directory that contains a `.hg` sub-directory. | 47 /// a working directory that contains a `.hg` sub-directory. |
47 pub fn find(config: &Config) -> Result<Self, RepoError> { | 48 /// |
48 let current_directory = crate::utils::current_dir()?; | 49 /// `explicit_path` is for `--repository` command-line arguments. |
49 // ancestors() is inclusive: it first yields `current_directory` as-is. | 50 pub fn find( |
50 for ancestor in current_directory.ancestors() { | 51 config: &Config, |
51 if ancestor.join(".hg").is_dir() { | 52 explicit_path: Option<&Path>, |
52 return Ok(Self::new_at_path(ancestor.to_owned(), config)?); | 53 ) -> Result<Self, RepoError> { |
53 } | 54 if let Some(root) = explicit_path { |
54 } | 55 // Having an absolute path isn’t necessary here but can help code |
55 Err(RepoError::NotFound { current_directory }) | 56 // elsewhere |
57 let root = current_dir()?.join(root); | |
58 if root.join(".hg").is_dir() { | |
59 Self::new_at_path(root, config) | |
60 } else { | |
61 Err(RepoError::NotFound { | |
62 at: root.to_owned(), | |
63 }) | |
64 } | |
65 } else { | |
66 let current_directory = crate::utils::current_dir()?; | |
67 // ancestors() is inclusive: it first yields `current_directory` | |
68 // as-is. | |
69 for ancestor in current_directory.ancestors() { | |
70 if ancestor.join(".hg").is_dir() { | |
71 return Self::new_at_path(ancestor.to_owned(), config); | |
72 } | |
73 } | |
74 Err(RepoError::NotFound { | |
75 at: current_directory, | |
76 }) | |
77 } | |
56 } | 78 } |
57 | 79 |
58 /// To be called after checking that `.hg` is a sub-directory | 80 /// To be called after checking that `.hg` is a sub-directory |
59 fn new_at_path( | 81 fn new_at_path( |
60 working_directory: PathBuf, | 82 working_directory: PathBuf, |