Find the repository root starting from a specific path. Like [`find_repository_root`], but starts from the given path instead of the current working directory. # Arguments `start_path` - The path to start searching from # Returns The path to the repository root. # Errors Returns [`CliError::RepositoryNotFound`] if no `.atomic` directory is found. # Example ```rust,ignore let repo_root = f
(start_path: &Path)
| 267 | /// let repo_root = find_repository_root_from("/home/user/project/src")?; |
| 268 | /// ``` |
| 269 | pub fn find_repository_root_from(start_path: &Path) -> CliResult<PathBuf> { |
| 270 | let mut current = start_path.to_path_buf(); |
| 271 | |
| 272 | // Canonicalize if possible to handle symlinks correctly |
| 273 | if let Ok(canonical) = current.canonicalize() { |
| 274 | current = canonical; |
| 275 | } |
| 276 | |
| 277 | loop { |
| 278 | let dot_dir = current.join(DOT_DIR); |
| 279 | if dot_dir.is_dir() { |
| 280 | return Ok(current); |
| 281 | } |
| 282 | |
| 283 | // A sandbox working tree has no `.atomic/` of its own — it carries a |
| 284 | // pointer to the canonical graph. Treat the sandbox root as a valid |
| 285 | // repository root; `Repository::open*` resolves the pointer. |
| 286 | if current.join(SANDBOX_POINTER).is_file() { |
| 287 | return Ok(current); |
| 288 | } |
| 289 | |
| 290 | // Move to parent directory |
| 291 | if !current.pop() { |
| 292 | // Reached the root without finding a repository |
| 293 | return Err(CliError::RepositoryNotFound { |
| 294 | searched_path: start_path.to_path_buf(), |
| 295 | }); |
| 296 | } |
| 297 | } |
| 298 | } |
| 299 | |
| 300 | /// Open a repository, optionally at a specific path. |
| 301 | /// |