Patchwork D8775: hg-core: implement `Operation` for `ListTrackedFiles`

login
register
mail settings
Submitter phabricator
Date July 21, 2020, 2:06 p.m.
Message ID <differential-rev-PHID-DREV-ckvmhq3sqzwpi7sxyqpo-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/46819/
State Superseded
Headers show

Comments

phabricator - July 21, 2020, 2:06 p.m.
acezar created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  Use `parse_dirstate` to list the files tracked in the working directory.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8775

AFFECTED FILES
  rust/hg-core/src/operations/list_tracked_files.rs
  rust/hg-core/src/operations/mod.rs

CHANGE DETAILS




To: acezar, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/rust/hg-core/src/operations/mod.rs b/rust/hg-core/src/operations/mod.rs
--- a/rust/hg-core/src/operations/mod.rs
+++ b/rust/hg-core/src/operations/mod.rs
@@ -1,6 +1,9 @@ 
 mod find_root;
 mod list_tracked_files;
 pub use find_root::{FindRoot, FindRootError, FindRootErrorKind};
+pub use list_tracked_files::{
+    ListTrackedFiles, ListTrackedFilesError, ListTrackedFilesErrorKind,
+};
 
 /// An interface for high-level hg operations.
 ///
diff --git a/rust/hg-core/src/operations/list_tracked_files.rs b/rust/hg-core/src/operations/list_tracked_files.rs
--- a/rust/hg-core/src/operations/list_tracked_files.rs
+++ b/rust/hg-core/src/operations/list_tracked_files.rs
@@ -1,10 +1,21 @@ 
+use super::find_root;
 use super::Operation;
+use crate::dirstate::parsers::parse_dirstate;
 use crate::utils::hg_path::HgPathBuf;
+use crate::DirstateParseError;
+use rayon::prelude::*;
+use std::convert::From;
 use std::fmt;
+use std::fs;
+use std::io;
 
 /// Kind of error encoutered by ListTrackedFiles
 #[derive(Debug)]
-pub enum ListTrackedFilesErrorKind {}
+pub enum ListTrackedFilesErrorKind {
+    FindRootError(find_root::FindRootError),
+    IoError(io::Error),
+    ParseError(DirstateParseError),
+}
 
 /// A ListTrackedFiles error
 #[derive(Debug)]
@@ -21,14 +32,37 @@ 
     }
 }
 
+impl From<ListTrackedFilesErrorKind> for ListTrackedFilesError {
+    fn from(kind: ListTrackedFilesErrorKind) -> Self {
+        ListTrackedFilesError { kind }
+    }
+}
+
 /// List files under Mercurial control in the working directory
 /// by reading the dirstate at .hg/dirstate
 pub struct ListTrackedFiles {}
 
+impl ListTrackedFiles {
+    pub fn new() -> Self {
+        ListTrackedFiles {}
+    }
+}
+
 impl Operation<Vec<HgPathBuf>> for ListTrackedFiles {
     type Error = ListTrackedFilesError;
 
     fn run(&self) -> Result<Vec<HgPathBuf>, Self::Error> {
-        unimplemented!()
+        let root = find_root::FindRoot::new()
+            .run()
+            .map_err(ListTrackedFilesErrorKind::FindRootError)?;
+        let dirstate = &root.join(".hg/dirstate");
+        let dirstate_content =
+            fs::read(&dirstate).map_err(ListTrackedFilesErrorKind::IoError)?;
+        let (_, entries, _) = parse_dirstate(&dirstate_content)
+            .map_err(ListTrackedFilesErrorKind::ParseError)?;
+        let mut files: Vec<_> =
+            entries.into_iter().map(|(path, _)| path).collect();
+        files.par_sort_unstable();
+        Ok(files)
     }
 }