annotate rust/rhg/src/commands/debugignorerhg.rs @ 52774:94e2547e6f3d

rust: move code from utils to utils::strings This moves string-related functions in hg::utils into the recently added hg::utils::strings module.
author Mitchell Kember <mkember@janestreet.com>
date Thu, 16 Jan 2025 13:15:02 -0500
parents b89c934e6269
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
1 use crate::error::CommandError;
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
2 use crate::ui::Ui;
52386
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
3 use clap::Arg;
52336
04b9a56c2d25 rust-lib: only export very common types to the top of the crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49987
diff changeset
4 use hg::dirstate::status::StatusError;
52385
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52336
diff changeset
5 use hg::filepatterns::RegexCompleteness;
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
6 use hg::matchers::{get_ignore_matcher_pre, ReSyntax};
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
7 use hg::repo::Repo;
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
8 use log::warn;
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
9
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
10 pub const HELP_TEXT: &str = "
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
11 Show effective hgignore patterns used by rhg.
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
12
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
13 This is a pure Rust version of `hg debugignore`.
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
14
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
15 Some options might be missing, check the list below.
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
16 ";
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
17
49758
37bc3edef76f rhg: upgrade `clap` dependency
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49550
diff changeset
18 pub fn args() -> clap::Command {
52386
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
19 clap::command!("debugignorerhg")
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
20 .arg(
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
21 Arg::new("all-patterns")
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
22 .help("include all patterns, including ones for exact file matches")
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
23 .short('a')
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
24 .action(clap::ArgAction::SetTrue)
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
25 .long("all-patterns"),
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
26 ).about(HELP_TEXT)
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
27 }
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
28
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
29 pub enum WhichPatterns {
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
30 All,
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
31 SlowPathOnly,
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
32 }
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
33
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
34 pub fn work(
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
35 repo: &Repo,
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
36 ui: &Ui,
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
37 which: WhichPatterns,
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
38 syntax: ReSyntax,
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
39 ) -> Result<(), CommandError> {
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
40 let ignore_file = repo.working_directory_vfs().join(".hgignore"); // TODO hardcoded
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
41 let all_patterns = matches!(which, WhichPatterns::All);
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
42
52385
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52336
diff changeset
43 let (ignore_matcher, warnings) = get_ignore_matcher_pre(
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
44 vec![ignore_file],
49987
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49758
diff changeset
45 repo.working_directory_path(),
49550
363923bd51cd dirstate-v2: hash the source of the ignore patterns as well
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48403
diff changeset
46 &mut |_source, _pattern_bytes| (),
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
47 )
49987
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49758
diff changeset
48 .map_err(StatusError::from)?;
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
49
52386
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
50 let regex_config = if all_patterns {
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
51 RegexCompleteness::Complete
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
52 } else {
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
53 RegexCompleteness::ExcludeExactFiles
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
54 };
52385
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52336
diff changeset
55 let ignore_matcher = ignore_matcher
52386
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52385
diff changeset
56 .build_debug_matcher(regex_config)
52385
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52336
diff changeset
57 .map_err(StatusError::from)?;
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52336
diff changeset
58
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
59 if !warnings.is_empty() {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
60 warn!("Pattern warnings: {:?}", &warnings);
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
61 }
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
62
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
63 let patterns = ignore_matcher.debug_get_patterns(syntax);
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
64 ui.write_stdout(&patterns)?;
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
65 ui.write_stdout(b"\n")?;
48403
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
66 Ok(())
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
67 }
52583
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
68
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
69 pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
70 let repo = invocation.repo?;
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
71 let args = invocation.subcommand_args;
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
72
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
73 let all_patterns = args.get_flag("all-patterns");
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
74 let patterns = if all_patterns {
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
75 WhichPatterns::All
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
76 } else {
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
77 WhichPatterns::SlowPathOnly
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
78 };
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
79
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
80 work(repo, invocation.ui, patterns, ReSyntax::Internal)
b89c934e6269 rust-hgignore: add a scripting command to print the hgignore regexp
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52386
diff changeset
81 }