Mercurial > hg-stable
changeset 51188:976403c95ba3
rhg: refactor hg status, make the display code usable for non-dirstate status
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Mon, 16 Oct 2023 18:56:40 +0100 |
parents | ddf2b33ee388 |
children | aba622c7dc7e |
files | rust/rhg/src/commands/status.rs |
diffstat | 1 files changed, 58 insertions(+), 48 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/rhg/src/commands/status.rs Mon Nov 27 15:22:05 2023 -0500 +++ b/rust/rhg/src/commands/status.rs Mon Oct 16 18:56:40 2023 +0100 @@ -36,6 +36,7 @@ use log::info; use rayon::prelude::*; use std::io; +use std::mem::take; use std::path::PathBuf; pub const HELP_TEXT: &str = " @@ -285,13 +286,37 @@ type StatusResult<'a> = Result<(DirstateStatus<'a>, Vec<PatternFileWarning>), StatusError>; + let relative_status = config + .get_option(b"commands", b"status.relative")? + .expect("commands.status.relative should have a default value"); + + let relativize_paths = relative_status || { + // See in Python code with `getuipathfn` usage in `commands.py`. + let legacy_relative_behavior = args.contains_id("file"); + match relative_paths(invocation.config)? { + RelativePaths::Legacy => legacy_relative_behavior, + RelativePaths::Bool(v) => v, + } + }; + + let mut output = DisplayStatusPaths { + ui, + no_status, + relativize: if relativize_paths { + Some(RelativizePaths::new(repo)?) + } else { + None + }, + print0, + }; + let after_status = |res: StatusResult| -> Result<_, CommandError> { let (mut ds_status, pattern_warnings) = res?; for warning in pattern_warnings { ui.write_stderr(&format_pattern_file_warning(&warning, repo))?; } - for (path, error) in ds_status.bad { + for (path, error) in take(&mut ds_status.bad) { let error = match error { hg::BadMatch::OsError(code) => { std::io::Error::from_raw_os_error(code).to_string() @@ -322,8 +347,7 @@ })?; let working_directory_vfs = repo.working_directory_vfs(); let store_vfs = repo.store_vfs(); - let res: Vec<_> = ds_status - .unsure + let res: Vec<_> = take(&mut ds_status.unsure) .into_par_iter() .map(|to_check| { // The compiler seems to get a bit confused with complex @@ -370,55 +394,12 @@ } } - let relative_status = config - .get_option(b"commands", b"status.relative")? - .expect("commands.status.relative should have a default value"); - - let relativize_paths = relative_status || { - // See in Python code with `getuipathfn` usage in `commands.py`. - let legacy_relative_behavior = args.contains_id("file"); - match relative_paths(invocation.config)? { - RelativePaths::Legacy => legacy_relative_behavior, - RelativePaths::Bool(v) => v, - } - }; - - let output = DisplayStatusPaths { - ui, - no_status, - relativize: if relativize_paths { - Some(RelativizePaths::new(repo)?) - } else { - None - }, - print0, - }; - if display_states.modified { - output.display(b"M ", "status.modified", ds_status.modified)?; - } - if display_states.added { - output.display(b"A ", "status.added", ds_status.added)?; - } - if display_states.removed { - output.display(b"R ", "status.removed", ds_status.removed)?; - } - if display_states.deleted { - output.display(b"! ", "status.deleted", ds_status.deleted)?; - } - if display_states.unknown { - output.display(b"? ", "status.unknown", ds_status.unknown)?; - } - if display_states.ignored { - output.display(b"I ", "status.ignored", ds_status.ignored)?; - } - if display_states.clean { - output.display(b"C ", "status.clean", ds_status.clean)?; - } - let dirstate_write_needed = ds_status.dirty; let filesystem_time_at_status_start = ds_status.filesystem_time_at_status_start; + output.output(display_states, ds_status)?; + Ok(( fixup, dirstate_write_needed, @@ -628,6 +609,35 @@ } Ok(()) } + + fn output( + &mut self, + display_states: DisplayStates, + ds_status: DirstateStatus, + ) -> Result<(), CommandError> { + if display_states.modified { + self.display(b"M ", "status.modified", ds_status.modified)?; + } + if display_states.added { + self.display(b"A ", "status.added", ds_status.added)?; + } + if display_states.removed { + self.display(b"R ", "status.removed", ds_status.removed)?; + } + if display_states.deleted { + self.display(b"! ", "status.deleted", ds_status.deleted)?; + } + if display_states.unknown { + self.display(b"? ", "status.unknown", ds_status.unknown)?; + } + if display_states.ignored { + self.display(b"I ", "status.ignored", ds_status.ignored)?; + } + if display_states.clean { + self.display(b"C ", "status.clean", ds_status.clean)?; + } + Ok(()) + } } /// Outcome of the additional check for an ambiguous tracked file