Mercurial > public > mercurial-scm > hg
changeset 52395:136e74c2bf8f
rhg: fix bug with matchers in rhg status --rev --rev
The fix was simply to move up the block of code that initializes the
matcher from the arguments.
author | Mitchell Kember <mkember@janestreet.com> |
---|---|
date | Tue, 03 Dec 2024 15:27:50 -0500 |
parents | 4e58b5499860 |
children | b0b6c28b340b |
files | rust/rhg/src/commands/status.rs tests/test-status.t |
diffstat | 2 files changed, 40 insertions(+), 47 deletions(-) [+] |
line wrap: on
line diff
--- a/rust/rhg/src/commands/status.rs Tue Dec 03 15:14:59 2024 -0500 +++ b/rust/rhg/src/commands/status.rs Tue Dec 03 15:27:50 2024 -0500 @@ -454,7 +454,46 @@ filesystem_time_at_status_start, )) }; + let (narrow_matcher, narrow_warnings) = narrow::matcher(repo)?; + let (sparse_matcher, sparse_warnings) = sparse::matcher(repo)?; + let matcher = match (repo.has_narrow(), repo.has_sparse()) { + (true, true) => { + Box::new(IntersectionMatcher::new(narrow_matcher, sparse_matcher)) + } + (true, false) => narrow_matcher, + (false, true) => sparse_matcher, + (false, false) => Box::new(AlwaysMatcher), + }; + let matcher = match args.get_many::<std::ffi::OsString>("file") { + None => matcher, + Some(files) => { + let patterns: Vec<Vec<u8>> = files + .filter(|s| !s.is_empty()) + .map(get_bytes_from_os_str) + .collect(); + for file in &patterns { + if file.starts_with(b"set:") { + return Err(CommandError::unsupported("fileset")); + } + } + let cwd = hg::utils::current_dir()?; + let root = repo.working_directory_path(); + let ignore_patterns = parse_pattern_args(patterns, &cwd, root)?; + let files_matcher = + hg::matchers::PatternMatcher::new(ignore_patterns)?; + Box::new(IntersectionMatcher::new( + Box::new(files_matcher), + matcher, + )) + } + }; + print_narrow_sparse_warnings( + &narrow_warnings, + &sparse_warnings, + ui, + repo, + )?; if let Some((rev1, rev2)) = revpair { let mut ds_status = DirstateStatus::default(); @@ -465,10 +504,7 @@ } let stat = hg::operations::status_rev_rev_no_copies( - repo, - rev1, - rev2, - narrow_matcher, + repo, rev1, rev2, matcher, )?; for entry in stat.iter() { let (path, status) = entry?; @@ -503,45 +539,6 @@ return Ok(()); } - let (sparse_matcher, sparse_warnings) = sparse::matcher(repo)?; - let matcher = match (repo.has_narrow(), repo.has_sparse()) { - (true, true) => { - Box::new(IntersectionMatcher::new(narrow_matcher, sparse_matcher)) - } - (true, false) => narrow_matcher, - (false, true) => sparse_matcher, - (false, false) => Box::new(AlwaysMatcher), - }; - let matcher = match args.get_many::<std::ffi::OsString>("file") { - None => matcher, - Some(files) => { - let patterns: Vec<Vec<u8>> = files - .filter(|s| !s.is_empty()) - .map(get_bytes_from_os_str) - .collect(); - for file in &patterns { - if file.starts_with(b"set:") { - return Err(CommandError::unsupported("fileset")); - } - } - let cwd = hg::utils::current_dir()?; - let root = repo.working_directory_path(); - let ignore_patterns = parse_pattern_args(patterns, &cwd, root)?; - let files_matcher = - hg::matchers::PatternMatcher::new(ignore_patterns)?; - Box::new(IntersectionMatcher::new( - Box::new(files_matcher), - matcher, - )) - } - }; - - print_narrow_sparse_warnings( - &narrow_warnings, - &sparse_warnings, - ui, - repo, - )?; let (fixup, mut dirstate_write_needed, filesystem_time_at_status_start) = dmap.with_status( matcher.as_ref(),
--- a/tests/test-status.t Tue Dec 03 15:14:59 2024 -0500 +++ b/tests/test-status.t Tue Dec 03 15:27:50 2024 -0500 @@ -496,10 +496,6 @@ R removed $ hg status --rev 0 --rev 1 unrelated - M modified (known-bad-output rhg !) - A added (known-bad-output rhg !) - A copied (known-bad-output rhg !) - R removed (known-bad-output rhg !) $ hg status -C --rev 0 --rev 1 added modified copied removed deleted M modified