BurntSushi/ripgrep

Missing support for `[[:space:]]` match group in the ignore crate

Open

#2,962 建立於 2025年1月6日

在 GitHub 查看
 (8 留言) (0 反應) (0 負責人)Rust (63,768 star) (2,559 fork)batch import
enhancementhelp wanted

描述

Please tick this box to confirm you have reviewed the above.

  • I have a different issue.

What version of ripgrep are you using?

ignore = "0.4.23"

How did you install ripgrep?

Cargo

What operating system are you using ripgrep on?

Fedora

NAME="Fedora Linux"
VERSION="41 (Workstation Edition)"
RELEASE_TYPE=stable
ID=fedora
VERSION_ID=41
VERSION_CODENAME=""
PLATFORM_ID="platform:f41"
PRETTY_NAME="Fedora Linux 41 (Workstation Edition)"
ANSI_COLOR="0;38;2;60;110;180"
LOGO=fedora-logo-icon
CPE_NAME="cpe:/o:fedoraproject:fedora:41"
DEFAULT_HOSTNAME="fedora"
HOME_URL="https://fedoraproject.org/"
DOCUMENTATION_URL="https://docs.fedoraproject.org/en-US/fedora/f41/system-administrators-guide/"
SUPPORT_URL="https://ask.fedoraproject.org/"
BUG_REPORT_URL="https://bugzilla.redhat.com/"
REDHAT_BUGZILLA_PRODUCT="Fedora"
REDHAT_BUGZILLA_PRODUCT_VERSION=41
REDHAT_SUPPORT_PRODUCT="Fedora"
REDHAT_SUPPORT_PRODUCT_VERSION=41
SUPPORT_END=2025-12-15
VARIANT="Workstation Edition"
VARIANT_ID=workstation

Describe your bug.

The ignore crate fails to handle certain character classes as part of it's matcher implementation. I noticed this for [[:space:]] which happens to be contained in some local .gitattributes file I try to parse and use via the ignore crate to teach [jj'](https://github.com/jj-vcs/jj/) to just ignore git-lfs files. Git itself [documents the pattern syntax](https://git-scm.com/docs/gitattributes) to be the same (beside minor restrictions) than that one from .gitignore` files, therefore I've tried to use the ignore crate for this.

What are the steps to reproduce the behavior?

Run the following code and see the assertion fail:

    let mut ignore_builder = ignore::gitignore::GitignoreBuilder::new("");

    ignore_builder.add_line(None, "giga_las/samples/MOAT[[:space:]]HOUSE[[:space:]]FARM[[:space:]]BH_Raw1[[:space:]](Disks).las").unwrap();
    ignore_builder
        .add_line(None, "giga_las/samples/MOAT_HOUSE_FARM_BH_Raw1_(Disks).las")
        .unwrap();

    let ignore = ignore_builder.build().unwrap();

    assert!(matches!(
        ignore.matched(
            "giga_las/samples/MOAT_HOUSE_FARM_BH_Raw1_(Disks).las",
            false
        ),
        ignore::Match::Ignore(_)
    ));

    assert!(
        matches!(
            ignore.matched(
                "giga_las/samples/MOAT HOUSE FARM BH Raw1 (Disks).las",
                false
            ),
            ignore::Match::Ignore(_)
        ),
        "Did not match, did not satisfy the [[:space:]] matchers"
    );

What is the actual behavior?

The assertion fails

What is the expected behavior?

The assertion passes. See the character class tests from the git repository itself here: https://github.com/git/git/blob/8d8387116ae8c3e73f6184471f0c46edbd2c7601/t/t3070-wildmatch.sh#L144 for future examples

貢獻者指南