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 @@ -25,6 +25,25 @@ use std::fs::{read_dir, DirEntry}; use std::path::Path; +/// Wrong type of file from a `BadMatch` +/// Note: a lot of those don't exist on all platforms. +#[derive(Debug)] +pub enum BadType { + CharacterDevice, + BlockDevice, + FIFO, + Socket, + Directory, + Unknown, +} + +/// Was explicitly matched but cannot be found/accessed +#[derive(Debug)] +pub enum BadMatch { + OsError(i32), + BadType(BadType), +} + /// Marker enum used to dispatch new status entries into the right collections. /// Is similar to `crate::EntryState`, but represents the transient state of /// entries during the lifetime of a command. @@ -36,6 +55,11 @@ Deleted, Clean, Unknown, + Ignored, + /// Empty dispatch, the file is not worth listing + None, + /// Was explicitly matched but cannot be found/accessed + Bad(BadMatch), } type IoResult = std::io::Result; @@ -257,6 +281,9 @@ pub removed: Vec<&'a HgPath>, pub deleted: Vec<&'a HgPath>, pub clean: Vec<&'a HgPath>, + pub ignored: Vec<&'a HgPath>, + pub unknown: Vec<&'a HgPath>, + pub bad: Vec<(&'a HgPath, BadMatch)>, /* TODO ignored * TODO unknown */ } @@ -270,17 +297,23 @@ let mut removed = vec![]; let mut deleted = vec![]; let mut clean = vec![]; + let mut ignored = vec![]; + let mut unknown = vec![]; + let mut bad = vec![]; for res in results.into_iter() { let (filename, dispatch) = res?; match dispatch { - Dispatch::Unknown => {} + Dispatch::Unknown => unknown.push(filename), Dispatch::Unsure => lookup.push(filename), Dispatch::Modified => modified.push(filename), Dispatch::Added => added.push(filename), Dispatch::Removed => removed.push(filename), Dispatch::Deleted => deleted.push(filename), Dispatch::Clean => clean.push(filename), + Dispatch::Ignored => ignored.push(filename), + Dispatch::None => {} + Dispatch::Bad(reason) => bad.push((filename, reason)), } } @@ -292,6 +325,9 @@ removed, deleted, clean, + ignored, + unknown, + bad, }, )) }