[Request] [++- ] D11722: rhg: implement the rhg-debugignore subcommand
aalekseyev (Arseniy Alekseyev)
phabricator at mercurial-scm.org
Wed Oct 27 11:43:05 UTC 2021
aalekseyev created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.
REVISION SUMMARY
This can be used to inspect the generated pattern, but also to benchmark
the time it takes to parse hgignore.
REPOSITORY
rHG Mercurial
BRANCH
stable
REVISION DETAIL
https://phab.mercurial-scm.org/D11722
AFFECTED FILES
rust/hg-core/src/matchers.rs
rust/rhg/src/commands/debugignorerhg.rs
rust/rhg/src/main.rs
CHANGE DETAILS
diff --git a/rust/rhg/src/main.rs b/rust/rhg/src/main.rs
--- a/rust/rhg/src/main.rs
+++ b/rust/rhg/src/main.rs
@@ -434,6 +434,7 @@
cat
debugdata
debugrequirements
+ debugignorerhg
files
root
config
diff --git a/rust/rhg/src/commands/debugignorerhg.rs b/rust/rhg/src/commands/debugignorerhg.rs
new file mode 100644
--- /dev/null
+++ b/rust/rhg/src/commands/debugignorerhg.rs
@@ -0,0 +1,39 @@
+
+use crate::error::CommandError;
+use clap::{SubCommand};
+use hg;
+use hg::matchers::get_ignore_matcher;
+use hg::StatusError;
+use log::{warn};
+
+pub const HELP_TEXT: &str = "
+Show effective hgignore patterns used by rhg.
+
+This is a pure Rust version of `hg debugignore`.
+
+Some options might be missing, check the list below.
+";
+
+pub fn args() -> clap::App<'static, 'static> {
+ SubCommand::with_name("debugignorerhg").about(HELP_TEXT)
+}
+
+pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
+ let repo = invocation.repo?;
+
+ let ignore_file = repo.working_directory_vfs().join(".hgignore"); // TODO hardcoded
+
+ let (ignore_matcher, warnings) = get_ignore_matcher(
+ vec![ignore_file],
+ &repo.working_directory_path().to_owned(),
+ &mut |_pattern_bytes| (),
+ ).map_err(|e| StatusError::from(e))?;
+
+ if !warnings.is_empty() {
+ warn!("Pattern warnings: {:?}", &warnings);
+ }
+
+ let patterns = ignore_matcher.debug_get_patterns();
+ println!("{}", String::from_utf8_lossy(patterns));
+ Ok (())
+}
diff --git a/rust/hg-core/src/matchers.rs b/rust/hg-core/src/matchers.rs
--- a/rust/hg-core/src/matchers.rs
+++ b/rust/hg-core/src/matchers.rs
@@ -560,14 +560,11 @@
/// Parses all "ignore" files with their recursive includes and returns a
/// function that checks whether a given file (in the general sense) should be
/// ignored.
-pub fn get_ignore_function<'a>(
+pub fn get_ignore_matcher<'a>(
mut all_pattern_files: Vec<PathBuf>,
root_dir: &Path,
inspect_pattern_bytes: &mut impl FnMut(&[u8]),
-) -> PatternResult<(
- Box<dyn for<'r> Fn(&'r HgPath) -> bool + Sync + 'a>,
- Vec<PatternFileWarning>,
-)> {
+) -> PatternResult<(IncludeMatcher<'a>, Vec<PatternFileWarning>)> {
let mut all_patterns = vec![];
let mut all_warnings = vec![];
@@ -590,10 +587,28 @@
all_warnings.extend(warnings);
}
let matcher = IncludeMatcher::new(all_patterns)?;
- Ok((
- Box::new(move |path: &HgPath| matcher.matches(path)),
- all_warnings,
- ))
+ Ok((matcher, all_warnings))
+}
+
+/// Parses all "ignore" files with their recursive includes and returns a
+/// function that checks whether a given file (in the general sense) should be
+/// ignored.
+pub fn get_ignore_function<'a>(
+ all_pattern_files: Vec<PathBuf>,
+ root_dir: &Path,
+ inspect_pattern_bytes: &mut impl FnMut(&[u8]),
+) -> PatternResult<(
+ Box<dyn for<'r> Fn(&'r HgPath) -> bool + Sync + 'a>,
+ Vec<PatternFileWarning>,
+)> {
+ let res =
+ get_ignore_matcher(all_pattern_files, root_dir, inspect_pattern_bytes);
+ res.map(|(matcher, all_warnings)| {
+ let res: Box<dyn for<'r> Fn(&'r HgPath) -> bool + Sync + 'a> =
+ Box::new(move |path: &HgPath| matcher.matches(path));
+
+ (res, all_warnings)
+ })
}
impl<'a> IncludeMatcher<'a> {
@@ -628,6 +643,10 @@
.chain(self.parents.iter());
DirsChildrenMultiset::new(thing, Some(&self.parents))
}
+
+ pub fn debug_get_patterns(&self) -> &[u8] {
+ self.patterns.as_ref()
+ }
}
impl<'a> Display for IncludeMatcher<'a> {
To: aalekseyev, #hg-reviewers
Cc: mercurial-patches, mercurial-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mercurial-scm.org/pipermail/mercurial-patches/attachments/20211027/24290a21/attachment-0001.html>
More information about the Mercurial-patches
mailing list