D7927: rust-status: add util for listing a directory

Alphare (Raphaël Gomès) phabricator at mercurial-scm.org
Fri Jan 17 10:33:47 EST 2020


Alphare created this revision.
Herald added subscribers: mercurial-devel, kevincox, durin42.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  I debated moving it to utils, but it is not used anywhere else for now, and
  its skip behavior is pretty specific to status.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  rust/hg-core/src/dirstate/status.rs

CHANGE DETAILS

diff --git a/rust/hg-core/src/dirstate/status.rs b/rust/hg-core/src/dirstate/status.rs
--- a/rust/hg-core/src/dirstate/status.rs
+++ b/rust/hg-core/src/dirstate/status.rs
@@ -14,12 +14,15 @@
     matchers::Matcher,
     utils::{
         files::HgMetadata,
-        hg_path::{hg_path_to_path_buf, HgPath},
+        hg_path::{
+            hg_path_to_path_buf, os_string_to_hg_path_buf, HgPath, HgPathBuf,
+        },
     },
     CopyMap, DirstateEntry, DirstateMap, EntryState,
 };
 use rayon::prelude::*;
 use std::collections::HashSet;
+use std::fs::{read_dir, DirEntry};
 use std::path::Path;
 
 /// Marker enum used to dispatch new status entries into the right collections.
@@ -48,6 +51,30 @@
     a & i32::max_value() != b & i32::max_value()
 }
 
+/// Return a sorted list containing information about the entries
+/// in the directory.
+fn list_directory(
+    path: impl AsRef<Path>,
+    skip_dot_hg: bool,
+) -> std::io::Result<Vec<(HgPathBuf, DirEntry)>> {
+    let mut results = vec![];
+    let entries = read_dir(path.as_ref())?;
+
+    for entry in entries {
+        let entry = entry?;
+        let filename = os_string_to_hg_path_buf(entry.file_name())?;
+        let file_type = entry.file_type()?;
+        if skip_dot_hg && filename.as_bytes() == b".hg" && file_type.is_dir() {
+            return Ok(vec![]);
+        } else {
+            results.push((HgPathBuf::from(filename), entry))
+        }
+    }
+
+    results.sort_by(|a, b| a.0.cmp(&b.0));
+    Ok(results)
+}
+
 /// The file corresponding to the dirstate entry was found on the filesystem.
 fn dispatch_found(
     filename: impl AsRef<HgPath>,



To: Alphare, #hg-reviewers
Cc: durin42, kevincox, mercurial-devel


More information about the Mercurial-devel mailing list