`-S/--smart-case` ignores `-e`/`-f` patterns and counts escapes like `\S` as uppercase
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
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:
- It only looks at the positional pattern. With
-eor-fthe positional pattern is empty, so the search is always case-insensitive, even when the given patterns contain uppercase letters. - It treats every uppercase character in the pattern text as uppercase, including those in escapes such as
\S,\Wor\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-indexand with a local index;-S -e ABCalso reproduces throughtgrep serve
Cause
SearchOptions::effective_case_insensitive checks only self.pattern, using char::is_uppercase on the raw text:
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, sois_uppercaseon the raw text is correct. - Otherwise, parse each pattern with
regex_syntax::astand look only at literal characters, as ripgrep'sgrep-regexdoes. 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
- Nessun Dockerfile né file Docker Compose
- Nessun modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di microsoft/tgrep
-
Difficoltà 5/5 Più di una settimana Idoneità per principianti 25/100
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 3/5 1-2 giorni Idoneità per principianti 50/100
microsoft/tgrep#206 · 1 commento ·
I maintainer di solito rispondono entro 1 giorno
-
Difficoltà 4/5 3-5 giorni Idoneità per principianti 45/100
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di microsoft/tgrep
Issue simili
-
BASEPRI needs an ISBAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 69/100
rust-embedded/cortex-m#702 · 1 commento ·
-
Make major, minor, and makedev safe on solarish targetsForse già presa @xtqqczze l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
improvement/feedback improvement/workflow-project
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
higress-group/HiRoute#166 ·
I maintainer di solito rispondono entro 1 giorno
-
Proxy ignores l5d-retry-http and l5d-retry-grpc conditions that follow a comma and spaceForse già presa @RaphaelFakhri l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 83/100
I maintainer di solito rispondono entro 3 giorni
-
sncast panics when decoding a `u384` valueForse già presa @RaphaelFakhri l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
foundry-rs/starknet-foundry#4635 ·
I maintainer di solito rispondono entro 3 giorni