Hacktoberfest 2026: le issue che i maintainer hanno segnato per ottobre, aperte e adatte ai principianti. Sfoglia le issue Hacktoberfest

`-S/--smart-case` ignores `-e`/`-f` patterns and counts escapes like `\S` as uppercase

Chiusa
#183 0 commenti 0 reazioni 0 assegnatari Vedi su GitHub

I maintainer di solito rispondono entro 1 giorno

Una pull request collegata è già stata integrata.

  • #187 di @shengyfu — integrata

Valutazione

Difficoltà
4/5
Tempo stimato
3-5 giorni
Idoneità per principianti
57/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Attiva
Stack tecnologico
rust
Ambito
cli, search

Direzione di ricerca

Start with SearchOptions::effective_case_insensitive in tgrep-cli/src/search.rs, then trace how all_patterns() and parsed patterns feed the query plan and matcher. Read the existing search tests and add regression coverage for the four reproductions, including escaped uppercase characters and -e/-f; done when smart-case behavior matches the stated ripgrep expectations in indexed and no-index searches.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Summary

-S/--smart-case decides case sensitivity in a way that differs from ripgrep in two cases:

  1. It only looks at the positional pattern. With -e or -f the positional pattern is empty, so the search is always case-insensitive, even when the given patterns contain uppercase letters.
  2. It treats every uppercase character in the pattern text as uppercase, including those in escapes such as \S, \W or \D. ripgrep only counts uppercase literals: "of the literals in the pattern, none of them are considered to be uppercase according to Unicode. For example, foo\pL has no uppercase literals but Foo\pL does."

The first returns extra matches. The second misses matches. Both happen with and without the index.

Reproduce

mkdir repro && cd repro
mkdir d
printf 'abc\n' > d/lower.txt
printf 'ABC\n' > d/upper.txt
printf 'ABC\n' > pats.txt          # outside d/ so the pattern file itself is not searched

tgrep --no-index -S -e ABC d
tgrep --no-index -S -f pats.txt d
tgrep --no-index -S -e abc -e XYZ d
tgrep --no-index -S 'a\Sc' d
Query Actual: tgrep Expected: rg 15.1.0
-S -e ABC d upper.txt, lower.txt upper.txt
-S -f pats.txt d (contains ABC) upper.txt, lower.txt upper.txt
-S -e abc -e XYZ d upper.txt, lower.txt lower.txt
-S 'a\Sc' d lower.txt upper.txt, lower.txt

ripgrep applies smart case to the patterns as a whole: if any pattern has an uppercase literal, the search is case-sensitive, which is why -e abc -e XYZ does not match ABC.

Environment

  • tgrep 1.1.0, built from 1120aca (current main) with rustc 1.95.0 (59807616e 2026-04-14)
  • Windows 11 Pro (build 28000); the code involved is platform-independent
  • Same results with --no-index and with a local index; -S -e ABC also reproduces through tgrep serve

Cause

SearchOptions::effective_case_insensitive checks only self.pattern, using char::is_uppercase on the raw text:

https://github.com/microsoft/tgrep/blob/1120aca41dd192ae61bdd996e9886cb354a78a27/tgrep-cli/src/search.rs#L235-L237

When -e or -f is used, the positional argument moves to the path list and self.pattern is empty (search.rs#L432-L439), so the check is always true. The result feeds both the query plan and the matcher (search.rs#L817) and is sent to the server, so indexed searches get the same wrong case mode as scans.

Possible fix

Compute smart case from all_patterns() instead of self.pattern, with the search case-sensitive if any pattern has an uppercase literal:

  • With -F, every character is a literal, so is_uppercase on the raw text is correct.
  • Otherwise, parse each pattern with regex_syntax::ast and look only at literal characters, as ripgrep's grep-regex does. A pattern with no literals at all (\w+) is not "all lowercase" under ripgrep's rule, so it stays case-sensitive.

A regression test could cover the four queries above.

Lingua principale
Rust
Stelle
3.5k
Fork
140
Merge medio
15h 44m
PR unite (30g)
27

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di microsoft/tgrep

Tutte le issue di microsoft/tgrep

Issue simili

Altre issue su Rust

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.