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.

use crate::error::CommandError;
use clap::Arg;
use hg::dirstate::status::StatusError;
use hg::filepatterns::RegexCompleteness;
use hg::matchers::get_ignore_matcher_pre;
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::Command {
    clap::command!("debugignorerhg")
    .arg(
        Arg::new("all-patterns")
            .help("include all patterns, including ones for exact file matches")
            .short('a')
            .action(clap::ArgAction::SetTrue)
            .long("all-patterns"),
    ).about(HELP_TEXT)
}

pub fn run(invocation: &crate::CliInvocation) -> Result<(), CommandError> {
    let repo = invocation.repo?;
    let args = invocation.subcommand_args;

    let ignore_file = repo.working_directory_vfs().join(".hgignore"); // TODO hardcoded
    let all_patterns = args.get_flag("all-patterns");

    let (ignore_matcher, warnings) = get_ignore_matcher_pre(
        vec![ignore_file],
        repo.working_directory_path(),
        &mut |_source, _pattern_bytes| (),
    )
    .map_err(StatusError::from)?;

    let regex_config = if all_patterns {
        RegexCompleteness::Complete
    } else {
        RegexCompleteness::ExcludeExactFiles
    };
    let ignore_matcher = ignore_matcher
        .build_debug_matcher(regex_config)
        .map_err(StatusError::from)?;

    if !warnings.is_empty() {
        warn!("Pattern warnings: {:?}", &warnings);
    }

    let patterns = ignore_matcher.debug_get_patterns();
    invocation.ui.write_stdout(patterns)?;
    invocation.ui.write_stdout(b"\n")?;
    Ok(())
}