diff rust/rhg/src/commands/files.rs @ 46167:8a4914397d02

rust: introduce Repo and Vfs types for filesystem abstraction This is similar to the corresponding Python classes. Repo represents a repository and knows the path to the `.hg` directory, the `store` directory, and the working directory. Separating these will enable supporting the share extension. A Vfs is created from a Repo for one of these three directories. It has filesystem access APIs that take a relative std::path::Path as a parameter. Differential Revision: https://phab.mercurial-scm.org/D9596
author Simon Sapin <simon.sapin@octobus.net>
date Mon, 14 Dec 2020 16:33:15 +0100
parents dca9cb99971c
children 3e2d539d0d1a
line wrap: on
line diff
--- a/rust/rhg/src/commands/files.rs	Sat Dec 19 15:56:54 2020 +0100
+++ b/rust/rhg/src/commands/files.rs	Mon Dec 14 16:33:15 2020 +0100
@@ -2,7 +2,6 @@
 use crate::error::{CommandError, CommandErrorKind};
 use crate::ui::utf8_to_local;
 use crate::ui::Ui;
-use hg::operations::find_root;
 use hg::operations::{
     list_rev_tracked_files, ListRevTrackedFilesError,
     ListRevTrackedFilesErrorKind,
@@ -10,10 +9,9 @@
 use hg::operations::{
     Dirstate, ListDirstateTrackedFilesError, ListDirstateTrackedFilesErrorKind,
 };
-use hg::requirements;
+use hg::repo::Repo;
 use hg::utils::files::{get_bytes_from_path, relativize_path};
 use hg::utils::hg_path::{HgPath, HgPathBuf};
-use std::path::Path;
 
 pub const HELP_TEXT: &str = "
 List tracked files.
@@ -33,13 +31,13 @@
     fn display_files(
         &self,
         ui: &Ui,
-        root: &Path,
+        repo: &Repo,
         files: impl IntoIterator<Item = &'a HgPath>,
     ) -> Result<(), CommandError> {
         let cwd = std::env::current_dir()
             .or_else(|e| Err(CommandErrorKind::CurrentDirNotFound(e)))?;
         let rooted_cwd = cwd
-            .strip_prefix(root)
+            .strip_prefix(repo.working_directory_path())
             .expect("cwd was already checked within the repository");
         let rooted_cwd = HgPathBuf::from(get_bytes_from_path(rooted_cwd));
 
@@ -56,16 +54,16 @@
 
 impl<'a> Command for FilesCommand<'a> {
     fn run(&self, ui: &Ui) -> Result<(), CommandError> {
-        let root = find_root()?;
-        requirements::check(&root)?;
+        let repo = Repo::find()?;
+        repo.check_requirements()?;
         if let Some(rev) = self.rev {
-            let files = list_rev_tracked_files(&root, rev)
+            let files = list_rev_tracked_files(&repo, rev)
                 .map_err(|e| map_rev_error(rev, e))?;
-            self.display_files(ui, &root, files.iter())
+            self.display_files(ui, &repo, files.iter())
         } else {
-            let distate = Dirstate::new(&root).map_err(map_dirstate_error)?;
+            let distate = Dirstate::new(&repo).map_err(map_dirstate_error)?;
             let files = distate.tracked_files().map_err(map_dirstate_error)?;
-            self.display_files(ui, &root, files)
+            self.display_files(ui, &repo, files)
         }
     }
 }