mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-07-25 17:21:57 -07:00
Compare commits
54 Commits
grep-cli-0
...
ignore-0.4
Author | SHA1 | Date | |
---|---|---|---|
|
2c3897585d | ||
|
6e9141a9ca | ||
|
c8e4a84519 | ||
|
f02a50a69d | ||
|
b9c774937f | ||
|
67dd809a80 | ||
|
e0a85678e1 | ||
|
23af5fb043 | ||
|
5dec4b8e37 | ||
|
827082a33a | ||
|
6c2a550e1e | ||
|
8e8fc9c503 | ||
|
2057023dc5 | ||
|
3f2fe0afee | ||
|
56c7ad175a | ||
|
5b7a30846f | ||
|
2a4dba3fbf | ||
|
84d65865e6 | ||
|
d9aaa11873 | ||
|
67ad9917ad | ||
|
daa157b5f9 | ||
|
ca5e294ad6 | ||
|
6c7947b819 | ||
|
9acb4a5405 | ||
|
0096c74c11 | ||
|
8c48355b03 | ||
|
f9b86de963 | ||
|
d23b74975a | ||
|
a5cbdb3dfe | ||
|
b6bac8484e | ||
|
805fa32d18 | ||
|
2d518dd1f9 | ||
|
8575d26179 | ||
|
2e81a7adfe | ||
|
cd5440fb62 | ||
|
2ee690e87a | ||
|
59f86a45d3 | ||
|
2d31af38a2 | ||
|
0da1176e7d | ||
|
eeffcd50b7 | ||
|
625743d7c8 | ||
|
3d0171040a | ||
|
93429d0f85 | ||
|
9c4b0baf10 | ||
|
179487aaed | ||
|
b407d62b63 | ||
|
9bd1e737bc | ||
|
c12231c621 | ||
|
b0df573834 | ||
|
85b2ceecd1 | ||
|
fee7ac79f1 | ||
|
54d5540c10 | ||
|
d0251c77fe | ||
|
6aa5993d4b |
12
.github/workflows/ci.yml
vendored
12
.github/workflows/ci.yml
vendored
@@ -75,6 +75,18 @@ jobs:
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: aarch64-unknown-linux-gnu
|
||||
- build: stable-arm-gnueabihf
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: armv7-unknown-linux-gnueabihf
|
||||
- build: stable-arm-musleabihf
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: armv7-unknown-linux-musleabihf
|
||||
- build: stable-arm-musleabi
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: armv7-unknown-linux-musleabi
|
||||
- build: stable-powerpc64
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
|
46
.github/workflows/release.yml
vendored
46
.github/workflows/release.yml
vendored
@@ -80,6 +80,24 @@ jobs:
|
||||
target: aarch64-unknown-linux-gnu
|
||||
strip: aarch64-linux-gnu-strip
|
||||
qemu: qemu-aarch64
|
||||
- build: stable-arm-gnueabihf
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: armv7-unknown-linux-gnueabihf
|
||||
strip: arm-linux-gnueabihf-strip
|
||||
qemu: qemu-arm
|
||||
- build: stable-arm-musleabihf
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: armv7-unknown-linux-musleabihf
|
||||
strip: arm-linux-musleabihf-strip
|
||||
qemu: qemu-arm
|
||||
- build: stable-arm-musleabi
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
target: armv7-unknown-linux-musleabi
|
||||
strip: arm-linux-musleabi-strip
|
||||
qemu: qemu-arm
|
||||
- build: stable-powerpc64
|
||||
os: ubuntu-latest
|
||||
rust: stable
|
||||
@@ -175,9 +193,9 @@ jobs:
|
||||
run: |
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.strip }}" \
|
||||
"/target/${{ matrix.target }}/release/rg"
|
||||
"/$BIN"
|
||||
|
||||
- name: Determine archive name
|
||||
shell: bash
|
||||
@@ -210,31 +228,31 @@ jobs:
|
||||
run: |
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.qemu }}" "/$BIN" --version
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.qemu }}" "/$BIN" \
|
||||
--generate complete-bash > "$ARCHIVE/complete/rg.bash"
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.qemu }}" "/$BIN" \
|
||||
--generate complete-fish > "$ARCHIVE/complete/rg.fish"
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.qemu }}" "/$BIN" \
|
||||
--generate complete-powershell > "$ARCHIVE/complete/_rg.ps1"
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.qemu }}" "/$BIN" \
|
||||
--generate complete-zsh > "$ARCHIVE/complete/_rg"
|
||||
docker run --rm -v \
|
||||
"$PWD/target:/target:Z" \
|
||||
"rustembedded/cross:${{ matrix.target }}" \
|
||||
"ghcr.io/cross-rs/${{ matrix.target }}:main" \
|
||||
"${{ matrix.qemu }}" "/$BIN" \
|
||||
--generate man > "$ARCHIVE/doc/rg.1"
|
||||
|
||||
@@ -332,14 +350,15 @@ jobs:
|
||||
run: |
|
||||
cargo deb --profile deb --target ${{ env.TARGET }}
|
||||
version="${{ needs.create-release.outputs.version }}"
|
||||
deb="target/${{ env.TARGET }}/debian/ripgrep_$version-1_amd64.deb"
|
||||
echo "DEB=$deb" >> $GITHUB_ENV
|
||||
echo "DEB_DIR=target/${{ env.TARGET }}/debian" >> $GITHUB_ENV
|
||||
echo "DEB_NAME=ripgrep_$version-1_amd64.deb" >> $GITHUB_ENV
|
||||
|
||||
- name: Create sha256 sum of deb file
|
||||
shell: bash
|
||||
run: |
|
||||
sum="$DEB.sha256"
|
||||
shasum -a 256 "$DEB" > "$sum"
|
||||
cd "$DEB_DIR"
|
||||
sum="$DEB_NAME.sha256"
|
||||
shasum -a 256 "$DEB_NAME" > "$sum"
|
||||
echo "SUM=$sum" >> $GITHUB_ENV
|
||||
|
||||
- name: Upload release archive
|
||||
@@ -347,5 +366,6 @@ jobs:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
shell: bash
|
||||
run: |
|
||||
cd "$DEB_DIR"
|
||||
version="${{ needs.create-release.outputs.version }}"
|
||||
gh release upload "$version" ${{ env.DEB }} ${{ env.SUM }}
|
||||
gh release upload "$version" "$DEB_NAME" "$SUM"
|
||||
|
65
CHANGELOG.md
65
CHANGELOG.md
@@ -1,9 +1,64 @@
|
||||
14.1.0 (TBD)
|
||||
============
|
||||
This is a minor release with a few small new features and bug fixes.
|
||||
|
||||
Bug fixes:
|
||||
|
||||
* [BUG #2664](https://github.com/BurntSushi/ripgrep/issues/2690):
|
||||
Fix unbounded memory growth in the `ignore` crate.
|
||||
|
||||
Feature enhancements:
|
||||
|
||||
* Added or improved file type filtering for Lean and Meson.
|
||||
* [FEATURE #2684](https://github.com/BurntSushi/ripgrep/issues/2684):
|
||||
Improve completions for the `fish` shell.
|
||||
* [FEATURE #2702](https://github.com/BurntSushi/ripgrep/pull/2702):
|
||||
Add release binaries for `armv7-unknown-linux-gnueabihf`,
|
||||
`armv7-unknown-linux-musleabihf` and `armv7-unknown-linux-musleabi`.
|
||||
|
||||
|
||||
14.0.3 (2023-11-28)
|
||||
===================
|
||||
This is a patch release with a bug fix for the `--sortr` flag.
|
||||
|
||||
Bug fixes:
|
||||
|
||||
* [BUG #2664](https://github.com/BurntSushi/ripgrep/issues/2664):
|
||||
Fix `--sortr=path`. I left a `todo!()` in the source. Oof.
|
||||
|
||||
|
||||
14.0.2 (2023-11-27)
|
||||
===================
|
||||
This is a patch release with a few small bug fixes.
|
||||
|
||||
Bug fixes:
|
||||
|
||||
* [BUG #2654](https://github.com/BurntSushi/ripgrep/issues/2654):
|
||||
Fix `deb` release sha256 sum file.
|
||||
* [BUG #2658](https://github.com/BurntSushi/ripgrep/issues/2658):
|
||||
Fix partial regression in the behavior of `--null-data --line-regexp`.
|
||||
* [BUG #2659](https://github.com/BurntSushi/ripgrep/issues/2659):
|
||||
Fix Fish shell completions.
|
||||
* [BUG #2662](https://github.com/BurntSushi/ripgrep/issues/2662):
|
||||
Fix typo in documentation for `-i/--ignore-case`.
|
||||
|
||||
|
||||
14.0.1 (2023-11-26)
|
||||
===================
|
||||
This a patch release meant to fix `cargo install ripgrep` on Windows.
|
||||
|
||||
Bug fixes:
|
||||
|
||||
* [BUG #2653](https://github.com/BurntSushi/ripgrep/issues/2653):
|
||||
Include `pkg/windows/Manifest.xml` in crate package.
|
||||
|
||||
|
||||
14.0.0 (2023-11-26)
|
||||
===================
|
||||
ripgrep 14 is a new major version release of ripgrep that has some new
|
||||
features, performance improvements and a lot of bug fixes.
|
||||
|
||||
The headling feature in this release is hyperlink support. In this release,
|
||||
The headlining feature in this release is hyperlink support. In this release,
|
||||
they are an opt-in feature but may change to an opt-out feature in the future.
|
||||
To enable them, try passing `--hyperlink-format default`. If you use [VS Code],
|
||||
then try passing `--hyperlink-format vscode`. Please [report your experience
|
||||
@@ -12,10 +67,10 @@ with hyperlinks][report-hyperlinks], positive or negative.
|
||||
[VS Code]: https://code.visualstudio.com/
|
||||
[report-hyperlinks]: https://github.com/BurntSushi/ripgrep/discussions/2611
|
||||
|
||||
Another headling development in this release is that it contains a rewrite of
|
||||
its regex engine. You generally shouldn't notice any changes, except for some
|
||||
searches may get faster. You can read more about the [regex engine rewrite on
|
||||
my blog][regex-internals]. Please [report your performance improvements or
|
||||
Another headlining development in this release is that it contains a rewrite
|
||||
of its regex engine. You generally shouldn't notice any changes, except for
|
||||
some searches may get faster. You can read more about the [regex engine rewrite
|
||||
on my blog][regex-internals]. Please [report your performance improvements or
|
||||
regressions that you notice][report-perf].
|
||||
|
||||
[report-perf]: https://github.com/BurntSushi/ripgrep/discussions/2652
|
||||
|
109
Cargo.lock
generated
109
Cargo.lock
generated
@@ -13,9 +13,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.75"
|
||||
version = "1.0.79"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6"
|
||||
checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca"
|
||||
|
||||
[[package]]
|
||||
name = "autocfg"
|
||||
@@ -25,9 +25,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||
|
||||
[[package]]
|
||||
name = "bstr"
|
||||
version = "1.8.0"
|
||||
version = "1.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "542f33a8835a0884b006a0c3df3dadd99c0c3f296ed26c2fdc8028e01ad6230c"
|
||||
checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"regex-automata",
|
||||
@@ -52,9 +52,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-channel"
|
||||
version = "0.5.8"
|
||||
version = "0.5.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200"
|
||||
checksum = "82a9b73a36529d9c47029b9fb3a6f0ea3cc916a261195352ba19e770fc1748b2"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"crossbeam-utils",
|
||||
@@ -62,9 +62,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-deque"
|
||||
version = "0.8.3"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef"
|
||||
checksum = "fca89a0e215bab21874660c67903c5f143333cab1da83d041c7ded6053774751"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
"crossbeam-epoch",
|
||||
@@ -73,22 +73,20 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-epoch"
|
||||
version = "0.9.15"
|
||||
version = "0.9.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7"
|
||||
checksum = "0e3681d554572a651dda4186cd47240627c3d0114d45a95f6ad27f2f22e7548d"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"cfg-if",
|
||||
"crossbeam-utils",
|
||||
"memoffset",
|
||||
"scopeguard",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crossbeam-utils"
|
||||
version = "0.8.16"
|
||||
version = "0.8.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294"
|
||||
checksum = "c3a430a770ebd84726f584a90ee7f020d28db52c6d02138900f22341f866d39c"
|
||||
dependencies = [
|
||||
"cfg-if",
|
||||
]
|
||||
@@ -134,7 +132,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "grep"
|
||||
version = "0.2.12"
|
||||
version = "0.3.1"
|
||||
dependencies = [
|
||||
"grep-cli",
|
||||
"grep-matcher",
|
||||
@@ -160,7 +158,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "grep-matcher"
|
||||
version = "0.1.6"
|
||||
version = "0.1.7"
|
||||
dependencies = [
|
||||
"memchr",
|
||||
"regex",
|
||||
@@ -168,7 +166,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "grep-pcre2"
|
||||
version = "0.1.6"
|
||||
version = "0.1.7"
|
||||
dependencies = [
|
||||
"grep-matcher",
|
||||
"log",
|
||||
@@ -177,7 +175,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "grep-printer"
|
||||
version = "0.1.7"
|
||||
version = "0.2.1"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"grep-matcher",
|
||||
@@ -191,7 +189,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "grep-regex"
|
||||
version = "0.1.11"
|
||||
version = "0.1.12"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"grep-matcher",
|
||||
@@ -202,7 +200,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "grep-searcher"
|
||||
version = "0.1.11"
|
||||
version = "0.1.13"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"encoding_rs",
|
||||
@@ -217,7 +215,7 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ignore"
|
||||
version = "0.4.21"
|
||||
version = "0.4.22"
|
||||
dependencies = [
|
||||
"bstr",
|
||||
"crossbeam-channel",
|
||||
@@ -233,9 +231,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.9"
|
||||
version = "1.0.10"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38"
|
||||
checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c"
|
||||
|
||||
[[package]]
|
||||
name = "jemalloc-sys"
|
||||
@@ -274,9 +272,9 @@ checksum = "baff4b617f7df3d896f97fe922b64817f6cd9a756bb81d40f8883f2f66dcb401"
|
||||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.150"
|
||||
version = "0.2.151"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c"
|
||||
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
@@ -292,28 +290,19 @@ checksum = "b5e6163cb8c49088c2c36f57875e58ccd8c87c7427f7fbd50ea6710b2f3f2e8f"
|
||||
|
||||
[[package]]
|
||||
name = "memchr"
|
||||
version = "2.6.4"
|
||||
version = "2.7.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167"
|
||||
checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
|
||||
|
||||
[[package]]
|
||||
name = "memmap2"
|
||||
version = "0.9.0"
|
||||
version = "0.9.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "deaba38d7abf1d4cca21cc89e932e542ba2b9258664d2a9ef0e61512039c9375"
|
||||
checksum = "45fd3a57831bf88bc63f8cebc0cf956116276e97fef3966103e96416209f7c92"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "memoffset"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "num-traits"
|
||||
version = "0.2.17"
|
||||
@@ -347,9 +336,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pcre2-sys"
|
||||
version = "0.2.7"
|
||||
version = "0.2.8"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8f8f5556f23cf2c0b481949fdfc19a7cd9b27ddcb00ef3477b0f4935cbdaedf2"
|
||||
checksum = "25b8a7b5253a4465b873a21ee7e8d6ec561a57eed5d319621bec36bea35c86ae"
|
||||
dependencies = [
|
||||
"cc",
|
||||
"libc",
|
||||
@@ -358,24 +347,24 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "pkg-config"
|
||||
version = "0.3.27"
|
||||
version = "0.3.28"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964"
|
||||
checksum = "69d3587f8a9e599cc7ec2c00e331f71c4e69a5f9a4b8a6efd5b07466b9736f9a"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.70"
|
||||
version = "1.0.76"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "39278fbbf5fb4f646ce651690877f89d1c5811a3d4acb27700c1cb3cdb78fd3b"
|
||||
checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.33"
|
||||
version = "1.0.35"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
|
||||
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
@@ -411,7 +400,7 @@ checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f"
|
||||
|
||||
[[package]]
|
||||
name = "ripgrep"
|
||||
version = "13.0.0"
|
||||
version = "14.0.3"
|
||||
dependencies = [
|
||||
"anyhow",
|
||||
"bstr",
|
||||
@@ -430,9 +419,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.15"
|
||||
version = "1.0.16"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741"
|
||||
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
|
||||
|
||||
[[package]]
|
||||
name = "same-file"
|
||||
@@ -443,26 +432,20 @@ dependencies = [
|
||||
"winapi-util",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "scopeguard"
|
||||
version = "1.2.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.193"
|
||||
version = "1.0.195"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
|
||||
checksum = "63261df402c67811e9ac6def069e4786148c4563f4b50fd4bf30aa370d626b02"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.193"
|
||||
version = "1.0.195"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
|
||||
checksum = "46fe8f8603d81ba86327b23a2e9cdf49e1255fb94a4c5f297f6ee0547178ea2c"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
@@ -471,9 +454,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "serde_json"
|
||||
version = "1.0.108"
|
||||
version = "1.0.111"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
|
||||
checksum = "176e46fa42316f18edd598015a5166857fc835ec732f5215eac6b7bdbf0a84f4"
|
||||
dependencies = [
|
||||
"itoa",
|
||||
"ryu",
|
||||
@@ -482,9 +465,9 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.39"
|
||||
version = "2.0.48"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
|
||||
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
18
Cargo.toml
18
Cargo.toml
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "ripgrep"
|
||||
version = "13.0.0" #:version
|
||||
version = "14.0.3" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
ripgrep is a line-oriented search tool that recursively searches the current
|
||||
@@ -17,7 +17,7 @@ exclude = [
|
||||
"HomebrewFormula",
|
||||
"/.github/",
|
||||
"/ci/",
|
||||
"/pkg/",
|
||||
"/pkg/brew",
|
||||
"/benchsuite/",
|
||||
"/scripts/",
|
||||
]
|
||||
@@ -51,7 +51,7 @@ members = [
|
||||
[dependencies]
|
||||
anyhow = "1.0.75"
|
||||
bstr = "1.7.0"
|
||||
grep = { version = "0.2.12", path = "crates/grep" }
|
||||
grep = { version = "0.3.1", path = "crates/grep" }
|
||||
ignore = { version = "0.4.21", path = "crates/ignore" }
|
||||
lexopt = "0.3.0"
|
||||
log = "0.4.5"
|
||||
@@ -74,6 +74,18 @@ pcre2 = ["grep/pcre2"]
|
||||
[profile.release]
|
||||
debug = 1
|
||||
|
||||
[profile.release-lto]
|
||||
inherits = "release"
|
||||
opt-level = 3
|
||||
debug = "none"
|
||||
strip = "symbols"
|
||||
debug-assertions = false
|
||||
overflow-checks = false
|
||||
lto = "fat"
|
||||
panic = "abort"
|
||||
incremental = false
|
||||
codegen-units = 1
|
||||
|
||||
# This is the main way to strip binaries in the deb package created by
|
||||
# 'cargo deb'. For other release binaries, we (currently) call 'strip'
|
||||
# explicitly in the release process.
|
||||
|
14
Cross.toml
14
Cross.toml
@@ -1,14 +0,0 @@
|
||||
[target.x86_64-unknown-linux-musl]
|
||||
image = "burntsushi/cross:x86_64-unknown-linux-musl"
|
||||
|
||||
[target.i686-unknown-linux-gnu]
|
||||
image = "burntsushi/cross:i686-unknown-linux-gnu"
|
||||
|
||||
[target.aarch64-unknown-linux-gnu]
|
||||
image = "burntsushi/cross:aarch64-unknown-linux-gnu"
|
||||
|
||||
[target.powerpc64-unknown-linux-gnu]
|
||||
image = "burntsushi/cross:powerpc64-unknown-linux-gnu"
|
||||
|
||||
[target.s390x-unknown-linux-gnu]
|
||||
image = "burntsushi/cross:s390x-unknown-linux-gnu"
|
78
README.md
78
README.md
@@ -42,7 +42,7 @@ This example searches the entire
|
||||
[Linux kernel source tree](https://github.com/BurntSushi/linux)
|
||||
(after running `make defconfig && make -j8`) for `[A-Z]+_SUSPEND`, where
|
||||
all matches must be words. Timings were collected on a system with an Intel
|
||||
i7-6900K 3.2 GHz.
|
||||
i9-12900K 5.2 GHz.
|
||||
|
||||
Please remember that a single benchmark is never enough! See my
|
||||
[blog post on ripgrep](https://blog.burntsushi.net/ripgrep/)
|
||||
@@ -50,13 +50,14 @@ for a very detailed comparison with more benchmarks and analysis.
|
||||
|
||||
| Tool | Command | Line count | Time |
|
||||
| ---- | ------- | ---------- | ---- |
|
||||
| ripgrep (Unicode) | `rg -n -w '[A-Z]+_SUSPEND'` | 452 | **0.136s** |
|
||||
| [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `git grep -P -n -w '[A-Z]+_SUSPEND'` | 452 | 0.348s |
|
||||
| [ugrep (Unicode)](https://github.com/Genivia/ugrep) | `ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND'` | 452 | 0.506s |
|
||||
| [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) | `ag -w '[A-Z]+_SUSPEND'` | 452 | 0.654s |
|
||||
| [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'` | 452 | 1.150s |
|
||||
| [ack](https://github.com/beyondgrep/ack3) | `ack -w '[A-Z]+_SUSPEND'` | 452 | 4.054s |
|
||||
| [git grep (Unicode)](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'` | 452 | 4.205s |
|
||||
| ripgrep (Unicode) | `rg -n -w '[A-Z]+_SUSPEND'` | 536 | **0.082s** (1.00x) |
|
||||
| [hypergrep](https://github.com/p-ranav/hypergrep) | `hgrep -n -w '[A-Z]+_SUSPEND'` | 536 | 0.167s (2.04x) |
|
||||
| [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `git grep -P -n -w '[A-Z]+_SUSPEND'` | 536 | 0.273s (3.34x) |
|
||||
| [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) | `ag -w '[A-Z]+_SUSPEND'` | 534 | 0.443s (5.43x) |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -r --ignore-files --no-hidden -I -w '[A-Z]+_SUSPEND'` | 536 | 0.639s (7.82x) |
|
||||
| [git grep](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=C git grep -E -n -w '[A-Z]+_SUSPEND'` | 536 | 0.727s (8.91x) |
|
||||
| [git grep (Unicode)](https://www.kernel.org/pub/software/scm/git/docs/git-grep.html) | `LC_ALL=en_US.UTF-8 git grep -E -n -w '[A-Z]+_SUSPEND'` | 536 | 2.670s (32.70x) |
|
||||
| [ack](https://github.com/beyondgrep/ack3) | `ack -w '[A-Z]+_SUSPEND'` | 2677 | 2.935s (35.94x) |
|
||||
|
||||
Here's another benchmark on the same corpus as above that disregards gitignore
|
||||
files and searches with a whitelist instead. The corpus is the same as in the
|
||||
@@ -65,24 +66,52 @@ doing equivalent work:
|
||||
|
||||
| Tool | Command | Line count | Time |
|
||||
| ---- | ------- | ---------- | ---- |
|
||||
| ripgrep | `rg -uuu -tc -n -w '[A-Z]+_SUSPEND'` | 388 | **0.096s** |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 388 | 0.493s |
|
||||
| [GNU grep](https://www.gnu.org/software/grep/) | `egrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 388 | 0.806s |
|
||||
| ripgrep | `rg -uuu -tc -n -w '[A-Z]+_SUSPEND'` | 447 | **0.063s** (1.00x) |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 447 | 0.607s (9.62x) |
|
||||
| [GNU grep](https://www.gnu.org/software/grep/) | `grep -E -r -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 447 | 0.674s (10.69x) |
|
||||
|
||||
And finally, a straight-up comparison between ripgrep, ugrep and GNU grep on a
|
||||
single large file cached in memory
|
||||
(~13GB, [`OpenSubtitles.raw.en.gz`](http://opus.nlpl.eu/download.php?f=OpenSubtitles/v2018/mono/OpenSubtitles.raw.en.gz)):
|
||||
Now we'll move to searching on single large file. Here is a straight-up
|
||||
comparison between ripgrep, ugrep and GNU grep on a file cached in memory
|
||||
(~13GB, [`OpenSubtitles.raw.en.gz`](http://opus.nlpl.eu/download.php?f=OpenSubtitles/v2018/mono/OpenSubtitles.raw.en.gz), decompressed):
|
||||
|
||||
| Tool | Command | Line count | Time |
|
||||
| ---- | ------- | ---------- | ---- |
|
||||
| ripgrep | `rg -w 'Sherlock [A-Z]\w+'` | 7882 | **2.769s** |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -w 'Sherlock [A-Z]\w+'` | 7882 | 6.802s |
|
||||
| [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [A-Z]\w+'` | 7882 | 9.027s |
|
||||
| ripgrep (Unicode) | `rg -w 'Sherlock [A-Z]\w+'` | 7882 | **1.042s** (1.00x) |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -w 'Sherlock [A-Z]\w+'` | 7882 | 1.339s (1.28x) |
|
||||
| [GNU grep (Unicode)](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 egrep -w 'Sherlock [A-Z]\w+'` | 7882 | 6.577s (6.31x) |
|
||||
|
||||
In the above benchmark, passing the `-n` flag (for showing line numbers)
|
||||
increases the times to `3.423s` for ripgrep and `13.031s` for GNU grep. ugrep
|
||||
increases the times to `1.664s` for ripgrep and `9.484s` for GNU grep. ugrep
|
||||
times are unaffected by the presence or absence of `-n`.
|
||||
|
||||
Beware of performance cliffs though:
|
||||
|
||||
| Tool | Command | Line count | Time |
|
||||
| ---- | ------- | ---------- | ---- |
|
||||
| ripgrep (Unicode) | `rg -w '[A-Z]\w+ Sherlock [A-Z]\w+'` | 485 | **1.053s** (1.00x) |
|
||||
| [GNU grep (Unicode)](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 grep -E -w '[A-Z]\w+ Sherlock [A-Z]\w+'` | 485 | 6.234s (5.92x) |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -w '[A-Z]\w+ Sherlock [A-Z]\w+'` | 485 | 28.973s (27.51x) |
|
||||
|
||||
And performance can drop precipitously across the board when searching big
|
||||
files for patterns without any opportunities for literal optimizations:
|
||||
|
||||
| Tool | Command | Line count | Time |
|
||||
| ---- | ------- | ---------- | ---- |
|
||||
| ripgrep | `rg '[A-Za-z]{30}'` | 6749 | **15.569s** (1.00x) |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep -w '[A-Z]\w+ Sherlock [A-Z]\w+'` | 6749 | 21.857s (1.40x) |
|
||||
| [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=C grep -E '[A-Za-z]{30}'` | 6749 | 32.409s (2.08x) |
|
||||
| [GNU grep (Unicode)](https://www.gnu.org/software/grep/) | `LC_ALL=en_US.UTF-8 grep -E '[A-Za-z]{30}'` | 6795 | 8m30s (32.74x) |
|
||||
|
||||
Finally, high match counts also tend to both tank performance and smooth
|
||||
out the differences between tools (because performance is dominated by how
|
||||
quickly one can handle a match and not the algorithm used to detect the match,
|
||||
generally speaking):
|
||||
|
||||
| Tool | Command | Line count | Time |
|
||||
| ---- | ------- | ---------- | ---- |
|
||||
| ripgrep | `rg the` | 83499915 | **6.948s** (1.00x) |
|
||||
| [ugrep](https://github.com/Genivia/ugrep) | `ugrep the` | 83499915 | 11.721s (1.69x) |
|
||||
| [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=C grep the` | 83499915 | 15.217s (2.19x) |
|
||||
|
||||
### Why should I use ripgrep?
|
||||
|
||||
@@ -283,7 +312,7 @@ If you're a **Guix** user, you can install ripgrep from the official
|
||||
package collection:
|
||||
|
||||
```
|
||||
$ sudo guix install ripgrep
|
||||
$ guix install ripgrep
|
||||
```
|
||||
|
||||
If you're a **Debian** user (or a user of a Debian derivative like **Ubuntu**),
|
||||
@@ -358,9 +387,16 @@ same port as Haiku x86_64 using the x86 secondary architecture build:
|
||||
$ sudo pkgman install ripgrep_x86
|
||||
```
|
||||
|
||||
If you're a **Void Linux** user, then you can install ripgrep from the
|
||||
[official repository](https://voidlinux.org/packages/?arch=x86_64&q=ripgrep):
|
||||
|
||||
```
|
||||
$ sudo xbps-install -Syv ripgrep
|
||||
```
|
||||
|
||||
If you're a **Rust programmer**, ripgrep can be installed with `cargo`.
|
||||
|
||||
* Note that the minimum supported version of Rust for ripgrep is **1.70.0**,
|
||||
* Note that the minimum supported version of Rust for ripgrep is **1.72.0**,
|
||||
although ripgrep may work with older versions.
|
||||
* Note that the binary may be bigger than expected because it contains debug
|
||||
symbols. This is intentional. To remove debug symbols and therefore reduce
|
||||
@@ -383,7 +419,7 @@ $ cargo binstall ripgrep
|
||||
|
||||
ripgrep is written in Rust, so you'll need to grab a
|
||||
[Rust installation](https://www.rust-lang.org/) in order to compile it.
|
||||
ripgrep compiles with Rust 1.70.0 (stable) or newer. In general, ripgrep tracks
|
||||
ripgrep compiles with Rust 1.72.0 (stable) or newer. In general, ripgrep tracks
|
||||
the latest stable release of the Rust compiler.
|
||||
|
||||
To build ripgrep:
|
||||
|
@@ -27,6 +27,7 @@
|
||||
`cargo update -p ripgrep` so that the `Cargo.lock` is updated. Commit the
|
||||
changes and create a new signed tag. Alternatively, use
|
||||
`cargo-up --no-push --no-release Cargo.toml {VERSION}` to automate this.
|
||||
* Run `cargo package` and ensure it succeeds.
|
||||
* Push changes to GitHub, NOT including the tag. (But do not publish a new
|
||||
version of ripgrep to crates.io yet.)
|
||||
* Once CI for `master` finishes successfully, push the version tag. (Trying to
|
||||
|
@@ -1,23 +0,0 @@
|
||||
These are Docker images used for cross compilation in CI builds (or locally)
|
||||
via the [Cross](https://github.com/rust-embedded/cross) tool.
|
||||
|
||||
The Cross tool actually provides its own Docker images, and all Docker images
|
||||
in this directory are derived from one of them. We provide our own in order to
|
||||
customize the environment. For example, we need to install compression tools
|
||||
like `xz` so that tests for the `-z/--search-zip` flag are run.
|
||||
|
||||
If you make a change to a Docker image, then you can re-build it. `cd` into the
|
||||
directory containing the `Dockerfile` and run:
|
||||
|
||||
$ cd x86_64-unknown-linux-musl
|
||||
$ ./build
|
||||
|
||||
At this point, subsequent uses of `cross` will now use your built image since
|
||||
Docker prefers local images over remote images. In order to make these changes
|
||||
stick, they need to be pushed to Docker Hub:
|
||||
|
||||
$ docker push burntsushi/cross:x86_64-unknown-linux-musl
|
||||
|
||||
Of course, only I (BurntSushi) can push to that location. To make `cross` use
|
||||
a different location, then edit `Cross.toml` in the root of this repo to use
|
||||
a different image name for the desired target.
|
@@ -1,4 +0,0 @@
|
||||
FROM rustembedded/cross:aarch64-unknown-linux-gnu
|
||||
|
||||
COPY stage/ubuntu-install-packages /
|
||||
RUN /ubuntu-install-packages
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p stage
|
||||
cp ../../ubuntu-install-packages ./stage/
|
||||
docker build -t burntsushi/cross:aarch64-unknown-linux-gnu .
|
@@ -1,4 +0,0 @@
|
||||
FROM rustembedded/cross:i686-unknown-linux-gnu
|
||||
|
||||
COPY stage/ubuntu-install-packages /
|
||||
RUN /ubuntu-install-packages
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p stage
|
||||
cp ../../ubuntu-install-packages ./stage/
|
||||
docker build -t burntsushi/cross:i686-unknown-linux-gnu .
|
@@ -1,4 +0,0 @@
|
||||
FROM rustembedded/cross:powerpc64-unknown-linux-gnu
|
||||
|
||||
COPY stage/ubuntu-install-packages /
|
||||
RUN /ubuntu-install-packages
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p stage
|
||||
cp ../../ubuntu-install-packages ./stage/
|
||||
docker build -t burntsushi/cross:powerpc64-unknown-linux-gnu .
|
@@ -1,4 +0,0 @@
|
||||
FROM rustembedded/cross:s390x-unknown-linux-gnu
|
||||
|
||||
COPY stage/ubuntu-install-packages /
|
||||
RUN /ubuntu-install-packages
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p stage
|
||||
cp ../../ubuntu-install-packages ./stage/
|
||||
docker build -t burntsushi/cross:s390x-unknown-linux-gnu .
|
@@ -1,4 +0,0 @@
|
||||
FROM rustembedded/cross:x86_64-unknown-linux-musl
|
||||
|
||||
COPY stage/ubuntu-install-packages /
|
||||
RUN /ubuntu-install-packages
|
@@ -1,5 +0,0 @@
|
||||
#!/bin/sh
|
||||
|
||||
mkdir -p stage
|
||||
cp ../../ubuntu-install-packages ./stage/
|
||||
docker build -t burntsushi/cross:x86_64-unknown-linux-musl .
|
29
crates/core/flags/complete/encodings.sh
Normal file
29
crates/core/flags/complete/encodings.sh
Normal file
@@ -0,0 +1,29 @@
|
||||
# This is impossible to read, but these encodings rarely if ever change, so
|
||||
# it probably does not matter. They are derived from the list given here:
|
||||
# https://encoding.spec.whatwg.org/#concept-encoding-get
|
||||
#
|
||||
# The globbing here works in both fish and zsh (though they expand it in
|
||||
# different orders). It may work in other shells too.
|
||||
|
||||
{{,us-}ascii,arabic,chinese,cyrillic,greek{,8},hebrew,korean}
|
||||
logical visual mac {,cs}macintosh x-mac-{cyrillic,roman,ukrainian}
|
||||
866 ibm{819,866} csibm866
|
||||
big5{,-hkscs} {cn-,cs}big5 x-x-big5
|
||||
cp{819,866,125{0,1,2,3,4,5,6,7,8}} x-cp125{0,1,2,3,4,5,6,7,8}
|
||||
csiso2022{jp,kr} csiso8859{6,8}{e,i}
|
||||
csisolatin{1,2,3,4,5,6,9} csisolatin{arabic,cyrillic,greek,hebrew}
|
||||
ecma-{114,118} asmo-708 elot_928 sun_eu_greek
|
||||
euc-{jp,kr} x-euc-jp cseuckr cseucpkdfmtjapanese
|
||||
{,x-}gbk csiso58gb231280 gb18030 {,cs}gb2312 gb_2312{,-80} hz-gb-2312
|
||||
iso-2022-{cn,cn-ext,jp,kr}
|
||||
iso8859{,-}{1,2,3,4,5,6,7,8,9,10,11,13,14,15}
|
||||
iso-8859-{1,2,3,4,5,6,7,8,9,10,11,{6,8}-{e,i},13,14,15,16} iso_8859-{1,2,3,4,5,6,7,8,9,15}
|
||||
iso_8859-{1,2,6,7}:1987 iso_8859-{3,4,5,8}:1988 iso_8859-9:1989
|
||||
iso-ir-{58,100,101,109,110,126,127,138,144,148,149,157}
|
||||
koi{,8,8-r,8-ru,8-u,8_r} cskoi8r
|
||||
ks_c_5601-{1987,1989} ksc{,_}5691 csksc56011987
|
||||
latin{1,2,3,4,5,6} l{1,2,3,4,5,6,9}
|
||||
shift{-,_}jis csshiftjis {,x-}sjis ms_kanji ms932
|
||||
utf{,-}8 utf-16{,be,le} unicode-1-1-utf-8
|
||||
windows-{31j,874,949,125{0,1,2,3,4,5,6,7,8}} dos-874 tis-620 ansi_x3.4-1968
|
||||
x-user-defined auto none
|
@@ -2,17 +2,13 @@
|
||||
Provides completions for ripgrep's CLI for the fish shell.
|
||||
*/
|
||||
|
||||
use crate::flags::defs::FLAGS;
|
||||
use crate::flags::{defs::FLAGS, CompletionType};
|
||||
|
||||
const TEMPLATE: &'static str =
|
||||
"complete -c rg -n '__fish_use_subcommand' !SHORT! !LONG! !DOC!\n";
|
||||
const TEMPLATE_CHOICES: &'static str =
|
||||
"complete -c rg -n '__fish_use_subcommand' !SHORT! !LONG! !DOC! -r -f -a '!CHOICES!'\n";
|
||||
const TEMPLATE: &'static str = "complete -c rg !SHORT! -l !LONG! -d '!DOC!'";
|
||||
const TEMPLATE_NEGATED: &'static str =
|
||||
"complete -c rg -l !NEGATED! -n '__fish_contains_opt !SHORT! !LONG!' -d '!DOC!'\n";
|
||||
|
||||
/// Generate completions for Fish.
|
||||
///
|
||||
/// Note that these completions are based on what was produced for ripgrep <=13
|
||||
/// using Clap 2.x. Improvements on this are welcome.
|
||||
pub(crate) fn generate() -> String {
|
||||
let mut out = String::new();
|
||||
for flag in FLAGS.iter() {
|
||||
@@ -20,25 +16,50 @@ pub(crate) fn generate() -> String {
|
||||
None => "".to_string(),
|
||||
Some(byte) => format!("-s {}", char::from(byte)),
|
||||
};
|
||||
let long = format!("-l '{}'", flag.name_long().replace("'", "\\'"));
|
||||
let doc = format!("-d '{}'", flag.doc_short().replace("'", "\\'"));
|
||||
let template = if flag.doc_choices().is_empty() {
|
||||
TEMPLATE.to_string()
|
||||
} else {
|
||||
TEMPLATE_CHOICES
|
||||
.replace("!CHOICES!", &flag.doc_choices().join(" "))
|
||||
};
|
||||
out.push_str(
|
||||
&template
|
||||
.replace("!SHORT!", &short)
|
||||
.replace("!LONG!", &long)
|
||||
.replace("!DOC!", &doc),
|
||||
);
|
||||
let long = flag.name_long();
|
||||
let doc = flag.doc_short().replace("'", "\\'");
|
||||
let mut completion = TEMPLATE
|
||||
.replace("!SHORT!", &short)
|
||||
.replace("!LONG!", &long)
|
||||
.replace("!DOC!", &doc);
|
||||
|
||||
match flag.completion_type() {
|
||||
CompletionType::Filename => {
|
||||
completion.push_str(" -r -F");
|
||||
}
|
||||
CompletionType::Executable => {
|
||||
completion.push_str(" -r -f -a '(__fish_complete_command)'");
|
||||
}
|
||||
CompletionType::Filetype => {
|
||||
completion.push_str(
|
||||
" -r -f -a '(rg --type-list | string replace : \\t)'",
|
||||
);
|
||||
}
|
||||
CompletionType::Encoding => {
|
||||
completion.push_str(" -r -f -a '");
|
||||
completion.push_str(super::ENCODINGS);
|
||||
completion.push_str("'");
|
||||
}
|
||||
CompletionType::Other if !flag.doc_choices().is_empty() => {
|
||||
completion.push_str(" -r -f -a '");
|
||||
completion.push_str(&flag.doc_choices().join(" "));
|
||||
completion.push_str("'");
|
||||
}
|
||||
CompletionType::Other if !flag.is_switch() => {
|
||||
completion.push_str(" -r -f");
|
||||
}
|
||||
CompletionType::Other => (),
|
||||
}
|
||||
|
||||
completion.push('\n');
|
||||
out.push_str(&completion);
|
||||
|
||||
if let Some(negated) = flag.name_negated() {
|
||||
out.push_str(
|
||||
&template
|
||||
.replace("!SHORT!", "")
|
||||
.replace("!LONG!", &negated)
|
||||
&TEMPLATE_NEGATED
|
||||
.replace("!NEGATED!", &negated)
|
||||
.replace("!SHORT!", &short)
|
||||
.replace("!LONG!", &long)
|
||||
.replace("!DOC!", &doc),
|
||||
);
|
||||
}
|
||||
|
@@ -2,6 +2,8 @@
|
||||
Modules for generating completions for various shells.
|
||||
*/
|
||||
|
||||
static ENCODINGS: &'static str = include_str!("encodings.sh");
|
||||
|
||||
pub(super) mod bash;
|
||||
pub(super) mod fish;
|
||||
pub(super) mod powershell;
|
||||
|
@@ -413,32 +413,8 @@ _rg_encodings() {
|
||||
local -a expl
|
||||
local -aU _encodings
|
||||
|
||||
# This is impossible to read, but these encodings rarely if ever change, so it
|
||||
# probably doesn't matter. They are derived from the list given here:
|
||||
# https://encoding.spec.whatwg.org/#concept-encoding-get
|
||||
_encodings=(
|
||||
{{,us-}ascii,arabic,chinese,cyrillic,greek{,8},hebrew,korean}
|
||||
logical visual mac {,cs}macintosh x-mac-{cyrillic,roman,ukrainian}
|
||||
866 ibm{819,866} csibm866
|
||||
big5{,-hkscs} {cn-,cs}big5 x-x-big5
|
||||
cp{819,866,125{0..8}} x-cp125{0..8}
|
||||
csiso2022{jp,kr} csiso8859{6,8}{e,i}
|
||||
csisolatin{{1..6},9} csisolatin{arabic,cyrillic,greek,hebrew}
|
||||
ecma-{114,118} asmo-708 elot_928 sun_eu_greek
|
||||
euc-{jp,kr} x-euc-jp cseuckr cseucpkdfmtjapanese
|
||||
{,x-}gbk csiso58gb231280 gb18030 {,cs}gb2312 gb_2312{,-80} hz-gb-2312
|
||||
iso-2022-{cn,cn-ext,jp,kr}
|
||||
iso8859{,-}{{1..11},13,14,15}
|
||||
iso-8859-{{1..11},{6,8}-{e,i},13,14,15,16} iso_8859-{{1..9},15}
|
||||
iso_8859-{1,2,6,7}:1987 iso_8859-{3,4,5,8}:1988 iso_8859-9:1989
|
||||
iso-ir-{58,100,101,109,110,126,127,138,144,148,149,157}
|
||||
koi{,8,8-r,8-ru,8-u,8_r} cskoi8r
|
||||
ks_c_5601-{1987,1989} ksc{,_}5691 csksc56011987
|
||||
latin{1..6} l{{1..6},9}
|
||||
shift{-,_}jis csshiftjis {,x-}sjis ms_kanji ms932
|
||||
utf{,-}8 utf-16{,be,le} unicode-1-1-utf-8
|
||||
windows-{31j,874,949,125{0..8}} dos-874 tis-620 ansi_x3.4-1968
|
||||
x-user-defined auto none
|
||||
!ENCODINGS!
|
||||
)
|
||||
|
||||
_wanted encodings expl encoding compadd -a "$@" - _encodings
|
||||
|
@@ -19,5 +19,5 @@ long as it meets criteria 3 and 4 above.
|
||||
|
||||
/// Generate completions for zsh.
|
||||
pub(crate) fn generate() -> String {
|
||||
include_str!("rg.zsh").to_string()
|
||||
include_str!("rg.zsh").replace("!ENCODINGS!", super::ENCODINGS.trim_end())
|
||||
}
|
||||
|
@@ -34,6 +34,8 @@ use crate::flags::{
|
||||
#[cfg(test)]
|
||||
use crate::flags::parse::parse_low_raw;
|
||||
|
||||
use super::CompletionType;
|
||||
|
||||
/// A list of all flags in ripgrep via implementations of `Flag`.
|
||||
///
|
||||
/// The order of these flags matter. It determines the order of the flags in
|
||||
@@ -1582,6 +1584,9 @@ The encoding detection that ripgrep uses can be reverted to its automatic mode
|
||||
via the \flag-negate{encoding} flag.
|
||||
"
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Encoding
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
let value = match v {
|
||||
@@ -1977,6 +1982,9 @@ When \flag{file} or \flag{regexp} is used, then ripgrep treats all positional
|
||||
arguments as files or directories to search.
|
||||
"
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Filename
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
let path = PathBuf::from(v.unwrap_value());
|
||||
@@ -2808,6 +2816,9 @@ to calling \fBgethostname\fP. On Windows, this corresponds to calling
|
||||
ripgrep uses your system's hostname for producing hyperlinks.
|
||||
"#
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Executable
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
let path = PathBuf::from(v.unwrap_value());
|
||||
@@ -3078,7 +3089,7 @@ Individual patterns can still be matched case sensitively by using
|
||||
inline regex flags. For example, \fB(?\-i)abc\fP will match \fBabc\fP
|
||||
case sensitively even when this flag is used.
|
||||
.sp
|
||||
This flag overrides \flag{case-sensitive} and flag{smart-case}.
|
||||
This flag overrides \flag{case-sensitive} and \flag{smart-case}.
|
||||
"#
|
||||
}
|
||||
|
||||
@@ -3141,6 +3152,9 @@ If you are looking for a way to include or exclude files and directories
|
||||
directly on the command line, then use \flag{glob} instead.
|
||||
"
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Filename
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
let path = PathBuf::from(v.unwrap_value());
|
||||
@@ -5410,6 +5424,9 @@ format, then \fBpzstd\fP is used to decompress the contents to stdout.
|
||||
This overrides the \flag{search-zip} flag.
|
||||
"#
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Executable
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
let path = match v {
|
||||
@@ -6781,6 +6798,9 @@ any rules found in ignore files.
|
||||
To see the list of available file types, use the \flag{type-list} flag.
|
||||
"#
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Filetype
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
args.type_changes.push(TypeChange::Select {
|
||||
@@ -7000,6 +7020,9 @@ will only search files that are unrecognized by its type definitions.
|
||||
To see the list of available file types, use the \flag{type-list} flag.
|
||||
"#
|
||||
}
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Filetype
|
||||
}
|
||||
|
||||
fn update(&self, v: FlagValue, args: &mut LowArgs) -> anyhow::Result<()> {
|
||||
args.type_changes.push(TypeChange::Negate {
|
||||
|
@@ -771,7 +771,13 @@ impl HiArgs {
|
||||
let Some(ref sort) = self.sort else { return Box::new(haystacks) };
|
||||
let mut with_timestamps: Vec<_> = match sort.kind {
|
||||
SortModeKind::Path if !sort.reverse => return Box::new(haystacks),
|
||||
SortModeKind::Path => todo!(),
|
||||
SortModeKind::Path => {
|
||||
let mut haystacks = haystacks.collect::<Vec<Haystack>>();
|
||||
haystacks.sort_by(|ref h1, ref h2| {
|
||||
h1.path().cmp(h2.path()).reverse()
|
||||
});
|
||||
return Box::new(haystacks.into_iter());
|
||||
}
|
||||
SortModeKind::LastModified => {
|
||||
attach_timestamps(haystacks, |md| md.modified()).collect()
|
||||
}
|
||||
|
@@ -70,7 +70,7 @@ mod parse;
|
||||
/// value. Flags that accept multiple values are an unsupported abberation.
|
||||
trait Flag: Debug + Send + Sync + UnwindSafe + RefUnwindSafe + 'static {
|
||||
/// Returns true if this flag is a switch. When a flag is a switch, the
|
||||
/// CLI parser will look for a value after the flag is seen.
|
||||
/// CLI parser will not look for a value after the flag is seen.
|
||||
fn is_switch(&self) -> bool;
|
||||
|
||||
/// A short single byte name for this flag. This returns `None` by default,
|
||||
@@ -150,6 +150,10 @@ trait Flag: Debug + Send + Sync + UnwindSafe + RefUnwindSafe + 'static {
|
||||
&[]
|
||||
}
|
||||
|
||||
fn completion_type(&self) -> CompletionType {
|
||||
CompletionType::Other
|
||||
}
|
||||
|
||||
/// Given the parsed value (which might just be a switch), this should
|
||||
/// update the state in `args` based on the value given for this flag.
|
||||
///
|
||||
@@ -228,6 +232,21 @@ impl Category {
|
||||
}
|
||||
}
|
||||
|
||||
/// The kind of argument a flag accepts, to be used for shell completions.
|
||||
#[derive(Clone, Copy, Debug)]
|
||||
enum CompletionType {
|
||||
/// No special category. is_switch() and doc_choices() may apply.
|
||||
Other,
|
||||
/// A path to a file.
|
||||
Filename,
|
||||
/// A command in $PATH.
|
||||
Executable,
|
||||
/// The name of a file type, as used by e.g. --type.
|
||||
Filetype,
|
||||
/// The name of an encoding_rs encoding, as used by --encoding.
|
||||
Encoding,
|
||||
}
|
||||
|
||||
/// Represents a value parsed from the command line.
|
||||
///
|
||||
/// This doesn't include the corresponding flag, but values come in one of
|
||||
|
@@ -39,21 +39,29 @@ macro_rules! eprintln_locked {
|
||||
// lock stdout before printing to stderr. This avoids interleaving
|
||||
// lines within ripgrep because `search_parallel` uses `termcolor`,
|
||||
// which accesses the same stdout lock when writing lines.
|
||||
let stdout = std::io::stdout();
|
||||
let _handle = stdout.lock();
|
||||
let stdout = std::io::stdout().lock();
|
||||
let mut stderr = std::io::stderr().lock();
|
||||
// We specifically ignore any errors here. One plausible error we
|
||||
// can get in some cases is a broken pipe error. And when that
|
||||
// occurs, we should exit gracefully. Otherwise, just abort with
|
||||
// an error code because there isn't much else we can do.
|
||||
//
|
||||
// See: https://github.com/BurntSushi/ripgrep/issues/1966
|
||||
if let Err(err) = writeln!(std::io::stderr(), $($tt)*) {
|
||||
if let Err(err) = write!(stderr, "rg: ") {
|
||||
if err.kind() == std::io::ErrorKind::BrokenPipe {
|
||||
std::process::exit(0);
|
||||
} else {
|
||||
std::process::exit(2);
|
||||
}
|
||||
}
|
||||
if let Err(err) = writeln!(stderr, $($tt)*) {
|
||||
if err.kind() == std::io::ErrorKind::BrokenPipe {
|
||||
std::process::exit(0);
|
||||
} else {
|
||||
std::process::exit(2);
|
||||
}
|
||||
}
|
||||
drop(stdout);
|
||||
}
|
||||
}}
|
||||
}
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "grep"
|
||||
version = "0.2.12" #:version
|
||||
version = "0.3.1" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
Fast line oriented regex searching as a library.
|
||||
@@ -14,12 +14,12 @@ license = "Unlicense OR MIT"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
grep-cli = { version = "0.1.7", path = "../cli" }
|
||||
grep-matcher = { version = "0.1.6", path = "../matcher" }
|
||||
grep-pcre2 = { version = "0.1.6", path = "../pcre2", optional = true }
|
||||
grep-printer = { version = "0.1.7", path = "../printer" }
|
||||
grep-regex = { version = "0.1.11", path = "../regex" }
|
||||
grep-searcher = { version = "0.1.11", path = "../searcher" }
|
||||
grep-cli = { version = "0.1.10", path = "../cli" }
|
||||
grep-matcher = { version = "0.1.7", path = "../matcher" }
|
||||
grep-pcre2 = { version = "0.1.7", path = "../pcre2", optional = true }
|
||||
grep-printer = { version = "0.2.1", path = "../printer" }
|
||||
grep-regex = { version = "0.1.12", path = "../regex" }
|
||||
grep-searcher = { version = "0.1.13", path = "../searcher" }
|
||||
|
||||
[dev-dependencies]
|
||||
termcolor = "1.0.4"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "ignore"
|
||||
version = "0.4.21" #:version
|
||||
version = "0.4.22" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
A fast library for efficiently matching ignore files such as `.gitignore`
|
||||
|
@@ -118,6 +118,7 @@ pub(crate) const DEFAULT_TYPES: &[(&[&str], &[&str])] = &[
|
||||
(&["jupyter"], &["*.ipynb", "*.jpynb"]),
|
||||
(&["k"], &["*.k"]),
|
||||
(&["kotlin"], &["*.kt", "*.kts"]),
|
||||
(&["lean"], &["*.lean"]),
|
||||
(&["less"], &["*.less"]),
|
||||
(&["license"], &[
|
||||
// General
|
||||
@@ -172,7 +173,7 @@ pub(crate) const DEFAULT_TYPES: &[(&[&str], &[&str])] = &[
|
||||
"*.mdx",
|
||||
]),
|
||||
(&["matlab"], &["*.m"]),
|
||||
(&["meson"], &["meson.build", "meson_options.txt"]),
|
||||
(&["meson"], &["meson.build", "meson_options.txt", "meson.options"]),
|
||||
(&["minified"], &["*.min.html", "*.min.css", "*.min.js"]),
|
||||
(&["mint"], &["*.mint"]),
|
||||
(&["mk"], &["mkfile"]),
|
||||
|
@@ -19,7 +19,7 @@ use std::{
|
||||
fs::{File, FileType},
|
||||
io::{self, BufRead},
|
||||
path::{Path, PathBuf},
|
||||
sync::{Arc, RwLock},
|
||||
sync::{Arc, RwLock, Weak},
|
||||
};
|
||||
|
||||
use crate::{
|
||||
@@ -34,11 +34,13 @@ use crate::{
|
||||
/// IgnoreMatch represents information about where a match came from when using
|
||||
/// the `Ignore` matcher.
|
||||
#[derive(Clone, Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub(crate) struct IgnoreMatch<'a>(IgnoreMatchInner<'a>);
|
||||
|
||||
/// IgnoreMatchInner describes precisely where the match information came from.
|
||||
/// This is private to allow expansion to more matchers in the future.
|
||||
#[derive(Clone, Debug)]
|
||||
#[allow(dead_code)]
|
||||
enum IgnoreMatchInner<'a> {
|
||||
Override(overrides::Glob<'a>),
|
||||
Gitignore(&'a gitignore::Glob),
|
||||
@@ -99,7 +101,7 @@ struct IgnoreInner {
|
||||
/// Note that this is never used during matching, only when adding new
|
||||
/// parent directory matchers. This avoids needing to rebuild glob sets for
|
||||
/// parent directories if many paths are being searched.
|
||||
compiled: Arc<RwLock<HashMap<OsString, Ignore>>>,
|
||||
compiled: Arc<RwLock<HashMap<OsString, Weak<IgnoreInner>>>>,
|
||||
/// The path to the directory that this matcher was built from.
|
||||
dir: PathBuf,
|
||||
/// An override matcher (default is empty).
|
||||
@@ -198,9 +200,11 @@ impl Ignore {
|
||||
let mut ig = self.clone();
|
||||
for parent in parents.into_iter().rev() {
|
||||
let mut compiled = self.0.compiled.write().unwrap();
|
||||
if let Some(prebuilt) = compiled.get(parent.as_os_str()) {
|
||||
ig = prebuilt.clone();
|
||||
continue;
|
||||
if let Some(weak) = compiled.get(parent.as_os_str()) {
|
||||
if let Some(prebuilt) = weak.upgrade() {
|
||||
ig = Ignore(prebuilt);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
let (mut igtmp, err) = ig.add_child_path(parent);
|
||||
errs.maybe_push(err);
|
||||
@@ -212,8 +216,12 @@ impl Ignore {
|
||||
} else {
|
||||
false
|
||||
};
|
||||
ig = Ignore(Arc::new(igtmp));
|
||||
compiled.insert(parent.as_os_str().to_os_string(), ig.clone());
|
||||
let ig_arc = Arc::new(igtmp);
|
||||
ig = Ignore(ig_arc.clone());
|
||||
compiled.insert(
|
||||
parent.as_os_str().to_os_string(),
|
||||
Arc::downgrade(&ig_arc),
|
||||
);
|
||||
}
|
||||
(ig, errs.into_error_option())
|
||||
}
|
||||
|
@@ -23,9 +23,11 @@ use crate::{
|
||||
/// The lifetime `'a` refers to the lifetime of the matcher that produced
|
||||
/// this glob.
|
||||
#[derive(Clone, Debug)]
|
||||
#[allow(dead_code)]
|
||||
pub struct Glob<'a>(GlobInner<'a>);
|
||||
|
||||
#[derive(Clone, Debug)]
|
||||
#[allow(dead_code)]
|
||||
enum GlobInner<'a> {
|
||||
/// No glob matched, but the file path should still be ignored.
|
||||
UnmatchedIgnore,
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "grep-matcher"
|
||||
version = "0.1.6" #:version
|
||||
version = "0.1.7" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
A trait for regular expressions, with a focus on line oriented search.
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "grep-pcre2"
|
||||
version = "0.1.6" #:version
|
||||
version = "0.1.7" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
Use PCRE2 with the 'grep' crate.
|
||||
@@ -14,6 +14,6 @@ license = "Unlicense OR MIT"
|
||||
edition = "2018"
|
||||
|
||||
[dependencies]
|
||||
grep-matcher = { version = "0.1.6", path = "../matcher" }
|
||||
grep-matcher = { version = "0.1.7", path = "../matcher" }
|
||||
log = "0.4.20"
|
||||
pcre2 = "0.2.6"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "grep-printer"
|
||||
version = "0.1.7" #:version
|
||||
version = "0.2.1" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
An implementation of the grep crate's Sink trait that provides standard
|
||||
@@ -20,15 +20,15 @@ serde = ["dep:serde", "dep:serde_json"]
|
||||
|
||||
[dependencies]
|
||||
bstr = "1.6.2"
|
||||
grep-matcher = { version = "0.1.6", path = "../matcher" }
|
||||
grep-searcher = { version = "0.1.11", path = "../searcher" }
|
||||
grep-matcher = { version = "0.1.7", path = "../matcher" }
|
||||
grep-searcher = { version = "0.1.13", path = "../searcher" }
|
||||
log = "0.4.5"
|
||||
termcolor = "1.3.0"
|
||||
serde = { version = "1.0.193", optional = true }
|
||||
serde_json = { version = "1.0.107", optional = true }
|
||||
|
||||
[dev-dependencies]
|
||||
grep-regex = { version = "0.1.11", path = "../regex" }
|
||||
grep-regex = { version = "0.1.12", path = "../regex" }
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
# We want to document all features.
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "grep-regex"
|
||||
version = "0.1.11" #:version
|
||||
version = "0.1.12" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
Use Rust's regex library with the 'grep' crate.
|
||||
@@ -15,7 +15,7 @@ edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
bstr = "1.6.2"
|
||||
grep-matcher = { version = "0.1.6", path = "../matcher" }
|
||||
grep-matcher = { version = "0.1.7", path = "../matcher" }
|
||||
log = "0.4.20"
|
||||
regex-automata = { version = "0.4.0" }
|
||||
regex-syntax = "0.8.0"
|
||||
|
@@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "grep-searcher"
|
||||
version = "0.1.11" #:version
|
||||
version = "0.1.13" #:version
|
||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||
description = """
|
||||
Fast line oriented regex searching as a library.
|
||||
@@ -17,13 +17,13 @@ edition = "2021"
|
||||
bstr = { version = "1.6.2", default-features = false, features = ["std"] }
|
||||
encoding_rs = "0.8.33"
|
||||
encoding_rs_io = "0.1.7"
|
||||
grep-matcher = { version = "0.1.6", path = "../matcher" }
|
||||
grep-matcher = { version = "0.1.7", path = "../matcher" }
|
||||
log = "0.4.20"
|
||||
memchr = "2.6.3"
|
||||
memmap = { package = "memmap2", version = "0.9.0" }
|
||||
|
||||
[dev-dependencies]
|
||||
grep-regex = { version = "0.1.11", path = "../regex" }
|
||||
grep-regex = { version = "0.1.12", path = "../regex" }
|
||||
regex = "1.9.5"
|
||||
|
||||
[features]
|
||||
|
@@ -612,6 +612,17 @@ impl<'s, M: Matcher, S: Sink> Core<'s, M, S> {
|
||||
return false;
|
||||
}
|
||||
if let Some(line_term) = self.matcher.line_terminator() {
|
||||
// FIXME: This works around a bug in grep-regex where it does
|
||||
// not set the line terminator of the regex itself, and thus
|
||||
// line anchors like `(?m:^)` and `(?m:$)` will not match
|
||||
// anything except for `\n`. So for now, we just disable the fast
|
||||
// line-by-line searcher which requires the regex to be able to
|
||||
// deal with line terminators correctly. The slow line-by-line
|
||||
// searcher strips line terminators and thus absolves the regex
|
||||
// engine from needing to care about whether they are `\n` or NUL.
|
||||
if line_term.as_byte() == b'\x00' {
|
||||
return false;
|
||||
}
|
||||
if line_term == self.config.line_term {
|
||||
return true;
|
||||
}
|
||||
|
@@ -1,14 +1,14 @@
|
||||
class RipgrepBin < Formula
|
||||
version '13.0.0'
|
||||
version '14.0.2'
|
||||
desc "Recursively search directories for a regex pattern."
|
||||
homepage "https://github.com/BurntSushi/ripgrep"
|
||||
|
||||
if OS.mac?
|
||||
url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-apple-darwin.tar.gz"
|
||||
sha256 "585c18350cb8d4392461edd6c921e6edd5a97cbfc03b567d7bd440423e118082"
|
||||
sha256 "dd06bebd3a9d75981f8e3271b6c69286990f3fc1a374f0e5b0fc2866ec69bc4c"
|
||||
elsif OS.linux?
|
||||
url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-unknown-linux-musl.tar.gz"
|
||||
sha256 "ee4e0751ab108b6da4f47c52da187d5177dc371f0f512a7caaec5434e711c091"
|
||||
sha256 "62cd0efc4d6f1817b9c852859987b4720cd52e0de008418266e8503028dc0c7a"
|
||||
end
|
||||
|
||||
conflicts_with "ripgrep"
|
||||
|
@@ -356,6 +356,17 @@ rgtest!(f263_sort_files, |dir: Dir, mut cmd: TestCommand| {
|
||||
eqnice!(expected, cmd.arg("--sort-files").arg("test").stdout());
|
||||
});
|
||||
|
||||
// See: https://github.com/BurntSushi/ripgrep/issues/263
|
||||
rgtest!(f263_sort_files_reverse, |dir: Dir, mut cmd: TestCommand| {
|
||||
dir.create("foo", "test");
|
||||
dir.create("abc", "test");
|
||||
dir.create("zoo", "test");
|
||||
dir.create("bar", "test");
|
||||
|
||||
let expected = "zoo:test\nfoo:test\nbar:test\nabc:test\n";
|
||||
eqnice!(expected, cmd.arg("--sortr=path").arg("test").stdout());
|
||||
});
|
||||
|
||||
// See: https://github.com/BurntSushi/ripgrep/issues/275
|
||||
rgtest!(f275_pathsep, |dir: Dir, mut cmd: TestCommand| {
|
||||
dir.create_dir("foo");
|
||||
@@ -961,10 +972,10 @@ rgtest!(f1404_nothing_searched_warning, |dir: Dir, mut cmd: TestCommand| {
|
||||
cmd.assert_err();
|
||||
|
||||
// Test that we actually get an error message that we expect.
|
||||
let output = cmd.cmd().output().unwrap();
|
||||
let output = cmd.raw_output();
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
let expected = "\
|
||||
No files were searched, which means ripgrep probably applied \
|
||||
rg: No files were searched, which means ripgrep probably applied \
|
||||
a filter you didn't expect.\n\
|
||||
Running with --debug will show why files are being skipped.\n\
|
||||
";
|
||||
@@ -984,7 +995,7 @@ rgtest!(f1404_nothing_searched_ignored, |dir: Dir, mut cmd: TestCommand| {
|
||||
|
||||
// But since --no-messages is given, there should not be any error message
|
||||
// printed.
|
||||
let output = cmd.cmd().output().unwrap();
|
||||
let output = cmd.raw_output();
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
let expected = "";
|
||||
eqnice!(expected, stderr);
|
||||
|
@@ -411,7 +411,7 @@ rgtest!(include_zero, |dir: Dir, mut cmd: TestCommand| {
|
||||
cmd.args(&["--count", "--include-zero", "nada"]);
|
||||
cmd.assert_err();
|
||||
|
||||
let output = cmd.cmd().output().unwrap();
|
||||
let output = cmd.raw_output();
|
||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||
let expected = "sherlock:0\n";
|
||||
|
||||
@@ -423,7 +423,7 @@ rgtest!(include_zero_override, |dir: Dir, mut cmd: TestCommand| {
|
||||
cmd.args(&["--count", "--include-zero", "--no-include-zero", "nada"]);
|
||||
cmd.assert_err();
|
||||
|
||||
let output = cmd.cmd().output().unwrap();
|
||||
let output = cmd.raw_output();
|
||||
let stdout = String::from_utf8_lossy(&output.stdout);
|
||||
assert!(stdout.is_empty());
|
||||
});
|
||||
|
@@ -399,10 +399,10 @@ rgtest!(r428_unrecognized_style, |dir: Dir, mut cmd: TestCommand| {
|
||||
cmd.arg("--colors=match:style:").arg("Sherlock");
|
||||
cmd.assert_err();
|
||||
|
||||
let output = cmd.cmd().output().unwrap();
|
||||
let output = cmd.raw_output();
|
||||
let stderr = String::from_utf8_lossy(&output.stderr);
|
||||
let expected = "\
|
||||
error parsing flag --colors: \
|
||||
rg: error parsing flag --colors: \
|
||||
unrecognized style attribute ''. Choose from: nobold, bold, nointense, \
|
||||
intense, nounderline, underline.
|
||||
";
|
||||
@@ -1210,3 +1210,10 @@ rgtest!(r2574, |dir: Dir, mut cmd: TestCommand| {
|
||||
.stdout();
|
||||
eqnice!("some.domain.com\nsome.domain.com\n", got);
|
||||
});
|
||||
|
||||
// See: https://github.com/BurntSushi/ripgrep/issues/2658
|
||||
rgtest!(r2658_null_data_line_regexp, |dir: Dir, mut cmd: TestCommand| {
|
||||
dir.create("haystack", "foo\0bar\0quux\0");
|
||||
let got = cmd.args(&["--null-data", "--line-regexp", r"bar"]).stdout();
|
||||
eqnice!("haystack:bar\0", got);
|
||||
});
|
||||
|
@@ -9,6 +9,8 @@ use std::sync::atomic::{AtomicUsize, Ordering};
|
||||
use std::thread;
|
||||
use std::time::Duration;
|
||||
|
||||
use bstr::ByteSlice;
|
||||
|
||||
static TEST_DIR: &'static str = "ripgrep-tests";
|
||||
static NEXT_ID: AtomicUsize = AtomicUsize::new(0);
|
||||
|
||||
@@ -325,13 +327,21 @@ impl TestCommand {
|
||||
|
||||
/// Gets the output of a command. If the command failed, then this panics.
|
||||
pub fn output(&mut self) -> process::Output {
|
||||
let output = self.cmd.output().unwrap();
|
||||
let output = self.raw_output();
|
||||
self.expect_success(output)
|
||||
}
|
||||
|
||||
/// Gets the raw output of a command after filtering nonsense like jemalloc
|
||||
/// error messages from stderr.
|
||||
pub fn raw_output(&mut self) -> process::Output {
|
||||
let mut output = self.cmd.output().unwrap();
|
||||
output.stderr = strip_jemalloc_nonsense(&output.stderr);
|
||||
output
|
||||
}
|
||||
|
||||
/// Runs the command and asserts that it resulted in an error exit code.
|
||||
pub fn assert_err(&mut self) {
|
||||
let o = self.cmd.output().unwrap();
|
||||
let o = self.raw_output();
|
||||
if o.status.success() {
|
||||
panic!(
|
||||
"\n\n===== {:?} =====\n\
|
||||
@@ -479,7 +489,7 @@ fn dir_list<P: AsRef<Path>>(dir: P) -> Vec<String> {
|
||||
/// So... we just manually handle these cases. So fucking fun.
|
||||
fn cross_runner() -> Option<String> {
|
||||
let runner = std::env::var("CROSS_RUNNER").ok()?;
|
||||
if runner.is_empty() {
|
||||
if runner.is_empty() || runner == "empty" {
|
||||
return None;
|
||||
}
|
||||
if cfg!(target_arch = "powerpc64") {
|
||||
@@ -500,3 +510,17 @@ fn cross_runner() -> Option<String> {
|
||||
pub fn is_cross() -> bool {
|
||||
std::env::var("CROSS_RUNNER").ok().map_or(false, |v| !v.is_empty())
|
||||
}
|
||||
|
||||
/// Strips absolutely fucked `<jemalloc>:` lines from the output.
|
||||
///
|
||||
/// In theory this only happens under qemu, which is where our tests run under
|
||||
/// `cross`. But is messes with our tests, because... they don't expect the
|
||||
/// allocator to fucking write to stderr. I mean, what the fuck? Who prints a
|
||||
/// warning message with absolutely no instruction for what to do with it or
|
||||
/// how to disable it. Absolutely fucking bonkers.
|
||||
fn strip_jemalloc_nonsense(data: &[u8]) -> Vec<u8> {
|
||||
let lines = data
|
||||
.lines_with_terminator()
|
||||
.filter(|line| !line.starts_with_str("<jemalloc>:"));
|
||||
bstr::concat(lines)
|
||||
}
|
||||
|
Reference in New Issue
Block a user