rust/rhg/src/commands/debugignorerhg.rs
author Arseniy Alekseyev <aalekseyev@janestreet.com>
Tue, 03 Dec 2024 14:39:00 +0000
changeset 52354 ff19ddb256b3
parent 52353 e2e49069eeb6
child 52557 b89c934e6269
permissions -rw-r--r--
rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output The flag controls if the printed regex is intended to cover everything (including the individually mentioned files), or just the regex that's used in matching.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
     1
use crate::error::CommandError;
52354
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
     2
use clap::Arg;
52300
04b9a56c2d25 rust-lib: only export very common types to the top of the crate
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49914
diff changeset
     3
use hg::dirstate::status::StatusError;
52353
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52300
diff changeset
     4
use hg::filepatterns::RegexCompleteness;
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52300
diff changeset
     5
use hg::matchers::get_ignore_matcher_pre;
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
     6
use log::warn;
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
     7
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
     8
pub const HELP_TEXT: &str = "
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
     9
Show effective hgignore patterns used by rhg.
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    10
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    11
This is a pure Rust version of `hg debugignore`.
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
Some options might be missing, check the list below.
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
49640
37bc3edef76f rhg: upgrade `clap` dependency
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49558
diff changeset
    16
pub fn args() -> clap::Command {
52354
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    17
    clap::command!("debugignorerhg")
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    18
    .arg(
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    19
        Arg::new("all-patterns")
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    20
            .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: 52353
diff changeset
    21
            .short('a')
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    22
            .action(clap::ArgAction::SetTrue)
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    23
            .long("all-patterns"),
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    24
    ).about(HELP_TEXT)
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    25
}
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    26
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    27
pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    28
    let repo = invocation.repo?;
52354
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    29
    let args = invocation.subcommand_args;
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    30
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    31
    let ignore_file = repo.working_directory_vfs().join(".hgignore"); // TODO hardcoded
52354
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    32
    let all_patterns = args.get_flag("all-patterns");
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    33
52353
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52300
diff changeset
    34
    let (ignore_matcher, warnings) = get_ignore_matcher_pre(
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    35
        vec![ignore_file],
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49640
diff changeset
    36
        repo.working_directory_path(),
49558
363923bd51cd dirstate-v2: hash the source of the ignore patterns as well
Rapha?l Gom?s <rgomes@octobus.net>
parents: 48355
diff changeset
    37
        &mut |_source, _pattern_bytes| (),
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    38
    )
49914
58074252db3c rust: run `cargo clippy`
Rapha?l Gom?s <rgomes@octobus.net>
parents: 49640
diff changeset
    39
    .map_err(StatusError::from)?;
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    40
52354
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    41
    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: 52353
diff changeset
    42
        RegexCompleteness::Complete
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    43
    } else {
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    44
        RegexCompleteness::ExcludeExactFiles
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    45
    };
52353
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52300
diff changeset
    46
    let ignore_matcher = ignore_matcher
52354
ff19ddb256b3 rust-ignore: add some tests of `debugignorerhg`, add flag -a to control output
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52353
diff changeset
    47
        .build_debug_matcher(regex_config)
52353
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52300
diff changeset
    48
        .map_err(StatusError::from)?;
e2e49069eeb6 rust-ignore: make `debugignorerhg` command show a full regex, with exact files
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents: 52300
diff changeset
    49
48355
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    50
    if !warnings.is_empty() {
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    51
        warn!("Pattern warnings: {:?}", &warnings);
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    52
    }
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    53
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    54
    let patterns = ignore_matcher.debug_get_patterns();
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    55
    invocation.ui.write_stdout(patterns)?;
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    56
    invocation.ui.write_stdout(b"\n")?;
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    57
    Ok(())
6d4daf51283c rhg: implement the debugignorerhg subcommand
Arseniy Alekseyev <aalekseyev@janestreet.com>
parents:
diff changeset
    58
}