Mercurial > hg
changeset 44523:0d97bcb3cee9
rust-status: add util for listing a directory
I debated moving it to utils, but it is not used anywhere else for now, and
its skip behavior is pretty specific to status.
Differential Revision: https://phab.mercurial-scm.org/D7927
author | Raphaël Gomès <rgomes@octobus.net> |
---|---|
date | Fri, 17 Jan 2020 15:37:24 +0100 |
parents | c697638e0e91 |
children | 483fce658e43 |
files | rust/hg-core/src/dirstate/status.rs |
diffstat | 1 files changed, 30 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/hg-core/src/dirstate/status.rs Fri Jan 17 11:53:31 2020 +0100 +++ b/rust/hg-core/src/dirstate/status.rs Fri Jan 17 15:37:24 2020 +0100 @@ -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,32 @@ a & i32::max_value() != b & i32::max_value() } +/// Return a sorted list containing information about the entries +/// in the directory. +/// +/// * `skip_dot_hg` - Return an empty vec if `path` contains a `.hg` 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_unstable_by_key(|e| e.0.clone()); + Ok(results) +} + /// The file corresponding to the dirstate entry was found on the filesystem. fn dispatch_found( filename: impl AsRef<HgPath>,