Compare commits
457 Commits
0.2.6
...
wincolor-0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
07c837e740 | ||
|
|
cb0e693e31 | ||
|
|
e9d448e93b | ||
|
|
c7fc916e6b | ||
|
|
e36b65a11a | ||
|
|
11ad7ab204 | ||
|
|
93943793c3 | ||
|
|
0fedaa7d28 | ||
|
|
e05023b406 | ||
|
|
f007f940c5 | ||
|
|
a8543f798d | ||
|
|
ef9e17d28a | ||
|
|
3cb4d1337e | ||
|
|
8514d4fbb4 | ||
|
|
ed9150c9b4 | ||
|
|
51864c13fc | ||
|
|
35f802166d | ||
|
|
bba2d56292 | ||
|
|
012880914b | ||
|
|
832f5baf1a | ||
|
|
a6d3a959eb | ||
|
|
f00625c3f4 | ||
|
|
82d03b99cd | ||
|
|
ab2e8190e7 | ||
|
|
58bdc366ec | ||
|
|
34c0b1bc70 | ||
|
|
74e96b498c | ||
|
|
7e0fa1c6be | ||
|
|
50616935a9 | ||
|
|
01b7859399 | ||
|
|
5aed0522e8 | ||
|
|
d1fa295bb2 | ||
|
|
85d463c0cc | ||
|
|
75a4b7b361 | ||
|
|
c687d3a7c0 | ||
|
|
fbc1e7fa18 | ||
|
|
14779ed0ea | ||
|
|
b6177f0459 | ||
|
|
ba1023e1e4 | ||
|
|
5e73075ef5 | ||
|
|
1b42c02489 | ||
|
|
0d03145293 | ||
|
|
f8162d2707 | ||
|
|
e044cfb33f | ||
|
|
7dd1194a97 | ||
|
|
a5855a5d73 | ||
|
|
03b0d832ed | ||
|
|
636bbc7c8f | ||
|
|
162e085b98 | ||
|
|
86c890bcec | ||
|
|
d775259ed9 | ||
|
|
d73a75d6cd | ||
|
|
7ae1f373c2 | ||
|
|
4d34132365 | ||
|
|
5173bfb11b | ||
|
|
8141da9d39 | ||
|
|
373e0595e6 | ||
|
|
1374f15bdf | ||
|
|
263e8f92b9 | ||
|
|
231698f802 | ||
|
|
3e8b44619d | ||
|
|
679198e71a | ||
|
|
2c84825ccb | ||
|
|
948821753c | ||
|
|
d2a3b61220 | ||
|
|
acb57eb4ad | ||
|
|
256aeb5546 | ||
|
|
a9377da624 | ||
|
|
c794ef2f04 | ||
|
|
8b9eba2147 | ||
|
|
c4732ca012 | ||
|
|
1aec4b1123 | ||
|
|
c4e1945384 | ||
|
|
04d17040e7 | ||
|
|
8c8c83a1f8 | ||
|
|
5714dbde09 | ||
|
|
311ccb1f6b | ||
|
|
efa4de8126 | ||
|
|
ad5fa56490 | ||
|
|
1bf9d29259 | ||
|
|
2a14bf2249 | ||
|
|
f0028a66ec | ||
|
|
08060a2105 | ||
|
|
cd575d99f8 | ||
|
|
1267f01c24 | ||
|
|
322d5515e5 | ||
|
|
f4770c2094 | ||
|
|
f887bc1f86 | ||
|
|
363a4fa9b7 | ||
|
|
712311fdc6 | ||
|
|
0d2354aca6 | ||
|
|
8dc513b5d2 | ||
|
|
a98156e71c | ||
|
|
cf94072429 | ||
|
|
db14046de4 | ||
|
|
36091591f0 | ||
|
|
12ffcb4296 | ||
|
|
e7c06b92fb | ||
|
|
353806b87a | ||
|
|
aebb132a86 | ||
|
|
ab4b6ab9c3 | ||
|
|
413178bc2c | ||
|
|
58fb4f987e | ||
|
|
4f1d6af296 | ||
|
|
6b79349f83 | ||
|
|
f858828f61 | ||
|
|
67b835fe2a | ||
|
|
214f2bef66 | ||
|
|
1136f8adab | ||
|
|
beb010d004 | ||
|
|
f9cbf7d3d4 | ||
|
|
7eb1dd129e | ||
|
|
a5f82e8826 | ||
|
|
ca6bd648ab | ||
|
|
af77dd55a2 | ||
|
|
3065a8c9c8 | ||
|
|
208c11af56 | ||
|
|
12a78a992c | ||
|
|
d97c80be63 | ||
|
|
5213bd30ea | ||
|
|
82d101907a | ||
|
|
30608f2444 | ||
|
|
3d323928a0 | ||
|
|
8b6a3bc858 | ||
|
|
e10544f819 | ||
|
|
dc7e39a6ba | ||
|
|
36c16eb00c | ||
|
|
fffee61f80 | ||
|
|
4cfb2b515b | ||
|
|
398326bfe2 | ||
|
|
01358a155c | ||
|
|
30ca3ecca6 | ||
|
|
dbc91644fd | ||
|
|
73c9ac4da5 | ||
|
|
fe7fe74b0a | ||
|
|
3d9acdab18 | ||
|
|
40bacbcd7c | ||
|
|
b3a9c34515 | ||
|
|
972ec1adc6 | ||
|
|
a2d4c03c71 | ||
|
|
b7c3cf314d | ||
|
|
6dce04963d | ||
|
|
d4b790fd8d | ||
|
|
9283dd122e | ||
|
|
4c41e9225b | ||
|
|
9f2b054550 | ||
|
|
5613df3034 | ||
|
|
79ad81626f | ||
|
|
354a5cad97 | ||
|
|
92e5fad27d | ||
|
|
f86f987d71 | ||
|
|
bfbd53eb92 | ||
|
|
0668c74ed4 | ||
|
|
1c03298903 | ||
|
|
e0e8f26c56 | ||
|
|
f5337329f4 | ||
|
|
84f4b4ef68 | ||
|
|
aeac85389d | ||
|
|
9b3921098a | ||
|
|
ad262f1146 | ||
|
|
170c078440 | ||
|
|
db044a058a | ||
|
|
c1f8040b32 | ||
|
|
c8a5a7a3f4 | ||
|
|
dd3df0ded7 | ||
|
|
62a182af78 | ||
|
|
4047d9db71 | ||
|
|
4683a325fa | ||
|
|
b6f1e5db1a | ||
|
|
9e51b18ac7 | ||
|
|
9d7b6eb09a | ||
|
|
7763c98188 | ||
|
|
06393f888c | ||
|
|
e0989ef13b | ||
|
|
45e850aff7 | ||
|
|
f2d1c582a8 | ||
|
|
ab70815ea2 | ||
|
|
27f97db510 | ||
|
|
506ad1f3cf | ||
|
|
13235b596f | ||
|
|
2628c8f38e | ||
|
|
112b3c5e0a | ||
|
|
4c78ca8b70 | ||
|
|
ff898cd105 | ||
|
|
2c98e5ce1e | ||
|
|
1e3fc79949 | ||
|
|
d1bbc6956b | ||
|
|
cd6c54f5f4 | ||
|
|
44c03f58bc | ||
|
|
d1a6ab922e | ||
|
|
b860fa3acd | ||
|
|
229b8e3b33 | ||
|
|
a515c4d601 | ||
|
|
5a666b042d | ||
|
|
16109166fe | ||
|
|
0b685c8429 | ||
|
|
d2c7a76a3c | ||
|
|
20f7d9b3a2 | ||
|
|
362abed44a | ||
|
|
c50b8b4125 | ||
|
|
7ad23e5565 | ||
|
|
66efbad871 | ||
|
|
1f2a9b0306 | ||
|
|
a45fe94240 | ||
|
|
ac1c95a6d9 | ||
|
|
685b431d80 | ||
|
|
487713aa34 | ||
|
|
e300541701 | ||
|
|
e9df420d2f | ||
|
|
201b4fc757 | ||
|
|
90a11dec5e | ||
|
|
9456d95e8f | ||
|
|
0c298f60a6 | ||
|
|
79271fcb33 | ||
|
|
fc975af8e9 | ||
|
|
1425d6735e | ||
|
|
aed3ccb9c7 | ||
|
|
33c95d2919 | ||
|
|
01deac9427 | ||
|
|
b4bc3b6349 | ||
|
|
685cc6c562 | ||
|
|
08c017330f | ||
|
|
2f3a8c7f69 | ||
|
|
3ac1b68e54 | ||
|
|
0ebd5465b7 | ||
|
|
5cb4bb9ea0 | ||
|
|
c8a179b4da | ||
|
|
46f94826fd | ||
|
|
75f1855a91 | ||
|
|
fd9870d668 | ||
|
|
a3a2708067 | ||
|
|
78847b65c8 | ||
|
|
e962eea1cc | ||
|
|
95bc678403 | ||
|
|
68af3bbdc4 | ||
|
|
70b6bdb104 | ||
|
|
c648eadbaa | ||
|
|
d352b79294 | ||
|
|
23aec58669 | ||
|
|
ae863bc7aa | ||
|
|
f0d3cae569 | ||
|
|
4ef4818130 | ||
|
|
8db24e1353 | ||
|
|
8bbe58d623 | ||
|
|
b3fd0df94b | ||
|
|
c1b841e934 | ||
|
|
f5ede0e319 | ||
|
|
6ecffec537 | ||
|
|
80e91a1f1d | ||
|
|
d570f78144 | ||
|
|
7c37065911 | ||
|
|
50f7a60a8d | ||
|
|
33ec988d70 | ||
|
|
adff43fbb4 | ||
|
|
71585f6d47 | ||
|
|
714ae82241 | ||
|
|
49fd668712 | ||
|
|
066f97d855 | ||
|
|
df1bf4a042 | ||
|
|
4e8c0fc4ad | ||
|
|
da1764dfd1 | ||
|
|
48a8a3a691 | ||
|
|
796eaab0d7 | ||
|
|
bf49448e1e | ||
|
|
cffba53379 | ||
|
|
79d40d0e20 | ||
|
|
525b278049 | ||
|
|
16de47920c | ||
|
|
a114b86063 | ||
|
|
a5a16ebb27 | ||
|
|
8ac5bc0147 | ||
|
|
cf750a190f | ||
|
|
d825648b86 | ||
|
|
22cb644eb6 | ||
|
|
e424f87487 | ||
|
|
f5b2c96b77 | ||
|
|
6e209b6fdb | ||
|
|
72e3c54e0a | ||
|
|
b67886264f | ||
|
|
e67ab459d3 | ||
|
|
7a926d090d | ||
|
|
596f94aa7f | ||
|
|
de55d37bea | ||
|
|
fecef10c1c | ||
|
|
79e5e6671f | ||
|
|
b04a68a782 | ||
|
|
e573ab5c60 | ||
|
|
f5a2d022ec | ||
|
|
b1d1cd2366 | ||
|
|
f26e0f088f | ||
|
|
057ed6305a | ||
|
|
730beb9cb5 | ||
|
|
ed60ec736c | ||
|
|
a7ca2d6563 | ||
|
|
a7d0e40668 | ||
|
|
7a951f103a | ||
|
|
c3de1f58ea | ||
|
|
e940bc956d | ||
|
|
8751e55706 | ||
|
|
2143bcf9cb | ||
|
|
a6a24bafb3 | ||
|
|
db27a33827 | ||
|
|
083fb73790 | ||
|
|
461e0c4e33 | ||
|
|
82df3b7685 | ||
|
|
ece6011164 | ||
|
|
00033e1875 | ||
|
|
5aea517fb4 | ||
|
|
073ff35ebb | ||
|
|
c4633ff187 | ||
|
|
97e6873b38 | ||
|
|
ed01e80a79 | ||
|
|
8f7b9be356 | ||
|
|
851799f42b | ||
|
|
b65a8c353b | ||
|
|
95cea77625 | ||
|
|
b187c1a817 | ||
|
|
f7a2fe30d4 | ||
|
|
aed315e80a | ||
|
|
2f0d9d411a | ||
|
|
163e00677a | ||
|
|
d58236fbdc | ||
|
|
932875684e | ||
|
|
b65bb37b14 | ||
|
|
de5cb7d22e | ||
|
|
7a682f465e | ||
|
|
084d3f4911 | ||
|
|
9911cd0cd9 | ||
|
|
de91c26bb1 | ||
|
|
5b1796d64d | ||
|
|
d4527854de | ||
|
|
82ceb818f3 | ||
|
|
dd5ded2f78 | ||
|
|
cbacf4f19e | ||
|
|
900ef0abc7 | ||
|
|
8396d3ffaa | ||
|
|
652c70f207 | ||
|
|
bb70f96743 | ||
|
|
6d346a09de | ||
|
|
699c76f45c | ||
|
|
de33003527 | ||
|
|
3e943636f4 | ||
|
|
3f515afbb4 | ||
|
|
30db03bb62 | ||
|
|
d66812102b | ||
|
|
86f8c3c818 | ||
|
|
5eb2ca4338 | ||
|
|
20bcb8d883 | ||
|
|
7282706b42 | ||
|
|
160f04894f | ||
|
|
0473df1ef5 | ||
|
|
301a3fd71d | ||
|
|
d12bdf35a5 | ||
|
|
08514e8e6c | ||
|
|
687e846944 | ||
|
|
b286fdcb88 | ||
|
|
e3959d67a6 | ||
|
|
7d475b0c70 | ||
|
|
42223047a8 | ||
|
|
42afb6faa5 | ||
|
|
c4a6733f3b | ||
|
|
9e04a8283c | ||
|
|
05b26d5986 | ||
|
|
506f046b8b | ||
|
|
ae592b11e3 | ||
|
|
a5e7f176f1 | ||
|
|
0428bd1bec | ||
|
|
7f3e7d2faa | ||
|
|
8d5906d7fc | ||
|
|
feda38852e | ||
|
|
59187902d0 | ||
|
|
aef46beaf2 | ||
|
|
f0e192943f | ||
|
|
df72d8d1e0 | ||
|
|
d06f84ced3 | ||
|
|
9598331fa8 | ||
|
|
883d8fc72f | ||
|
|
e8a30cb893 | ||
|
|
03f7605322 | ||
|
|
61663e2307 | ||
|
|
bd3e7eedb1 | ||
|
|
1e6c2ac8e3 | ||
|
|
0302d58eb8 | ||
|
|
e37f783fc0 | ||
|
|
495e13cc61 | ||
|
|
92dc402f7f | ||
|
|
a3f5e0c3d5 | ||
|
|
39e1a0d694 | ||
|
|
e9cd0a1cc3 | ||
|
|
cc35ae0748 | ||
|
|
5ee175beaf | ||
|
|
4b18f82899 | ||
|
|
5462af4434 | ||
|
|
d2e70da040 | ||
|
|
64dc9b6709 | ||
|
|
9ffd4c421f | ||
|
|
d862b80afb | ||
|
|
5b73dcc8ab | ||
|
|
2dce0dc0df | ||
|
|
2e5c3c05e8 | ||
|
|
6884eea2f5 | ||
|
|
a3a2f0be6a | ||
|
|
f24873c70b | ||
|
|
58126ffe15 | ||
|
|
17644a76c0 | ||
|
|
9fc9f368f5 | ||
|
|
9cab076a72 | ||
|
|
7aa9652f3c | ||
|
|
7187f61ca8 | ||
|
|
f869c58a5a | ||
|
|
3538ba3577 | ||
|
|
a454fa75b9 | ||
|
|
18943b9317 | ||
|
|
68427b5b79 | ||
|
|
4ca15a8a51 | ||
|
|
2daef51fe5 | ||
|
|
43ed91dc5c | ||
|
|
dada75d2a7 | ||
|
|
76b9f01ad2 | ||
|
|
8baa0e56b7 | ||
|
|
301ee6d3f5 | ||
|
|
77ad7588ae | ||
|
|
58aca2efb2 | ||
|
|
351eddc17e | ||
|
|
277dda544c | ||
|
|
8c869cbd87 | ||
|
|
598b162fea | ||
|
|
0222e024fe | ||
|
|
5bd0edbbe1 | ||
|
|
4368913d8f | ||
|
|
02de97b8ce | ||
|
|
32db773d51 | ||
|
|
b272be25fa | ||
|
|
f63c168563 | ||
|
|
a05671c8d7 | ||
|
|
1aeae3e22d | ||
|
|
60d537c43d | ||
|
|
ef5c07476b | ||
|
|
4f6f34307c | ||
|
|
7cf560d27c | ||
|
|
15b263ff55 | ||
|
|
53121e0733 | ||
|
|
404785f950 | ||
|
|
103c4c953c | ||
|
|
82abf883c5 | ||
|
|
a2315d5ee5 | ||
|
|
201d0cb8c1 | ||
|
|
6f45478a7d | ||
|
|
9c2c569624 | ||
|
|
a1e4e0f85c | ||
|
|
caf31a769b | ||
|
|
920112e640 | ||
|
|
a84ffe603b | ||
|
|
e4f83f3161 | ||
|
|
fbca4a0332 | ||
|
|
65c7df1c25 | ||
|
|
18237da9b2 |
10
.gitignore
vendored
10
.gitignore
vendored
@@ -4,3 +4,13 @@ target
|
|||||||
/grep/Cargo.lock
|
/grep/Cargo.lock
|
||||||
/globset/Cargo.lock
|
/globset/Cargo.lock
|
||||||
/ignore/Cargo.lock
|
/ignore/Cargo.lock
|
||||||
|
/termcolor/Cargo.lock
|
||||||
|
/wincolor/Cargo.lock
|
||||||
|
|
||||||
|
# Snapcraft files
|
||||||
|
stage
|
||||||
|
prime
|
||||||
|
parts
|
||||||
|
*.snap
|
||||||
|
*.pyc
|
||||||
|
ripgrep*_source.tar.bz2
|
||||||
45
.travis.yml
45
.travis.yml
@@ -1,10 +1,21 @@
|
|||||||
language: rust
|
language: rust
|
||||||
cache: cargo
|
cache: cargo
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
- PROJECT_NAME=ripgrep
|
- PROJECT_NAME=ripgrep
|
||||||
|
- RUST_BACKTRACE: full
|
||||||
|
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
# Needed for completion-function test.
|
||||||
|
- zsh
|
||||||
|
# Needed for testing decompression search.
|
||||||
|
- xz-utils
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
include:
|
include:
|
||||||
# Nightly channel.
|
# Nightly channel.
|
||||||
# (All *nix releases are done on the nightly channel to take advantage
|
# (All *nix releases are done on the nightly channel to take advantage
|
||||||
@@ -18,6 +29,16 @@ matrix:
|
|||||||
- os: osx
|
- os: osx
|
||||||
rust: nightly
|
rust: nightly
|
||||||
env: TARGET=x86_64-apple-darwin
|
env: TARGET=x86_64-apple-darwin
|
||||||
|
- os: linux
|
||||||
|
rust: nightly
|
||||||
|
env: TARGET=arm-unknown-linux-gnueabihf GCC_VERSION=4.8
|
||||||
|
addons:
|
||||||
|
apt:
|
||||||
|
packages:
|
||||||
|
- gcc-4.8-arm-linux-gnueabihf
|
||||||
|
- binutils-arm-linux-gnueabihf
|
||||||
|
- libc6-armhf-cross
|
||||||
|
- libc6-dev-armhf-cross
|
||||||
# Beta channel.
|
# Beta channel.
|
||||||
- os: linux
|
- os: linux
|
||||||
rust: beta
|
rust: beta
|
||||||
@@ -25,19 +46,23 @@ matrix:
|
|||||||
- os: linux
|
- os: linux
|
||||||
rust: beta
|
rust: beta
|
||||||
env: TARGET=x86_64-unknown-linux-gnu
|
env: TARGET=x86_64-unknown-linux-gnu
|
||||||
- os: osx
|
|
||||||
rust: beta
|
|
||||||
env: TARGET=x86_64-apple-darwin
|
|
||||||
# Minimum Rust supported channel.
|
# Minimum Rust supported channel.
|
||||||
- os: linux
|
- os: linux
|
||||||
rust: 1.9.0
|
rust: 1.20.0
|
||||||
|
env: TARGET=x86_64-unknown-linux-gnu
|
||||||
|
- os: linux
|
||||||
|
rust: 1.20.0
|
||||||
env: TARGET=x86_64-unknown-linux-musl
|
env: TARGET=x86_64-unknown-linux-musl
|
||||||
- os: linux
|
- os: linux
|
||||||
rust: 1.9.0
|
rust: 1.20.0
|
||||||
env: TARGET=x86_64-unknown-linux-gnu
|
env: TARGET=arm-unknown-linux-gnueabihf GCC_VERSION=4.8
|
||||||
- os: osx
|
addons:
|
||||||
rust: 1.9.0
|
apt:
|
||||||
env: TARGET=x86_64-apple-darwin
|
packages:
|
||||||
|
- gcc-4.8-arm-linux-gnueabihf
|
||||||
|
- binutils-arm-linux-gnueabihf
|
||||||
|
- libc6-armhf-cross
|
||||||
|
- libc6-dev-armhf-cross
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- export PATH="$PATH:$HOME/.cargo/bin"
|
- export PATH="$PATH:$HOME/.cargo/bin"
|
||||||
|
|||||||
443
CHANGELOG.md
443
CHANGELOG.md
@@ -1,3 +1,446 @@
|
|||||||
|
0.7.1 (2017-10-22)
|
||||||
|
==================
|
||||||
|
This is a patch release of ripgrep that includes a fix to very bad regression
|
||||||
|
introduced in ripgrep 0.7.0.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #648](https://github.com/BurntSushi/ripgrep/issues/648):
|
||||||
|
Fix a bug where it was very easy to exceed standard file descriptor limits.
|
||||||
|
|
||||||
|
|
||||||
|
0.7.0 (2017-10-20)
|
||||||
|
==================
|
||||||
|
This is a new minor version release of ripgrep that includes mostly bug fixes.
|
||||||
|
|
||||||
|
ripgrep continues to require Rust 1.17, and there are no known breaking changes
|
||||||
|
introduced in this release.
|
||||||
|
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for config & license files, Elm,
|
||||||
|
Purescript, Standard ML, sh, systemd, Terraform
|
||||||
|
* [FEATURE #593](https://github.com/BurntSushi/ripgrep/pull/593):
|
||||||
|
Using both `-o/--only-matching` and `-r/--replace` does the right thing.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #200](https://github.com/BurntSushi/ripgrep/issues/200):
|
||||||
|
ripgrep will stop when its pipe is closed.
|
||||||
|
* [BUG #402](https://github.com/BurntSushi/ripgrep/issues/402):
|
||||||
|
Fix context printing bug when the `-m/--max-count` flag is used.
|
||||||
|
* [BUG #521](https://github.com/BurntSushi/ripgrep/issues/521):
|
||||||
|
Fix interaction between `-r/--replace` and terminal colors.
|
||||||
|
* [BUG #559](https://github.com/BurntSushi/ripgrep/issues/559):
|
||||||
|
Ignore test that tried reading a non-UTF-8 file path on macOS.
|
||||||
|
* [BUG #599](https://github.com/BurntSushi/ripgrep/issues/599):
|
||||||
|
Fix color escapes on empty matches.
|
||||||
|
* [BUG #600](https://github.com/BurntSushi/ripgrep/issues/600):
|
||||||
|
Avoid expensive (on Windows) file handle check when using --files.
|
||||||
|
* [BUG #618](https://github.com/BurntSushi/ripgrep/issues/618):
|
||||||
|
Clarify installation instructions for Ubuntu users.
|
||||||
|
* [BUG #633](https://github.com/BurntSushi/ripgrep/issues/633):
|
||||||
|
Faster symlink loop checking on Windows.
|
||||||
|
|
||||||
|
|
||||||
|
0.6.0 (2017-08-23)
|
||||||
|
==================
|
||||||
|
This is a new minor version release of ripgrep that includes many bug fixes
|
||||||
|
and a few new features such as `--iglob` and `-x/--line-regexp`.
|
||||||
|
|
||||||
|
Note that this release increases the minimum supported Rust version from 1.12
|
||||||
|
to 1.17.
|
||||||
|
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for BitBake, C++, Cabal, cshtml, Julia,
|
||||||
|
Make, msbuild, QMake, Yocto
|
||||||
|
* [FEATURE #163](https://github.com/BurntSushi/ripgrep/issues/163):
|
||||||
|
Add an `--iglob` flag that is like `-g/--glob`, but matches globs
|
||||||
|
case insensitively.
|
||||||
|
* [FEATURE #520](https://github.com/BurntSushi/ripgrep/pull/518):
|
||||||
|
Add `-x/--line-regexp` flag, which requires a match to span an entire line.
|
||||||
|
* [FEATURE #551](https://github.com/BurntSushi/ripgrep/pull/551),
|
||||||
|
[FEATURE #554](https://github.com/BurntSushi/ripgrep/pull/554):
|
||||||
|
`ignore`: add new `matched_path_or_any_parents` method.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #342](https://github.com/BurntSushi/ripgrep/issues/342):
|
||||||
|
Fix invisible text in some PowerShell environments by changing the
|
||||||
|
default color scheme on Windows.
|
||||||
|
* [BUG #413](https://github.com/BurntSushi/ripgrep/issues/413):
|
||||||
|
Release binaries on Unix are now `strip`'d by default. This decreases
|
||||||
|
binary size by an order of magnitude.
|
||||||
|
* [BUG #483](https://github.com/BurntSushi/ripgrep/issues/483):
|
||||||
|
When `--quiet` is passed, `--files` should be quiet.
|
||||||
|
* [BUG #488](https://github.com/BurntSushi/ripgrep/pull/488):
|
||||||
|
When `--vimgrep` is passed, `--with-filename` should be enabled
|
||||||
|
automatically.
|
||||||
|
* [BUG #493](https://github.com/BurntSushi/ripgrep/issues/493):
|
||||||
|
Fix another bug in the implementation of the `-o/--only-matching`
|
||||||
|
flag.
|
||||||
|
* [BUG #499](https://github.com/BurntSushi/ripgrep/pull/499):
|
||||||
|
Permit certain flags to override others.
|
||||||
|
* [BUG #523](https://github.com/BurntSushi/ripgrep/pull/523):
|
||||||
|
`wincolor`: Re-fetch Windows console on all calls.
|
||||||
|
* [BUG #523](https://github.com/BurntSushi/ripgrep/issues/524):
|
||||||
|
`--version` now shows enabled compile-time features.
|
||||||
|
* [BUG #532](https://github.com/BurntSushi/ripgrep/issues/532),
|
||||||
|
[BUG #536](https://github.com/BurntSushi/ripgrep/pull/536),
|
||||||
|
[BUG #538](https://github.com/BurntSushi/ripgrep/pull/538),
|
||||||
|
[BUG #540](https://github.com/BurntSushi/ripgrep/pull/540),
|
||||||
|
[BUG #560](https://github.com/BurntSushi/ripgrep/pull/560),
|
||||||
|
[BUG #565](https://github.com/BurntSushi/ripgrep/pull/565):
|
||||||
|
Improve zsh completion.
|
||||||
|
* [BUG #578](https://github.com/BurntSushi/ripgrep/pull/578):
|
||||||
|
Enable SIMD for `encoding_rs` when appropriate.
|
||||||
|
* [BUG #580](https://github.com/BurntSushi/ripgrep/issues/580):
|
||||||
|
Fix `-w/--word-regexp` in the presence of capturing groups.
|
||||||
|
* [BUG #581](https://github.com/BurntSushi/ripgrep/issues/581):
|
||||||
|
Document that ripgrep may terminate unexpectedly when searching via
|
||||||
|
memory maps (which can happen using default settings).
|
||||||
|
|
||||||
|
Friends of ripgrep:
|
||||||
|
|
||||||
|
I'd like to give a big Thank You to @okdana for their recent hard work on
|
||||||
|
ripgrep. This includes new features like `--line-regexp`, heroic effort on
|
||||||
|
zsh auto-completion and thinking through some thorny argv issues with me.
|
||||||
|
|
||||||
|
I'd also like to thank @ericbn for their work on improving ripgrep's argv
|
||||||
|
parsing by allowing some flags to override others.
|
||||||
|
|
||||||
|
Thanks @okdana and @ericbn!
|
||||||
|
|
||||||
|
|
||||||
|
0.5.2 (2017-05-11)
|
||||||
|
==================
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for Nix.
|
||||||
|
* [FEATURE #362](https://github.com/BurntSushi/ripgrep/issues/362):
|
||||||
|
Add `--regex-size-limit` and `--dfa-size-limit` flags.
|
||||||
|
* [FEATURE #444](https://github.com/BurntSushi/ripgrep/issues/444):
|
||||||
|
Improve error messages for invalid globs.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #442](https://github.com/BurntSushi/ripgrep/issues/442):
|
||||||
|
Fix line wrapping in `--help` output.
|
||||||
|
* [BUG #451](https://github.com/BurntSushi/ripgrep/issues/451):
|
||||||
|
Fix bug with duplicate output when using `-o/--only-matching` flag.
|
||||||
|
|
||||||
|
|
||||||
|
0.5.1 (2017-04-09)
|
||||||
|
==================
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for vim.
|
||||||
|
* [FEATURE #34](https://github.com/BurntSushi/ripgrep/issues/34):
|
||||||
|
Add a `-o/--only-matching` flag.
|
||||||
|
* [FEATURE #377](https://github.com/BurntSushi/ripgrep/issues/377):
|
||||||
|
Column numbers can now be customized with a color. (The default is
|
||||||
|
no color.)
|
||||||
|
* [FEATURE #419](https://github.com/BurntSushi/ripgrep/issues/419):
|
||||||
|
Added `-0` short flag option for `--null`.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #381](https://github.com/BurntSushi/ripgrep/issues/381):
|
||||||
|
Include license text in all subcrates.
|
||||||
|
* [BUG #418](https://github.com/BurntSushi/ripgrep/issues/418),
|
||||||
|
[BUG #426](https://github.com/BurntSushi/ripgrep/issues/426),
|
||||||
|
[BUG #439](https://github.com/BurntSushi/ripgrep/issues/439):
|
||||||
|
Fix a few bugs with `-h/--help` output.
|
||||||
|
|
||||||
|
|
||||||
|
0.5.0 (2017-03-12)
|
||||||
|
==================
|
||||||
|
This is a new minor version release of ripgrep that includes one minor breaking
|
||||||
|
change, bug fixes and several new features including support for text encodings
|
||||||
|
other than UTF-8.
|
||||||
|
|
||||||
|
A notable accomplishment with respect to Rust is that ripgrep proper now only
|
||||||
|
contains a single `unsafe` use (for accessing the contents of a memory map).
|
||||||
|
|
||||||
|
The **breaking change** is:
|
||||||
|
|
||||||
|
* [FEATURE #380](https://github.com/BurntSushi/ripgrep/issues/380):
|
||||||
|
Line numbers are now hidden by default when ripgrep is printing to a tty
|
||||||
|
**and** the only thing searched is stdin.
|
||||||
|
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for Ceylon, CSS, Elixir, HTML, log,
|
||||||
|
SASS, SVG, Twig
|
||||||
|
* [FEATURE #1](https://github.com/BurntSushi/ripgrep/issues/1):
|
||||||
|
Add support for additional text encodings, including automatic detection for
|
||||||
|
UTF-16 via BOM sniffing. Explicit text encoding support with the
|
||||||
|
`-E/--encoding` flag was also added for latin-1, GBK, EUC-JP
|
||||||
|
and Shift_JIS, among others. The full list can be found here:
|
||||||
|
https://encoding.spec.whatwg.org/#concept-encoding-get
|
||||||
|
* [FEATURE #129](https://github.com/BurntSushi/ripgrep/issues/129):
|
||||||
|
Add a new `-M/--max-columns` flag that omits lines longer than the given
|
||||||
|
number of bytes. (Disabled by default!)
|
||||||
|
* [FEATURE #369](https://github.com/BurntSushi/ripgrep/issues/369):
|
||||||
|
A new flag, `--max-filesize`, was added for limiting searches to files with
|
||||||
|
a maximum file size.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #52](https://github.com/BurntSushi/ripgrep/issues/52),
|
||||||
|
[BUG #311](https://github.com/BurntSushi/ripgrep/issues/311):
|
||||||
|
Tweak how binary files are detected and handled. (We are slightly less
|
||||||
|
conservative and will no longer use memory without bound.)
|
||||||
|
* [BUG #326](https://github.com/BurntSushi/ripgrep/issues/326):
|
||||||
|
When --files flag is given, we should never attempt to parse positional
|
||||||
|
arguments as regexes.
|
||||||
|
* [BUG #327](https://github.com/BurntSushi/ripgrep/issues/327):
|
||||||
|
Permit the --heading flag to override the --no-heading flag.
|
||||||
|
* [BUG #340](https://github.com/BurntSushi/ripgrep/pull/340):
|
||||||
|
Clarify that the `-u/--unrestricted` flags are aliases.
|
||||||
|
* [BUG #343](https://github.com/BurntSushi/ripgrep/pull/343):
|
||||||
|
Global git ignore config should use `$HOME/.config/git/ignore` and not
|
||||||
|
`$HOME/git/ignore`.
|
||||||
|
* [BUG #345](https://github.com/BurntSushi/ripgrep/pull/345):
|
||||||
|
Clarify docs for `-g/--glob` flag.
|
||||||
|
* [BUG #381](https://github.com/BurntSushi/ripgrep/issues/381):
|
||||||
|
Add license files to each sub-crate.
|
||||||
|
* [BUG #383](https://github.com/BurntSushi/ripgrep/issues/383):
|
||||||
|
Use latest version of clap (for argv parsing).
|
||||||
|
* [BUG #392](https://github.com/BurntSushi/ripgrep/issues/391):
|
||||||
|
Fix translation of set globs (e.g., `{foo,bar,quux}`) to regexes.
|
||||||
|
* [BUG #401](https://github.com/BurntSushi/ripgrep/pull/401):
|
||||||
|
Add PowerShell completion file to Windows release.
|
||||||
|
* [BUG #405](https://github.com/BurntSushi/ripgrep/issues/405):
|
||||||
|
Fix bug when excluding absolute paths with the `-g/--glob` flag.
|
||||||
|
|
||||||
|
|
||||||
|
0.4.0
|
||||||
|
=====
|
||||||
|
This is a new minor version release of ripgrep that includes a couple very
|
||||||
|
minor breaking changes, a few new features and lots of bug fixes.
|
||||||
|
|
||||||
|
This version of ripgrep upgrades its `regex` dependency from `0.1` to `0.2`,
|
||||||
|
which includes a few minor syntax changes:
|
||||||
|
|
||||||
|
* POSIX character classes now require double bracketing. Previously, the regex
|
||||||
|
`[:upper:]` would parse as the `upper` POSIX character class. Now it parses
|
||||||
|
as the character class containing the characters `:upper:`. The fix to this
|
||||||
|
change is to use `[[:upper:]]` instead. Note that variants like
|
||||||
|
`[[:upper:][:blank:]]` continue to work.
|
||||||
|
* The character `[` must always be escaped inside a character class.
|
||||||
|
* The characters `&`, `-` and `~` must be escaped if any one of them are
|
||||||
|
repeated consecutively. For example, `[&]`, `[\&]`, `[\&\&]`, `[&-&]` are all
|
||||||
|
equivalent while `[&&]` is illegal. (The motivation for this and the prior
|
||||||
|
change is to provide a backwards compatible path for adding character class
|
||||||
|
set notation.)
|
||||||
|
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for Crystal, Kotlin, Perl, PowerShell,
|
||||||
|
Ruby, Swig
|
||||||
|
* [FEATURE #83](https://github.com/BurntSushi/ripgrep/issues/83):
|
||||||
|
Type definitions can now include other type definitions.
|
||||||
|
* [FEATURE #243](https://github.com/BurntSushi/ripgrep/issues/243):
|
||||||
|
**BREAKING CHANGE**: The `--column` flag now implies `--line-number`.
|
||||||
|
* [FEATURE #263](https://github.com/BurntSushi/ripgrep/issues/263):
|
||||||
|
Add a new `--sort-files` flag.
|
||||||
|
* [FEATURE #275](https://github.com/BurntSushi/ripgrep/issues/275):
|
||||||
|
Add a new `--path-separator` flag. Useful in cygwin.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #182](https://github.com/BurntSushi/ripgrep/issues/182):
|
||||||
|
Redux: use more portable ANSI color escape sequences when possible.
|
||||||
|
* [BUG #258](https://github.com/BurntSushi/ripgrep/issues/258):
|
||||||
|
Fix bug that caused ripgrep's parallel iterator to spin and burn CPU.
|
||||||
|
* [BUG #262](https://github.com/BurntSushi/ripgrep/issues/262):
|
||||||
|
Document how to install shell completion files.
|
||||||
|
* [BUG #266](https://github.com/BurntSushi/ripgrep/issues/266),
|
||||||
|
[BUG #293](https://github.com/BurntSushi/ripgrep/issues/293):
|
||||||
|
Fix handling of bold styling and change the default colors.
|
||||||
|
* [BUG #268](https://github.com/BurntSushi/ripgrep/issues/268):
|
||||||
|
Make lack of backreference support more explicit.
|
||||||
|
* [BUG #271](https://github.com/BurntSushi/ripgrep/issues/271):
|
||||||
|
Remove `~` dependency on clap.
|
||||||
|
* [BUG #277](https://github.com/BurntSushi/ripgrep/issues/277):
|
||||||
|
Fix cosmetic issue in `globset` crate docs.
|
||||||
|
* [BUG #279](https://github.com/BurntSushi/ripgrep/issues/279):
|
||||||
|
ripgrep did not terminate when `-q/--quiet` was given.
|
||||||
|
* [BUG #281](https://github.com/BurntSushi/ripgrep/issues/281):
|
||||||
|
**BREAKING CHANGE**: Completely remove `^C` handling from ripgrep.
|
||||||
|
* [BUG #284](https://github.com/BurntSushi/ripgrep/issues/284):
|
||||||
|
Make docs for `-g/--glob` clearer.
|
||||||
|
* [BUG #286](https://github.com/BurntSushi/ripgrep/pull/286):
|
||||||
|
When stdout is redirected to a file, don't search that file.
|
||||||
|
* [BUG #287](https://github.com/BurntSushi/ripgrep/pull/287):
|
||||||
|
Fix ZSH completions.
|
||||||
|
* [BUG #295](https://github.com/BurntSushi/ripgrep/pull/295):
|
||||||
|
Remove superfluous `memmap` dependency in `grep` crate.
|
||||||
|
* [BUG #308](https://github.com/BurntSushi/ripgrep/pull/308):
|
||||||
|
Improve docs for `-r/--replace`.
|
||||||
|
* [BUG #313](https://github.com/BurntSushi/ripgrep/pull/313):
|
||||||
|
Update bytecount dep to latest version.
|
||||||
|
* [BUG #318](https://github.com/BurntSushi/ripgrep/pull/318):
|
||||||
|
Fix invalid UTF-8 output bug in Windows consoles.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.2
|
||||||
|
=====
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for Less, Sass, stylus, Zsh
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #229](https://github.com/BurntSushi/ripgrep/issues/229):
|
||||||
|
Make smart case slightly less conservative.
|
||||||
|
* [BUG #247](https://github.com/BurntSushi/ripgrep/issues/247):
|
||||||
|
Clarify use of --heading/--no-heading.
|
||||||
|
* [BUG #251](https://github.com/BurntSushi/ripgrep/issues/251),
|
||||||
|
[BUG #264](https://github.com/BurntSushi/ripgrep/issues/264),
|
||||||
|
[BUG #267](https://github.com/BurntSushi/ripgrep/issues/267):
|
||||||
|
Fix matching bug caused by literal optimizations.
|
||||||
|
* [BUG #256](https://github.com/BurntSushi/ripgrep/issues/256):
|
||||||
|
Fix bug that caused `rg foo` and `rg foo/` to have different behavior
|
||||||
|
when `foo` was a symlink.
|
||||||
|
* [BUG #270](https://github.com/BurntSushi/ripgrep/issues/270):
|
||||||
|
Fix bug where patterns starting with a `-` couldn't be used with the
|
||||||
|
`-e/--regexp` flag. (This resolves a regression that was introduced in
|
||||||
|
ripgrep 0.3.0.)
|
||||||
|
|
||||||
|
|
||||||
|
0.3.1
|
||||||
|
=====
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #242](https://github.com/BurntSushi/ripgrep/issues/242):
|
||||||
|
ripgrep didn't respect `--colors foo:none` correctly. Now it does.
|
||||||
|
|
||||||
|
|
||||||
|
0.3.0
|
||||||
|
=====
|
||||||
|
This is a new minor version release of ripgrep that includes two breaking
|
||||||
|
changes with lots of bug fixes and some new features and performance
|
||||||
|
improvements. Notably, if you had a problem with colors or piping on Windows
|
||||||
|
before, then that should now be fixed in this release.
|
||||||
|
|
||||||
|
**BREAKING CHANGES**:
|
||||||
|
|
||||||
|
* ripgrep now requires Rust 1.11 to compile. Previously, it could build on
|
||||||
|
Rust 1.9. The cause of this was the move from
|
||||||
|
[Docopt to Clap](https://github.com/BurntSushi/ripgrep/pull/233)
|
||||||
|
for argument parsing.
|
||||||
|
* The `-e/--regexp` flag can no longer accept a pattern starting with a `-`.
|
||||||
|
There are two work-arounds: `rg -- -foo` and `rg [-]foo` or `rg -e [-]foo`
|
||||||
|
will all search for the same `-foo` pattern. The cause of this was the move
|
||||||
|
from [Docopt to Clap](https://github.com/BurntSushi/ripgrep/pull/233)
|
||||||
|
for argument parsing.
|
||||||
|
[This may get fixed in the
|
||||||
|
future.](https://github.com/kbknapp/clap-rs/issues/742).
|
||||||
|
|
||||||
|
Performance improvements:
|
||||||
|
|
||||||
|
* [PERF #33](https://github.com/BurntSushi/ripgrep/issues/33):
|
||||||
|
ripgrep now performs similar to GNU grep on small corpora.
|
||||||
|
* [PERF #136](https://github.com/BurntSushi/ripgrep/issues/136):
|
||||||
|
ripgrep no longer slows down because of argument parsing when given a large
|
||||||
|
argument list.
|
||||||
|
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for Elixir.
|
||||||
|
* [FEATURE #7](https://github.com/BurntSushi/ripgrep/issues/7):
|
||||||
|
Add a `-f/--file` flag that causes ripgrep to read patterns from a file.
|
||||||
|
* [FEATURE #51](https://github.com/BurntSushi/ripgrep/issues/51):
|
||||||
|
Add a `--colors` flag that enables one to customize the colors used in
|
||||||
|
ripgrep's output.
|
||||||
|
* [FEATURE #138](https://github.com/BurntSushi/ripgrep/issues/138):
|
||||||
|
Add a `--files-without-match` flag that shows only file paths that contain
|
||||||
|
zero matches.
|
||||||
|
* [FEATURE #230](https://github.com/BurntSushi/ripgrep/issues/230):
|
||||||
|
Add completion files to the release (Bash, Fish and PowerShell).
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #37](https://github.com/BurntSushi/ripgrep/issues/37):
|
||||||
|
Use correct ANSI escape sequences when `TERM=screen.linux`.
|
||||||
|
* [BUG #94](https://github.com/BurntSushi/ripgrep/issues/94):
|
||||||
|
ripgrep now detects stdin on Windows automatically.
|
||||||
|
* [BUG #117](https://github.com/BurntSushi/ripgrep/issues/117):
|
||||||
|
Colors should now work correctly and automatically inside mintty.
|
||||||
|
* [BUG #182](https://github.com/BurntSushi/ripgrep/issues/182):
|
||||||
|
Colors should now work within Emacs. In particular, `--color=always` will
|
||||||
|
emit colors regardless of the current environment.
|
||||||
|
* [BUG #189](https://github.com/BurntSushi/ripgrep/issues/189):
|
||||||
|
Show less content when running `rg -h`. The full help content can be
|
||||||
|
accessed with `rg --help`.
|
||||||
|
* [BUG #210](https://github.com/BurntSushi/ripgrep/issues/210):
|
||||||
|
Support non-UTF-8 file names on Unix platforms.
|
||||||
|
* [BUG #231](https://github.com/BurntSushi/ripgrep/issues/231):
|
||||||
|
Switch from block buffering to line buffering.
|
||||||
|
* [BUG #241](https://github.com/BurntSushi/ripgrep/issues/241):
|
||||||
|
Some error messages weren't suppressed when `--no-messages` was used.
|
||||||
|
|
||||||
|
|
||||||
|
0.2.9
|
||||||
|
=====
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #226](https://github.com/BurntSushi/ripgrep/issues/226):
|
||||||
|
File paths explicitly given on the command line weren't searched in parallel.
|
||||||
|
(This was a regression in `0.2.7`.)
|
||||||
|
* [BUG #228](https://github.com/BurntSushi/ripgrep/issues/228):
|
||||||
|
If a directory was given to `--ignore-file`, ripgrep's memory usage would
|
||||||
|
grow without bound.
|
||||||
|
|
||||||
|
|
||||||
|
0.2.8
|
||||||
|
=====
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* Fixed a bug with the SIMD/AVX features for using bytecount in commit
|
||||||
|
`4ca15a`.
|
||||||
|
|
||||||
|
|
||||||
|
0.2.7
|
||||||
|
=====
|
||||||
|
Performance improvements:
|
||||||
|
|
||||||
|
* [PERF #223](https://github.com/BurntSushi/ripgrep/pull/223):
|
||||||
|
Added a parallel recursive directory iterator. This results in major
|
||||||
|
performance improvements on large repositories.
|
||||||
|
* [PERF #11](https://github.com/BurntSushi/ripgrep/pull/11):
|
||||||
|
ripgrep now uses the `bytecount` library for counting new lines. In some
|
||||||
|
cases, ripgrep runs twice as fast. Use
|
||||||
|
`RUSTFLAGS="-C target-cpu=native" cargo build --release --features 'simd-accel avx-accel'`
|
||||||
|
to get the fastest possible binary.
|
||||||
|
|
||||||
|
Feature enhancements:
|
||||||
|
|
||||||
|
* Added or improved file type filtering for Agda, Tex, Taskpaper, Markdown,
|
||||||
|
asciidoc, textile, rdoc, org, creole, wiki, pod, C#, PDF, C, C++.
|
||||||
|
* [FEATURE #149](https://github.com/BurntSushi/ripgrep/issues/149):
|
||||||
|
Add a new `--no-messages` flag that suppresses error messages.
|
||||||
|
Note that `rg foo 2> /dev/null` also works.
|
||||||
|
* [FEATURE #159](https://github.com/BurntSushi/ripgrep/issues/159):
|
||||||
|
Add a new `-m/--max-count` flag that limits the total number of matches
|
||||||
|
printed for each file searched.
|
||||||
|
|
||||||
|
Bug fixes:
|
||||||
|
|
||||||
|
* [BUG #199](https://github.com/BurntSushi/ripgrep/issues/199):
|
||||||
|
Fixed a bug where `-S/--smart-case` wasn't being applied correctly to
|
||||||
|
literal optimizations.
|
||||||
|
* [BUG #203](https://github.com/BurntSushi/ripgrep/issues/203):
|
||||||
|
Mention the full name, ripgrep, in more places. It now appears in
|
||||||
|
the output of `--help` and `--version`. The repository URL is now also
|
||||||
|
in the output of `--help` and the man page.
|
||||||
|
* [BUG #215](https://github.com/BurntSushi/ripgrep/issues/215):
|
||||||
|
Include small note about how to search for a pattern that starts with a `-`.
|
||||||
|
|
||||||
|
|
||||||
0.2.6
|
0.2.6
|
||||||
=====
|
=====
|
||||||
Feature enhancements:
|
Feature enhancements:
|
||||||
|
|||||||
420
Cargo.lock
generated
420
Cargo.lock
generated
@@ -1,262 +1,326 @@
|
|||||||
[root]
|
|
||||||
name = "ripgrep"
|
|
||||||
version = "0.2.5"
|
|
||||||
dependencies = [
|
|
||||||
"ctrlc 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"grep 0.1.3",
|
|
||||||
"ignore 0.1.3",
|
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"memmap 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"num_cpus 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "aho-corasick"
|
name = "aho-corasick"
|
||||||
version = "0.5.3"
|
version = "0.6.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ctrlc"
|
name = "ansi_term"
|
||||||
version = "2.0.1"
|
version = "0.10.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "atty"
|
||||||
|
version = "0.2.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "deque"
|
name = "bitflags"
|
||||||
|
version = "1.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bytecount"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)",
|
"simd 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "docopt"
|
name = "cfg-if"
|
||||||
version = "0.6.86"
|
version = "0.1.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "clap"
|
||||||
|
version = "2.29.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
"atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"strsim 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "crossbeam"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "encoding_rs"
|
||||||
|
version = "0.7.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"simd 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "env_logger"
|
name = "env_logger"
|
||||||
version = "0.3.5"
|
version = "0.4.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fnv"
|
name = "fnv"
|
||||||
version = "1.0.5"
|
version = "1.0.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fs2"
|
name = "fuchsia-zircon"
|
||||||
version = "0.3.0"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fuchsia-zircon-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fuchsia-zircon-sys"
|
||||||
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glob"
|
||||||
|
version = "0.2.11"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "globset"
|
name = "globset"
|
||||||
version = "0.1.1"
|
version = "0.2.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "grep"
|
name = "grep"
|
||||||
version = "0.1.3"
|
version = "0.1.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memmap 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ignore"
|
name = "ignore"
|
||||||
version = "0.1.3"
|
version = "0.3.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"globset 0.1.1",
|
"crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"globset 0.2.1",
|
||||||
"log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"thread_local 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"walkdir 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"same-file 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
"tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
[[package]]
|
"walkdir 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
name = "kernel32-sys"
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
version = "0.2.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lazy_static"
|
name = "lazy_static"
|
||||||
version = "0.2.1"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "libc"
|
name = "libc"
|
||||||
version = "0.2.17"
|
version = "0.2.34"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.3.6"
|
version = "0.3.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "log"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memchr"
|
name = "memchr"
|
||||||
version = "0.1.11"
|
version = "2.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "memmap"
|
name = "memmap"
|
||||||
version = "0.5.0"
|
version = "0.6.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"fs2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num_cpus"
|
name = "num_cpus"
|
||||||
version = "1.1.0"
|
version = "1.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rand"
|
name = "rand"
|
||||||
version = "0.3.14"
|
version = "0.3.19"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"fuchsia-zircon 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_syscall"
|
||||||
|
version = "0.1.33"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "redox_termios"
|
||||||
|
version = "0.1.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"redox_syscall 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex"
|
name = "regex"
|
||||||
version = "0.1.80"
|
version = "0.2.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
"regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"simd 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
"simd 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)",
|
"thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
"utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "regex-syntax"
|
name = "regex-syntax"
|
||||||
version = "0.3.9"
|
version = "0.4.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-serialize"
|
name = "ripgrep"
|
||||||
version = "0.3.19"
|
version = "0.7.1"
|
||||||
|
dependencies = [
|
||||||
|
"atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"encoding_rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"globset 0.2.1",
|
||||||
|
"grep 0.1.7",
|
||||||
|
"ignore 0.3.1",
|
||||||
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"regex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"same-file 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"termcolor 0.3.3",
|
||||||
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "same-file"
|
||||||
|
version = "1.0.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simd"
|
name = "simd"
|
||||||
version = "0.1.1"
|
version = "0.2.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "strsim"
|
name = "strsim"
|
||||||
version = "0.5.1"
|
version = "0.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "term"
|
name = "tempdir"
|
||||||
version = "0.4.4"
|
version = "0.3.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"rand 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread-id"
|
name = "termcolor"
|
||||||
version = "2.0.0"
|
version = "0.3.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"wincolor 0.1.4",
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread-id"
|
name = "termion"
|
||||||
version = "3.0.0"
|
version = "1.5.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)",
|
"redox_syscall 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "textwrap"
|
||||||
|
version = "0.9.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread_local"
|
name = "thread_local"
|
||||||
version = "0.2.7"
|
version = "0.3.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
"lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "thread_local"
|
name = "unicode-width"
|
||||||
version = "0.3.0"
|
version = "0.1.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
|
||||||
"thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
"unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unreachable"
|
name = "unreachable"
|
||||||
version = "0.1.1"
|
version = "1.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
@@ -264,7 +328,12 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "utf8-ranges"
|
name = "utf8-ranges"
|
||||||
version = "0.1.3"
|
version = "1.0.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "vec_map"
|
||||||
|
version = "0.8.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -274,52 +343,79 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "walkdir"
|
name = "walkdir"
|
||||||
version = "1.0.1"
|
version = "2.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
"same-file 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)",
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.2.8"
|
version = "0.3.2"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-i686-pc-windows-gnu 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"winapi-x86_64-pc-windows-gnu 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winapi-i686-pc-windows-gnu"
|
||||||
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi-build"
|
name = "winapi-x86_64-pc-windows-gnu"
|
||||||
version = "0.1.1"
|
version = "0.3.2"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wincolor"
|
||||||
|
version = "0.1.4"
|
||||||
|
dependencies = [
|
||||||
|
"winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
]
|
||||||
|
|
||||||
[metadata]
|
[metadata]
|
||||||
"checksum aho-corasick 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ca972c2ea5f742bfce5687b9aef75506a764f61d37f8f649047846a9686ddb66"
|
"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4"
|
||||||
"checksum ctrlc 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "77f98bb69e3fefadcc5ca80a1368a55251f70295168203e01165bcaecb270891"
|
"checksum ansi_term 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6b3568b48b7cefa6b8ce125f9bb4989e52fbcc29ebea88df04cc7c5f12f70455"
|
||||||
"checksum deque 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1614659040e711785ed8ea24219140654da1729f3ec8a47a9719d041112fe7bf"
|
"checksum atty 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8352656fd42c30a0c3c89d26dea01e3b77c0ab2af18230835c15e2e13cd51859"
|
||||||
"checksum docopt 0.6.86 (registry+https://github.com/rust-lang/crates.io-index)" = "4a7ef30445607f6fc8720f0a0a2c7442284b629cf0d049286860fae23e71c4d9"
|
"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf"
|
||||||
"checksum env_logger 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "15abd780e45b3ea4f76b4e9a26ff4843258dd8a3eed2775a0e7368c2e7936c2f"
|
"checksum bytecount 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "882585cd7ec84e902472df34a5e01891202db3bf62614e1f0afe459c1afcf744"
|
||||||
"checksum fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6cc484842f1e2884faf56f529f960cc12ad8c71ce96cc7abba0a067c98fee344"
|
"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de"
|
||||||
"checksum fs2 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "640001e1bd865c7c32806292822445af576a6866175b5225aa2087ca5e3de551"
|
"checksum clap 2.29.0 (registry+https://github.com/rust-lang/crates.io-index)" = "110d43e343eb29f4f51c1db31beb879d546db27998577e5715270a54bcf41d3f"
|
||||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
"checksum crossbeam 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "24ce9782d4d5c53674646a6a4c1863a21a8fc0cb649b3c94dfc16e45071dea19"
|
||||||
"checksum lazy_static 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "49247ec2a285bb3dcb23cbd9c35193c025e7251bfce77c1d5da97e6362dffe7f"
|
"checksum encoding_rs 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f5215aabf22b83153be3ee44dfe3f940214541b2ce13d419c55e7a115c8c51a9"
|
||||||
"checksum libc 0.2.17 (registry+https://github.com/rust-lang/crates.io-index)" = "044d1360593a78f5c8e5e710beccdc24ab71d1f01bc19a29bcacdba22e8475d8"
|
"checksum env_logger 0.4.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3ddf21e73e016298f5cb37d6ef8e8da8e39f91f9ec8b0df44b7deb16a9f8cd5b"
|
||||||
"checksum log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ab83497bf8bf4ed2a74259c1c802351fcd67a65baa86394b6ba73c36f4838054"
|
"checksum fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)" = "2fad85553e09a6f881f739c29f0b00b0f01357c743266d478b68951ce23285f3"
|
||||||
"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20"
|
"checksum fuchsia-zircon 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "bd510087c325af53ba24f3be8f1c081b0982319adcb8b03cad764512923ccc19"
|
||||||
"checksum memmap 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)" = "065ce59af31c18ea2c419100bda6247dd4ec3099423202b12f0bd32e529fabd2"
|
"checksum fuchsia-zircon-sys 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "08b3a6f13ad6b96572b53ce7af74543132f1a7055ccceb6d073dd36c54481859"
|
||||||
"checksum num_cpus 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8890e6084723d57d0df8d2720b0d60c6ee67d6c93e7169630e4371e88765dcad"
|
"checksum glob 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "8be18de09a56b60ed0edf84bc9df007e30040691af7acd1c41874faac5895bfb"
|
||||||
"checksum rand 0.3.14 (registry+https://github.com/rust-lang/crates.io-index)" = "2791d88c6defac799c3f20d74f094ca33b9332612d9aef9078519c82e4fe04a5"
|
"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d"
|
||||||
"checksum regex 0.1.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4fd4ace6a8cf7860714a2c2280d6c1f7e6a413486c13298bbc86fd3da019402f"
|
"checksum libc 0.2.34 (registry+https://github.com/rust-lang/crates.io-index)" = "36fbc8a8929c632868295d0178dd8f63fc423fd7537ad0738372bd010b3ac9b0"
|
||||||
"checksum regex-syntax 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "f9ec002c35e86791825ed294b50008eea9ddfc8def4420124fbc6b08db834957"
|
"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b"
|
||||||
"checksum rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "6159e4e6e559c81bd706afe9c8fd68f547d3e851ce12e76b1de7914bab61691b"
|
"checksum log 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b3a89a0c46ba789b8a247d4c567aed4d7c68e624672d238b45cc3ec20dc9f940"
|
||||||
"checksum simd 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "63b5847c2d766ca7ce7227672850955802fabd779ba616aeabead4c2c3877023"
|
"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d"
|
||||||
"checksum strsim 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "50c069df92e4b01425a8bf3576d5d417943a6a7272fbabaf5bd80b1aaa76442e"
|
"checksum memmap 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e2ffa2c986de11a9df78620c01eeaaf27d94d3ff02bf81bfcca953102dd0c6ff"
|
||||||
"checksum term 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "3deff8a2b3b6607d6d7cc32ac25c0b33709453ca9cceac006caac51e963cf94a"
|
"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30"
|
||||||
"checksum thread-id 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a9539db560102d1cef46b8b78ce737ff0bb64e7e18d35b2a5688f7d097d0ff03"
|
"checksum rand 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)" = "9e7944d95d25ace8f377da3ac7068ce517e4c646754c43a1b1849177bbf72e59"
|
||||||
"checksum thread-id 3.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4437c97558c70d129e40629a5b385b3fb1ffac301e63941335e4d354081ec14a"
|
"checksum redox_syscall 0.1.33 (registry+https://github.com/rust-lang/crates.io-index)" = "07b8f011e3254d5a9b318fde596d409a0001c9ae4c6e7907520c2eaa4d988c99"
|
||||||
"checksum thread_local 0.2.7 (registry+https://github.com/rust-lang/crates.io-index)" = "8576dbbfcaef9641452d5cf0df9b0e7eeab7694956dd33bb61515fb8f18cfdd5"
|
"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76"
|
||||||
"checksum thread_local 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "50057ca52c629a39aed52d8eb253800cb727875fa6fc7c4b1445f0ac3b50c27c"
|
"checksum regex 0.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "42af8b40717e6a4dae0c00e09d65733e3c68aecfa865c3cc75ea1ed0e66d5149"
|
||||||
"checksum unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2ae5ddb18e1c92664717616dd9549dde73f539f01bd7b77c2edb2446bdff91"
|
"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e"
|
||||||
"checksum utf8-ranges 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a1ca13c08c41c9c3e04224ed9ff80461d97e121589ff27c753a16cb10830ae0f"
|
"checksum same-file 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f3257af0472da4b8b8902102a57bafffd9991f0f43772a8af6153d597e6e4ae2"
|
||||||
|
"checksum simd 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3dd0805c7363ab51a829a1511ad24b6ed0349feaa756c4bc2f977f9f496e6673"
|
||||||
|
"checksum strsim 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b4d15c810519a91cf877e7e36e63fe068815c678181439f2f29e2562147c3694"
|
||||||
|
"checksum tempdir 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "87974a6f5c1dfb344d733055601650059a3363de2a6104819293baff662132d6"
|
||||||
|
"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096"
|
||||||
|
"checksum textwrap 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c0b59b6b4b44d867f1370ef1bd91bfb262bf07bf0ae65c202ea2fbc16153b693"
|
||||||
|
"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963"
|
||||||
|
"checksum unicode-width 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "bf3a113775714a22dcb774d8ea3655c53a32debae63a063acc00a91cc586245f"
|
||||||
|
"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56"
|
||||||
|
"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122"
|
||||||
|
"checksum vec_map 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "887b5b631c2ad01628bbbaa7dd4c869f80d3186688f8d0b6f58774fbe324988c"
|
||||||
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d"
|
||||||
"checksum walkdir 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "98da26f00240118fbb7a06fa29579d1b39d34cd6e0505ea5c125b26d5260a967"
|
"checksum walkdir 2.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b167e9a4420d8dddb260e70c90a4a375a1e5691f21f70e715553da87b6c2503a"
|
||||||
"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a"
|
"checksum winapi 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "890b38836c01d72fdb636d15c9cfc52ec7fd783b330abc93cd1686f4308dfccc"
|
||||||
"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc"
|
"checksum winapi-i686-pc-windows-gnu 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec6667f60c23eca65c561e63a13d81b44234c2e38a6b6c959025ee907ec614cc"
|
||||||
|
"checksum winapi-x86_64-pc-windows-gnu 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "98f12c52b2630cd05d2c3ffd8e008f7f48252c042b4871c72aed9dc733b96668"
|
||||||
|
|||||||
54
Cargo.toml
54
Cargo.toml
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ripgrep"
|
name = "ripgrep"
|
||||||
version = "0.2.6" #:version
|
version = "0.7.1" #:version
|
||||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||||
description = """
|
description = """
|
||||||
Line oriented search tool using Rust's regex library. Combines the raw
|
Line oriented search tool using Rust's regex library. Combines the raw
|
||||||
@@ -11,8 +11,14 @@ homepage = "https://github.com/BurntSushi/ripgrep"
|
|||||||
repository = "https://github.com/BurntSushi/ripgrep"
|
repository = "https://github.com/BurntSushi/ripgrep"
|
||||||
readme = "README.md"
|
readme = "README.md"
|
||||||
keywords = ["regex", "grep", "egrep", "search", "pattern"]
|
keywords = ["regex", "grep", "egrep", "search", "pattern"]
|
||||||
|
categories = ["command-line-utilities", "text-processing"]
|
||||||
license = "Unlicense/MIT"
|
license = "Unlicense/MIT"
|
||||||
exclude = ["HomebrewFormula"]
|
exclude = ["HomebrewFormula"]
|
||||||
|
build = "build.rs"
|
||||||
|
|
||||||
|
[badges]
|
||||||
|
travis-ci = { repository = "BurntSushi/ripgrep" }
|
||||||
|
appveyor = { repository = "BurntSushi/ripgrep" }
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
bench = false
|
bench = false
|
||||||
@@ -23,29 +29,43 @@ name = "rg"
|
|||||||
name = "integration"
|
name = "integration"
|
||||||
path = "tests/tests.rs"
|
path = "tests/tests.rs"
|
||||||
|
|
||||||
|
[workspace]
|
||||||
|
members = [ "grep", "globset", "ignore", "termcolor", "wincolor" ]
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ctrlc = "2.0"
|
atty = "0.2.2"
|
||||||
deque = "0.3"
|
bytecount = "0.3.1"
|
||||||
docopt = "0.6"
|
clap = "2.26"
|
||||||
env_logger = "0.3"
|
encoding_rs = "0.7"
|
||||||
grep = { version = "0.1.3", path = "grep" }
|
env_logger = { version = "0.4", default-features = false }
|
||||||
ignore = { version = "0.1.3", path = "ignore" }
|
grep = { version = "0.1.7", path = "grep" }
|
||||||
lazy_static = "0.2"
|
ignore = { version = "0.3.1", path = "ignore" }
|
||||||
|
lazy_static = "1"
|
||||||
libc = "0.2"
|
libc = "0.2"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
memchr = "0.1"
|
memchr = "2"
|
||||||
memmap = "0.5"
|
memmap = "0.6"
|
||||||
num_cpus = "1"
|
num_cpus = "1"
|
||||||
regex = "0.1.77"
|
regex = "0.2.4"
|
||||||
rustc-serialize = "0.3"
|
same-file = "1"
|
||||||
term = "0.4"
|
termcolor = { version = "0.3.3", path = "termcolor" }
|
||||||
|
globset = { version = "0.2.1", path = "globset" }
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies.winapi]
|
||||||
kernel32-sys = "0.2"
|
version = "0.3"
|
||||||
winapi = "0.2"
|
features = ["std", "winnt"]
|
||||||
|
|
||||||
|
[build-dependencies]
|
||||||
|
clap = "2.26"
|
||||||
|
lazy_static = "1"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
simd-accel = ["regex/simd-accel"]
|
avx-accel = ["bytecount/avx-accel"]
|
||||||
|
simd-accel = [
|
||||||
|
"bytecount/simd-accel",
|
||||||
|
"regex/simd-accel",
|
||||||
|
"encoding_rs/simd-accel",
|
||||||
|
]
|
||||||
|
|
||||||
[profile.release]
|
[profile.release]
|
||||||
debug = true
|
debug = true
|
||||||
|
|||||||
47
ISSUE_TEMPLATE.md
Normal file
47
ISSUE_TEMPLATE.md
Normal file
@@ -0,0 +1,47 @@
|
|||||||
|
#### What version of ripgrep are you using?
|
||||||
|
|
||||||
|
Replace this text with the output of `rg --version`.
|
||||||
|
|
||||||
|
#### What operating system are you using ripgrep on?
|
||||||
|
|
||||||
|
Replace this text with your operating system and version.
|
||||||
|
|
||||||
|
#### Describe your question, feature request, or bug.
|
||||||
|
|
||||||
|
If a question, please describe the problem you're trying to solve and give
|
||||||
|
as much context as possible.
|
||||||
|
|
||||||
|
If a feature request, please describe the behavior you want and the motivation.
|
||||||
|
Please also provide an example of how ripgrep would be used if your feature
|
||||||
|
request were added.
|
||||||
|
|
||||||
|
If a bug, please see below.
|
||||||
|
|
||||||
|
#### If this is a bug, what are the steps to reproduce the behavior?
|
||||||
|
|
||||||
|
If possible, please include both your search patterns and the corpus on which
|
||||||
|
you are searching. Unless the bug is very obvious, then it is unlikely that it
|
||||||
|
will be fixed if the ripgrep maintainers cannot reproduce it.
|
||||||
|
|
||||||
|
If the corpus is too big and you cannot decrease its size, file the bug anyway
|
||||||
|
and the ripgrep maintainers will help figure out next steps.
|
||||||
|
|
||||||
|
#### If this is a bug, what is the actual behavior?
|
||||||
|
|
||||||
|
Show the command you ran and the actual output. Include the `--debug` flag in
|
||||||
|
your invocation of ripgrep.
|
||||||
|
|
||||||
|
If the output is large, put it in a gist: https://gist.github.com/
|
||||||
|
|
||||||
|
If the output is small, put it in code fences:
|
||||||
|
|
||||||
|
```
|
||||||
|
your
|
||||||
|
output
|
||||||
|
goes
|
||||||
|
here
|
||||||
|
```
|
||||||
|
|
||||||
|
#### If this is a bug, what is the expected behavior?
|
||||||
|
|
||||||
|
What do you think ripgrep should have done?
|
||||||
345
README.md
345
README.md
@@ -1,9 +1,11 @@
|
|||||||
ripgrep (rg)
|
ripgrep (rg)
|
||||||
------------
|
------------
|
||||||
`ripgrep` is a command line search tool that combines the usability of The
|
`ripgrep` is a line-oriented search tool that recursively searches your current
|
||||||
Silver Searcher (an `ack` clone) with the raw speed of GNU grep. `ripgrep` has
|
directory for a regex pattern while respecting your gitignore rules. To a first
|
||||||
first class support on Windows, Mac and Linux, with binary downloads available
|
approximation, ripgrep combines the usability of The Silver Searcher (similar
|
||||||
for [every release](https://github.com/BurntSushi/ripgrep/releases).
|
to `ack`) with the raw speed of GNU grep. `ripgrep` has first class support on
|
||||||
|
Windows, macOS and Linux, with binary downloads available for
|
||||||
|
[every release](https://github.com/BurntSushi/ripgrep/releases).
|
||||||
|
|
||||||
[](https://travis-ci.org/BurntSushi/ripgrep)
|
[](https://travis-ci.org/BurntSushi/ripgrep)
|
||||||
[](https://ci.appveyor.com/project/BurntSushi/ripgrep)
|
[](https://ci.appveyor.com/project/BurntSushi/ripgrep)
|
||||||
@@ -11,15 +13,20 @@ for [every release](https://github.com/BurntSushi/ripgrep/releases).
|
|||||||
|
|
||||||
Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
|
Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
|
||||||
|
|
||||||
|
### CHANGELOG
|
||||||
|
|
||||||
|
Please see the [CHANGELOG](CHANGELOG.md) for a release history.
|
||||||
|
|
||||||
### Screenshot of search results
|
### Screenshot of search results
|
||||||
|
|
||||||
[](http://burntsushi.net/stuff/ripgrep1.png)
|
[](http://burntsushi.net/stuff/ripgrep1.png)
|
||||||
|
|
||||||
### Quick example comparing tools
|
### Quick examples comparing tools
|
||||||
|
|
||||||
This example searches the entire Linux kernel source tree (after running
|
This example searches the entire Linux kernel source tree (after running
|
||||||
`make defconfig && make -j8`) for `[A-Z]+_SUSPEND`, where all matches must be
|
`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.
|
words. Timings were collected on a system with an Intel i7-6900K 3.2 GHz, and
|
||||||
|
ripgrep was compiled using the `compile` script in this repo.
|
||||||
|
|
||||||
Please remember that a single benchmark is never enough! See my
|
Please remember that a single benchmark is never enough! See my
|
||||||
[blog post on `ripgrep`](http://blog.burntsushi.net/ripgrep/)
|
[blog post on `ripgrep`](http://blog.burntsushi.net/ripgrep/)
|
||||||
@@ -27,26 +34,50 @@ for a very detailed comparison with more benchmarks and analysis.
|
|||||||
|
|
||||||
| Tool | Command | Line count | Time |
|
| Tool | Command | Line count | Time |
|
||||||
| ---- | ------- | ---------- | ---- |
|
| ---- | ------- | ---------- | ---- |
|
||||||
| ripgrep | `rg -n -w '[A-Z]+_SUSPEND'` | 450 | **0.245s** |
|
| ripgrep (Unicode) | `rg -n -w '[A-Z]+_SUSPEND'` | 450 | **0.106s** |
|
||||||
| [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) | `ag -w '[A-Z]+_SUSPEND'` | 450 | 0.753s |
|
| [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'` | 450 | 0.553s |
|
||||||
| [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'` | 450 | 0.823s |
|
| [The Silver Searcher](https://github.com/ggreer/the_silver_searcher) | `ag -w '[A-Z]+_SUSPEND'` | 450 | 0.589s |
|
||||||
| [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'` | 450 | 2.880s |
|
| [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'` | 450 | 2.266s |
|
||||||
| [sift](https://github.com/svent/sift) | `sift --git -n -w '[A-Z]+_SUSPEND'` | 450 | 3.656s |
|
| [sift](https://github.com/svent/sift) | `sift --git -n -w '[A-Z]+_SUSPEND'` | 450 | 3.505s |
|
||||||
| [The Platinum Searcher](https://github.com/monochromegane/the_platinum_searcher) | `pt -w -e '[A-Z]+_SUSPEND'` | 450 | 12.369s |
|
| [ack](https://github.com/petdance/ack2) | `ack -w '[A-Z]+_SUSPEND'` | 1878 | 6.823s |
|
||||||
| [ack](http://beyondgrep.com/) | `ack -w '[A-Z]+_SUSPEND'` | 1878 | 16.952s |
|
| [The Platinum Searcher](https://github.com/monochromegane/the_platinum_searcher) | `pt -w -e '[A-Z]+_SUSPEND'` | 450 | 14.208s |
|
||||||
|
|
||||||
(Yes, `ack` [has](https://github.com/petdance/ack2/issues/445) a
|
(Yes, `ack` [has](https://github.com/petdance/ack2/issues/445) a
|
||||||
[bug](https://github.com/petdance/ack2/issues/14).)
|
[bug](https://github.com/petdance/ack2/issues/14).)
|
||||||
|
|
||||||
|
Here's another benchmark that disregards gitignore files and searches with a
|
||||||
|
whitelist instead. The corpus is the same as in the previous benchmark, and the
|
||||||
|
flags passed to each command ensure that they are doing equivalent work:
|
||||||
|
|
||||||
|
| Tool | Command | Line count | Time |
|
||||||
|
| ---- | ------- | ---------- | ---- |
|
||||||
|
| ripgrep | `rg -L -u -tc -n -w '[A-Z]+_SUSPEND'` | 404 | **0.079s** |
|
||||||
|
| [ucg](https://github.com/gvansickle/ucg) | `ucg --type=cc -w '[A-Z]+_SUSPEND'` | 390 | 0.163s |
|
||||||
|
| [GNU grep](https://www.gnu.org/software/grep/) | `egrep -R -n --include='*.c' --include='*.h' -w '[A-Z]+_SUSPEND'` | 404 | 0.611s |
|
||||||
|
|
||||||
|
(`ucg` [has slightly different behavior in the presence of symbolic links](https://github.com/gvansickle/ucg/issues/106).)
|
||||||
|
|
||||||
|
And finally, a straight-up comparison between ripgrep and GNU grep on a single
|
||||||
|
large file (~9.3GB,
|
||||||
|
[`OpenSubtitles2016.raw.en.gz`](http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.en.gz)):
|
||||||
|
|
||||||
|
| Tool | Command | Line count | Time |
|
||||||
|
| ---- | ------- | ---------- | ---- |
|
||||||
|
| ripgrep | `rg -w 'Sherlock [A-Z]\w+'` | 5268 | **2.108s** |
|
||||||
|
| [GNU grep](https://www.gnu.org/software/grep/) | `LC_ALL=C egrep -w 'Sherlock [A-Z]\w+'` | 5268 | 7.014s |
|
||||||
|
|
||||||
|
In the above benchmark, passing the `-n` flag (for showing line numbers)
|
||||||
|
increases the times to `2.640s` for ripgrep and `10.277s` for GNU grep.
|
||||||
|
|
||||||
### Why should I use `ripgrep`?
|
### Why should I use `ripgrep`?
|
||||||
|
|
||||||
* It can replace both The Silver Searcher and GNU grep because it is faster
|
* It can replace both The Silver Searcher and GNU grep because it is generally
|
||||||
than both. (N.B. It is not, strictly speaking, a "drop-in" replacement for
|
faster than both. (N.B. It is not, strictly speaking, a "drop-in" replacement
|
||||||
both, but the feature sets are far more similar than different.)
|
for both, but the feature sets are far more similar than different.)
|
||||||
* Like The Silver Searcher, `ripgrep` defaults to recursive directory search
|
* Like The Silver Searcher, `ripgrep` defaults to recursive directory search
|
||||||
and won't search files ignored by your `.gitignore` files. It also ignores
|
and won't search files ignored by your `.gitignore` files. It also ignores
|
||||||
hidden and binary files by default. `ripgrep` also implements full support
|
hidden and binary files by default. `ripgrep` also implements full support
|
||||||
for `.gitignore`, where as there are many bugs related to that functionality
|
for `.gitignore`, whereas there are many bugs related to that functionality
|
||||||
in The Silver Searcher.
|
in The Silver Searcher.
|
||||||
* `ripgrep` can search specific types of files. For example, `rg -tpy foo`
|
* `ripgrep` can search specific types of files. For example, `rg -tpy foo`
|
||||||
limits your search to Python files and `rg -Tjs foo` excludes Javascript
|
limits your search to Python files and `rg -Tjs foo` excludes Javascript
|
||||||
@@ -56,13 +87,44 @@ for a very detailed comparison with more benchmarks and analysis.
|
|||||||
of search results, searching multiple patterns, highlighting matches with
|
of search results, searching multiple patterns, highlighting matches with
|
||||||
color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while
|
color and full Unicode support. Unlike GNU grep, `ripgrep` stays fast while
|
||||||
supporting Unicode (which is always on).
|
supporting Unicode (which is always on).
|
||||||
|
* `ripgrep` supports searching files in text encodings other than UTF-8, such
|
||||||
|
as UTF-16, latin-1, GBK, EUC-JP, Shift_JIS and more. (Some support for
|
||||||
|
automatically detecting UTF-16 is provided. Other text encodings must be
|
||||||
|
specifically specified with the `-E/--encoding` flag.)
|
||||||
|
* `ripgrep` supports searching files compressed in a common format (gzip, xz,
|
||||||
|
lzma or bzip2 current) with the `-z/--search-zip` flag.
|
||||||
|
|
||||||
In other words, use `ripgrep` if you like speed, sane defaults, fewer bugs and
|
In other words, use `ripgrep` if you like speed, filtering by default, fewer
|
||||||
Unicode.
|
bugs, and Unicode support.
|
||||||
|
|
||||||
|
### Why shouldn't I use `ripgrep`?
|
||||||
|
|
||||||
|
I'd like to try to convince you why you *shouldn't* use `ripgrep`. This should
|
||||||
|
give you a glimpse at some important downsides or missing features of
|
||||||
|
`ripgrep`.
|
||||||
|
|
||||||
|
* `ripgrep` uses a regex engine based on finite automata, so if you want fancy
|
||||||
|
regex features such as backreferences or lookaround, `ripgrep` won't provide
|
||||||
|
them to you. `ripgrep` does support lots of things though, including, but not
|
||||||
|
limited to: lazy quantification (e.g., `a+?`), repetitions (e.g., `a{2,5}`),
|
||||||
|
begin/end assertions (e.g., `^\w+$`), word boundaries (e.g., `\bfoo\b`), and
|
||||||
|
support for Unicode categories (e.g., `\p{Sc}` to match currency symbols or
|
||||||
|
`\p{Lu}` to match any uppercase letter). (Fancier regexes will never be
|
||||||
|
supported.)
|
||||||
|
* `ripgrep` doesn't have multiline search. (Unlikely to ever be supported.)
|
||||||
|
|
||||||
|
In other words, if you like fancy regexes or multiline search, then `ripgrep`
|
||||||
|
may not quite meet your needs (yet).
|
||||||
|
|
||||||
|
### Feature comparison
|
||||||
|
|
||||||
|
Andy Lester, author of [ack](https://beyondgrep.com/), has published an
|
||||||
|
excellent table comparing the features of ack, ag, git-grep, GNU grep and
|
||||||
|
ripgrep: https://beyondgrep.com/feature-comparison/
|
||||||
|
|
||||||
### Is it really faster than everything else?
|
### Is it really faster than everything else?
|
||||||
|
|
||||||
Yes. A large number of benchmarks with detailed analysis for each is
|
Generally, yes. A large number of benchmarks with detailed analysis for each is
|
||||||
[available on my blog](http://blog.burntsushi.net/ripgrep/).
|
[available on my blog](http://blog.burntsushi.net/ripgrep/).
|
||||||
|
|
||||||
Summarizing, `ripgrep` is fast because:
|
Summarizing, `ripgrep` is fast because:
|
||||||
@@ -82,22 +144,27 @@ Summarizing, `ripgrep` is fast because:
|
|||||||
[`RegexSet`](https://doc.rust-lang.org/regex/regex/struct.RegexSet.html).
|
[`RegexSet`](https://doc.rust-lang.org/regex/regex/struct.RegexSet.html).
|
||||||
That means a single file path can be matched against multiple glob patterns
|
That means a single file path can be matched against multiple glob patterns
|
||||||
simultaneously.
|
simultaneously.
|
||||||
* Uses a Chase-Lev work-stealing queue for quickly distributing work to
|
* It uses a lock-free parallel recursive directory iterator, courtesy of
|
||||||
multiple threads.
|
[`crossbeam`](https://docs.rs/crossbeam) and
|
||||||
|
[`ignore`](https://docs.rs/ignore).
|
||||||
|
|
||||||
### Installation
|
### Installation
|
||||||
|
|
||||||
The binary name for `ripgrep` is `rg`.
|
The binary name for `ripgrep` is `rg`.
|
||||||
|
|
||||||
[Binaries for `ripgrep` are available for Windows, Mac and
|
**[Archives of precompiled binaries for `ripgrep` are available for Windows,
|
||||||
Linux.](https://github.com/BurntSushi/ripgrep/releases) Linux binaries are
|
macOS and Linux.](https://github.com/BurntSushi/ripgrep/releases)** Users of
|
||||||
static executables. Windows binaries are available either as built with MinGW
|
platforms not explicitly mentioned below (such as Debian) are advised
|
||||||
(GNU) or with Microsoft Visual C++ (MSVC). When possible, prefer MSVC over GNU,
|
to download one of these archives.
|
||||||
but you'll need to have the
|
|
||||||
[Microsoft VC++ 2015 redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=48145)
|
Linux binaries are static executables. Windows binaries are available either as
|
||||||
|
built with MinGW (GNU) or with Microsoft Visual C++ (MSVC). When possible,
|
||||||
|
prefer MSVC over GNU, but you'll need to have the [Microsoft VC++ 2015
|
||||||
|
redistributable](https://www.microsoft.com/en-us/download/details.aspx?id=48145)
|
||||||
installed.
|
installed.
|
||||||
|
|
||||||
If you're a **Mac OS X Homebrew** user, then you can install ripgrep either
|
If you're a **macOS Homebrew** or a **Linuxbrew** user,
|
||||||
|
then you can install ripgrep either
|
||||||
from homebrew-core, (compiled with rust stable, no SIMD):
|
from homebrew-core, (compiled with rust stable, no SIMD):
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -112,24 +179,42 @@ $ brew tap burntsushi/ripgrep https://github.com/BurntSushi/ripgrep.git
|
|||||||
$ brew install burntsushi/ripgrep/ripgrep-bin
|
$ brew install burntsushi/ripgrep/ripgrep-bin
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If you're a **Windows Chocolatey** user, then you can install `ripgrep` from the [official repo](https://chocolatey.org/packages/ripgrep):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ choco install ripgrep
|
||||||
|
```
|
||||||
|
|
||||||
If you're an **Arch Linux** user, then you can install `ripgrep` from the official repos:
|
If you're an **Arch Linux** user, then you can install `ripgrep` from the official repos:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ pacman -S ripgrep
|
$ pacman -S ripgrep
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're a **Fedora 24+** user, you can install `ripgrep` from [copr](https://copr.fedorainfracloud.org/coprs/carlgeorge/ripgrep/):
|
If you're a **Gentoo** user, you can install `ripgrep` from the [official repo](https://packages.gentoo.org/packages/sys-apps/ripgrep):
|
||||||
|
|
||||||
```
|
```
|
||||||
$ dnf copr enable carlgeorge/ripgrep
|
$ emerge sys-apps/ripgrep
|
||||||
$ dnf install ripgrep
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're a **RHEL/CentOS 7** user, you can install `ripgrep` from [copr](https://copr.fedorainfracloud.org/coprs/carlgeorge/ripgrep/):
|
If you're a **Fedora 27+** user, you can install `ripgrep` from official repositories.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlgeorge/ripgrep/repo/epel-7/carlgeorge-ripgrep-epel-7.repo
|
$ sudo dnf install ripgrep
|
||||||
$ yum install ripgrep
|
```
|
||||||
|
|
||||||
|
If you're a **Fedora 24+** user, you can install `ripgrep` from [copr](https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo dnf copr enable carlwgeorge/ripgrep
|
||||||
|
$ sudo dnf install ripgrep
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're a **RHEL/CentOS 7** user, you can install `ripgrep` from [copr](https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ sudo yum-config-manager --add-repo=https://copr.fedorainfracloud.org/coprs/carlwgeorge/ripgrep/repo/epel-7/carlwgeorge-ripgrep-epel-7.repo
|
||||||
|
$ sudo yum install ripgrep
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're a **Nix** user, you can install `ripgrep` from
|
If you're a **Nix** user, you can install `ripgrep` from
|
||||||
@@ -140,7 +225,21 @@ $ nix-env --install ripgrep
|
|||||||
$ # (Or using the attribute name, which is also `ripgrep`.)
|
$ # (Or using the attribute name, which is also `ripgrep`.)
|
||||||
```
|
```
|
||||||
|
|
||||||
If you're a **Rust programmer**, `ripgrep` can be installed with `cargo`:
|
If you're an **Ubuntu** user, `ripgrep` can be installed from the `snap` store.
|
||||||
|
* Note that if you are using `16.04 LTS` or later, snap is already installed.
|
||||||
|
* For older versions you can install snap using
|
||||||
|
[this guide](https://docs.snapcraft.io/core/install-ubuntu).
|
||||||
|
|
||||||
|
```
|
||||||
|
sudo snap install rg
|
||||||
|
```
|
||||||
|
|
||||||
|
If you're a **Rust programmer**, `ripgrep` can be installed with `cargo`.
|
||||||
|
* Note that the minimum supported version of Rust for ripgrep is **1.17**,
|
||||||
|
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
|
||||||
|
the file size, run `strip` on the binary.
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cargo install ripgrep
|
$ cargo install ripgrep
|
||||||
@@ -151,7 +250,7 @@ $ cargo install ripgrep
|
|||||||
|
|
||||||
### Whirlwind tour
|
### Whirlwind tour
|
||||||
|
|
||||||
The command line usage of `ripgrep` doesn't differ much from other tools that
|
The command-line usage of `ripgrep` doesn't differ much from other tools that
|
||||||
perform a similar function, so you probably already know how to use `ripgrep`.
|
perform a similar function, so you probably already know how to use `ripgrep`.
|
||||||
The full details can be found in `rg --help`, but let's go on a whirlwind tour.
|
The full details can be found in `rg --help`, but let's go on a whirlwind tour.
|
||||||
|
|
||||||
@@ -160,11 +259,10 @@ colorize your output and show line numbers, just like The Silver Searcher.
|
|||||||
Coloring works on Windows too! Colors can be controlled more granularly with
|
Coloring works on Windows too! Colors can be controlled more granularly with
|
||||||
the `--color` flag.
|
the `--color` flag.
|
||||||
|
|
||||||
One last thing before we get started: `ripgrep` assumes UTF-8 *everywhere*. It
|
One last thing before we get started: generally speaking, `ripgrep` assumes the
|
||||||
can still search files that are invalid UTF-8 (like, say, latin-1), but it will
|
input it is reading to be UTF-8. However, if ripgrep notices a file is encoded as
|
||||||
simply not work on UTF-16 encoded files or other more exotic encodings.
|
UTF-16, then it will know how to search it. For other encodings, you'll need to
|
||||||
[Support for other encodings may
|
explicitly specify them with the `-E/--encoding` flag.
|
||||||
happen.](https://github.com/BurntSushi/ripgrep/issues/1)
|
|
||||||
|
|
||||||
To recursively search the current directory, while respecting all `.gitignore`
|
To recursively search the current directory, while respecting all `.gitignore`
|
||||||
files, ignore hidden files and directories and skip binary files:
|
files, ignore hidden files and directories and skip binary files:
|
||||||
@@ -230,6 +328,12 @@ Or exclude files matching a particular glob:
|
|||||||
$ rg foo -g '!*.min.js'
|
$ rg foo -g '!*.min.js'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Search and return paths matching a particular glob (i.e., `-g` flag in ag/ack):
|
||||||
|
|
||||||
|
```
|
||||||
|
$ rg -g 'doc*' --files
|
||||||
|
```
|
||||||
|
|
||||||
Search only HTML and CSS files:
|
Search only HTML and CSS files:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -258,11 +362,28 @@ extensions.
|
|||||||
The syntax supported is
|
The syntax supported is
|
||||||
[documented as part of Rust's regex library](https://doc.rust-lang.org/regex/regex/index.html#syntax).
|
[documented as part of Rust's regex library](https://doc.rust-lang.org/regex/regex/index.html#syntax).
|
||||||
|
|
||||||
|
### Shell completions
|
||||||
|
|
||||||
|
Shell completion files are included in the release tarball for Bash, Fish, Zsh
|
||||||
|
and PowerShell.
|
||||||
|
|
||||||
|
For **bash**, move `complete/rg.bash-completion` to `$XDG_CONFIG_HOME/bash_completion`
|
||||||
|
or `/etc/bash_completion.d/`.
|
||||||
|
|
||||||
|
For **fish**, move `complete/rg.fish` to `$HOME/.config/fish/completions/`.
|
||||||
|
|
||||||
|
For **PowerShell**, add `. _rg.ps1` to your PowerShell
|
||||||
|
[profile](https://technet.microsoft.com/en-us/library/bb613488(v=vs.85).aspx)
|
||||||
|
(note the leading period). If the `_rg.ps1` file is not on your `PATH`, do
|
||||||
|
`. /path/to/_rg.ps1` instead.
|
||||||
|
|
||||||
|
For **zsh**, move `complete/_rg` to one of your `$fpath` directories.
|
||||||
|
|
||||||
### Building
|
### Building
|
||||||
|
|
||||||
`ripgrep` is written in Rust, so you'll need to grab a
|
`ripgrep` is written in Rust, so you'll need to grab a
|
||||||
[Rust installation](https://www.rust-lang.org/) in order to compile it.
|
[Rust installation](https://www.rust-lang.org/) in order to compile it.
|
||||||
`ripgrep` compiles with Rust 1.9 (stable) or newer. Building is easy:
|
`ripgrep` compiles with Rust 1.17 (stable) or newer. Building is easy:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ git clone https://github.com/BurntSushi/ripgrep
|
$ git clone https://github.com/BurntSushi/ripgrep
|
||||||
@@ -276,12 +397,15 @@ If you have a Rust nightly compiler, then you can enable optional SIMD
|
|||||||
acceleration like so:
|
acceleration like so:
|
||||||
|
|
||||||
```
|
```
|
||||||
RUSTFLAGS="-C target-cpu=native" cargo build --release --features simd-accel
|
RUSTFLAGS="-C target-cpu=native" cargo build --release --features 'simd-accel avx-accel'
|
||||||
```
|
```
|
||||||
|
|
||||||
|
If your machine doesn't support AVX instructions, then simply remove
|
||||||
|
`avx-accel` from the features list. Similarly for SIMD.
|
||||||
|
|
||||||
### Running tests
|
### Running tests
|
||||||
|
|
||||||
`ripgrep` is relatively well tested, including both unit tests and integration
|
`ripgrep` is relatively well-tested, including both unit tests and integration
|
||||||
tests. To run the full test suite, use:
|
tests. To run the full test suite, use:
|
||||||
|
|
||||||
```
|
```
|
||||||
@@ -289,3 +413,134 @@ $ cargo test
|
|||||||
```
|
```
|
||||||
|
|
||||||
from the repository root.
|
from the repository root.
|
||||||
|
|
||||||
|
### Tips
|
||||||
|
|
||||||
|
#### Windows Powershell
|
||||||
|
|
||||||
|
##### Powershell Profile
|
||||||
|
|
||||||
|
To customize powershell on start-up, there is a special powershell script that has to be created.
|
||||||
|
In order to find its location, type `$profile`
|
||||||
|
See [more](https://technet.microsoft.com/en-us/library/bb613488(v=vs.85).aspx) for profile details.
|
||||||
|
|
||||||
|
Any powershell code in this file gets evaluated at the start of console.
|
||||||
|
This way you can have own aliases to be created at start.
|
||||||
|
|
||||||
|
##### Setup function alias
|
||||||
|
|
||||||
|
Often you can find a need to make alias for the favourite utility.
|
||||||
|
|
||||||
|
But powershell function aliases do not behave like your typical linux shell alias.
|
||||||
|
|
||||||
|
You always need to propagate arguments and **Stdin** input.
|
||||||
|
But it cannot be done simply as `function grep() { $input | rg.exe --hidden $args }`
|
||||||
|
|
||||||
|
Use below example as reference to how setup alias in powershell.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
function grep {
|
||||||
|
$count = @($input).Count
|
||||||
|
$input.Reset()
|
||||||
|
|
||||||
|
if ($count) {
|
||||||
|
$input | rg.exe --hidden $args
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
rg.exe --hidden $args
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Powershell special variables:
|
||||||
|
* input - is powershell **Stdin** object that allows you to access its content.
|
||||||
|
* args - is array of arguments passed to this function.
|
||||||
|
|
||||||
|
This alias checks whether there is **Stdin** input and propagates only if there is some lines.
|
||||||
|
Otherwise empty `$input` will make powershell to trigger `rg` to search empty **Stdin**
|
||||||
|
|
||||||
|
##### Piping non-ASCII content to ripgrep
|
||||||
|
|
||||||
|
When piping input into native executables in PowerShell, the encoding of the
|
||||||
|
input is controlled by the `$OutputEncoding` variable. By default, this is set
|
||||||
|
to US-ASCII, and any characters in the pipeline that don't have encodings in
|
||||||
|
US-ASCII are converted to `?` (question mark) characters.
|
||||||
|
|
||||||
|
To change this setting, set `$OutputEncoding` to a different encoding, as
|
||||||
|
represented by a .NET encoding object. Some common examples are below. The
|
||||||
|
value of this variable is reset when PowerShell restarts, so to make this
|
||||||
|
change take effect every time PowerShell is started add a line setting the
|
||||||
|
variable into your PowerShell profile.
|
||||||
|
|
||||||
|
Example `$OutputEncoding` settings:
|
||||||
|
* UTF-8 without BOM: `$OutputEncoding = [System.Text.UTF8Encoding]::new()`
|
||||||
|
* The console's output encoding:
|
||||||
|
`$OutputEncoding = [System.Console]::OutputEncoding`
|
||||||
|
|
||||||
|
If you continue to have encoding problems, you can also force the encoding
|
||||||
|
that the console will use for printing to UTF-8 with
|
||||||
|
`[System.Console]::OutputEncoding = [System.Text.Encoding]::UTF8`. This
|
||||||
|
will also reset when PowerShell is restarted, so you can add that line
|
||||||
|
to your profile as well if you want to make the setting permanent.
|
||||||
|
|
||||||
|
#### How do I make the output look like ag's?
|
||||||
|
|
||||||
|
Use the `--colors` flag, like so:
|
||||||
|
|
||||||
|
rg --colors line:fg:yellow \
|
||||||
|
--colors line:style:bold \
|
||||||
|
--colors path:fg:green \
|
||||||
|
--colors path:style:bold \
|
||||||
|
--colors match:fg:black \
|
||||||
|
--colors match:bg:yellow \
|
||||||
|
--colors match:style:nobold \
|
||||||
|
foo
|
||||||
|
|
||||||
|
### Known issues
|
||||||
|
|
||||||
|
#### I just hit Ctrl+C in the middle of ripgrep's output and now my terminal's foreground color is wrong!
|
||||||
|
|
||||||
|
Type in `color` in cmd.exe (Command Prompt) and `echo -ne "\033[0m"` on Unix
|
||||||
|
to restore your original foreground color.
|
||||||
|
|
||||||
|
In PowerShell, you can add the following code to your profile which will
|
||||||
|
restore the original foreground color when `Reset-ForegroundColor` is called.
|
||||||
|
Including the `Set-Alias` line will allow you to call it with simply `color`.
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
$OrigFgColor = $Host.UI.RawUI.ForegroundColor
|
||||||
|
function Reset-ForegroundColor {
|
||||||
|
$Host.UI.RawUI.ForegroundColor = $OrigFgColor
|
||||||
|
}
|
||||||
|
Set-Alias -Name color -Value Reset-ForegroundColor
|
||||||
|
```
|
||||||
|
|
||||||
|
PR [#187](https://github.com/BurntSushi/ripgrep/pull/187) fixed this, and it
|
||||||
|
was later deprecated in
|
||||||
|
[#281](https://github.com/BurntSushi/ripgrep/issues/281). A full explanation is
|
||||||
|
available [here][msys issue explanation].
|
||||||
|
|
||||||
|
[msys issue explanation]: https://github.com/BurntSushi/ripgrep/issues/281#issuecomment-269093893
|
||||||
|
|
||||||
|
#### When I run `rg` it executes some other command!
|
||||||
|
|
||||||
|
It's likely that you have a shell alias or even another tool called `rg` which
|
||||||
|
is interfering with `ripgrep` — run `which rg` to see what it is.
|
||||||
|
|
||||||
|
(Notably, the `rails` plug-in for
|
||||||
|
[Oh My Zsh](https://github.com/robbyrussell/oh-my-zsh/wiki/Plugins#rails) sets
|
||||||
|
up an `rg` alias for `rails generate`.)
|
||||||
|
|
||||||
|
Problems like this can be resolved in one of several ways:
|
||||||
|
|
||||||
|
* If you're using the OMZ `rails` plug-in, disable it by editing the `plugins`
|
||||||
|
array in your zsh configuration.
|
||||||
|
* Temporarily bypass an existing `rg` alias by calling `ripgrep` as
|
||||||
|
`command rg`, `\rg`, or `'rg'`.
|
||||||
|
* Temporarily bypass an existing alias or another tool named `rg` by calling
|
||||||
|
`ripgrep` by its full path (e.g., `/usr/bin/rg` or `/usr/local/bin/rg`).
|
||||||
|
* Permanently disable an existing `rg` alias by adding `unalias rg` to the
|
||||||
|
bottom of your shell configuration file (e.g., `.bash_profile` or `.zshrc`).
|
||||||
|
* Give `ripgrep` its own alias that doesn't conflict with other tools/aliases by
|
||||||
|
adding a line like the following to the bottom of your shell configuration
|
||||||
|
file: `alias ripgrep='command rg'`
|
||||||
|
|||||||
29
appveyor.yml
29
appveyor.yml
@@ -1,6 +1,23 @@
|
|||||||
|
# Inspired from https://github.com/habitat-sh/habitat/blob/master/appveyor.yml
|
||||||
|
cache:
|
||||||
|
- c:\cargo\registry
|
||||||
|
- c:\cargo\git
|
||||||
|
- c:\projects\ripgrep\target
|
||||||
|
|
||||||
|
init:
|
||||||
|
- mkdir c:\cargo
|
||||||
|
- mkdir c:\rustup
|
||||||
|
- SET PATH=c:\cargo\bin;%PATH%
|
||||||
|
|
||||||
|
clone_folder: c:\projects\ripgrep
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
|
CARGO_HOME: "c:\\cargo"
|
||||||
|
RUSTUP_HOME: "c:\\rustup"
|
||||||
|
CARGO_TARGET_DIR: "c:\\projects\\ripgrep\\target"
|
||||||
global:
|
global:
|
||||||
PROJECT_NAME: ripgrep
|
PROJECT_NAME: ripgrep
|
||||||
|
RUST_BACKTRACE: full
|
||||||
matrix:
|
matrix:
|
||||||
- TARGET: i686-pc-windows-gnu
|
- TARGET: i686-pc-windows-gnu
|
||||||
CHANNEL: stable
|
CHANNEL: stable
|
||||||
@@ -11,12 +28,14 @@ environment:
|
|||||||
- TARGET: x86_64-pc-windows-msvc
|
- TARGET: x86_64-pc-windows-msvc
|
||||||
CHANNEL: stable
|
CHANNEL: stable
|
||||||
|
|
||||||
|
matrix:
|
||||||
|
fast_finish: true
|
||||||
|
|
||||||
# Install Rust and Cargo
|
# Install Rust and Cargo
|
||||||
# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml)
|
# (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml)
|
||||||
install:
|
install:
|
||||||
- curl -sSf -o rustup-init.exe https://win.rustup.rs/
|
- curl -sSf -o rustup-init.exe https://win.rustup.rs/
|
||||||
- rustup-init.exe -y --default-host %TARGET%
|
- rustup-init.exe -y --default-host %TARGET% --no-modify-path
|
||||||
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin
|
|
||||||
- if defined MSYS2_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS2_BITS%\bin
|
- if defined MSYS2_BITS set PATH=%PATH%;C:\msys64\mingw%MSYS2_BITS%\bin
|
||||||
- rustc -V
|
- rustc -V
|
||||||
- cargo -V
|
- cargo -V
|
||||||
@@ -27,10 +46,7 @@ build: false
|
|||||||
# Equivalent to Travis' `script` phase
|
# Equivalent to Travis' `script` phase
|
||||||
# TODO modify this phase as you see fit
|
# TODO modify this phase as you see fit
|
||||||
test_script:
|
test_script:
|
||||||
- cargo test --verbose
|
- cargo test --verbose --all
|
||||||
- cargo test --verbose --manifest-path grep/Cargo.toml
|
|
||||||
- cargo test --verbose --manifest-path globset/Cargo.toml
|
|
||||||
- cargo test --verbose --manifest-path ignore/Cargo.toml
|
|
||||||
|
|
||||||
before_deploy:
|
before_deploy:
|
||||||
# Generate artifacts for release
|
# Generate artifacts for release
|
||||||
@@ -38,6 +54,7 @@ before_deploy:
|
|||||||
- cargo build --release
|
- cargo build --release
|
||||||
- mkdir staging
|
- mkdir staging
|
||||||
- copy target\release\rg.exe staging
|
- copy target\release\rg.exe staging
|
||||||
|
- ps: copy target\release\build\ripgrep-*\out\_rg.ps1 staging
|
||||||
- cd staging
|
- cd staging
|
||||||
# release zipfile will look like 'rust-everywhere-v1.2.3-x86_64-pc-windows-msvc'
|
# release zipfile will look like 'rust-everywhere-v1.2.3-x86_64-pc-windows-msvc'
|
||||||
- 7z a ../%PROJECT_NAME%-%APPVEYOR_REPO_TAG_NAME%-%TARGET%.zip *
|
- 7z a ../%PROJECT_NAME%-%APPVEYOR_REPO_TAG_NAME%-%TARGET%.zip *
|
||||||
|
|||||||
@@ -26,10 +26,10 @@ SUBTITLES_DIR = 'subtitles'
|
|||||||
SUBTITLES_EN_NAME = 'OpenSubtitles2016.raw.en'
|
SUBTITLES_EN_NAME = 'OpenSubtitles2016.raw.en'
|
||||||
SUBTITLES_EN_NAME_SAMPLE = 'OpenSubtitles2016.raw.sample.en'
|
SUBTITLES_EN_NAME_SAMPLE = 'OpenSubtitles2016.raw.sample.en'
|
||||||
SUBTITLES_EN_NAME_GZ = '%s.gz' % SUBTITLES_EN_NAME
|
SUBTITLES_EN_NAME_GZ = '%s.gz' % SUBTITLES_EN_NAME
|
||||||
SUBTITLES_EN_URL = 'http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.en.gz'
|
SUBTITLES_EN_URL = 'http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.en.gz' # noqa
|
||||||
SUBTITLES_RU_NAME = 'OpenSubtitles2016.raw.ru'
|
SUBTITLES_RU_NAME = 'OpenSubtitles2016.raw.ru'
|
||||||
SUBTITLES_RU_NAME_GZ = '%s.gz' % SUBTITLES_RU_NAME
|
SUBTITLES_RU_NAME_GZ = '%s.gz' % SUBTITLES_RU_NAME
|
||||||
SUBTITLES_RU_URL = 'http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.ru.gz'
|
SUBTITLES_RU_URL = 'http://opus.lingfil.uu.se/OpenSubtitles2016/mono/OpenSubtitles2016.raw.ru.gz' # noqa
|
||||||
|
|
||||||
LINUX_DIR = 'linux'
|
LINUX_DIR = 'linux'
|
||||||
LINUX_CLONE = 'git://github.com/BurntSushi/linux'
|
LINUX_CLONE = 'git://github.com/BurntSushi/linux'
|
||||||
@@ -755,7 +755,8 @@ class Benchmark(object):
|
|||||||
|
|
||||||
def __init__(self, name=None, pattern=None, commands=None,
|
def __init__(self, name=None, pattern=None, commands=None,
|
||||||
warmup_count=1, count=3, line_count=True,
|
warmup_count=1, count=3, line_count=True,
|
||||||
allow_missing_commands=False):
|
allow_missing_commands=False,
|
||||||
|
disabled_cmds=None):
|
||||||
'''
|
'''
|
||||||
Create a single benchmark.
|
Create a single benchmark.
|
||||||
|
|
||||||
@@ -786,6 +787,11 @@ class Benchmark(object):
|
|||||||
:param bool line_count:
|
:param bool line_count:
|
||||||
When set, the lines of each search are counted and included
|
When set, the lines of each search are counted and included
|
||||||
in the samples produced.
|
in the samples produced.
|
||||||
|
:param bool allow_missing_commands:
|
||||||
|
When set, if a command is missing, then the benchmark
|
||||||
|
will simply skip it.
|
||||||
|
:param list(str) disabled_cmds:
|
||||||
|
A list of commands to skip.
|
||||||
'''
|
'''
|
||||||
self.name = name
|
self.name = name
|
||||||
self.pattern = pattern
|
self.pattern = pattern
|
||||||
@@ -794,6 +800,7 @@ class Benchmark(object):
|
|||||||
self.count = count
|
self.count = count
|
||||||
self.line_count = line_count
|
self.line_count = line_count
|
||||||
self.allow_missing_commands = allow_missing_commands
|
self.allow_missing_commands = allow_missing_commands
|
||||||
|
self.disabled_cmds = set(disabled_cmds or [])
|
||||||
|
|
||||||
def raise_if_missing(self):
|
def raise_if_missing(self):
|
||||||
'''
|
'''
|
||||||
@@ -804,8 +811,11 @@ class Benchmark(object):
|
|||||||
least one command in this benchmark could not be found on this
|
least one command in this benchmark could not be found on this
|
||||||
system.
|
system.
|
||||||
'''
|
'''
|
||||||
missing_commands = \
|
missing_commands = []
|
||||||
[c.binary_name for c in self.commands if not c.exists()]
|
for c in self.commands:
|
||||||
|
if c.binary_name in self.disabled_cmds or c.exists():
|
||||||
|
continue
|
||||||
|
missing_commands.append(c.binary_name)
|
||||||
if not self.allow_missing_commands and len(missing_commands) > 0:
|
if not self.allow_missing_commands and len(missing_commands) > 0:
|
||||||
raise MissingCommands(missing_commands)
|
raise MissingCommands(missing_commands)
|
||||||
|
|
||||||
@@ -821,6 +831,8 @@ class Benchmark(object):
|
|||||||
self.raise_if_missing()
|
self.raise_if_missing()
|
||||||
result = Result(self)
|
result = Result(self)
|
||||||
for cmd in self.commands:
|
for cmd in self.commands:
|
||||||
|
if cmd.binary_name in self.disabled_cmds:
|
||||||
|
continue
|
||||||
if self.allow_missing_commands and not cmd.exists():
|
if self.allow_missing_commands and not cmd.exists():
|
||||||
# Skip this command if we're OK with it.
|
# Skip this command if we're OK with it.
|
||||||
continue
|
continue
|
||||||
@@ -849,7 +861,7 @@ class Benchmark(object):
|
|||||||
:rtype: int
|
:rtype: int
|
||||||
'''
|
'''
|
||||||
if not cmd.exists():
|
if not cmd.exists():
|
||||||
raise MissingCommand(cmd.cmd[0])
|
raise MissingCommands([cmd.cmd[0]])
|
||||||
cmd.kwargs['stderr'] = subprocess.DEVNULL
|
cmd.kwargs['stderr'] = subprocess.DEVNULL
|
||||||
if self.line_count:
|
if self.line_count:
|
||||||
cmd.kwargs['stdout'] = subprocess.PIPE
|
cmd.kwargs['stdout'] = subprocess.PIPE
|
||||||
@@ -936,8 +948,9 @@ class Result(object):
|
|||||||
A dictionary from command name to a set of line
|
A dictionary from command name to a set of line
|
||||||
counts recorded.
|
counts recorded.
|
||||||
'''
|
'''
|
||||||
return {s['line_count'] for s in self.samples_for(cmd)
|
return {s['line_count']
|
||||||
if s['line_count'] is not None}
|
for s in self.samples_for(cmd)
|
||||||
|
if s['line_count'] is not None}
|
||||||
|
|
||||||
def distribution_for(self, cmd):
|
def distribution_for(self, cmd):
|
||||||
'''
|
'''
|
||||||
@@ -1069,7 +1082,7 @@ def download_subtitles_en(suite_dir):
|
|||||||
if not os.path.exists(en_path):
|
if not os.path.exists(en_path):
|
||||||
if not os.path.exists(en_path_gz):
|
if not os.path.exists(en_path_gz):
|
||||||
run_cmd(['curl', '-LO', SUBTITLES_EN_URL], cwd=subtitle_dir)
|
run_cmd(['curl', '-LO', SUBTITLES_EN_URL], cwd=subtitle_dir)
|
||||||
run_cmd(['gunzip', en_path_gz], cwd=subtitle_dir)
|
run_cmd(['gunzip', en_path_gz])
|
||||||
if not os.path.exists(en_path_sample):
|
if not os.path.exists(en_path_sample):
|
||||||
# Get a sample roughly the same size as the Russian corpus so that
|
# Get a sample roughly the same size as the Russian corpus so that
|
||||||
# benchmarks finish in a reasonable time.
|
# benchmarks finish in a reasonable time.
|
||||||
@@ -1096,7 +1109,7 @@ def download_subtitles_ru(suite_dir):
|
|||||||
if not os.path.exists(ru_path):
|
if not os.path.exists(ru_path):
|
||||||
if not os.path.exists(ru_path_gz):
|
if not os.path.exists(ru_path_gz):
|
||||||
run_cmd(['curl', '-LO', SUBTITLES_RU_URL], cwd=subtitle_dir)
|
run_cmd(['curl', '-LO', SUBTITLES_RU_URL], cwd=subtitle_dir)
|
||||||
run_cmd(['gunzip', ru_path_gz], cwd=subtitle_dir)
|
run_cmd(['gunzip', ru_path_gz])
|
||||||
|
|
||||||
|
|
||||||
def has_subtitles_ru(suite_dir):
|
def has_subtitles_ru(suite_dir):
|
||||||
@@ -1135,6 +1148,7 @@ def download(suite_dir, choices):
|
|||||||
|
|
||||||
def collect_benchmarks(suite_dir, filter_pat=None,
|
def collect_benchmarks(suite_dir, filter_pat=None,
|
||||||
allow_missing_commands=False,
|
allow_missing_commands=False,
|
||||||
|
disabled_cmds=None,
|
||||||
warmup_iter=1, bench_iter=3):
|
warmup_iter=1, bench_iter=3):
|
||||||
'''
|
'''
|
||||||
Return an iterable of all runnable benchmarks.
|
Return an iterable of all runnable benchmarks.
|
||||||
@@ -1161,6 +1175,7 @@ def collect_benchmarks(suite_dir, filter_pat=None,
|
|||||||
benchmark.warmup_count = warmup_iter
|
benchmark.warmup_count = warmup_iter
|
||||||
benchmark.count = bench_iter
|
benchmark.count = bench_iter
|
||||||
benchmark.allow_missing_commands = allow_missing_commands
|
benchmark.allow_missing_commands = allow_missing_commands
|
||||||
|
benchmark.disabled_cmds = disabled_cmds
|
||||||
benchmark.raise_if_missing()
|
benchmark.raise_if_missing()
|
||||||
except MissingDependencies as e:
|
except MissingDependencies as e:
|
||||||
eprint(
|
eprint(
|
||||||
@@ -1169,6 +1184,7 @@ def collect_benchmarks(suite_dir, filter_pat=None,
|
|||||||
name,
|
name,
|
||||||
' '.join(['--download %s' % n for n in e.missing_names]),
|
' '.join(['--download %s' % n for n in e.missing_names]),
|
||||||
))
|
))
|
||||||
|
continue
|
||||||
except MissingCommands as e:
|
except MissingCommands as e:
|
||||||
fmt = 'missing commands: %s, skipping benchmark %s ' \
|
fmt = 'missing commands: %s, skipping benchmark %s ' \
|
||||||
'(run with --allow-missing to run incomplete benchmarks)'
|
'(run with --allow-missing to run incomplete benchmarks)'
|
||||||
@@ -1195,6 +1211,8 @@ def main():
|
|||||||
p.add_argument(
|
p.add_argument(
|
||||||
'--allow-missing', action='store_true',
|
'--allow-missing', action='store_true',
|
||||||
help='Permit benchmarks to run even if some commands are missing.')
|
help='Permit benchmarks to run even if some commands are missing.')
|
||||||
|
p.add_argument(
|
||||||
|
'--disabled', help='A list of comma separated commands to skip.')
|
||||||
p.add_argument(
|
p.add_argument(
|
||||||
'-f', '--force', action='store_true',
|
'-f', '--force', action='store_true',
|
||||||
help='Overwrite existing files if there is a conflict.')
|
help='Overwrite existing files if there is a conflict.')
|
||||||
@@ -1222,6 +1240,7 @@ def main():
|
|||||||
benchmarks = collect_benchmarks(
|
benchmarks = collect_benchmarks(
|
||||||
args.dir, filter_pat=args.bench,
|
args.dir, filter_pat=args.bench,
|
||||||
allow_missing_commands=args.allow_missing,
|
allow_missing_commands=args.allow_missing,
|
||||||
|
disabled_cmds=(args.disabled or '').split(','),
|
||||||
warmup_iter=args.warmup_iter, bench_iter=args.bench_iter)
|
warmup_iter=args.warmup_iter, bench_iter=args.bench_iter)
|
||||||
for b in benchmarks:
|
for b in benchmarks:
|
||||||
print(b.name)
|
print(b.name)
|
||||||
@@ -1248,6 +1267,7 @@ def main():
|
|||||||
benchmarks = collect_benchmarks(
|
benchmarks = collect_benchmarks(
|
||||||
args.dir, filter_pat=args.bench,
|
args.dir, filter_pat=args.bench,
|
||||||
allow_missing_commands=args.allow_missing,
|
allow_missing_commands=args.allow_missing,
|
||||||
|
disabled_cmds=(args.disabled or '').split(','),
|
||||||
warmup_iter=args.warmup_iter, bench_iter=args.bench_iter)
|
warmup_iter=args.warmup_iter, bench_iter=args.bench_iter)
|
||||||
for i, b in enumerate(benchmarks):
|
for i, b in enumerate(benchmarks):
|
||||||
result = b.run()
|
result = b.run()
|
||||||
@@ -1265,8 +1285,6 @@ def main():
|
|||||||
if mean is None:
|
if mean is None:
|
||||||
# If we couldn't get a distribution for this command then
|
# If we couldn't get a distribution for this command then
|
||||||
# it was skipped.
|
# it was skipped.
|
||||||
print('{name:{pad}} SKIPPED'.format(
|
|
||||||
name=name, pad=max_name_len + 2))
|
|
||||||
continue
|
continue
|
||||||
line_counts = result.line_counts_for(cmd)
|
line_counts = result.line_counts_for(cmd)
|
||||||
show_fast_cmd, show_line_counts = '', ''
|
show_fast_cmd, show_line_counts = '', ''
|
||||||
|
|||||||
@@ -0,0 +1,157 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09452986717224121,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08666801452636719,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08859610557556152,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07011771202087402,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06441712379455566,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06532430648803711,68,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10056233406066895,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09930968284606934,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09773039817810059,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07829093933105469,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0827643871307373,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08210110664367676,160,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06728911399841309,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06839728355407715,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.0736091136932373,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3859975337982178,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38575077056884766,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.4032607078552246,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.0657193660736084,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058367013931274414,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05761837959289551,16,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07888174057006836,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08236145973205566,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07680559158325195,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3796377182006836,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3852665424346924,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.387775182723999,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06758904457092285,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06706357002258301,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07329010963439941,370,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06952190399169922,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06766009330749512,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06621623039245605,16,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.29076576232910156,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3039717674255371,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3147861957550049,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16966867446899414,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16578006744384766,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16440153121948242,490,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2742593288421631,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27411365509033203,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2799038887023926,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15713810920715332,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15285205841064453,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.14862322807312012,419,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06728196144104004,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06869316101074219,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07347917556762695,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05894923210144043,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0584101676940918,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05851030349731445,1630,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16553878784179688,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16529393196105957,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16843223571777344,23,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16363120079040527,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16463160514831543,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16590571403503418,103,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07585549354553223,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07546257972717285,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07645726203918457,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.0733344554901123,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07160758972167969,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07302546501159668,174,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06922054290771484,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06507658958435059,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06478118896484375,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06373715400695801,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06354117393493652,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06615662574768066,168,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07121825218200684,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07050347328186035,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07254600524902344,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06099557876586914,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.061118364334106445,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.062296390533447266,6,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2724471092224121,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26970720291137695,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2697625160217285,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21796512603759766,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32093358039855957,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.35228729248046875,848,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2418622970581055,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2306008338928223,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.1873059272766113,862,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22467422485351562,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23565077781677246,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21903586387634277,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19292092323303223,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19452929496765137,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1927196979522705,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28882503509521484,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29108643531799316,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29820847511291504,629,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32578349113464355,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2801830768585205,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41840386390686035,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.42424988746643066,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3513953685760498,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.35476160049438477,642,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2841978073120117,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18991756439208984,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.296999454498291,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2810351848602295,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27904558181762695,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28331899642944336,629,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.065884590148926,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9066839218139648,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8898587226867676,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8937196731567383,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8904955387115479,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8846819400787354,13,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2928280830383301,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2243812084197998,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2868325710296631,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2832787036895752,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2892146110534668,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22050261497497559,317,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1501314640045166,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3660097122192383,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3461437225341797,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.281209945678711,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.287156343460083,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2730507850646973,691,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.712820529937744,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7904467582702637,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.657541036605835,735,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.28091931343078613,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2749307155609131,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.27948546409606934,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3499312400817871,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3630790710449219,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35364317893981934,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36719226837158203,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3705906867980957,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3758120536804199,583,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1964221000671387,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1625583171844482,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1898295879364014,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.168842077255249,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2533905506134033,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2375917434692383,604,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.27202439308166504,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.26978445053100586,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21065115928649902,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36217236518859863,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36077117919921875,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2883784770965576,579,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.496169090270996,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.315001964569092,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.3024141788482666,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0939135551452637,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.8922672271728516,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1002702713012695,,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3976116180419922,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.4013686180114746,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3070716857910156,278,
|
||||||
|
@@ -0,0 +1,126 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.090 +/- 0.004 (lines: 68)
|
||||||
|
rg (whitelist)* 0.067 +/- 0.003 (lines: 68)*
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.099 +/- 0.001 (lines: 160)
|
||||||
|
rg (whitelist)* 0.081 +/- 0.002 (lines: 160)*
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.070 +/- 0.003 (lines: 16)
|
||||||
|
rg (ignore) (mmap) 0.392 +/- 0.010 (lines: 16)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.004 (lines: 16)*
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.079 +/- 0.003 (lines: 370)
|
||||||
|
rg (ignore) (mmap) 0.384 +/- 0.004 (lines: 370)
|
||||||
|
rg (whitelist)* 0.069 +/- 0.003 (lines: 370)*
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.068 +/- 0.002 (lines: 16)*
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.303 +/- 0.012 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.167 +/- 0.003 (lines: 490)
|
||||||
|
rg (whitelist) 0.276 +/- 0.003 (lines: 419)
|
||||||
|
rg (whitelist) (ASCII)* 0.153 +/- 0.004 (lines: 419)*
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.070 +/- 0.003 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.059 +/- 0.000 (lines: 1630)*
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.166 +/- 0.002 (lines: 23)*
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg* 0.165 +/- 0.001 (lines: 103)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.076 +/- 0.001 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.073 +/- 0.001 (lines: 174)
|
||||||
|
rg (whitelist) 0.066 +/- 0.002 (lines: 180)
|
||||||
|
rg (whitelist) (ASCII)* 0.064 +/- 0.001 (lines: 168)*
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.071 +/- 0.001 (lines: 6)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.001 (lines: 6)*
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 0.271 +/- 0.002 (lines: 848)*
|
||||||
|
rg* 0.297 +/- 0.070 (lines: 848)
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 2.220 +/- 0.029 (lines: 862)*
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg 0.226 +/- 0.008 (lines: 629)
|
||||||
|
rg (no mmap)* 0.193 +/- 0.001 (lines: 629)*
|
||||||
|
rg (lines) 0.293 +/- 0.005 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.341 +/- 0.070 (lines: 642)*
|
||||||
|
rg (lines) 0.377 +/- 0.041 (lines: 642)
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII)* 0.257 +/- 0.058 (lines: 629)*
|
||||||
|
rg 0.281 +/- 0.002 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 1.954 +/- 0.097 (lines: 13)
|
||||||
|
rg (ASCII)* 1.890 +/- 0.005 (lines: 13)*
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg 0.268 +/- 0.038 (lines: 317)
|
||||||
|
rg (ASCII)* 0.264 +/- 0.038 (lines: 317)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines)* 1.287 +/- 0.119 (lines: 691)
|
||||||
|
rg 1.280 +/- 0.007 (lines: 691)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 3.720 +/- 0.067 (lines: 735)*
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.278 +/- 0.003 (lines: 583)*
|
||||||
|
rg (no mmap) 0.356 +/- 0.007 (lines: 583)
|
||||||
|
rg (lines) 0.371 +/- 0.004 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg* 1.183 +/- 0.018 (lines: 604)*
|
||||||
|
rg (lines) 1.220 +/- 0.045 (lines: 604)
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.251 +/- 0.035 (lines: 0)*
|
||||||
|
rg 0.337 +/- 0.042 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.371 +/- 0.108 (lines: 41)
|
||||||
|
rg (ASCII)* 3.029 +/- 0.118 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.369 +/- 0.053 (lines: 278)*
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09608030319213867,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08815908432006836,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08974266052246094,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06675052642822266,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06632375717163086,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06531620025634766,68,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09764790534973145,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10003781318664551,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10493707656860352,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07940077781677246,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07863998413085938,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07791614532470703,160,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06878829002380371,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06836318969726562,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07277226448059082,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.379986047744751,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.40039825439453125,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.39777183532714844,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.059081315994262695,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05873990058898926,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.0586698055267334,16,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07791399955749512,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.0774388313293457,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07851481437683105,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3788566589355469,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.385251522064209,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38781046867370605,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06934094429016113,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07142090797424316,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07115054130554199,370,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06683826446533203,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.0690450668334961,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06625819206237793,16,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2812047004699707,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2557988166809082,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2892444133758545,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16913127899169922,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16315627098083496,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16622567176818848,490,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2771792411804199,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2861213684082031,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2742443084716797,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15151619911193848,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15233445167541504,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1620476245880127,419,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07045555114746094,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07046008110046387,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07087540626525879,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06178712844848633,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0631401538848877,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0627889633178711,1630,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16510963439941406,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16919803619384766,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16366028785705566,23,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.17235875129699707,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16506695747375488,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16702055931091309,103,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07636308670043945,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.0767667293548584,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07441020011901855,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07776570320129395,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07788562774658203,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07390785217285156,174,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06318306922912598,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06787896156311035,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06569766998291016,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06557774543762207,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06389331817626953,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06407284736633301,168,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06868839263916016,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07014894485473633,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06822323799133301,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05816149711608887,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.0577540397644043,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06107187271118164,6,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38473939895629883,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2760040760040283,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.366499662399292,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32836484909057617,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3063969612121582,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3368823528289795,848,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2332417964935303,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0444729328155518,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0396711826324463,862,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.13685226440429688,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1380929946899414,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.13843274116516113,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.192030668258667,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1971268653869629,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2931783199310303,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2777669429779053,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28525233268737793,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22691082954406738,629,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.31324243545532227,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4144246578216553,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41251444816589355,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.492443323135376,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4691810607910156,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4890565872192383,642,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2987544536590576,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28134918212890625,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29971933364868164,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22062921524047852,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2716941833496094,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2172706127166748,629,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0828537940979004,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8791723251342773,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.079643964767456,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8388440608978271,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8970744609832764,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6844482421875,13,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28177690505981445,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29820775985717773,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2861142158508301,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22010159492492676,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22217011451721191,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2219986915588379,317,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.146566390991211,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3609087467193604,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1496453285217285,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.281858205795288,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.365553855895996,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2781758308410645,691,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.622640609741211,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7452948093414307,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.762295961380005,735,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.27922916412353516,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2578129768371582,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21048188209533691,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.34738945960998535,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.368546724319458,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35752224922180176,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2654876708984375,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2697427272796631,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3652024269104004,583,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.178579330444336,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1693329811096191,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.144824504852295,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0454356670379639,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0725409984588623,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2725732326507568,604,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20514369010925293,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18602967262268066,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2725963592529297,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35959553718566895,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36090755462646484,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35926032066345215,579,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.509491205215454,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.292212963104248,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4941117763519287,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0987064838409424,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1049976348876953,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.098233222961426,,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3214902877807617,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.38519954681396484,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3827836513519287,278,
|
||||||
|
@@ -0,0 +1,126 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.091 +/- 0.004 (lines: 68)
|
||||||
|
rg (whitelist)* 0.066 +/- 0.001 (lines: 68)*
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.101 +/- 0.004 (lines: 160)
|
||||||
|
rg (whitelist)* 0.079 +/- 0.001 (lines: 160)*
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.070 +/- 0.002 (lines: 16)
|
||||||
|
rg (ignore) (mmap) 0.393 +/- 0.011 (lines: 16)
|
||||||
|
rg (whitelist)* 0.059 +/- 0.000 (lines: 16)*
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.078 +/- 0.001 (lines: 370)
|
||||||
|
rg (ignore) (mmap) 0.384 +/- 0.005 (lines: 370)
|
||||||
|
rg (whitelist)* 0.071 +/- 0.001 (lines: 370)*
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.067 +/- 0.001 (lines: 16)*
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.275 +/- 0.017 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.166 +/- 0.003 (lines: 490)
|
||||||
|
rg (whitelist) 0.279 +/- 0.006 (lines: 419)
|
||||||
|
rg (whitelist) (ASCII)* 0.155 +/- 0.006 (lines: 419)*
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.071 +/- 0.000 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.063 +/- 0.001 (lines: 1630)*
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.166 +/- 0.003 (lines: 23)*
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg* 0.168 +/- 0.004 (lines: 103)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.076 +/- 0.001 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.077 +/- 0.002 (lines: 174)
|
||||||
|
rg (whitelist)* 0.066 +/- 0.002 (lines: 180)
|
||||||
|
rg (whitelist) (ASCII) 0.065 +/- 0.001 (lines: 168)*
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.069 +/- 0.001 (lines: 6)
|
||||||
|
rg (whitelist)* 0.059 +/- 0.002 (lines: 6)*
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines)* 0.342 +/- 0.058 (lines: 848)
|
||||||
|
rg 0.324 +/- 0.016 (lines: 848)*
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 2.106 +/- 0.110 (lines: 862)*
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg* 0.138 +/- 0.001 (lines: 629)*
|
||||||
|
rg (no mmap) 0.227 +/- 0.057 (lines: 629)
|
||||||
|
rg (lines) 0.263 +/- 0.032 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.380 +/- 0.058 (lines: 642)*
|
||||||
|
rg (lines) 0.484 +/- 0.013 (lines: 642)
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII) 0.293 +/- 0.010 (lines: 629)
|
||||||
|
rg* 0.237 +/- 0.030 (lines: 629)*
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 2.014 +/- 0.117 (lines: 13)
|
||||||
|
rg (ASCII)* 1.807 +/- 0.110 (lines: 13)*
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg 0.289 +/- 0.009 (lines: 317)
|
||||||
|
rg (ASCII)* 0.221 +/- 0.001 (lines: 317)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines)* 1.219 +/- 0.123 (lines: 691)*
|
||||||
|
rg 1.309 +/- 0.049 (lines: 691)
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 3.710 +/- 0.076 (lines: 735)*
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.249 +/- 0.035 (lines: 583)*
|
||||||
|
rg (no mmap) 0.358 +/- 0.011 (lines: 583)
|
||||||
|
rg (lines) 0.300 +/- 0.056 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg 1.164 +/- 0.017 (lines: 604)
|
||||||
|
rg (lines)* 1.130 +/- 0.124 (lines: 604)*
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.221 +/- 0.045 (lines: 0)*
|
||||||
|
rg 0.360 +/- 0.001 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.432 +/- 0.121 (lines: 41)
|
||||||
|
rg (ASCII)* 3.101 +/- 0.004 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.363 +/- 0.036 (lines: 278)*
|
||||||
@@ -0,0 +1,157 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10048675537109375,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09462523460388184,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0931856632232666,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06952047348022461,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07045698165893555,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06589603424072266,68,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09840559959411621,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0973203182220459,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09747123718261719,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07976746559143066,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07973408699035645,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0842599868774414,160,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06900453567504883,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06771540641784668,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07333683967590332,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38510584831237793,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38396191596984863,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.37463903427124023,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05757570266723633,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058022260665893555,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06006050109863281,16,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07654142379760742,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07764244079589844,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07787275314331055,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38339757919311523,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38019704818725586,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3887295722961426,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06747794151306152,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06868124008178711,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06679105758666992,370,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.07849764823913574,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.08336472511291504,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06723690032958984,16,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.25814294815063477,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.29274845123291016,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2985391616821289,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16458344459533691,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16898059844970703,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1756742000579834,490,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3002643585205078,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2709066867828369,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2683436870574951,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1489565372467041,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.14751625061035156,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1487743854522705,419,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06930160522460938,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07447147369384766,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07432723045349121,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06141376495361328,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06345224380493164,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05813455581665039,1630,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16566061973571777,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.17109084129333496,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16268444061279297,23,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16269755363464355,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16636371612548828,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16133809089660645,103,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07663178443908691,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07986211776733398,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07756590843200684,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07402157783508301,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07861495018005371,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07465910911560059,174,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06782341003417969,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06639862060546875,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06768679618835449,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06638240814208984,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06481051445007324,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06659054756164551,168,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06744074821472168,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06904149055480957,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07302141189575195,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05972766876220703,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.0587460994720459,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05879020690917969,6,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3649451732635498,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.37390756607055664,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3691575527191162,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3192598819732666,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3968648910522461,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.347275972366333,848,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.11361026763916,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9423036575317383,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9265573024749756,862,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21686100959777832,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23349666595458984,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2394559383392334,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2971608638763428,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2950170040130615,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2873063087463379,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2898998260498047,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21834325790405273,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2833542823791504,629,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3961493968963623,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.30686163902282715,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.44585490226745605,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.46064209938049316,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4497091770172119,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34823131561279297,642,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2819490432739258,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18886327743530273,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28542351722717285,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18991541862487793,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27848052978515625,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21271944046020508,629,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0810630321502686,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0093939304351807,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8533532619476318,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8952853679656982,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7897896766662598,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.893296480178833,13,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19786620140075684,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1896834373474121,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29248762130737305,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2933495044708252,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29410600662231445,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23128199577331543,317,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.343696117401123,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3544535636901855,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3534214496612549,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2638463973999023,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2450191974639893,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2779006958007812,691,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7900640964508057,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.812807321548462,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7412266731262207,735,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2562215328216553,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2781085968017578,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21145415306091309,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36469101905822754,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37107086181640625,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29900336265563965,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3739583492279053,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3521237373352051,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3766622543334961,583,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1903154850006104,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.196908950805664,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1714701652526855,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0471339225769043,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2229478359222412,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1774308681488037,604,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20592975616455078,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2680799961090088,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29538846015930176,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36015796661376953,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3006131649017334,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36701369285583496,579,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4495208263397217,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4749486446380615,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.29917049407959,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.0949668884277344,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1213910579681396,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.905003070831299,,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.39461803436279297,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3211812973022461,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3848116397857666,278,
|
||||||
|
@@ -0,0 +1,126 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.096 +/- 0.004 (lines: 68)
|
||||||
|
rg (whitelist)* 0.069 +/- 0.002 (lines: 68)*
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.098 +/- 0.001 (lines: 160)
|
||||||
|
rg (whitelist)* 0.081 +/- 0.003 (lines: 160)*
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.070 +/- 0.003 (lines: 16)
|
||||||
|
rg (ignore) (mmap) 0.381 +/- 0.006 (lines: 16)
|
||||||
|
rg (whitelist)* 0.059 +/- 0.001 (lines: 16)*
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.077 +/- 0.001 (lines: 370)
|
||||||
|
rg (ignore) (mmap) 0.384 +/- 0.004 (lines: 370)
|
||||||
|
rg (whitelist)* 0.068 +/- 0.001 (lines: 370)*
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.076 +/- 0.008 (lines: 16)*
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.283 +/- 0.022 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.170 +/- 0.006 (lines: 490)
|
||||||
|
rg (whitelist) 0.280 +/- 0.018 (lines: 419)
|
||||||
|
rg (whitelist) (ASCII)* 0.148 +/- 0.001 (lines: 419)*
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.073 +/- 0.003 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.003 (lines: 1630)*
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.166 +/- 0.004 (lines: 23)*
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg* 0.163 +/- 0.003 (lines: 103)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.078 +/- 0.002 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.076 +/- 0.002 (lines: 174)
|
||||||
|
rg (whitelist) 0.067 +/- 0.001 (lines: 180)
|
||||||
|
rg (whitelist) (ASCII)* 0.066 +/- 0.001 (lines: 168)*
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.070 +/- 0.003 (lines: 6)
|
||||||
|
rg (whitelist)* 0.059 +/- 0.001 (lines: 6)*
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 0.369 +/- 0.004 (lines: 848)
|
||||||
|
rg* 0.354 +/- 0.039 (lines: 848)*
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 1.994 +/- 0.104 (lines: 862)*
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg* 0.230 +/- 0.012 (lines: 629)*
|
||||||
|
rg (no mmap) 0.293 +/- 0.005 (lines: 629)
|
||||||
|
rg (lines) 0.264 +/- 0.040 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.383 +/- 0.070 (lines: 642)*
|
||||||
|
rg (lines) 0.420 +/- 0.062 (lines: 642)
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII)* 0.252 +/- 0.055 (lines: 629)
|
||||||
|
rg 0.227 +/- 0.046 (lines: 629)*
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 1.981 +/- 0.116 (lines: 13)
|
||||||
|
rg (ASCII)* 1.859 +/- 0.060 (lines: 13)*
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg* 0.227 +/- 0.057 (lines: 317)*
|
||||||
|
rg (ASCII) 0.273 +/- 0.036 (lines: 317)
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 1.351 +/- 0.006 (lines: 691)
|
||||||
|
rg* 1.262 +/- 0.016 (lines: 691)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 3.781 +/- 0.037 (lines: 735)*
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.249 +/- 0.034 (lines: 583)*
|
||||||
|
rg (no mmap) 0.345 +/- 0.040 (lines: 583)
|
||||||
|
rg (lines) 0.368 +/- 0.013 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg 1.186 +/- 0.013 (lines: 604)
|
||||||
|
rg (lines)* 1.149 +/- 0.091 (lines: 604)*
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.256 +/- 0.046 (lines: 0)*
|
||||||
|
rg 0.343 +/- 0.037 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.408 +/- 0.095 (lines: 41)
|
||||||
|
rg (ASCII)* 3.040 +/- 0.118 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.367 +/- 0.040 (lines: 278)*
|
||||||
157
benchsuite/runs/2016-12-24-archlinux-cheetah-musl-system/raw.csv
Normal file
157
benchsuite/runs/2016-12-24-archlinux-cheetah-musl-system/raw.csv
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09466052055358887,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09342074394226074,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0869603157043457,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06717634201049805,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06487321853637695,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06573486328125,68,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10077238082885742,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10428118705749512,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09920215606689453,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07973098754882812,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07897496223449707,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07888197898864746,160,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06830811500549316,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.0715939998626709,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06830549240112305,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3897213935852051,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.39376020431518555,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3769495487213135,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.060272932052612305,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058103322982788086,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06174445152282715,16,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07664990425109863,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07809257507324219,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08361077308654785,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38071417808532715,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.37515711784362793,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.38091325759887695,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06704211235046387,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06667947769165039,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06667375564575195,370,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06779932975769043,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06725239753723145,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06754946708679199,16,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2662222385406494,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30044007301330566,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30494165420532227,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17267060279846191,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16266226768493652,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16399097442626953,490,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.25603818893432617,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.26952672004699707,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2737579345703125,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.14797663688659668,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15069222450256348,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15210580825805664,419,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06923699378967285,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07373404502868652,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07130026817321777,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05809664726257324,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06291556358337402,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.062150001525878906,1630,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16234064102172852,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16682648658752441,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1634657382965088,23,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16612553596496582,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.1632983684539795,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16044902801513672,103,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07571697235107422,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07967901229858398,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07469820976257324,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07374238967895508,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07341313362121582,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07449674606323242,174,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06552338600158691,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06324410438537598,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0665595531463623,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06373834609985352,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06749844551086426,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06431031227111816,168,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.0686798095703125,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06870913505554199,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06892633438110352,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05895066261291504,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06163740158081055,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.058525800704956055,6,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34538722038269043,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.265763521194458,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26305389404296875,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20859956741333008,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20516705513000488,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20496821403503418,848,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2090365886688232,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.226768732070923,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.226130962371826,862,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.24144577980041504,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21985626220703125,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21775150299072266,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2918863296508789,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1962728500366211,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19310998916625977,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26285672187805176,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18955564498901367,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1910560131072998,629,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.40812134742736816,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.31265878677368164,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.31433773040771484,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3256862163543701,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32616353034973145,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.32959580421447754,642,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27936625480651855,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28154826164245605,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20779705047607422,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26377248764038086,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2896091938018799,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21306395530700684,629,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0740439891815186,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.875295639038086,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0514187812805176,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6831274032592773,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6856412887573242,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6853716373443604,13,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2878584861755371,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22226691246032715,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.294330358505249,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3013031482696533,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2214052677154541,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19563746452331543,317,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1506719589233398,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.345916509628296,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3316686153411865,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2255687713623047,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0810630321502686,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2861762046813965,691,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.666182279586792,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.730118751525879,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7910759449005127,735,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.265308141708374,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2775256633758545,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29873085021972656,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3600039482116699,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3705918788909912,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37277793884277344,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3728773593902588,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2903330326080322,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3601820468902588,583,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1635336875915527,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9739360809326172,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.155383825302124,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2030081748962402,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0454139709472656,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2500181198120117,604,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2797272205352783,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2795555591583252,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2683413028717041,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2863891124725342,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.35770344734191895,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3524661064147949,579,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.514166831970215,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4967641830444336,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.2882306575775146,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.8897318840026855,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1153793334960938,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.100428581237793,,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.4093492031097412,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.4054989814758301,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3883328437805176,278,
|
||||||
|
126
benchsuite/runs/2016-12-24-archlinux-cheetah-musl-system/summary
Normal file
126
benchsuite/runs/2016-12-24-archlinux-cheetah-musl-system/summary
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.092 +/- 0.004 (lines: 68)
|
||||||
|
rg (whitelist)* 0.066 +/- 0.001 (lines: 68)*
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.101 +/- 0.003 (lines: 160)
|
||||||
|
rg (whitelist)* 0.079 +/- 0.000 (lines: 160)*
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.069 +/- 0.002 (lines: 16)
|
||||||
|
rg (ignore) (mmap) 0.387 +/- 0.009 (lines: 16)
|
||||||
|
rg (whitelist)* 0.060 +/- 0.002 (lines: 16)*
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.079 +/- 0.004 (lines: 370)
|
||||||
|
rg (ignore) (mmap) 0.379 +/- 0.003 (lines: 370)
|
||||||
|
rg (whitelist)* 0.067 +/- 0.000 (lines: 370)*
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.068 +/- 0.000 (lines: 16)*
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.291 +/- 0.021 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.166 +/- 0.005 (lines: 490)
|
||||||
|
rg (whitelist) 0.266 +/- 0.009 (lines: 419)
|
||||||
|
rg (whitelist) (ASCII)* 0.150 +/- 0.002 (lines: 419)*
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.071 +/- 0.002 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.003 (lines: 1630)*
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.164 +/- 0.002 (lines: 23)*
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg* 0.163 +/- 0.003 (lines: 103)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.077 +/- 0.003 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.074 +/- 0.001 (lines: 174)
|
||||||
|
rg (whitelist)* 0.065 +/- 0.002 (lines: 180)*
|
||||||
|
rg (whitelist) (ASCII) 0.065 +/- 0.002 (lines: 168)
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.069 +/- 0.000 (lines: 6)
|
||||||
|
rg (whitelist)* 0.060 +/- 0.002 (lines: 6)*
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 0.291 +/- 0.047 (lines: 848)
|
||||||
|
rg* 0.206 +/- 0.002 (lines: 848)*
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 2.221 +/- 0.010 (lines: 862)*
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg 0.226 +/- 0.013 (lines: 629)
|
||||||
|
rg (no mmap) 0.227 +/- 0.056 (lines: 629)
|
||||||
|
rg (lines)* 0.214 +/- 0.042 (lines: 629)*
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.345 +/- 0.055 (lines: 642)
|
||||||
|
rg (lines) 0.327 +/- 0.002 (lines: 642)*
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII)* 0.256 +/- 0.042 (lines: 629)
|
||||||
|
rg 0.255 +/- 0.039 (lines: 629)*
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 2.000 +/- 0.109 (lines: 13)
|
||||||
|
rg (ASCII)* 1.685 +/- 0.001 (lines: 13)*
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg 0.268 +/- 0.040 (lines: 317)
|
||||||
|
rg (ASCII)* 0.239 +/- 0.055 (lines: 317)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 1.276 +/- 0.109 (lines: 691)
|
||||||
|
rg* 1.198 +/- 0.105 (lines: 691)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 3.729 +/- 0.062 (lines: 735)*
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.281 +/- 0.017 (lines: 583)*
|
||||||
|
rg (no mmap) 0.368 +/- 0.007 (lines: 583)
|
||||||
|
rg (lines) 0.341 +/- 0.044 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg* 1.098 +/- 0.107 (lines: 604)*
|
||||||
|
rg (lines) 1.166 +/- 0.107 (lines: 604)
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.276 +/- 0.007 (lines: 0)*
|
||||||
|
rg 0.332 +/- 0.040 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.433 +/- 0.126 (lines: 41)
|
||||||
|
rg (ASCII)* 3.035 +/- 0.126 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.401 +/- 0.011 (lines: 278)*
|
||||||
157
benchsuite/runs/2016-12-24-archlinux-cheetah/raw.csv
Normal file
157
benchsuite/runs/2016-12-24-archlinux-cheetah/raw.csv
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09865546226501465,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08865809440612793,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0934293270111084,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07241153717041016,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06905841827392578,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.06687068939208984,68,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1011350154876709,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1053009033203125,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10577726364135742,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0832066535949707,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0812225341796875,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08363056182861328,160,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07260608673095703,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06956887245178223,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.07262110710144043,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3854484558105469,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.3801109790802002,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.38498902320861816,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06220889091491699,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.059615373611450195,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.06207394599914551,16,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08192729949951172,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08037471771240234,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08067464828491211,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3890647888183594,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3882875442504883,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3826119899749756,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07255673408508301,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07240700721740723,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06744766235351562,370,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06866455078125,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06612515449523926,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06630897521972656,16,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30286335945129395,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2710304260253906,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30267834663391113,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16382431983947754,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1649789810180664,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16989731788635254,490,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3308746814727783,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27356576919555664,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2729830741882324,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16254186630249023,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15763211250305176,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15112638473510742,419,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07556724548339844,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07514452934265137,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.06890320777893066,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.061008453369140625,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06007099151611328,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.058913469314575195,1630,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1675281524658203,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1719217300415039,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1675257682800293,23,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16816997528076172,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16349577903747559,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.1649951934814453,103,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07944488525390625,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.08015990257263184,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07640767097473145,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.0741121768951416,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07456159591674805,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07508492469787598,174,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06891131401062012,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0655059814453125,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06730937957763672,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.0630197525024414,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06429147720336914,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06670451164245605,168,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07088422775268555,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06971001625061035,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.06918931007385254,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.05994749069213867,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06264781951904297,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.061440467834472656,6,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4529764652252197,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28824853897094727,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.287844181060791,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34439826011657715,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34816765785217285,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23656105995178223,848,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.026144027709961,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2452991008758545,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2087535858154297,862,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2194046974182129,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22587895393371582,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22500324249267578,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3005552291870117,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2805304527282715,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.30254316329956055,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2822296619415283,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2205369472503662,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23558998107910156,629,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4217369556427002,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4352266788482666,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3286154270172119,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4068911075592041,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4721720218658447,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.49277544021606445,642,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2922394275665283,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2809920310974121,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2835381031036377,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28315305709838867,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29279136657714844,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29344797134399414,629,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0767383575439453,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0589702129364014,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8731834888458252,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6820619106292725,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8845677375793457,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6996817588806152,13,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2987375259399414,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2955625057220459,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2865116596221924,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27387547492980957,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2899343967437744,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19668984413146973,317,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4088802337646484,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3826014995574951,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4164769649505615,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2548110485076904,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.080472707748413,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3337528705596924,691,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.449100971221924,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.747535467147827,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7990715503692627,735,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.21280717849731445,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18636178970336914,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2740190029144287,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36304640769958496,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3737907409667969,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37337779998779297,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2974729537963867,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2715010643005371,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36052799224853516,583,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.206491231918335,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.202974557876587,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.195291519165039,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2875757217407227,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2895469665527344,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.277585506439209,604,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2928614616394043,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2610359191894531,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2692301273345947,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36007237434387207,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.37184953689575195,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3902134895324707,579,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.2949090003967285,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.48958683013916,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.389604091644287,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.894768714904785,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.873474359512329,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.088130474090576,,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3918273448944092,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.38251543045043945,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2919657230377197,278,
|
||||||
|
126
benchsuite/runs/2016-12-24-archlinux-cheetah/summary
Normal file
126
benchsuite/runs/2016-12-24-archlinux-cheetah/summary
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.094 +/- 0.005 (lines: 68)
|
||||||
|
rg (whitelist)* 0.069 +/- 0.003 (lines: 68)*
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.104 +/- 0.003 (lines: 160)
|
||||||
|
rg (whitelist)* 0.083 +/- 0.001 (lines: 160)*
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.072 +/- 0.002 (lines: 16)
|
||||||
|
rg (ignore) (mmap) 0.384 +/- 0.003 (lines: 16)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.001 (lines: 16)*
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.081 +/- 0.001 (lines: 370)
|
||||||
|
rg (ignore) (mmap) 0.387 +/- 0.004 (lines: 370)
|
||||||
|
rg (whitelist)* 0.071 +/- 0.003 (lines: 370)*
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.067 +/- 0.001 (lines: 16)*
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.292 +/- 0.018 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.166 +/- 0.003 (lines: 490)
|
||||||
|
rg (whitelist) 0.292 +/- 0.033 (lines: 419)
|
||||||
|
rg (whitelist) (ASCII)* 0.157 +/- 0.006 (lines: 419)*
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.073 +/- 0.004 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.060 +/- 0.001 (lines: 1630)*
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.169 +/- 0.003 (lines: 23)*
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg* 0.166 +/- 0.002 (lines: 103)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.079 +/- 0.002 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.075 +/- 0.000 (lines: 174)
|
||||||
|
rg (whitelist) 0.067 +/- 0.002 (lines: 180)
|
||||||
|
rg (whitelist) (ASCII)* 0.065 +/- 0.002 (lines: 168)*
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.070 +/- 0.001 (lines: 6)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.001 (lines: 6)*
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 0.343 +/- 0.095 (lines: 848)
|
||||||
|
rg* 0.310 +/- 0.063 (lines: 848)*
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 2.160 +/- 0.117 (lines: 862)*
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg* 0.223 +/- 0.004 (lines: 629)*
|
||||||
|
rg (no mmap) 0.295 +/- 0.012 (lines: 629)
|
||||||
|
rg (lines) 0.246 +/- 0.032 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.395 +/- 0.058 (lines: 642)*
|
||||||
|
rg (lines) 0.457 +/- 0.045 (lines: 642)
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII)* 0.286 +/- 0.006 (lines: 629)*
|
||||||
|
rg 0.290 +/- 0.006 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 2.003 +/- 0.113 (lines: 13)
|
||||||
|
rg (ASCII)* 1.755 +/- 0.112 (lines: 13)*
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg 0.294 +/- 0.006 (lines: 317)
|
||||||
|
rg (ASCII)* 0.253 +/- 0.050 (lines: 317)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 1.403 +/- 0.018 (lines: 691)
|
||||||
|
rg* 1.223 +/- 0.130 (lines: 691)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 3.665 +/- 0.189 (lines: 735)*
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.224 +/- 0.045 (lines: 583)*
|
||||||
|
rg (no mmap) 0.370 +/- 0.006 (lines: 583)
|
||||||
|
rg (lines) 0.310 +/- 0.046 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg* 1.202 +/- 0.006 (lines: 604)*
|
||||||
|
rg (lines) 1.285 +/- 0.006 (lines: 604)
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.274 +/- 0.017 (lines: 0)*
|
||||||
|
rg 0.374 +/- 0.015 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.391 +/- 0.097 (lines: 41)
|
||||||
|
rg (ASCII)* 2.952 +/- 0.118 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.355 +/- 0.055 (lines: 278)*
|
||||||
157
benchsuite/runs/2016-12-30-archlinux-cheetah/raw.csv
Normal file
157
benchsuite/runs/2016-12-30-archlinux-cheetah/raw.csv
Normal file
@@ -0,0 +1,157 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09816598892211914,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08965039253234863,68,
|
||||||
|
linux_alternates,1,3,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09101128578186035,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07472872734069824,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07628297805786133,68,
|
||||||
|
linux_alternates,1,3,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07189559936523438,68,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10288548469543457,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10204243659973145,160,
|
||||||
|
linux_alternates_casei,1,3,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1031193733215332,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08190178871154785,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08523178100585938,160,
|
||||||
|
linux_alternates_casei,1,3,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.07952761650085449,160,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06972551345825195,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.0691523551940918,16,
|
||||||
|
linux_literal,1,3,rg (ignore),rg -n PM_RESUME,0.06865429878234863,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.39247632026672363,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.4009978771209717,16,
|
||||||
|
linux_literal,1,3,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.40122294425964355,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.062048912048339844,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.05932760238647461,16,
|
||||||
|
linux_literal,1,3,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.058171749114990234,16,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.08261799812316895,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.0780181884765625,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore),rg -n -i PM_RESUME,0.07934045791625977,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.4008915424346924,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.3899986743927002,370,
|
||||||
|
linux_literal_casei,1,3,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.39725732803344727,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.07104611396789551,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.0707247257232666,370,
|
||||||
|
linux_literal_casei,1,3,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.06864142417907715,370,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06764745712280273,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.06994485855102539,16,
|
||||||
|
linux_literal_default,1,3,rg,rg PM_RESUME,0.0682222843170166,16,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27941250801086426,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.31389880180358887,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.30502963066101074,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16565680503845215,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16579079627990723,490,
|
||||||
|
linux_no_literal,1,3,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.169691801071167,490,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2969038486480713,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.2995884418487549,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.27426910400390625,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15207958221435547,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15367984771728516,419,
|
||||||
|
linux_no_literal,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15249848365783691,419,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07145977020263672,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.07139325141906738,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (ignore),rg -n [A-Z]+_RESUME,0.0708932876586914,1652,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.05987191200256348,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06223797798156738,1630,
|
||||||
|
linux_re_literal_suffix,1,3,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.06115579605102539,1630,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16427040100097656,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.16524410247802734,23,
|
||||||
|
linux_unicode_greek,1,3,rg,rg -n \p{Greek},0.1664714813232422,23,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16639113426208496,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16803503036499023,103,
|
||||||
|
linux_unicode_greek_casei,1,3,rg,rg -n -i \p{Greek},0.16656923294067383,103,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07580804824829102,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07589507102966309,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore),rg -n \wAh,0.07574295997619629,186,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07641291618347168,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07523059844970703,174,
|
||||||
|
linux_unicode_word,1,3,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.07748007774353027,174,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06804847717285156,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06720519065856934,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist),rg -n --no-ignore -tall \wAh,0.06687021255493164,180,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06528687477111816,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.07101035118103027,168,
|
||||||
|
linux_unicode_word,1,3,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.06446981430053711,168,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07159972190856934,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.0695488452911377,6,
|
||||||
|
linux_word,1,3,rg (ignore),rg -n -w PM_RESUME,0.07082796096801758,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06297016143798828,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06128263473510742,6,
|
||||||
|
linux_word,1,3,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.06177973747253418,6,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.36841607093811035,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.30306172370910645,848,
|
||||||
|
subtitles_en_alternate,1,3,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3288271427154541,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3186373710632324,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23814082145690918,848,
|
||||||
|
subtitles_en_alternate,1,3,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23152780532836914,848,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2480580806732178,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.2288904190063477,862,
|
||||||
|
subtitles_en_alternate_casei,1,3,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.287020206451416,862,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21738362312316895,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.16032648086547852,629,
|
||||||
|
subtitles_en_literal,1,3,rg,rg Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.15392351150512695,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21230578422546387,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27013158798217773,629,
|
||||||
|
subtitles_en_literal,1,3,rg (no mmap),rg --no-mmap Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19994258880615234,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2728753089904785,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23652935028076172,629,
|
||||||
|
subtitles_en_literal,1,3,rg (lines),rg -n Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2579770088195801,629,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3031468391418457,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.40822505950927734,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg,rg -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38727545738220215,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4260599613189697,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4490511417388916,642,
|
||||||
|
subtitles_en_literal_casei,1,3,rg (lines),rg -n -i Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.49449872970581055,642,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2707977294921875,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2691836357116699,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.24464011192321777,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22373199462890625,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.25702810287475586,629,
|
||||||
|
subtitles_en_literal_word,1,3,rg,rg -nw Sherlock Holmes /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23047828674316406,629,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.139404773712158,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0484464168548584,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.0293972492218018,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.840238094329834,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7812306880950928,13,
|
||||||
|
subtitles_en_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7657690048217773,13,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.26054978370666504,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2869753837585449,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg,rg -n \w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22949600219726562,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21858429908752441,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2064223289489746,317,
|
||||||
|
subtitles_en_surrounding_words,1,3,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20789289474487305,317,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.313758373260498,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2925219535827637,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3444299697875977,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.264918565750122,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.30733060836792,691,
|
||||||
|
subtitles_ru_alternate,1,3,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1466560363769531,691,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.783818244934082,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.76894474029541,735,
|
||||||
|
subtitles_ru_alternate_casei,1,3,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.788987398147583,735,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2822730541229248,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.25232434272766113,583,
|
||||||
|
subtitles_ru_literal,1,3,rg,rg Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2563645839691162,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.34694504737854004,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3202054500579834,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (no mmap),rg --no-mmap Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3236703872680664,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.36035776138305664,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3270585536956787,583,
|
||||||
|
subtitles_ru_literal,1,3,rg (lines),rg -n Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3121967315673828,583,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0397696495056152,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.158402442932129,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg,rg -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1158676147460938,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.2041549682617188,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1511006355285645,604,
|
||||||
|
subtitles_ru_literal_casei,1,3,rg (lines),rg -n -i Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1794021129608154,604,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.19694828987121582,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.1980271339416504,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2128591537475586,,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3568108081817627,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3353869915008545,579,
|
||||||
|
subtitles_ru_literal_word,1,3,rg,rg -nw Шерлок Холмс /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3075387477874756,579,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.5629587173461914,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.5984435081481934,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.4725229740142822,41,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.170077323913574,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.064476490020752,,
|
||||||
|
subtitles_ru_no_literal,1,3,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.159156084060669,,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3924906253814697,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3874075412750244,278,
|
||||||
|
subtitles_ru_surrounding_words,1,3,rg,rg -n \w+\s+Холмс\s+\w+ /data/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.39940643310546875,278,
|
||||||
|
126
benchsuite/runs/2016-12-30-archlinux-cheetah/summary
Normal file
126
benchsuite/runs/2016-12-30-archlinux-cheetah/summary
Normal file
@@ -0,0 +1,126 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.093 +/- 0.005 (lines: 68)
|
||||||
|
rg (whitelist)* 0.074 +/- 0.002 (lines: 68)*
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.103 +/- 0.001 (lines: 160)
|
||||||
|
rg (whitelist)* 0.082 +/- 0.003 (lines: 160)*
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.069 +/- 0.001 (lines: 16)
|
||||||
|
rg (ignore) (mmap) 0.398 +/- 0.005 (lines: 16)
|
||||||
|
rg (whitelist)* 0.060 +/- 0.002 (lines: 16)*
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.080 +/- 0.002 (lines: 370)
|
||||||
|
rg (ignore) (mmap) 0.396 +/- 0.006 (lines: 370)
|
||||||
|
rg (whitelist)* 0.070 +/- 0.001 (lines: 370)*
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.069 +/- 0.001 (lines: 16)*
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.299 +/- 0.018 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.167 +/- 0.002 (lines: 490)
|
||||||
|
rg (whitelist) 0.290 +/- 0.014 (lines: 419)
|
||||||
|
rg (whitelist) (ASCII)* 0.153 +/- 0.001 (lines: 419)*
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.071 +/- 0.000 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.061 +/- 0.001 (lines: 1630)*
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.165 +/- 0.001 (lines: 23)*
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg* 0.167 +/- 0.001 (lines: 103)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.076 +/- 0.000 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.076 +/- 0.001 (lines: 174)
|
||||||
|
rg (whitelist) 0.067 +/- 0.001 (lines: 180)
|
||||||
|
rg (whitelist) (ASCII)* 0.067 +/- 0.004 (lines: 168)*
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.071 +/- 0.001 (lines: 6)
|
||||||
|
rg (whitelist)* 0.062 +/- 0.001 (lines: 6)*
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 0.333 +/- 0.033 (lines: 848)
|
||||||
|
rg* 0.263 +/- 0.048 (lines: 848)*
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 2.255 +/- 0.030 (lines: 862)*
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg* 0.177 +/- 0.035 (lines: 629)*
|
||||||
|
rg (no mmap) 0.227 +/- 0.037 (lines: 629)
|
||||||
|
rg (lines) 0.256 +/- 0.018 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.366 +/- 0.056 (lines: 642)*
|
||||||
|
rg (lines) 0.457 +/- 0.035 (lines: 642)
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII) 0.262 +/- 0.015 (lines: 629)
|
||||||
|
rg* 0.237 +/- 0.018 (lines: 629)*
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 2.072 +/- 0.059 (lines: 13)
|
||||||
|
rg (ASCII)* 1.796 +/- 0.039 (lines: 13)*
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg 0.259 +/- 0.029 (lines: 317)
|
||||||
|
rg (ASCII)* 0.211 +/- 0.007 (lines: 317)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 1.317 +/- 0.026 (lines: 691)
|
||||||
|
rg* 1.240 +/- 0.083 (lines: 691)*
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
rg* 3.781 +/- 0.010 (lines: 735)*
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.264 +/- 0.016 (lines: 583)*
|
||||||
|
rg (no mmap) 0.330 +/- 0.015 (lines: 583)
|
||||||
|
rg (lines) 0.333 +/- 0.025 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg* 1.105 +/- 0.060 (lines: 604)*
|
||||||
|
rg (lines) 1.178 +/- 0.027 (lines: 604)
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.203 +/- 0.009 (lines: 0)*
|
||||||
|
rg 0.333 +/- 0.025 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.545 +/- 0.065 (lines: 41)
|
||||||
|
rg (ASCII)* 3.131 +/- 0.058 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.393 +/- 0.006 (lines: 278)*
|
||||||
59
benchsuite/runs/2018-01-08-archlinux-cheetah/README
Normal file
59
benchsuite/runs/2018-01-08-archlinux-cheetah/README
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
This directory contains updated benchmarks as of 2018-01-08. They were captured
|
||||||
|
via the benchsuite script at `benchsuite/benchsuite` from the root of this
|
||||||
|
repository. The command that was run:
|
||||||
|
|
||||||
|
$ ./benchsuite \
|
||||||
|
--dir /tmp/benchsuite \
|
||||||
|
--raw runs/2018-01-08-archlinux-cheetah/raw.csv \
|
||||||
|
--warmup-iter 1 \
|
||||||
|
--bench-iter 5
|
||||||
|
|
||||||
|
These results are most directly comparable to the
|
||||||
|
`2016-09-22-archlinux-cheetah` run in the parent directory.
|
||||||
|
|
||||||
|
The versions of each tool are as follows:
|
||||||
|
|
||||||
|
$ grep -V
|
||||||
|
grep (GNU grep) 3.1
|
||||||
|
|
||||||
|
$ ag -V
|
||||||
|
ag version 2.1.0
|
||||||
|
Features:
|
||||||
|
+jit +lzma +zlib
|
||||||
|
|
||||||
|
$ sift -V
|
||||||
|
sift 0.8.0 (linux/amd64)
|
||||||
|
built from commit 2ca94717 (which seems to be 0.9.0)
|
||||||
|
|
||||||
|
$ pt --version
|
||||||
|
pt version 2.1.4
|
||||||
|
|
||||||
|
$ ucg -V
|
||||||
|
UniversalCodeGrep 0.3.3
|
||||||
|
[...]
|
||||||
|
Build info
|
||||||
|
|
||||||
|
Repo version: 0.3.3-251-g9b5a3e3
|
||||||
|
|
||||||
|
Compiler info:
|
||||||
|
Name ($(CXX)): "g++ -std=gnu++1z"
|
||||||
|
Version string: "g++ (GCC) 7.2.1 20171224"
|
||||||
|
|
||||||
|
ISA extensions in use:
|
||||||
|
sse4.2: yes
|
||||||
|
popcnt: yes
|
||||||
|
|
||||||
|
libpcre info:
|
||||||
|
Not linked against libpcre.
|
||||||
|
|
||||||
|
libpcre2-8 info:
|
||||||
|
Version: 10.30 2017-08-14
|
||||||
|
JIT support built in?: yes
|
||||||
|
JIT target architecture: x86 64bit (little endian + unaligned)
|
||||||
|
Newline style: LF
|
||||||
|
|
||||||
|
The version of ripgrep was compiled from source on commit 85d463c0, with the
|
||||||
|
simd-accel and avx-accel features enabled:
|
||||||
|
|
||||||
|
$ export RUSTFLAGS="-C target-cpu=native"
|
||||||
|
$ cargo build --release --features 'simd-accel avx-accel'
|
||||||
806
benchsuite/runs/2018-01-08-archlinux-cheetah/raw.csv
Normal file
806
benchsuite/runs/2018-01-08-archlinux-cheetah/raw.csv
Normal file
@@ -0,0 +1,806 @@
|
|||||||
|
benchmark,warmup_iter,iter,name,command,duration,lines,env
|
||||||
|
linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10186767578125,68,
|
||||||
|
linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10199356079101562,68,
|
||||||
|
linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09750819206237793,68,
|
||||||
|
linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09634733200073242,68,
|
||||||
|
linux_alternates,1,5,rg (ignore),rg -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.10117292404174805,68,
|
||||||
|
linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.49642109870910645,68,
|
||||||
|
linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.48993706703186035,68,
|
||||||
|
linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4837028980255127,68,
|
||||||
|
linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.4773833751678467,68,
|
||||||
|
linux_alternates,1,5,ag (ignore),ag -s ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.558436393737793,68,
|
||||||
|
linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2605454921722412,68,LC_ALL=C
|
||||||
|
linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.26748204231262207,68,LC_ALL=C
|
||||||
|
linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.26719212532043457,68,LC_ALL=C
|
||||||
|
linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2719383239746094,68,LC_ALL=C
|
||||||
|
linux_alternates,1,5,git grep (ignore),git grep -E -I -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.26963257789611816,68,LC_ALL=C
|
||||||
|
linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.08797001838684082,68,
|
||||||
|
linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09073781967163086,68,
|
||||||
|
linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0914468765258789,68,
|
||||||
|
linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09071612358093262,68,
|
||||||
|
linux_alternates,1,5,rg (whitelist),rg --no-ignore -n ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.0914316177368164,68,
|
||||||
|
linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1372535228729248,68,
|
||||||
|
linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13880419731140137,68,
|
||||||
|
linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13315439224243164,68,
|
||||||
|
linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1367807388305664,68,
|
||||||
|
linux_alternates,1,5,ucg (whitelist),ucg --nosmart-case ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.13135552406311035,68,
|
||||||
|
linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.12781810760498047,160,
|
||||||
|
linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.11988544464111328,160,
|
||||||
|
linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1205439567565918,160,
|
||||||
|
linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.12867259979248047,160,
|
||||||
|
linux_alternates_casei,1,5,rg (ignore),rg -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.1215970516204834,160,
|
||||||
|
linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5444357395172119,160,
|
||||||
|
linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5511739253997803,160,
|
||||||
|
linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5382294654846191,160,
|
||||||
|
linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.5499558448791504,160,
|
||||||
|
linux_alternates_casei,1,5,ag (ignore),ag -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.6376545429229736,160,
|
||||||
|
linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.9767155647277832,160,LC_ALL=C
|
||||||
|
linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.920574426651001,160,LC_ALL=C
|
||||||
|
linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.9352290630340576,160,LC_ALL=C
|
||||||
|
linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.8866012096405029,160,LC_ALL=C
|
||||||
|
linux_alternates_casei,1,5,git grep (ignore),git grep -E -I -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.9189445972442627,160,LC_ALL=C
|
||||||
|
linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09351730346679688,160,
|
||||||
|
linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09393739700317383,160,
|
||||||
|
linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09986448287963867,160,
|
||||||
|
linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09596824645996094,160,
|
||||||
|
linux_alternates_casei,1,5,rg (whitelist),rg --no-ignore -n -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.09604883193969727,160,
|
||||||
|
linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.23943114280700684,160,
|
||||||
|
linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2587015628814697,160,
|
||||||
|
linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2543606758117676,160,
|
||||||
|
linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.2490406036376953,160,
|
||||||
|
linux_alternates_casei,1,5,ucg (whitelist),ucg -i ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT,0.24046540260314941,160,
|
||||||
|
linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08253765106201172,16,
|
||||||
|
linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08176755905151367,16,
|
||||||
|
linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08141684532165527,16,
|
||||||
|
linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08108830451965332,16,
|
||||||
|
linux_literal,1,5,rg (ignore),rg -n PM_RESUME,0.08082938194274902,16,
|
||||||
|
linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.6870582103729248,16,
|
||||||
|
linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.807842493057251,16,
|
||||||
|
linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.8129942417144775,16,
|
||||||
|
linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.7582321166992188,16,
|
||||||
|
linux_literal,1,5,rg (ignore) (mmap),rg -n --mmap PM_RESUME,0.6869800090789795,16,
|
||||||
|
linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6534101963043213,16,
|
||||||
|
linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6020612716674805,16,
|
||||||
|
linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6712157726287842,16,
|
||||||
|
linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.6267571449279785,16,
|
||||||
|
linux_literal,1,5,ag (ignore) (mmap),ag -s PM_RESUME,0.505136251449585,16,
|
||||||
|
linux_literal,1,5,pt (ignore),pt PM_RESUME,0.21415948867797852,16,
|
||||||
|
linux_literal,1,5,pt (ignore),pt PM_RESUME,0.19318318367004395,16,
|
||||||
|
linux_literal,1,5,pt (ignore),pt PM_RESUME,0.21352124214172363,16,
|
||||||
|
linux_literal,1,5,pt (ignore),pt PM_RESUME,0.18979454040527344,16,
|
||||||
|
linux_literal,1,5,pt (ignore),pt PM_RESUME,0.16629600524902344,16,
|
||||||
|
linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.46967077255249023,16,
|
||||||
|
linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.46343088150024414,16,
|
||||||
|
linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.4723978042602539,16,
|
||||||
|
linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.4741063117980957,16,
|
||||||
|
linux_literal,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git PM_RESUME,0.4613051414489746,16,
|
||||||
|
linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.20196986198425293,16,LC_ALL=C
|
||||||
|
linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.18932533264160156,16,LC_ALL=C
|
||||||
|
linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.19396305084228516,16,LC_ALL=C
|
||||||
|
linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.1952073574066162,16,LC_ALL=C
|
||||||
|
linux_literal,1,5,git grep (ignore),git grep -I -n PM_RESUME,0.20149731636047363,16,LC_ALL=C
|
||||||
|
linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08270478248596191,16,
|
||||||
|
linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08414745330810547,16,
|
||||||
|
linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08627724647521973,16,
|
||||||
|
linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.08978700637817383,16,
|
||||||
|
linux_literal,1,5,rg (whitelist),rg -n --no-ignore -tall PM_RESUME,0.0836489200592041,16,
|
||||||
|
linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.15774202346801758,16,
|
||||||
|
linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.16005396842956543,16,
|
||||||
|
linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.15743708610534668,16,
|
||||||
|
linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.16156601905822754,16,
|
||||||
|
linux_literal,1,5,ucg (whitelist),ucg --nosmart-case PM_RESUME,0.1557624340057373,16,
|
||||||
|
linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.1028127670288086,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10258054733276367,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10902261734008789,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10802555084228516,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore),rg -n -i PM_RESUME,0.10153412818908691,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7902817726135254,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7985179424285889,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.8208649158477783,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7937076091766357,374,
|
||||||
|
linux_literal_casei,1,5,rg (ignore) (mmap),rg -n -i --mmap PM_RESUME,0.7936429977416992,374,
|
||||||
|
linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.5215470790863037,374,
|
||||||
|
linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.46518707275390625,374,
|
||||||
|
linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.4467353820800781,374,
|
||||||
|
linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.4595184326171875,374,
|
||||||
|
linux_literal_casei,1,5,ag (ignore) (mmap),ag -i PM_RESUME,0.4531285762786865,374,
|
||||||
|
linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.187762022018433,374,
|
||||||
|
linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.178058385848999,374,
|
||||||
|
linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.096448421478271,374,
|
||||||
|
linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.190524339675903,374,
|
||||||
|
linux_literal_casei,1,5,pt (ignore),pt -i PM_RESUME,14.231573343276978,374,
|
||||||
|
linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.4668574333190918,374,
|
||||||
|
linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.46050214767456055,374,
|
||||||
|
linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.46228861808776855,374,
|
||||||
|
linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.44957947731018066,374,
|
||||||
|
linux_literal_casei,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git PM_RESUME,0.4612581729888916,374,
|
||||||
|
linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.1932981014251709,370,LC_ALL=C
|
||||||
|
linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.20561552047729492,370,LC_ALL=C
|
||||||
|
linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.19516706466674805,370,LC_ALL=C
|
||||||
|
linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.20196247100830078,370,LC_ALL=C
|
||||||
|
linux_literal_casei,1,5,git grep (ignore),git grep -I -n -i PM_RESUME,0.19236421585083008,370,LC_ALL=C
|
||||||
|
linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09555959701538086,370,
|
||||||
|
linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09589338302612305,370,
|
||||||
|
linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09479856491088867,370,
|
||||||
|
linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.09741568565368652,370,
|
||||||
|
linux_literal_casei,1,5,rg (whitelist),rg -n -i --no-ignore -tall PM_RESUME,0.10127615928649902,370,
|
||||||
|
linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15514039993286133,370,
|
||||||
|
linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15668940544128418,370,
|
||||||
|
linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15429425239562988,370,
|
||||||
|
linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.15332818031311035,370,
|
||||||
|
linux_literal_casei,1,5,ucg (whitelist),ucg -i PM_RESUME,0.14861536026000977,370,
|
||||||
|
linux_literal_default,1,5,rg,rg PM_RESUME,0.08931398391723633,16,
|
||||||
|
linux_literal_default,1,5,rg,rg PM_RESUME,0.08717465400695801,16,
|
||||||
|
linux_literal_default,1,5,rg,rg PM_RESUME,0.0879361629486084,16,
|
||||||
|
linux_literal_default,1,5,rg,rg PM_RESUME,0.08688950538635254,16,
|
||||||
|
linux_literal_default,1,5,rg,rg PM_RESUME,0.09138607978820801,16,
|
||||||
|
linux_literal_default,1,5,ag,ag PM_RESUME,0.5342838764190674,16,
|
||||||
|
linux_literal_default,1,5,ag,ag PM_RESUME,0.47187042236328125,16,
|
||||||
|
linux_literal_default,1,5,ag,ag PM_RESUME,0.4456596374511719,16,
|
||||||
|
linux_literal_default,1,5,ag,ag PM_RESUME,0.4507424831390381,16,
|
||||||
|
linux_literal_default,1,5,ag,ag PM_RESUME,0.44472575187683105,16,
|
||||||
|
linux_literal_default,1,5,ucg,ucg PM_RESUME,0.15556907653808594,16,
|
||||||
|
linux_literal_default,1,5,ucg,ucg PM_RESUME,0.1533644199371338,16,
|
||||||
|
linux_literal_default,1,5,ucg,ucg PM_RESUME,0.15392351150512695,16,
|
||||||
|
linux_literal_default,1,5,ucg,ucg PM_RESUME,0.1535196304321289,16,
|
||||||
|
linux_literal_default,1,5,ucg,ucg PM_RESUME,0.15589547157287598,16,
|
||||||
|
linux_literal_default,1,5,pt,pt PM_RESUME,0.2261514663696289,16,
|
||||||
|
linux_literal_default,1,5,pt,pt PM_RESUME,0.2731902599334717,16,
|
||||||
|
linux_literal_default,1,5,pt,pt PM_RESUME,0.2563004493713379,16,
|
||||||
|
linux_literal_default,1,5,pt,pt PM_RESUME,0.2575085163116455,16,
|
||||||
|
linux_literal_default,1,5,pt,pt PM_RESUME,0.1724245548248291,16,
|
||||||
|
linux_literal_default,1,5,sift,sift PM_RESUME,0.13233542442321777,16,
|
||||||
|
linux_literal_default,1,5,sift,sift PM_RESUME,0.1256580352783203,16,
|
||||||
|
linux_literal_default,1,5,sift,sift PM_RESUME,0.12435102462768555,16,
|
||||||
|
linux_literal_default,1,5,sift,sift PM_RESUME,0.1259307861328125,16,
|
||||||
|
linux_literal_default,1,5,sift,sift PM_RESUME,0.12412142753601074,16,
|
||||||
|
linux_literal_default,1,5,git grep,git grep PM_RESUME,0.1742086410522461,16,LC_ALL=en_US.UTF-8
|
||||||
|
linux_literal_default,1,5,git grep,git grep PM_RESUME,0.16890597343444824,16,LC_ALL=en_US.UTF-8
|
||||||
|
linux_literal_default,1,5,git grep,git grep PM_RESUME,0.16680669784545898,16,LC_ALL=en_US.UTF-8
|
||||||
|
linux_literal_default,1,5,git grep,git grep PM_RESUME,0.16899871826171875,16,LC_ALL=en_US.UTF-8
|
||||||
|
linux_literal_default,1,5,git grep,git grep PM_RESUME,0.19794917106628418,16,LC_ALL=en_US.UTF-8
|
||||||
|
linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.33940672874450684,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3274960517883301,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32681775093078613,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.32865071296691895,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore),rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.3240926265716553,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17426586151123047,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17265701293945312,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1703634262084961,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.17192435264587402,490,
|
||||||
|
linux_no_literal,1,5,rg (ignore) (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.1704559326171875,490,
|
||||||
|
linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.8443403244018555,766,
|
||||||
|
linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.6956703662872314,766,
|
||||||
|
linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.6938261985778809,766,
|
||||||
|
linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.695967435836792,766,
|
||||||
|
linux_no_literal,1,5,ag (ignore) (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.6945271492004395,766,
|
||||||
|
linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.645716428756714,490,
|
||||||
|
linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.441533088684082,490,
|
||||||
|
linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.472522735595703,490,
|
||||||
|
linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.42497444152832,490,
|
||||||
|
linux_no_literal,1,5,pt (ignore) (ASCII),pt -e \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},12.407486200332642,490,
|
||||||
|
linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.091489553451538,490,
|
||||||
|
linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.049214124679565,490,
|
||||||
|
linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.879419803619385,490,
|
||||||
|
linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},9.07261848449707,490,
|
||||||
|
linux_no_literal,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.918747901916504,490,
|
||||||
|
linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.334321975708008,490,LC_ALL=en_US.UTF-8
|
||||||
|
linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.993232727050781,490,LC_ALL=en_US.UTF-8
|
||||||
|
linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.622304916381836,490,LC_ALL=en_US.UTF-8
|
||||||
|
linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.35973048210144,490,LC_ALL=en_US.UTF-8
|
||||||
|
linux_no_literal,1,5,git grep (ignore),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},8.39980435371399,490,LC_ALL=en_US.UTF-8
|
||||||
|
linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},2.0318400859832764,490,LC_ALL=C
|
||||||
|
linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8587837219238281,490,LC_ALL=C
|
||||||
|
linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.873384714126587,490,LC_ALL=C
|
||||||
|
linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8111364841461182,490,LC_ALL=C
|
||||||
|
linux_no_literal,1,5,git grep (ignore) (ASCII),git grep -E -I -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},1.8385357856750488,490,LC_ALL=C
|
||||||
|
linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28792643547058105,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28545212745666504,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28576135635375977,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.29883813858032227,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist),rg -n --no-ignore -tall \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.28493285179138184,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15974783897399902,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.15943312644958496,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.160233736038208,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16201996803283691,458,
|
||||||
|
linux_no_literal,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.16033530235290527,458,
|
||||||
|
linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.4639148712158203,416,
|
||||||
|
linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.46042823791503906,416,
|
||||||
|
linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.45925426483154297,416,
|
||||||
|
linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.477064847946167,416,
|
||||||
|
linux_no_literal,1,5,ucg (whitelist) (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5},0.507554292678833,416,
|
||||||
|
linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08520364761352539,1652,
|
||||||
|
linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08203816413879395,1652,
|
||||||
|
linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08355021476745605,1652,
|
||||||
|
linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.0865166187286377,1652,
|
||||||
|
linux_re_literal_suffix,1,5,rg (ignore),rg -n [A-Z]+_RESUME,0.08125448226928711,1652,
|
||||||
|
linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4846627712249756,1652,
|
||||||
|
linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.48070311546325684,1652,
|
||||||
|
linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4813041687011719,1652,
|
||||||
|
linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4755582809448242,1652,
|
||||||
|
linux_re_literal_suffix,1,5,ag (ignore),ag -s [A-Z]+_RESUME,0.4926290512084961,1652,
|
||||||
|
linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.124520540237427,1652,
|
||||||
|
linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.151537656784058,1652,
|
||||||
|
linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.157994270324707,1652,
|
||||||
|
linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.102291822433472,1652,
|
||||||
|
linux_re_literal_suffix,1,5,pt (ignore),pt -e [A-Z]+_RESUME,14.103861093521118,1652,
|
||||||
|
linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.182392835617065,1652,
|
||||||
|
linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.190829277038574,1652,
|
||||||
|
linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,3.9770240783691406,1652,
|
||||||
|
linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,3.9978606700897217,1652,
|
||||||
|
linux_re_literal_suffix,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git [A-Z]+_RESUME,4.146454572677612,1652,
|
||||||
|
linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5080702304840088,1652,LC_ALL=C
|
||||||
|
linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5281260013580322,1652,LC_ALL=C
|
||||||
|
linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5350546836853027,1652,LC_ALL=C
|
||||||
|
linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5474245548248291,1652,LC_ALL=C
|
||||||
|
linux_re_literal_suffix,1,5,git grep (ignore),git grep -E -I -n [A-Z]+_RESUME,0.5256762504577637,1652,LC_ALL=C
|
||||||
|
linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.07924222946166992,1630,
|
||||||
|
linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0767812728881836,1630,
|
||||||
|
linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.07874488830566406,1630,
|
||||||
|
linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.0804905891418457,1630,
|
||||||
|
linux_re_literal_suffix,1,5,rg (whitelist),rg -n --no-ignore -tall [A-Z]+_RESUME,0.07479119300842285,1630,
|
||||||
|
linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13643193244934082,1630,
|
||||||
|
linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13543128967285156,1630,
|
||||||
|
linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13312768936157227,1630,
|
||||||
|
linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13562273979187012,1630,
|
||||||
|
linux_re_literal_suffix,1,5,ucg (whitelist),ucg --nosmart-case [A-Z]+_RESUME,0.13236212730407715,1630,
|
||||||
|
linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.17355775833129883,23,
|
||||||
|
linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.1676032543182373,23,
|
||||||
|
linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.1727275848388672,23,
|
||||||
|
linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.17095375061035156,23,
|
||||||
|
linux_unicode_greek,1,5,rg,rg -n \p{Greek},0.17271947860717773,23,
|
||||||
|
linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.14364218711853,23,
|
||||||
|
linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.137334108352661,23,
|
||||||
|
linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.083475351333618,23,
|
||||||
|
linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.095231056213379,23,
|
||||||
|
linux_unicode_greek,1,5,pt,pt -e \p{Greek},14.151906490325928,23,
|
||||||
|
linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8376963138580322,23,
|
||||||
|
linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8271427154541016,23,
|
||||||
|
linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.8310961723327637,23,
|
||||||
|
linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.826141595840454,23,
|
||||||
|
linux_unicode_greek,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \p{Greek},2.805818796157837,23,
|
||||||
|
linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.16843819618225098,103,
|
||||||
|
linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.1704998016357422,103,
|
||||||
|
linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.17055058479309082,103,
|
||||||
|
linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.17064881324768066,103,
|
||||||
|
linux_unicode_greek_casei,1,5,rg,rg -n -i \p{Greek},0.1699228286743164,103,
|
||||||
|
linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.164355993270874,23,
|
||||||
|
linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.099931478500366,23,
|
||||||
|
linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.155095338821411,23,
|
||||||
|
linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.109308004379272,23,
|
||||||
|
linux_unicode_greek_casei,1,5,pt,pt -i -e \p{Greek},14.072362422943115,23,
|
||||||
|
linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.003945589065551758,,
|
||||||
|
linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.004189729690551758,,
|
||||||
|
linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.0034589767456054688,,
|
||||||
|
linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.003614187240600586,,
|
||||||
|
linux_unicode_greek_casei,1,5,sift,sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -i --git \p{Greek},0.003975629806518555,,
|
||||||
|
linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09798526763916016,186,
|
||||||
|
linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09575009346008301,186,
|
||||||
|
linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.10181760787963867,186,
|
||||||
|
linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09650158882141113,186,
|
||||||
|
linux_unicode_word,1,5,rg (ignore),rg -n \wAh,0.09717488288879395,186,
|
||||||
|
linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09417867660522461,174,
|
||||||
|
linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09903812408447266,174,
|
||||||
|
linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09407877922058105,174,
|
||||||
|
linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09681963920593262,174,
|
||||||
|
linux_unicode_word,1,5,rg (ignore) (ASCII),rg -n (?-u)\wAh,0.09762454032897949,174,
|
||||||
|
linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.5779609680175781,174,
|
||||||
|
linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.635645866394043,174,
|
||||||
|
linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.6109263896942139,174,
|
||||||
|
linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.6260912418365479,174,
|
||||||
|
linux_unicode_word,1,5,ag (ignore) (ASCII),ag -s \wAh,0.6823546886444092,174,
|
||||||
|
linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.178487062454224,174,
|
||||||
|
linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.190000057220459,174,
|
||||||
|
linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.16363000869751,174,
|
||||||
|
linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.160430431365967,174,
|
||||||
|
linux_unicode_word,1,5,pt (ignore) (ASCII),pt -e \wAh,14.2189621925354,174,
|
||||||
|
linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.17629337310791,174,
|
||||||
|
linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.051238059997559,174,
|
||||||
|
linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.323853015899658,174,
|
||||||
|
linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.085661172866821,174,
|
||||||
|
linux_unicode_word,1,5,sift (ignore) (ASCII),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n --git \wAh,4.036486625671387,174,
|
||||||
|
linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.620476961135864,186,LC_ALL=en_US.UTF-8
|
||||||
|
linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.536192417144775,186,LC_ALL=en_US.UTF-8
|
||||||
|
linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.510494232177734,186,LC_ALL=en_US.UTF-8
|
||||||
|
linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,6.001620769500732,186,LC_ALL=en_US.UTF-8
|
||||||
|
linux_unicode_word,1,5,git grep (ignore),git grep -E -I -n \wAh,4.602652311325073,186,LC_ALL=en_US.UTF-8
|
||||||
|
linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3785994052886963,174,LC_ALL=C
|
||||||
|
linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.4163663387298584,174,LC_ALL=C
|
||||||
|
linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.402677297592163,174,LC_ALL=C
|
||||||
|
linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3327512741088867,174,LC_ALL=C
|
||||||
|
linux_unicode_word,1,5,git grep (ignore) (ASCII),git grep -E -I -n \wAh,1.3501760959625244,174,LC_ALL=C
|
||||||
|
linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.07958698272705078,180,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0798649787902832,180,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.08086204528808594,180,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.0814356803894043,180,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist),rg -n --no-ignore -tall \wAh,0.08273720741271973,180,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.08280825614929199,168,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.08074021339416504,168,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.0821676254272461,168,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.07926368713378906,168,
|
||||||
|
linux_unicode_word,1,5,rg (whitelist) (ASCII),rg -n --no-ignore -tall (?-u)\wAh,0.08405280113220215,168,
|
||||||
|
linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.1545090675354004,168,
|
||||||
|
linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.1517190933227539,168,
|
||||||
|
linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.15704965591430664,168,
|
||||||
|
linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.15523767471313477,168,
|
||||||
|
linux_unicode_word,1,5,ucg (ASCII),ucg --nosmart-case \wAh,0.1582942008972168,168,
|
||||||
|
linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.09102368354797363,6,
|
||||||
|
linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.08986210823059082,6,
|
||||||
|
linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.08989477157592773,6,
|
||||||
|
linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.0895695686340332,6,
|
||||||
|
linux_word,1,5,rg (ignore),rg -n -w PM_RESUME,0.09547114372253418,6,
|
||||||
|
linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.4948008060455322,6,
|
||||||
|
linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.45710110664367676,6,
|
||||||
|
linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.44803452491760254,6,
|
||||||
|
linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.44779396057128906,6,
|
||||||
|
linux_word,1,5,ag (ignore),ag -s -w PM_RESUME,0.4563112258911133,6,
|
||||||
|
linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.233235597610474,6,
|
||||||
|
linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.277648687362671,6,
|
||||||
|
linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.218127727508545,6,
|
||||||
|
linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.171622037887573,6,
|
||||||
|
linux_word,1,5,pt (ignore),pt -w PM_RESUME,14.214240312576294,6,
|
||||||
|
linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.1536731719970703,6,
|
||||||
|
linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2415099143981934,6,
|
||||||
|
linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2526626586914062,6,
|
||||||
|
linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.2590816020965576,6,
|
||||||
|
linux_word,1,5,sift (ignore),sift --binary-skip --exclude-files .* --exclude-files *.pdf -n -w --git PM_RESUME,3.222473621368408,6,
|
||||||
|
linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16982412338256836,6,LC_ALL=C
|
||||||
|
linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16739583015441895,6,LC_ALL=C
|
||||||
|
linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.16866540908813477,6,LC_ALL=C
|
||||||
|
linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.18207120895385742,6,LC_ALL=C
|
||||||
|
linux_word,1,5,git grep (ignore),git grep -E -I -n -w PM_RESUME,0.17716264724731445,6,LC_ALL=C
|
||||||
|
linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07490420341491699,6,
|
||||||
|
linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07714152336120605,6,
|
||||||
|
linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07552146911621094,6,
|
||||||
|
linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.07651710510253906,6,
|
||||||
|
linux_word,1,5,rg (whitelist),rg -n -w --no-ignore -tall PM_RESUME,0.0757131576538086,6,
|
||||||
|
linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.1530015468597412,6,
|
||||||
|
linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.15152239799499512,6,
|
||||||
|
linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.1571195125579834,6,
|
||||||
|
linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.15993595123291016,6,
|
||||||
|
linux_word,1,5,ucg (whitelist),ucg --nosmart-case -w PM_RESUME,0.15633797645568848,6,
|
||||||
|
subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.33371877670288086,848,
|
||||||
|
subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3207988739013672,848,
|
||||||
|
subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3301675319671631,848,
|
||||||
|
subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.29731154441833496,848,
|
||||||
|
subtitles_en_alternate,1,5,rg (lines),rg -n Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2711911201477051,848,
|
||||||
|
subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.186570405960083,848,
|
||||||
|
subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.1659939289093018,848,
|
||||||
|
subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.187847137451172,848,
|
||||||
|
subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.3522064685821533,848,
|
||||||
|
subtitles_en_alternate,1,5,ag (lines),ag -s Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.316105842590332,848,
|
||||||
|
subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1400718688964844,848,
|
||||||
|
subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1492774486541748,848,
|
||||||
|
subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1337254047393799,848,
|
||||||
|
subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1037378311157227,848,
|
||||||
|
subtitles_en_alternate,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1312851905822754,848,
|
||||||
|
subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8294000625610352,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.808884620666504,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8134734630584717,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8405649662017822,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep (lines),grep -E -an Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.8500289916992188,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21175312995910645,848,
|
||||||
|
subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2118232250213623,848,
|
||||||
|
subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21287035942077637,848,
|
||||||
|
subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21167230606079102,848,
|
||||||
|
subtitles_en_alternate,1,5,rg,rg Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.28102636337280273,848,
|
||||||
|
subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5029187202453613,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.49977445602417,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.508340835571289,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5002548694610596,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate,1,5,grep,grep -E -a Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.629526138305664,848,LC_ALL=C
|
||||||
|
subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.730497360229492,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.781018018722534,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.7858059406280518,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.7127914428710938,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ag (ASCII),ag -s -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.717308759689331,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.428208351135254,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.389420509338379,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.403301954269409,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4691550731658936,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,ucg (ASCII),ucg -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.4245004653930664,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.978189706802368,862,LC_ALL=C
|
||||||
|
subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.974303722381592,862,LC_ALL=C
|
||||||
|
subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.982886552810669,862,LC_ALL=C
|
||||||
|
subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.90018630027771,862,LC_ALL=C
|
||||||
|
subtitles_en_alternate_casei,1,5,grep (ASCII),grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.0078439712524414,862,LC_ALL=C
|
||||||
|
subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9129142761230469,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9066660404205322,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.946380615234375,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9672930240631104,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,rg,rg -n -i Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.028451919555664,862,
|
||||||
|
subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.9427030086517334,862,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.938739061355591,862,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.921248435974121,862,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.9194068908691406,862,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_alternate_casei,1,5,grep,grep -E -ani Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,2.917184829711914,862,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.12293672561645508,629,
|
||||||
|
subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1259000301361084,629,
|
||||||
|
subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.12285709381103516,629,
|
||||||
|
subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.12280964851379395,629,
|
||||||
|
subtitles_en_literal,1,5,rg,rg Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1547396183013916,629,
|
||||||
|
subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.22011375427246094,629,
|
||||||
|
subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23095202445983887,629,
|
||||||
|
subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2577846050262451,629,
|
||||||
|
subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2563819885253906,629,
|
||||||
|
subtitles_en_literal,1,5,rg (no mmap),rg --no-mmap Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.24869346618652344,629,
|
||||||
|
subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.415337324142456,629,
|
||||||
|
subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4208543300628662,629,
|
||||||
|
subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.416351079940796,629,
|
||||||
|
subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4270708560943604,629,
|
||||||
|
subtitles_en_literal,1,5,pt,pt -N Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4243996143341064,629,
|
||||||
|
subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2245020866394043,629,
|
||||||
|
subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2382345199584961,629,
|
||||||
|
subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.23533034324645996,629,
|
||||||
|
subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2577829360961914,629,
|
||||||
|
subtitles_en_literal,1,5,sift,sift Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2599349021911621,629,
|
||||||
|
subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4733700752258301,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4598572254180908,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5303301811218262,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4775106906890869,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep,grep -a Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4881136417388916,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20051789283752441,629,
|
||||||
|
subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17326998710632324,629,
|
||||||
|
subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.20733428001403809,629,
|
||||||
|
subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.189713716506958,629,
|
||||||
|
subtitles_en_literal,1,5,rg (lines),rg -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17817258834838867,629,
|
||||||
|
subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5327835083007812,629,
|
||||||
|
subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5411181449890137,629,
|
||||||
|
subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.600783109664917,629,
|
||||||
|
subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5838911533355713,629,
|
||||||
|
subtitles_en_literal,1,5,ag (lines),ag -s Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6051928997039795,629,
|
||||||
|
subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4090385437011719,629,
|
||||||
|
subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3816399574279785,629,
|
||||||
|
subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38033008575439453,629,
|
||||||
|
subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3731727600097656,629,
|
||||||
|
subtitles_en_literal,1,5,ucg (lines),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.38796329498291016,629,
|
||||||
|
subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4102630615234375,629,
|
||||||
|
subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4137451648712158,629,
|
||||||
|
subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.4649333953857422,629,
|
||||||
|
subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.430387258529663,629,
|
||||||
|
subtitles_en_literal,1,5,pt (lines),pt Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.541991949081421,629,
|
||||||
|
subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6231405735015869,629,
|
||||||
|
subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5986526012420654,629,
|
||||||
|
subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5821917057037354,629,
|
||||||
|
subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6045489311218262,629,
|
||||||
|
subtitles_en_literal,1,5,sift (lines),sift -n Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5986905097961426,629,
|
||||||
|
subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8278565406799316,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.777052640914917,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7619414329528809,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8248744010925293,629,LC_ALL=C
|
||||||
|
subtitles_en_literal,1,5,grep (lines),grep -an Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.824932336807251,629,LC_ALL=C
|
||||||
|
subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.2718961238861084,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27082157135009766,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.27086758613586426,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.274705171585083,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg,rg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3337059020996094,642,
|
||||||
|
subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9112112522125244,642,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.907888650894165,642,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.912668228149414,642,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9082865715026855,642,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_casei,1,5,grep,grep -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.9177796840667725,642,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.6020669937133789,642,LC_ALL=C
|
||||||
|
subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.568228006362915,642,LC_ALL=C
|
||||||
|
subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5648214817047119,642,LC_ALL=C
|
||||||
|
subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5568234920501709,642,LC_ALL=C
|
||||||
|
subtitles_en_literal_casei,1,5,grep (ASCII),grep -E -ai Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.5588953495025635,642,LC_ALL=C
|
||||||
|
subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3486766815185547,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.34010815620422363,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.33849263191223145,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3917088508605957,642,
|
||||||
|
subtitles_en_literal_casei,1,5,rg (lines),rg -n -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.39266490936279297,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5564041137695312,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5533506870269775,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6205368041992188,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5530028343200684,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ag (lines) (ASCII),ag -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.6189889907836914,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3834850788116455,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.41916346549987793,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3895289897918701,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4278140068054199,642,
|
||||||
|
subtitles_en_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.4013493061065674,642,
|
||||||
|
subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17953085899353027,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17679834365844727,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17448186874389648,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.21117281913757324,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Sherlock Holmes(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1848156452178955,629,
|
||||||
|
subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5236153602600098,629,
|
||||||
|
subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.52512526512146,629,
|
||||||
|
subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5218794345855713,629,
|
||||||
|
subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5384306907653809,629,
|
||||||
|
subtitles_en_literal_word,1,5,ag (ASCII),ag -sw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5150353908538818,629,
|
||||||
|
subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3757903575897217,629,
|
||||||
|
subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3744041919708252,629,
|
||||||
|
subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.37261366844177246,629,
|
||||||
|
subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.40795230865478516,629,
|
||||||
|
subtitles_en_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.3868849277496338,629,
|
||||||
|
subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8265349864959717,629,LC_ALL=C
|
||||||
|
subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8123743534088135,629,LC_ALL=C
|
||||||
|
subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7669925689697266,629,LC_ALL=C
|
||||||
|
subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.766636848449707,629,LC_ALL=C
|
||||||
|
subtitles_en_literal_word,1,5,grep (ASCII),grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7665839195251465,629,LC_ALL=C
|
||||||
|
subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1879115104675293,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18082356452941895,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18497347831726074,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1769394874572754,629,
|
||||||
|
subtitles_en_literal_word,1,5,rg,rg -nw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1917715072631836,629,
|
||||||
|
subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8192996978759766,629,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.8193323612213135,629,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7837738990783691,629,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7639024257659912,629,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_literal_word,1,5,grep,grep -anw Sherlock Holmes /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.7634689807891846,629,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7922985553741455,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7885758876800537,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.802325963973999,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.792595386505127,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.7909605503082275,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5903098583221436,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5982813835144043,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5926671028137207,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.5976767539978027,13,
|
||||||
|
subtitles_en_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.593153953552246,13,
|
||||||
|
subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.614634275436401,48,
|
||||||
|
subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.574857473373413,48,
|
||||||
|
subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.54079270362854,48,
|
||||||
|
subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.600660800933838,48,
|
||||||
|
subtitles_en_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,6.531627178192139,48,
|
||||||
|
subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.361133337020874,13,
|
||||||
|
subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.456786870956421,13,
|
||||||
|
subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.403071403503418,13,
|
||||||
|
subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.398236274719238,13,
|
||||||
|
subtitles_en_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,5.348573923110962,13,
|
||||||
|
subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.5057969093322754,13,LC_ALL=C
|
||||||
|
subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.4157862663269043,13,LC_ALL=C
|
||||||
|
subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.471182346343994,13,LC_ALL=C
|
||||||
|
subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.4590909481048584,13,LC_ALL=C
|
||||||
|
subtitles_en_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.3759689331054688,13,LC_ALL=C
|
||||||
|
subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18518710136413574,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18791556358337402,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18598675727844238,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18552684783935547,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg,rg -n \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.19262075424194336,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1321008205413818,317,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0709969997406006,317,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.1117346286773682,317,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0880234241485596,317,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_surrounding_words,1,5,grep,grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0745558738708496,317,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.1827528476715088,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18874144554138184,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17983436584472656,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.18831133842468262,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,rg (ASCII),rg -n (?-u)\w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,0.17810606956481934,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.5957207679748535,323,
|
||||||
|
subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.627211570739746,323,
|
||||||
|
subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.554431200027466,323,
|
||||||
|
subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.492656469345093,323,
|
||||||
|
subtitles_en_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,4.443558216094971,323,
|
||||||
|
subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.522758722305298,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.502918004989624,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.6503307819366455,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.58940052986145,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,3.569624423980713,317,
|
||||||
|
subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0672054290771484,317,LC_ALL=C
|
||||||
|
subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0729331970214844,317,LC_ALL=C
|
||||||
|
subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.052501916885376,317,LC_ALL=C
|
||||||
|
subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0711696147918701,317,LC_ALL=C
|
||||||
|
subtitles_en_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Holmes\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.sample.en,1.0863316059112549,317,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0312588214874268,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.063939094543457,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0000121593475342,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9842438697814941,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg (lines),rg -n Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.95733642578125,691,
|
||||||
|
subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7781903743743896,691,
|
||||||
|
subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.861164093017578,691,
|
||||||
|
subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8268885612487793,691,
|
||||||
|
subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8621268272399902,691,
|
||||||
|
subtitles_ru_alternate,1,5,ag (lines),ag -s Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8216166496276855,691,
|
||||||
|
subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0069098472595215,691,
|
||||||
|
subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.025178909301758,691,
|
||||||
|
subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0631070137023926,691,
|
||||||
|
subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0902633666992188,691,
|
||||||
|
subtitles_ru_alternate,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0272655487060547,691,
|
||||||
|
subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.510146617889404,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.541701793670654,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.506088733673096,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.51838755607605,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep (lines),grep -E -an Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.486810684204102,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9679937362670898,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9942011833190918,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9233448505401611,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9294781684875488,691,
|
||||||
|
subtitles_ru_alternate,1,5,rg,rg Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8729774951934814,691,
|
||||||
|
subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.100147485733032,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.075790166854858,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.069685220718384,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.0526063442230225,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate,1,5,grep,grep -E -a Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.129194498062134,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7894201278686523,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7878782749176025,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.796328544616699,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.8249149322509766,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ag (ASCII),ag -s -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.7949724197387695,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.075739622116089,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.013590097427368,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.012375593185425,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.023118495941162,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,ucg (ASCII),ucg -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0641982555389404,691,
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.467320442199707,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.486851692199707,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.479818344116211,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.516186475753784,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep (ASCII),grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,7.471773862838745,691,LC_ALL=C
|
||||||
|
subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.026185274124146,735,
|
||||||
|
subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.168465614318848,735,
|
||||||
|
subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.039950370788574,735,
|
||||||
|
subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.089850425720215,735,
|
||||||
|
subtitles_ru_alternate_casei,1,5,rg,rg -n -i Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,11.112446546554565,735,
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.822641849517822,735,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.808355331420898,735,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.80171275138855,735,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.794351577758789,735,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_alternate_casei,1,5,grep,grep -E -ani Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.844403266906738,735,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20681476593017578,583,
|
||||||
|
subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.190568208694458,583,
|
||||||
|
subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18462657928466797,583,
|
||||||
|
subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.1873643398284912,583,
|
||||||
|
subtitles_ru_literal,1,5,rg,rg Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.20382428169250488,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3085510730743408,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.318758487701416,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3177149295806885,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.31236958503723145,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (no mmap),rg --no-mmap Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.31880998611450195,583,
|
||||||
|
subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.152938365936279,583,
|
||||||
|
subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.124867677688599,583,
|
||||||
|
subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.132290363311768,583,
|
||||||
|
subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.158328056335449,583,
|
||||||
|
subtitles_ru_literal,1,5,pt,pt -N Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.1022467613220215,583,
|
||||||
|
subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.807113409042358,583,
|
||||||
|
subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.8178558349609375,583,
|
||||||
|
subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.925220012664795,583,
|
||||||
|
subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.861236333847046,583,
|
||||||
|
subtitles_ru_literal,1,5,sift,sift Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.763278484344482,583,
|
||||||
|
subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.704503059387207,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6887199878692627,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7092702388763428,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6964359283447266,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep,grep -a Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6928379535675049,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2646975517272949,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.26806163787841797,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2700214385986328,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2669072151184082,583,
|
||||||
|
subtitles_ru_literal,1,5,rg (lines),rg -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2656106948852539,583,
|
||||||
|
subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.9972407817840576,583,
|
||||||
|
subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.906053066253662,583,
|
||||||
|
subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.864766836166382,583,
|
||||||
|
subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7820546627044678,583,
|
||||||
|
subtitles_ru_literal,1,5,ag (lines),ag -s Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7599871158599854,583,
|
||||||
|
subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.411653995513916,583,
|
||||||
|
subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.394604206085205,583,
|
||||||
|
subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.362853765487671,583,
|
||||||
|
subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.4795477390289307,583,
|
||||||
|
subtitles_ru_literal,1,5,ucg (lines),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.4428844451904297,583,
|
||||||
|
subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.122563123703003,583,
|
||||||
|
subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.17008900642395,583,
|
||||||
|
subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.1965367794036865,583,
|
||||||
|
subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.152370929718018,583,
|
||||||
|
subtitles_ru_literal,1,5,pt (lines),pt Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,5.106513738632202,583,
|
||||||
|
subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.408761978149414,583,
|
||||||
|
subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.423579454421997,583,
|
||||||
|
subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.2807464599609375,583,
|
||||||
|
subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.3771467208862305,583,
|
||||||
|
subtitles_ru_literal,1,5,sift (lines),sift -n Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.378506422042847,583,
|
||||||
|
subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.121800422668457,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1189923286437988,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0678138732910156,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0668041706085205,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal,1,5,grep (lines),grep -an Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0713574886322021,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9427816867828369,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0397350788116455,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9732518196105957,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9387776851654053,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg,rg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.9536802768707275,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.338641405105591,604,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.280565023422241,604,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.241750240325928,604,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.316105604171753,604,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_casei,1,5,grep,grep -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,6.307560205459595,604,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7379302978515625,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7226619720458984,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.683293342590332,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.714146614074707,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_casei,1,5,grep (ASCII),grep -E -ai Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7654330730438232,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0237820148468018,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0194151401519775,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0364336967468262,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.035005807876587,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,rg (lines),rg -n -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0438766479492188,604,
|
||||||
|
subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.619025468826294,,
|
||||||
|
subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.647244930267334,,
|
||||||
|
subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6785612106323242,,
|
||||||
|
subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6503715515136719,,
|
||||||
|
subtitles_ru_literal_casei,1,5,ag (lines) (ASCII),ag -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6314499378204346,,
|
||||||
|
subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.8302316665649414,583,
|
||||||
|
subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7719593048095703,583,
|
||||||
|
subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7697594165802002,583,
|
||||||
|
subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7312629222869873,583,
|
||||||
|
subtitles_ru_literal_casei,1,5,ucg (lines) (ASCII),ucg -i Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.767866849899292,583,
|
||||||
|
subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.19411826133728027,,
|
||||||
|
subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18651676177978516,,
|
||||||
|
subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.19614577293395996,,
|
||||||
|
subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.18459081649780273,,
|
||||||
|
subtitles_ru_literal_word,1,5,rg (ASCII),rg -n (?-u:\b)Шерлок Холмс(?-u:\b) /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.1797487735748291,,
|
||||||
|
subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6507105827331543,,
|
||||||
|
subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6480035781860352,,
|
||||||
|
subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.7138750553131104,,
|
||||||
|
subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6521759033203125,,
|
||||||
|
subtitles_ru_literal_word,1,5,ag (ASCII),ag -sw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.6728894710540771,,
|
||||||
|
subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.3646819591522217,583,
|
||||||
|
subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.3836848735809326,583,
|
||||||
|
subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.419490337371826,583,
|
||||||
|
subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.363335609436035,583,
|
||||||
|
subtitles_ru_literal_word,1,5,ucg (ASCII),ucg --nosmart-case Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.488351345062256,583,
|
||||||
|
subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.171506643295288,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.1602776050567627,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.084787368774414,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0714166164398193,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_word,1,5,grep (ASCII),grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.083632469177246,583,LC_ALL=C
|
||||||
|
subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2769143581390381,579,
|
||||||
|
subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2694058418273926,579,
|
||||||
|
subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.26763367652893066,579,
|
||||||
|
subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2671318054199219,579,
|
||||||
|
subtitles_ru_literal_word,1,5,rg,rg -nw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2922348976135254,579,
|
||||||
|
subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.083528757095337,579,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0857081413269043,579,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.07025146484375,579,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.071930170059204,579,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_literal_word,1,5,grep,grep -anw Шерлок Холмс /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.0709245204925537,579,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1552906036376953,41,
|
||||||
|
subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.164951801300049,41,
|
||||||
|
subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.175389289855957,41,
|
||||||
|
subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.1861774921417236,41,
|
||||||
|
subtitles_ru_no_literal,1,5,rg,rg -n \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,3.153625011444092,41,
|
||||||
|
subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7353317737579346,,
|
||||||
|
subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7592883110046387,,
|
||||||
|
subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.7242491245269775,,
|
||||||
|
subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.747089385986328,,
|
||||||
|
subtitles_ru_no_literal,1,5,rg (ASCII),rg -n (?-u)\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.732586145401001,,
|
||||||
|
subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0796375274658203,,
|
||||||
|
subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9670393466949463,,
|
||||||
|
subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9413447380065918,,
|
||||||
|
subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.916764497756958,,
|
||||||
|
subtitles_ru_no_literal,1,5,ag (ASCII),ag -s \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9110031127929688,,
|
||||||
|
subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0622072219848633,,
|
||||||
|
subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0975682735443115,,
|
||||||
|
subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0741493701934814,,
|
||||||
|
subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0423810482025146,,
|
||||||
|
subtitles_ru_no_literal,1,5,ucg (ASCII),ucg --nosmart-case \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.000764846801758,,
|
||||||
|
subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6251120567321777,,LC_ALL=C
|
||||||
|
subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.644089698791504,,LC_ALL=C
|
||||||
|
subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6416165828704834,,LC_ALL=C
|
||||||
|
subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6321892738342285,,LC_ALL=C
|
||||||
|
subtitles_ru_no_literal,1,5,grep (ASCII),grep -E -an \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5} /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.6264762878417969,,LC_ALL=C
|
||||||
|
subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.29879307746887207,278,
|
||||||
|
subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.3226010799407959,278,
|
||||||
|
subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.32187771797180176,278,
|
||||||
|
subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.2825047969818115,278,
|
||||||
|
subtitles_ru_surrounding_words,1,5,rg,rg -n \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,0.283217191696167,278,
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3977878093719482,278,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4288139343261719,278,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4054889678955078,278,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.4003441333770752,278,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep,grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.5269148349761963,278,LC_ALL=en_US.UTF-8
|
||||||
|
subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8912529945373535,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9221522808074951,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9416618347167969,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.893650770187378,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ag (ASCII),ag -s \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.8895554542541504,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0110745429992676,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.9790067672729492,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.0426392555236816,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.121723175048828,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,ucg (ASCII),ucg --nosmart-case \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,2.1247596740722656,,
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3579976558685303,,LC_ALL=C
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.382859468460083,,LC_ALL=C
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.393401861190796,,LC_ALL=C
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.474374532699585,,LC_ALL=C
|
||||||
|
subtitles_ru_surrounding_words,1,5,grep (ASCII),grep -E -an \w+\s+Холмс\s+\w+ /tmp/benchsuite/subtitles/OpenSubtitles2016.raw.ru,1.3835601806640625,,LC_ALL=C
|
||||||
|
235
benchsuite/runs/2018-01-08-archlinux-cheetah/summary
Normal file
235
benchsuite/runs/2018-01-08-archlinux-cheetah/summary
Normal file
@@ -0,0 +1,235 @@
|
|||||||
|
linux_alternates (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.100 +/- 0.003 (lines: 68)
|
||||||
|
ag (ignore) 0.501 +/- 0.033 (lines: 68)
|
||||||
|
git grep (ignore) 0.267 +/- 0.004 (lines: 68)
|
||||||
|
rg (whitelist)* 0.090 +/- 0.001 (lines: 68)*
|
||||||
|
ucg (whitelist) 0.135 +/- 0.003 (lines: 68)
|
||||||
|
|
||||||
|
linux_alternates_casei (pattern: ERR_SYS|PME_TURN_OFF|LINK_REQ_RST|CFG_BME_EVT)
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
rg (ignore) 0.124 +/- 0.004 (lines: 160)
|
||||||
|
ag (ignore) 0.564 +/- 0.041 (lines: 160)
|
||||||
|
git grep (ignore) 0.928 +/- 0.033 (lines: 160)
|
||||||
|
rg (whitelist)* 0.096 +/- 0.003 (lines: 160)*
|
||||||
|
ucg (whitelist) 0.248 +/- 0.008 (lines: 160)
|
||||||
|
|
||||||
|
linux_literal (pattern: PM_RESUME)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore)* 0.082 +/- 0.001 (lines: 16)*
|
||||||
|
rg (ignore) (mmap) 0.751 +/- 0.062 (lines: 16)
|
||||||
|
ag (ignore) (mmap) 0.612 +/- 0.065 (lines: 16)
|
||||||
|
pt (ignore) 0.195 +/- 0.020 (lines: 16)
|
||||||
|
sift (ignore) 0.468 +/- 0.006 (lines: 16)
|
||||||
|
git grep (ignore) 0.196 +/- 0.005 (lines: 16)
|
||||||
|
rg (whitelist) 0.085 +/- 0.003 (lines: 16)
|
||||||
|
ucg (whitelist) 0.159 +/- 0.002 (lines: 16)
|
||||||
|
|
||||||
|
linux_literal_casei (pattern: PM_RESUME)
|
||||||
|
----------------------------------------
|
||||||
|
rg (ignore) 0.105 +/- 0.003 (lines: 374)
|
||||||
|
rg (ignore) (mmap) 0.799 +/- 0.012 (lines: 374)
|
||||||
|
ag (ignore) (mmap) 0.469 +/- 0.030 (lines: 374)
|
||||||
|
pt (ignore) 14.177 +/- 0.049 (lines: 374)
|
||||||
|
sift (ignore) 0.460 +/- 0.006 (lines: 374)
|
||||||
|
git grep (ignore) 0.198 +/- 0.006 (lines: 370)
|
||||||
|
rg (whitelist)* 0.097 +/- 0.003 (lines: 370)*
|
||||||
|
ucg (whitelist) 0.154 +/- 0.003 (lines: 370)
|
||||||
|
|
||||||
|
linux_literal_default (pattern: PM_RESUME)
|
||||||
|
------------------------------------------
|
||||||
|
rg* 0.089 +/- 0.002 (lines: 16)*
|
||||||
|
ag 0.469 +/- 0.038 (lines: 16)
|
||||||
|
ucg 0.154 +/- 0.001 (lines: 16)
|
||||||
|
pt 0.237 +/- 0.040 (lines: 16)
|
||||||
|
sift 0.126 +/- 0.003 (lines: 16)
|
||||||
|
git grep 0.175 +/- 0.013 (lines: 16)
|
||||||
|
|
||||||
|
linux_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
-----------------------------------------------------------------
|
||||||
|
rg (ignore) 0.329 +/- 0.006 (lines: 490)
|
||||||
|
rg (ignore) (ASCII) 0.172 +/- 0.002 (lines: 490)
|
||||||
|
ag (ignore) (ASCII) 0.725 +/- 0.067 (lines: 766)
|
||||||
|
pt (ignore) (ASCII) 12.478 +/- 0.097 (lines: 490)
|
||||||
|
sift (ignore) (ASCII) 9.002 +/- 0.096 (lines: 490)
|
||||||
|
git grep (ignore) 8.542 +/- 0.277 (lines: 490)
|
||||||
|
git grep (ignore) (ASCII) 1.883 +/- 0.087 (lines: 490)
|
||||||
|
rg (whitelist) 0.289 +/- 0.006 (lines: 458)
|
||||||
|
rg (whitelist) (ASCII)* 0.160 +/- 0.001 (lines: 458)*
|
||||||
|
ucg (whitelist) (ASCII) 0.474 +/- 0.020 (lines: 416)
|
||||||
|
|
||||||
|
linux_re_literal_suffix (pattern: [A-Z]+_RESUME)
|
||||||
|
------------------------------------------------
|
||||||
|
rg (ignore) 0.084 +/- 0.002 (lines: 1652)
|
||||||
|
ag (ignore) 0.483 +/- 0.006 (lines: 1652)
|
||||||
|
pt (ignore) 14.128 +/- 0.026 (lines: 1652)
|
||||||
|
sift (ignore) 4.099 +/- 0.103 (lines: 1652)
|
||||||
|
git grep (ignore) 0.529 +/- 0.014 (lines: 1652)
|
||||||
|
rg (whitelist)* 0.078 +/- 0.002 (lines: 1630)*
|
||||||
|
ucg (whitelist) 0.135 +/- 0.002 (lines: 1630)
|
||||||
|
|
||||||
|
linux_unicode_greek (pattern: \p{Greek})
|
||||||
|
----------------------------------------
|
||||||
|
rg* 0.172 +/- 0.002 (lines: 23)*
|
||||||
|
pt 14.122 +/- 0.031 (lines: 23)
|
||||||
|
sift 2.826 +/- 0.012 (lines: 23)
|
||||||
|
|
||||||
|
linux_unicode_greek_casei (pattern: \p{Greek})
|
||||||
|
----------------------------------------------
|
||||||
|
rg 0.170 +/- 0.001 (lines: 103)
|
||||||
|
pt 14.120 +/- 0.039 (lines: 23)
|
||||||
|
sift* 0.004 +/- 0.000 (lines: 0)*
|
||||||
|
|
||||||
|
linux_unicode_word (pattern: \wAh)
|
||||||
|
----------------------------------
|
||||||
|
rg (ignore) 0.098 +/- 0.002 (lines: 186)
|
||||||
|
rg (ignore) (ASCII) 0.096 +/- 0.002 (lines: 174)
|
||||||
|
ag (ignore) (ASCII) 0.627 +/- 0.038 (lines: 174)
|
||||||
|
pt (ignore) (ASCII) 14.182 +/- 0.024 (lines: 174)
|
||||||
|
sift (ignore) (ASCII) 4.135 +/- 0.119 (lines: 174)
|
||||||
|
git grep (ignore) 4.854 +/- 0.643 (lines: 186)
|
||||||
|
git grep (ignore) (ASCII) 1.376 +/- 0.035 (lines: 174)
|
||||||
|
rg (whitelist) 0.081 +/- 0.001 (lines: 180)*
|
||||||
|
rg (whitelist) (ASCII)* 0.082 +/- 0.002 (lines: 168)
|
||||||
|
ucg (ASCII) 0.155 +/- 0.003 (lines: 168)
|
||||||
|
|
||||||
|
linux_word (pattern: PM_RESUME)
|
||||||
|
-------------------------------
|
||||||
|
rg (ignore) 0.091 +/- 0.002 (lines: 6)
|
||||||
|
ag (ignore) 0.461 +/- 0.020 (lines: 6)
|
||||||
|
pt (ignore) 14.223 +/- 0.038 (lines: 6)
|
||||||
|
sift (ignore) 3.226 +/- 0.043 (lines: 6)
|
||||||
|
git grep (ignore) 0.173 +/- 0.006 (lines: 6)
|
||||||
|
rg (whitelist)* 0.076 +/- 0.001 (lines: 6)*
|
||||||
|
ucg (whitelist) 0.156 +/- 0.003 (lines: 6)
|
||||||
|
|
||||||
|
subtitles_en_alternate (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 0.311 +/- 0.026 (lines: 848)
|
||||||
|
ag (lines) 2.242 +/- 0.086 (lines: 848)
|
||||||
|
ucg (lines) 1.132 +/- 0.017 (lines: 848)
|
||||||
|
grep (lines) 1.828 +/- 0.017 (lines: 848)
|
||||||
|
rg* 0.226 +/- 0.031 (lines: 848)*
|
||||||
|
grep 1.528 +/- 0.057 (lines: 848)
|
||||||
|
|
||||||
|
subtitles_en_alternate_casei (pattern: Sherlock Holmes|John Watson|Irene Adler|Inspector Lestrade|Professor Moriarty)
|
||||||
|
---------------------------------------------------------------------------------------------------------------------
|
||||||
|
ag (ASCII) 3.745 +/- 0.035 (lines: 862)
|
||||||
|
ucg (ASCII) 2.423 +/- 0.030 (lines: 862)
|
||||||
|
grep (ASCII) 2.969 +/- 0.040 (lines: 862)
|
||||||
|
rg* 1.952 +/- 0.049 (lines: 862)*
|
||||||
|
grep 2.928 +/- 0.012 (lines: 862)
|
||||||
|
|
||||||
|
subtitles_en_literal (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------
|
||||||
|
rg* 0.130 +/- 0.014 (lines: 629)*
|
||||||
|
rg (no mmap) 0.243 +/- 0.017 (lines: 629)
|
||||||
|
pt 1.421 +/- 0.005 (lines: 629)
|
||||||
|
sift 0.243 +/- 0.015 (lines: 629)
|
||||||
|
grep 0.486 +/- 0.027 (lines: 629)
|
||||||
|
rg (lines) 0.190 +/- 0.014 (lines: 629)
|
||||||
|
ag (lines) 1.573 +/- 0.034 (lines: 629)
|
||||||
|
ucg (lines) 0.386 +/- 0.014 (lines: 629)
|
||||||
|
pt (lines) 1.452 +/- 0.055 (lines: 629)
|
||||||
|
sift (lines) 0.601 +/- 0.015 (lines: 629)
|
||||||
|
grep (lines) 0.803 +/- 0.031 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_literal_casei (pattern: Sherlock Holmes)
|
||||||
|
-----------------------------------------------------
|
||||||
|
rg* 0.284 +/- 0.028 (lines: 642)*
|
||||||
|
grep 1.912 +/- 0.004 (lines: 642)
|
||||||
|
grep (ASCII) 0.570 +/- 0.018 (lines: 642)
|
||||||
|
rg (lines) 0.362 +/- 0.028 (lines: 642)
|
||||||
|
ag (lines) (ASCII) 1.580 +/- 0.036 (lines: 642)
|
||||||
|
ucg (lines) (ASCII) 0.404 +/- 0.019 (lines: 642)
|
||||||
|
|
||||||
|
subtitles_en_literal_word (pattern: Sherlock Holmes)
|
||||||
|
----------------------------------------------------
|
||||||
|
rg (ASCII)* 0.185 +/- 0.015 (lines: 629)
|
||||||
|
ag (ASCII) 1.525 +/- 0.009 (lines: 629)
|
||||||
|
ucg (ASCII) 0.384 +/- 0.015 (lines: 629)
|
||||||
|
grep (ASCII) 0.788 +/- 0.029 (lines: 629)
|
||||||
|
rg 0.184 +/- 0.006 (lines: 629)*
|
||||||
|
grep 0.790 +/- 0.028 (lines: 629)
|
||||||
|
|
||||||
|
subtitles_en_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 1.793 +/- 0.005 (lines: 13)
|
||||||
|
rg (ASCII)* 1.594 +/- 0.003 (lines: 13)*
|
||||||
|
ag (ASCII) 6.573 +/- 0.036 (lines: 48)
|
||||||
|
ucg (ASCII) 5.394 +/- 0.042 (lines: 13)
|
||||||
|
grep (ASCII) 3.446 +/- 0.050 (lines: 13)
|
||||||
|
|
||||||
|
subtitles_en_surrounding_words (pattern: \w+\s+Holmes\s+\w+)
|
||||||
|
------------------------------------------------------------
|
||||||
|
rg 0.187 +/- 0.003 (lines: 317)
|
||||||
|
grep 1.095 +/- 0.026 (lines: 317)
|
||||||
|
rg (ASCII)* 0.184 +/- 0.005 (lines: 317)*
|
||||||
|
ag (ASCII) 4.543 +/- 0.075 (lines: 323)
|
||||||
|
ucg (ASCII) 3.567 +/- 0.058 (lines: 317)
|
||||||
|
grep (ASCII) 1.070 +/- 0.012 (lines: 317)
|
||||||
|
|
||||||
|
subtitles_ru_alternate (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------
|
||||||
|
rg (lines) 1.007 +/- 0.041 (lines: 691)
|
||||||
|
ag (lines) 3.830 +/- 0.035 (lines: 691)
|
||||||
|
ucg (lines) 2.043 +/- 0.034 (lines: 691)
|
||||||
|
grep (lines) 7.513 +/- 0.020 (lines: 691)
|
||||||
|
rg* 0.938 +/- 0.046 (lines: 691)*
|
||||||
|
grep 7.085 +/- 0.030 (lines: 691)
|
||||||
|
|
||||||
|
subtitles_ru_alternate_casei (pattern: Шерлок Холмс|Джон Уотсон|Ирен Адлер|инспектор Лестрейд|профессор Мориарти)
|
||||||
|
-----------------------------------------------------------------------------------------------------------------
|
||||||
|
ag (ASCII) 3.799 +/- 0.015 (lines: 691)
|
||||||
|
ucg (ASCII)* 2.038 +/- 0.030 (lines: 691)*
|
||||||
|
grep (ASCII) 7.484 +/- 0.019 (lines: 691)
|
||||||
|
rg 11.087 +/- 0.057 (lines: 735)
|
||||||
|
grep 6.814 +/- 0.020 (lines: 735)
|
||||||
|
|
||||||
|
subtitles_ru_literal (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------
|
||||||
|
rg* 0.195 +/- 0.010 (lines: 583)*
|
||||||
|
rg (no mmap) 0.315 +/- 0.005 (lines: 583)
|
||||||
|
pt 5.134 +/- 0.023 (lines: 583)
|
||||||
|
sift 5.835 +/- 0.061 (lines: 583)
|
||||||
|
grep 0.698 +/- 0.008 (lines: 583)
|
||||||
|
rg (lines) 0.267 +/- 0.002 (lines: 583)
|
||||||
|
ag (lines) 2.862 +/- 0.096 (lines: 583)
|
||||||
|
ucg (lines) 2.418 +/- 0.045 (lines: 583)
|
||||||
|
pt (lines) 5.150 +/- 0.036 (lines: 583)
|
||||||
|
sift (lines) 6.374 +/- 0.056 (lines: 583)
|
||||||
|
grep (lines) 1.089 +/- 0.028 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_casei (pattern: Шерлок Холмс)
|
||||||
|
--------------------------------------------------
|
||||||
|
rg 0.970 +/- 0.041 (lines: 604)
|
||||||
|
grep 6.297 +/- 0.037 (lines: 604)
|
||||||
|
grep (ASCII) 0.725 +/- 0.030 (lines: 583)
|
||||||
|
rg (lines) 1.032 +/- 0.010 (lines: 604)
|
||||||
|
ag (lines) (ASCII)* 0.645 +/- 0.022 (lines: 0)*
|
||||||
|
ucg (lines) (ASCII) 0.774 +/- 0.036 (lines: 583)
|
||||||
|
|
||||||
|
subtitles_ru_literal_word (pattern: Шерлок Холмс)
|
||||||
|
-------------------------------------------------
|
||||||
|
rg (ASCII)* 0.188 +/- 0.007 (lines: 0)*
|
||||||
|
ag (ASCII) 0.668 +/- 0.028 (lines: 0)
|
||||||
|
ucg (ASCII) 2.404 +/- 0.052 (lines: 583)
|
||||||
|
grep (ASCII) 1.114 +/- 0.048 (lines: 583)
|
||||||
|
rg 0.275 +/- 0.011 (lines: 579)
|
||||||
|
grep 1.076 +/- 0.008 (lines: 579)
|
||||||
|
|
||||||
|
subtitles_ru_no_literal (pattern: \w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5}\s+\w{5})
|
||||||
|
----------------------------------------------------------------------------------------
|
||||||
|
rg 3.167 +/- 0.014 (lines: 41)
|
||||||
|
rg (ASCII) 2.740 +/- 0.014 (lines: 0)
|
||||||
|
ag (ASCII) 1.963 +/- 0.069 (lines: 0)
|
||||||
|
ucg (ASCII) 2.055 +/- 0.037 (lines: 0)
|
||||||
|
grep (ASCII)* 1.634 +/- 0.009 (lines: 0)*
|
||||||
|
|
||||||
|
subtitles_ru_surrounding_words (pattern: \w+\s+Холмс\s+\w+)
|
||||||
|
-----------------------------------------------------------
|
||||||
|
rg* 0.302 +/- 0.020 (lines: 278)*
|
||||||
|
grep 1.432 +/- 0.055 (lines: 278)
|
||||||
|
ag (ASCII) 1.908 +/- 0.023 (lines: 0)
|
||||||
|
ucg (ASCII) 2.056 +/- 0.066 (lines: 0)
|
||||||
|
grep (ASCII) 1.398 +/- 0.044 (lines: 0)
|
||||||
26
build.rs
Normal file
26
build.rs
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
#[macro_use]
|
||||||
|
extern crate clap;
|
||||||
|
#[macro_use]
|
||||||
|
extern crate lazy_static;
|
||||||
|
|
||||||
|
use std::env;
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
use clap::Shell;
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
#[path = "src/app.rs"]
|
||||||
|
mod app;
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let outdir = match env::var_os("OUT_DIR") {
|
||||||
|
None => return,
|
||||||
|
Some(outdir) => outdir,
|
||||||
|
};
|
||||||
|
fs::create_dir_all(&outdir).unwrap();
|
||||||
|
|
||||||
|
let mut app = app::app();
|
||||||
|
app.gen_completions("rg", Shell::Bash, &outdir);
|
||||||
|
app.gen_completions("rg", Shell::Fish, &outdir);
|
||||||
|
app.gen_completions("rg", Shell::PowerShell, &outdir);
|
||||||
|
}
|
||||||
@@ -6,8 +6,12 @@ set -ex
|
|||||||
|
|
||||||
# Generate artifacts for release
|
# Generate artifacts for release
|
||||||
mk_artifacts() {
|
mk_artifacts() {
|
||||||
RUSTFLAGS="-C target-feature=+ssse3" \
|
if is_ssse3_target; then
|
||||||
cargo build --target $TARGET --release --features simd-accel
|
RUSTFLAGS="-C target-feature=+ssse3" \
|
||||||
|
cargo build --target $TARGET --release --features simd-accel
|
||||||
|
else
|
||||||
|
cargo build --target $TARGET --release
|
||||||
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
mk_tarball() {
|
mk_tarball() {
|
||||||
@@ -15,10 +19,17 @@ mk_tarball() {
|
|||||||
local td=$(mktempd)
|
local td=$(mktempd)
|
||||||
local out_dir=$(pwd)
|
local out_dir=$(pwd)
|
||||||
local name="${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}"
|
local name="${PROJECT_NAME}-${TRAVIS_TAG}-${TARGET}"
|
||||||
mkdir "$td/$name"
|
local gcc_prefix="$(gcc_prefix)"
|
||||||
|
mkdir "${td:?}/${name}"
|
||||||
|
mkdir "$td/$name/complete"
|
||||||
|
|
||||||
cp target/$TARGET/release/rg "$td/$name/"
|
cp target/$TARGET/release/rg "$td/$name/rg"
|
||||||
|
${gcc_prefix}strip "$td/$name/rg"
|
||||||
cp {doc/rg.1,README.md,UNLICENSE,COPYING,LICENSE-MIT} "$td/$name/"
|
cp {doc/rg.1,README.md,UNLICENSE,COPYING,LICENSE-MIT} "$td/$name/"
|
||||||
|
cp \
|
||||||
|
target/$TARGET/release/build/ripgrep-*/out/{rg.bash-completion,rg.fish,_rg.ps1} \
|
||||||
|
"$td/$name/complete/"
|
||||||
|
cp complete/_rg "$td/$name/complete/"
|
||||||
|
|
||||||
pushd $td
|
pushd $td
|
||||||
tar czf "$out_dir/$name.tar.gz" *
|
tar czf "$out_dir/$name.tar.gz" *
|
||||||
|
|||||||
@@ -17,9 +17,6 @@ install_c_toolchain() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
install_rustup() {
|
install_rustup() {
|
||||||
# uninstall the rust toolchain installed by travis, we are going to use rustup
|
|
||||||
sh ~/rust/lib/rustlib/uninstall.sh
|
|
||||||
|
|
||||||
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=$TRAVIS_RUST_VERSION
|
curl https://sh.rustup.rs -sSf | sh -s -- -y --default-toolchain=$TRAVIS_RUST_VERSION
|
||||||
|
|
||||||
rustc -V
|
rustc -V
|
||||||
@@ -34,16 +31,19 @@ install_standard_crates() {
|
|||||||
|
|
||||||
configure_cargo() {
|
configure_cargo() {
|
||||||
local prefix=$(gcc_prefix)
|
local prefix=$(gcc_prefix)
|
||||||
|
if [ -n "${prefix}" ]; then
|
||||||
|
local gcc_suffix=
|
||||||
|
test -n "${GCC_VERSION}" && gcc_suffix="-${GCC_VERSION}" || :
|
||||||
|
local gcc="${prefix}gcc${gcc_suffix}"
|
||||||
|
|
||||||
if [ ! -z $prefix ]; then
|
|
||||||
# information about the cross compiler
|
# information about the cross compiler
|
||||||
${prefix}gcc -v
|
${gcc} -v
|
||||||
|
|
||||||
# tell cargo which linker to use for cross compilation
|
# tell cargo which linker to use for cross compilation
|
||||||
mkdir -p .cargo
|
mkdir -p .cargo
|
||||||
cat >>.cargo/config <<EOF
|
cat >>.cargo/config <<EOF
|
||||||
[target.$TARGET]
|
[target.$TARGET]
|
||||||
linker = "${prefix}gcc"
|
linker = "${gcc}"
|
||||||
EOF
|
EOF
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|||||||
22
ci/script.sh
22
ci/script.sh
@@ -15,24 +15,16 @@ disable_cross_doctests() {
|
|||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
run_test_suite() {
|
main() {
|
||||||
cargo clean --target $TARGET --verbose
|
# disable_cross_doctests
|
||||||
cargo build --target $TARGET --verbose
|
cargo build --target "${TARGET}" --verbose --all
|
||||||
cargo test --target $TARGET --verbose
|
if [ "$(architecture)" = "amd64" ] || [ "$(architecture)" = "i386" ]; then
|
||||||
cargo build --target $TARGET --verbose --manifest-path grep/Cargo.toml
|
cargo test --target "${TARGET}" --verbose --all
|
||||||
cargo test --target $TARGET --verbose --manifest-path grep/Cargo.toml
|
"$( dirname "${0}" )/test_complete.sh"
|
||||||
cargo build --target $TARGET --verbose --manifest-path globset/Cargo.toml
|
fi
|
||||||
cargo test --target $TARGET --verbose --manifest-path globset/Cargo.toml
|
|
||||||
cargo build --target $TARGET --verbose --manifest-path ignore/Cargo.toml
|
|
||||||
cargo test --target $TARGET --verbose --manifest-path ignore/Cargo.toml
|
|
||||||
|
|
||||||
# sanity check the file type
|
# sanity check the file type
|
||||||
file target/$TARGET/debug/rg
|
file target/$TARGET/debug/rg
|
||||||
}
|
}
|
||||||
|
|
||||||
main() {
|
|
||||||
# disable_cross_doctests
|
|
||||||
run_test_suite
|
|
||||||
}
|
|
||||||
|
|
||||||
main
|
main
|
||||||
|
|||||||
94
ci/test_complete.sh
Executable file
94
ci/test_complete.sh
Executable file
@@ -0,0 +1,94 @@
|
|||||||
|
#!/usr/bin/env zsh
|
||||||
|
|
||||||
|
##
|
||||||
|
# Compares options in `rg --help` output to options in zsh completion function
|
||||||
|
|
||||||
|
emulate -R zsh
|
||||||
|
setopt extended_glob
|
||||||
|
setopt no_function_argzero
|
||||||
|
setopt no_unset
|
||||||
|
|
||||||
|
get_comp_args() {
|
||||||
|
setopt local_options unset
|
||||||
|
|
||||||
|
# Our completion function recognises a special variable which tells it to
|
||||||
|
# dump the _arguments specs and then just return. But do this in a sub-shell
|
||||||
|
# anyway to avoid any weirdness
|
||||||
|
( _RG_COMPLETE_LIST_ARGS=1 source $1 )
|
||||||
|
return $?
|
||||||
|
}
|
||||||
|
|
||||||
|
main() {
|
||||||
|
local diff
|
||||||
|
local rg="${${0:a}:h}/../target/${TARGET:-}/release/rg"
|
||||||
|
local _rg="${${0:a}:h}/../complete/_rg"
|
||||||
|
local -a help_args comp_args
|
||||||
|
|
||||||
|
[[ -e $rg ]] || rg=${rg/%\/release\/rg/\/debug\/rg}
|
||||||
|
|
||||||
|
[[ -e $rg ]] || {
|
||||||
|
printf >&2 'File not found: %s\n' $rg
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
[[ -e $_rg ]] || {
|
||||||
|
printf >&2 'File not found: %s\n' $_rg
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
printf 'Comparing options:\n-%s\n+%s\n' $rg $_rg
|
||||||
|
|
||||||
|
# 'Parse' options out of the `--help` output. To prevent false positives we
|
||||||
|
# only look at lines where the first non-white-space character is `-`
|
||||||
|
help_args=( ${(f)"$(
|
||||||
|
$rg --help |
|
||||||
|
$rg -- '^\s*-' |
|
||||||
|
$rg -io -- '[\t ,](-[a-z0-9]|--[a-z0-9-]+)\b' |
|
||||||
|
tr -d '\t ,' |
|
||||||
|
sort -u
|
||||||
|
)"} )
|
||||||
|
|
||||||
|
# 'Parse' options out of the completion function
|
||||||
|
comp_args=( ${(f)"$( get_comp_args $_rg )"} )
|
||||||
|
|
||||||
|
comp_args=( ${comp_args#\(*\)} ) # Strip excluded options
|
||||||
|
comp_args=( ${comp_args#\*} ) # Strip repetition indicator
|
||||||
|
comp_args=( ${comp_args%%-[:[]*} ) # Strip everything after -optname-
|
||||||
|
comp_args=( ${comp_args%%[:+=[]*} ) # Strip everything after other optspecs
|
||||||
|
comp_args=( ${comp_args##[^-]*} ) # Remove non-options
|
||||||
|
|
||||||
|
# This probably isn't necessary, but we should ensure the same order
|
||||||
|
comp_args=( ${(f)"$( printf '%s\n' $comp_args | sort -u )"} )
|
||||||
|
|
||||||
|
(( $#help_args )) || {
|
||||||
|
printf >&2 'Failed to get help_args\n'
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
(( $#comp_args )) || {
|
||||||
|
printf >&2 'Failed to get comp_args\n'
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
diff="$(
|
||||||
|
if diff --help 2>&1 | grep -qF -- '--label'; then
|
||||||
|
diff -U2 \
|
||||||
|
--label '`rg --help`' \
|
||||||
|
--label '`_rg`' \
|
||||||
|
=( printf '%s\n' $help_args ) =( printf '%s\n' $comp_args )
|
||||||
|
else
|
||||||
|
diff -U2 \
|
||||||
|
-L '`rg --help`' \
|
||||||
|
-L '`_rg`' \
|
||||||
|
=( printf '%s\n' $help_args ) =( printf '%s\n' $comp_args )
|
||||||
|
fi
|
||||||
|
)"
|
||||||
|
|
||||||
|
(( $#diff )) && {
|
||||||
|
printf >&2 '%s\n' 'zsh completion options differ from `--help` options:'
|
||||||
|
printf >&2 '%s\n' $diff
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
printf 'OK\n'
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
main "${@}"
|
||||||
14
ci/utils.sh
14
ci/utils.sh
@@ -39,11 +39,11 @@ dobin() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
architecture() {
|
architecture() {
|
||||||
case $1 in
|
case ${TARGET:?} in
|
||||||
x86_64-unknown-linux-gnu|x86_64-unknown-linux-musl)
|
x86_64-*)
|
||||||
echo amd64
|
echo amd64
|
||||||
;;
|
;;
|
||||||
i686-unknown-linux-gnu|i686-unknown-linux-musl)
|
i686-*|i586-*|i386-*)
|
||||||
echo i386
|
echo i386
|
||||||
;;
|
;;
|
||||||
arm*-unknown-linux-gnueabihf)
|
arm*-unknown-linux-gnueabihf)
|
||||||
@@ -54,3 +54,11 @@ architecture() {
|
|||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
|
is_ssse3_target() {
|
||||||
|
case "${TARGET}" in
|
||||||
|
i686-unknown-netbsd) return 1 ;; # i686-unknown-netbsd - SSE2
|
||||||
|
i686*|x86_64*) return 0 ;;
|
||||||
|
esac
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|||||||
9
compile
9
compile
@@ -1,5 +1,8 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
|
|
||||||
export RUSTFLAGS="-C target-feature=+ssse3"
|
# export RUSTFLAGS="-C target-feature=+ssse3"
|
||||||
# export RUSTFLAGS="-C target-cpu=native"
|
# cargo build --release --features 'simd-accel'
|
||||||
cargo build --release --features simd-accel
|
|
||||||
|
export RUSTFLAGS="-C target-cpu=native"
|
||||||
|
cargo build --release --features 'simd-accel avx-accel'
|
||||||
|
# cargo build --release --features 'simd-accel avx-accel' --target x86_64-unknown-linux-musl
|
||||||
|
|||||||
259
complete/_rg
Normal file
259
complete/_rg
Normal file
@@ -0,0 +1,259 @@
|
|||||||
|
#compdef rg
|
||||||
|
|
||||||
|
##
|
||||||
|
# zsh completion function for ripgrep
|
||||||
|
#
|
||||||
|
# Run ci/test_complete.sh after building to ensure that the options supported by
|
||||||
|
# this function stay in synch with the `rg` binary.
|
||||||
|
#
|
||||||
|
# @see https://github.com/zsh-users/zsh/blob/master/Etc/completion-style-guide
|
||||||
|
#
|
||||||
|
# Based on code from the zsh-users project — see copyright notice below.
|
||||||
|
|
||||||
|
_rg() {
|
||||||
|
local state_descr ret curcontext="${curcontext:-}"
|
||||||
|
local -a context line state
|
||||||
|
local -A opt_args val_args
|
||||||
|
local -a rg_args
|
||||||
|
|
||||||
|
# Sort by long option name to match `rg --help`
|
||||||
|
rg_args=(
|
||||||
|
'(-A -C --after-context --context)'{-A+,--after-context=}'[specify lines to show after each match]:number of lines'
|
||||||
|
'(-B -C --before-context --context)'{-B+,--before-context=}'[specify lines to show before each match]:number of lines'
|
||||||
|
'(-i -s -S --ignore-case --case-sensitive --smart-case)'{-s,--case-sensitive}'[search case-sensitively]'
|
||||||
|
'--color=[specify when to use colors in output]:when:( never auto always ansi )'
|
||||||
|
'*--colors=[specify color settings and styles]: :->colorspec'
|
||||||
|
'--column[show column numbers]'
|
||||||
|
'(-A -B -C --after-context --before-context --context)'{-C+,--context=}'[specify lines to show before and after each match]:number of lines'
|
||||||
|
'--context-separator=[specify string used to separate non-continuous context lines in output]:separator'
|
||||||
|
'(-c --count --passthrough --passthru)'{-c,--count}'[only show count of matches for each file]'
|
||||||
|
'--debug[show debug messages]'
|
||||||
|
'--dfa-size-limit=[specify upper size limit of generated DFA]:DFA size'
|
||||||
|
'(-E --encoding)'{-E+,--encoding=}'[specify text encoding of files to search]: :_rg_encodings'
|
||||||
|
'*'{-f+,--file=}'[specify file containing patterns to search for]:file:_files'
|
||||||
|
"(1)--files[show each file that would be searched (but don't search)]"
|
||||||
|
'(-l --files-with-matches --files-without-match)'{-l,--files-with-matches}'[only show names of files with matches]'
|
||||||
|
'(-l --files-with-matches --files-without-match)--files-without-match[only show names of files without matches]'
|
||||||
|
'(-F --fixed-strings)'{-F,--fixed-strings}'[treat pattern as literal string instead of regular expression]'
|
||||||
|
'(-L --follow)'{-L,--follow}'[follow symlinks]'
|
||||||
|
'*'{-g+,--glob=}'[include or exclude files for searching that match the specified glob]:glob'
|
||||||
|
'(: -)'{-h,--help}'[display help information]'
|
||||||
|
'(-p --no-heading --pretty --vimgrep)--heading[show matches grouped by file name]'
|
||||||
|
'--hidden[search hidden files and directories]'
|
||||||
|
'*--iglob=[include or exclude files for searching that match the specified case-insensitive glob]:glob'
|
||||||
|
'(-i -s -S --case-sensitive --ignore-case --smart-case)'{-i,--ignore-case}'[search case-insensitively]'
|
||||||
|
'--ignore-file=[specify additional ignore file]:file:_files'
|
||||||
|
'(-v --invert-match)'{-v,--invert-match}'[invert matching]'
|
||||||
|
'(-n -N --line-number --no-line-number)'{-n,--line-number}'[show line numbers]'
|
||||||
|
'(-N --no-line-number)--line-number-width=[specify width of displayed line number]:number of columns'
|
||||||
|
'(-w -x --line-regexp --word-regexp)'{-x,--line-regexp}'[only show matches surrounded by line boundaries]'
|
||||||
|
'(-M --max-columns)'{-M+,--max-columns=}'[specify max length of lines to print]:number of bytes'
|
||||||
|
'(-m --max-count)'{-m+,--max-count=}'[specify max number of matches per file]:number of matches'
|
||||||
|
'--max-filesize=[specify size above which files should be ignored]:file size'
|
||||||
|
'--maxdepth=[specify max number of directories to descend]:number of directories'
|
||||||
|
'(--mmap --no-mmap)--mmap[search using memory maps when possible]'
|
||||||
|
'(-H --with-filename --no-filename)--no-filename[suppress all file names]'
|
||||||
|
"(-p --heading --pretty --vimgrep)--no-heading[don't group matches by file name]"
|
||||||
|
"(--no-ignore-parent)--no-ignore[don't respect ignore files]"
|
||||||
|
"--no-ignore-parent[don't respect ignore files in parent directories]"
|
||||||
|
"--no-ignore-vcs[don't respect version control ignore files]"
|
||||||
|
'(-n -N --line-number --no-line-number)'{-N,--no-line-number}'[suppress line numbers]'
|
||||||
|
'--no-messages[suppress all error messages]'
|
||||||
|
"(--mmap --no-mmap)--no-mmap[don't search using memory maps]"
|
||||||
|
'(-0 --null)'{-0,--null}'[print NUL byte after file names]'
|
||||||
|
'(-o -r --only-matching --passthrough --passthru --replace)'{-o,--only-matching}'[show only matching part of each line]'
|
||||||
|
'(-c -o -r --count --only-matching --passthrough --replace)--passthru[show both matching and non-matching lines]'
|
||||||
|
'!(-c -o -r --count --only-matching --passthru --replace)--passthrough'
|
||||||
|
'--path-separator=[specify path separator to use when printing file names]:separator'
|
||||||
|
'(-p --heading --no-heading --pretty --vimgrep)'{-p,--pretty}'[alias for --color=always --heading -n]'
|
||||||
|
'(-q --quiet)'{-q,--quiet}'[suppress normal output]'
|
||||||
|
'--regex-size-limit=[specify upper size limit of compiled regex]:regex size'
|
||||||
|
'(1 -f --file)*'{-e+,--regexp=}'[specify pattern]:pattern'
|
||||||
|
'(-c -o -r --count --only-matching --passthrough --passthru --replace)'{-r+,--replace=}'[specify string used to replace matches]:replace string'
|
||||||
|
'(-i -s -S --ignore-case --case-sensitive --smart-case)'{-S,--smart-case}'[search case-insensitively if the pattern is all lowercase]'
|
||||||
|
'(-j --threads)--sort-files[sort results by file path (disables parallelism)]'
|
||||||
|
'(-a --text)'{-a,--text}'[search binary files as if they were text]'
|
||||||
|
'(-j --sort-files --threads)'{-j+,--threads=}'[specify approximate number of threads to use]:number of threads'
|
||||||
|
'*'{-t+,--type=}'[only search files matching specified type]: :_rg_types'
|
||||||
|
'*--type-add=[add new glob for file type]: :->typespec'
|
||||||
|
'*--type-clear=[clear globs previously defined for specified file type]: :_rg_types'
|
||||||
|
# This should actually be exclusive with everything but other type options
|
||||||
|
'(:)--type-list[show all supported file types and their associated globs]'
|
||||||
|
'*'{-T+,--type-not=}"[don't search files matching specified type]: :_rg_types"
|
||||||
|
'*'{-u,--unrestricted}'[reduce level of "smart" searching]'
|
||||||
|
'(: -)'{-V,--version}'[display version information]'
|
||||||
|
'(-p --heading --no-heading --pretty)--vimgrep[show results in vim-compatible format]'
|
||||||
|
'(-H --no-filename --with-filename)'{-H,--with-filename}'[display the file name for matches]'
|
||||||
|
'(-w -x --line-regexp --word-regexp)'{-w,--word-regexp}'[only show matches surrounded by word boundaries]'
|
||||||
|
'(-e -f --file --files --regexp --type-list)1: :_rg_pattern'
|
||||||
|
'(--type-list)*:file:_files'
|
||||||
|
'(-z --search-zip)'{-z,--search-zip}'[search in compressed files]'
|
||||||
|
)
|
||||||
|
|
||||||
|
[[ ${_RG_COMPLETE_LIST_ARGS:-} == (1|t*|y*) ]] && {
|
||||||
|
printf '%s\n' "${rg_args[@]}"
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
_arguments -s -S : "${rg_args[@]}" && return 0
|
||||||
|
|
||||||
|
while (( $#state )); do
|
||||||
|
case "${state[1]}" in
|
||||||
|
colorspec)
|
||||||
|
# @todo I don't like this because it allows you to do weird things like
|
||||||
|
# `line:line:bg:`. Also, i would like the `compadd -q` behaviour
|
||||||
|
[[ -prefix *:none: ]] && return 1
|
||||||
|
[[ -prefix *:*:*:* ]] && return 1
|
||||||
|
|
||||||
|
_values -S ':' 'color/style type' \
|
||||||
|
'column[specify coloring for column numbers]: :->attribute' \
|
||||||
|
'line[specify coloring for line numbers]: :->attribute' \
|
||||||
|
'match[specify coloring for match text]: :->attribute' \
|
||||||
|
'path[specify color for file names]: :->attribute' && return 0
|
||||||
|
|
||||||
|
[[ "${state}" == 'attribute' ]] &&
|
||||||
|
_values -S ':' 'color/style attribute' \
|
||||||
|
'none[clear color/style for type]' \
|
||||||
|
'bg[specify background color]: :->color' \
|
||||||
|
'fg[specify foreground color]: :->color' \
|
||||||
|
'style[specify text style]: :->style' && return 0
|
||||||
|
|
||||||
|
[[ "${state}" == 'color' ]] &&
|
||||||
|
_values -S ':' 'color value' \
|
||||||
|
black blue green red cyan magenta yellow white && return 0
|
||||||
|
|
||||||
|
[[ "${state}" == 'style' ]] &&
|
||||||
|
_values -S ':' 'style value' \
|
||||||
|
bold nobold intense nointense && return 0
|
||||||
|
;;
|
||||||
|
|
||||||
|
typespec)
|
||||||
|
if compset -P '[^:]##:include:'; then
|
||||||
|
_sequence -s ',' _rg_types && return 0
|
||||||
|
# @todo This bit in particular could be better, but it's a little
|
||||||
|
# complex, and attempting to solve it seems to run us up against a crash
|
||||||
|
# bug — zsh # 40362
|
||||||
|
elif compset -P '[^:]##:'; then
|
||||||
|
_message 'glob or include directive' && return 1
|
||||||
|
elif [[ ! -prefix *:* ]]; then
|
||||||
|
_rg_types -qS ':' && return 0
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
shift state
|
||||||
|
done
|
||||||
|
|
||||||
|
return 1
|
||||||
|
}
|
||||||
|
|
||||||
|
# zsh 5.1 refuses to complete options if a 'match-less' operand like our pattern
|
||||||
|
# could be 'completed' instead. We can use _guard() to avoid this problem, but
|
||||||
|
# it introduces another one: zsh won't print the message if we try to complete
|
||||||
|
# the pattern after having passed `--`. To work around *that* problem, we can
|
||||||
|
# use this function to bypass the _guard() when `--` is on the command line.
|
||||||
|
# This is inaccurate (it'd get confused by e.g. `rg -e --`), but zsh's handling
|
||||||
|
# of `--` isn't accurate anyway
|
||||||
|
_rg_pattern() {
|
||||||
|
if (( ${words[(I)--]} )); then
|
||||||
|
_message 'pattern'
|
||||||
|
else
|
||||||
|
_guard '^-*' 'pattern'
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# Complete encodings
|
||||||
|
_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
|
||||||
|
)
|
||||||
|
|
||||||
|
_wanted rg-encodings expl 'encoding' compadd -a "${@}" - _encodings
|
||||||
|
}
|
||||||
|
|
||||||
|
# Complete file types
|
||||||
|
_rg_types() {
|
||||||
|
local -a expl
|
||||||
|
local -aU _types
|
||||||
|
|
||||||
|
_types=( ${${(f)"$( _call_program rg-types rg --type-list )"}%%:*} )
|
||||||
|
|
||||||
|
_wanted rg-types expl 'file type' compadd -a "${@}" - _types
|
||||||
|
}
|
||||||
|
|
||||||
|
_rg "${@}"
|
||||||
|
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Copyright (c) 2011 Github zsh-users - http://github.com/zsh-users
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# Redistribution and use in source and binary forms, with or without
|
||||||
|
# modification, are permitted provided that the following conditions are met:
|
||||||
|
# * Redistributions of source code must retain the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer.
|
||||||
|
# * Redistributions in binary form must reproduce the above copyright
|
||||||
|
# notice, this list of conditions and the following disclaimer in the
|
||||||
|
# documentation and/or other materials provided with the distribution.
|
||||||
|
# * Neither the name of the zsh-users nor the
|
||||||
|
# names of its contributors may be used to endorse or promote products
|
||||||
|
# derived from this software without specific prior written permission.
|
||||||
|
#
|
||||||
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
||||||
|
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||||
|
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
# DISCLAIMED. IN NO EVENT SHALL ZSH-USERS BE LIABLE FOR ANY
|
||||||
|
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||||
|
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||||
|
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||||
|
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||||
|
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||||
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Description
|
||||||
|
# -----------
|
||||||
|
#
|
||||||
|
# Completion script for ripgrep
|
||||||
|
#
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
# Authors
|
||||||
|
# -------
|
||||||
|
#
|
||||||
|
# * arcizan <ghostrevery@gmail.com>
|
||||||
|
# * MaskRay <i@maskray.me>
|
||||||
|
#
|
||||||
|
# ------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
# Local Variables:
|
||||||
|
# mode: shell-script
|
||||||
|
# coding: utf-8-unix
|
||||||
|
# indent-tabs-mode: nil
|
||||||
|
# sh-indentation: 2
|
||||||
|
# sh-basic-offset: 2
|
||||||
|
# End:
|
||||||
|
# vim: ft=zsh sw=2 ts=2 et
|
||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh -e
|
||||||
|
|
||||||
pandoc -s -t man rg.1.md -o rg.1
|
pandoc -s -f markdown-smart -t man rg.1.md -o rg.1
|
||||||
sed -i 's/\.TH.*/.TH "rg" "1"/g' rg.1
|
sed -i.bak 's/\.TH.*/.TH "rg" "1"/g' rg.1
|
||||||
|
rm -f rg.1.bak # BSD `sed` requires the creation of a back-up file
|
||||||
|
|||||||
342
doc/rg.1
342
doc/rg.1
@@ -1,4 +1,4 @@
|
|||||||
.\" Automatically generated by Pandoc 1.17.2
|
.\" Automatically generated by Pandoc 2.0.6
|
||||||
.\"
|
.\"
|
||||||
.TH "rg" "1"
|
.TH "rg" "1"
|
||||||
.hy
|
.hy
|
||||||
@@ -7,22 +7,48 @@
|
|||||||
rg \- recursively search current directory for lines matching a pattern
|
rg \- recursively search current directory for lines matching a pattern
|
||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.PP
|
.PP
|
||||||
rg [\f[I]options\f[]] \-e PATTERN ...
|
rg [\f[I]OPTIONS\f[]] \f[I]PATTERN\f[] [\f[I]PATH\f[] ...]
|
||||||
[\f[I]<\f[]path\f[I]> ...\f[]]
|
|
||||||
.PP
|
.PP
|
||||||
rg [\f[I]options\f[]] <\f[I]pattern\f[]> [\f[I]<\f[]path\f[I]> ...\f[]]
|
rg [\f[I]OPTIONS\f[]] [\-e \f[I]PATTERN\f[] ...] [\-f \f[I]FILE\f[] ...]
|
||||||
|
[\f[I]PATH\f[] ...]
|
||||||
.PP
|
.PP
|
||||||
rg [\f[I]options\f[]] \-\-files [\f[I]<\f[]path\f[I]> ...\f[]]
|
rg [\f[I]OPTIONS\f[]] \-\-files [\f[I]PATH\f[] ...]
|
||||||
.PP
|
.PP
|
||||||
rg [\f[I]options\f[]] \-\-type\-list
|
rg [\f[I]OPTIONS\f[]] \-\-type\-list
|
||||||
.PP
|
.PP
|
||||||
rg [\f[I]options\f[]] \-\-help
|
rg [\f[I]OPTIONS\f[]] \-\-help
|
||||||
.PP
|
.PP
|
||||||
rg [\f[I]options\f[]] \-\-version
|
rg [\f[I]OPTIONS\f[]] \-\-version
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
.PP
|
.PP
|
||||||
rg (ripgrep) combines the usability of The Silver Searcher (an ack
|
ripgrep (rg) combines the usability of The Silver Searcher (an ack
|
||||||
clone) with the raw speed of grep.
|
clone) with the raw speed of grep.
|
||||||
|
.PP
|
||||||
|
ripgrep\[aq]s regex engine uses finite automata and guarantees linear
|
||||||
|
time searching.
|
||||||
|
Because of this, features like backreferences and arbitrary lookaround
|
||||||
|
are not supported.
|
||||||
|
.PP
|
||||||
|
Note that ripgrep may abort unexpectedly when using default settings if
|
||||||
|
it searches a file that is simultaneously truncated.
|
||||||
|
This behavior can be avoided by passing the \-\-no\-mmap flag.
|
||||||
|
.PP
|
||||||
|
Project home page: https://github.com/BurntSushi/ripgrep
|
||||||
|
.SH POSITIONAL ARGUMENTS
|
||||||
|
.TP
|
||||||
|
.B \f[I]PATTERN\f[]
|
||||||
|
A regular expression used for searching.
|
||||||
|
To match a pattern beginning with a dash, use the \-e/\-\-regexp option.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \f[I]PATH\f[]
|
||||||
|
A file or directory to search.
|
||||||
|
Directories are searched recursively.
|
||||||
|
Paths specified expicitly on the command line override glob and ignore
|
||||||
|
rules.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
.SH COMMON OPTIONS
|
.SH COMMON OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.B \-a, \-\-text
|
.B \-a, \-\-text
|
||||||
@@ -36,9 +62,12 @@ Only show count of line matches for each file.
|
|||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-\-color \f[I]WHEN\f[]
|
.B \-\-color \f[I]WHEN\f[]
|
||||||
Whether to use coloring in match.
|
Whether to use color in the output.
|
||||||
Valid values are never, always or auto.
|
Valid values are never, auto, always or ansi.
|
||||||
[default: auto]
|
The default is auto.
|
||||||
|
When always is used, coloring is attempted based on your environment.
|
||||||
|
When ansi is used, coloring is forcefully done using ANSI escape color
|
||||||
|
codes.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
@@ -46,6 +75,7 @@ Valid values are never, always or auto.
|
|||||||
Use PATTERN to search.
|
Use PATTERN to search.
|
||||||
This option can be provided multiple times, where all patterns given are
|
This option can be provided multiple times, where all patterns given are
|
||||||
searched.
|
searched.
|
||||||
|
This is also useful when searching for patterns that start with a dash.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
@@ -56,11 +86,29 @@ Treat the pattern as a literal string instead of a regular expression.
|
|||||||
.TP
|
.TP
|
||||||
.B \-g, \-\-glob \f[I]GLOB\f[] ...
|
.B \-g, \-\-glob \f[I]GLOB\f[] ...
|
||||||
Include or exclude files for searching that match the given glob.
|
Include or exclude files for searching that match the given glob.
|
||||||
This always overrides any other ignore logic.
|
This always overrides any other ignore logic if there is a conflict, but
|
||||||
|
is otherwise applied in addition to ignore files (e.g., .gitignore or
|
||||||
|
\&.ignore).
|
||||||
Multiple glob flags may be used.
|
Multiple glob flags may be used.
|
||||||
Globbing rules match .gitignore globs.
|
Globbing rules match .gitignore globs.
|
||||||
Precede a glob with a \[aq]!\[aq] to exclude it.
|
Precede a glob with a \[aq]!\[aq] to exclude it.
|
||||||
.RS
|
.RS
|
||||||
|
.PP
|
||||||
|
The \-\-glob flag subsumes the functionality of both the \-\-include and
|
||||||
|
\-\-exclude flags commonly found in other tools.
|
||||||
|
.PP
|
||||||
|
Values given to \-g must be quoted or your shell will expand them and
|
||||||
|
result in unexpected behavior.
|
||||||
|
.PP
|
||||||
|
Combine with the \-\-files flag to return matched filenames (i.e., to
|
||||||
|
replicate ack/ag\[aq]s \-g flag).
|
||||||
|
For example:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
rg\ \-g\ \[aq]*.foo\[aq]\ \-\-files
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-h, \-\-help
|
.B \-h, \-\-help
|
||||||
@@ -109,8 +157,15 @@ Reduce the level of \[aq]smart\[aq] searching.
|
|||||||
A single \-u doesn\[aq]t respect .gitignore (etc.) files.
|
A single \-u doesn\[aq]t respect .gitignore (etc.) files.
|
||||||
Two \-u flags will search hidden files and directories.
|
Two \-u flags will search hidden files and directories.
|
||||||
Three \-u flags will search binary files.
|
Three \-u flags will search binary files.
|
||||||
\-uu is equivalent to grep \-r, and \-uuu is equivalent to grep \-a \-r.
|
\-uu is equivalent to \f[C]grep\ \-r\f[], and \-uuu is equivalent to
|
||||||
|
\f[C]grep\ \-a\ \-r\f[].
|
||||||
.RS
|
.RS
|
||||||
|
.PP
|
||||||
|
Note that the \-u flags are convenient aliases for other combinations of
|
||||||
|
flags.
|
||||||
|
\-u aliases \-\-no\-ignore.
|
||||||
|
\-uu aliases \-\-no\-ignore \-\-hidden.
|
||||||
|
\-uuu aliases \-\-no\-ignore \-\-hidden \-\-text.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-v, \-\-invert\-match
|
.B \-v, \-\-invert\-match
|
||||||
@@ -123,6 +178,21 @@ Only show matches surrounded by word boundaries.
|
|||||||
This is equivalent to putting \\b before and after the search pattern.
|
This is equivalent to putting \\b before and after the search pattern.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-x, \-\-line\-regexp
|
||||||
|
Only show matches surrounded by line boundaries.
|
||||||
|
This is equivalent to putting ^...$ around the search pattern.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-z, \-\-search\-zip
|
||||||
|
Search in compressed files.
|
||||||
|
Currently gz, bz2, xz and lzma formats are supported.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
Note that ripgrep expects to find the decompression binaries for the
|
||||||
|
respective formats in your system\[aq]s PATH for use with this flag.
|
||||||
|
.RE
|
||||||
.SH LESS COMMON OPTIONS
|
.SH LESS COMMON OPTIONS
|
||||||
.TP
|
.TP
|
||||||
.B \-A, \-\-after\-context \f[I]NUM\f[]
|
.B \-A, \-\-after\-context \f[I]NUM\f[]
|
||||||
@@ -140,15 +210,41 @@ Show NUM lines before and after each match.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-colors \f[I]SPEC\f[] ...
|
||||||
|
This flag specifies color settings for use in the output.
|
||||||
|
This flag may be provided multiple times.
|
||||||
|
Settings are applied iteratively.
|
||||||
|
Colors are limited to one of eight choices: red, blue, green, cyan,
|
||||||
|
magenta, yellow, white and black.
|
||||||
|
Styles are limited to nobold, bold, nointense or intense.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
The format of the flag is {type}:{attribute}:{value}.
|
||||||
|
{type} should be one of path, line, column or match.
|
||||||
|
{attribute} can be fg, bg or style.
|
||||||
|
Value is either a color (for fg and bg) or a text style.
|
||||||
|
A special format, {type}:none, will clear all color settings for {type}.
|
||||||
|
.PP
|
||||||
|
For example, the following command will change the match color to
|
||||||
|
magenta and the background color for line numbers to yellow:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
rg\ \-\-colors\ \[aq]match:fg:magenta\[aq]\ \-\-colors\ \[aq]line:bg:yellow\[aq]\ foo.
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-\-column
|
.B \-\-column
|
||||||
Show column numbers (1 based) in output.
|
Show column numbers (1 based) in output.
|
||||||
This only shows the column numbers for the first match on each line.
|
This only shows the column numbers for the first match on each line.
|
||||||
Note that this doesn\[aq]t try to account for Unicode.
|
Note that this doesn\[aq]t try to account for Unicode.
|
||||||
One byte is equal to one column.
|
One byte is equal to one column.
|
||||||
|
This implies \-\-line\-number.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-\-context\-separator \f[I]ARG\f[]
|
.B \-\-context\-separator \f[I]SEPARATOR\f[]
|
||||||
The string to use when separating non\-continuous context lines.
|
The string to use when separating non\-continuous context lines.
|
||||||
Escape sequences may be used.
|
Escape sequences may be used.
|
||||||
[default: \-\-]
|
[default: \-\-]
|
||||||
@@ -160,9 +256,35 @@ Show debug messages.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-E, \-\-encoding \f[I]ENCODING\f[]
|
||||||
|
Specify the text encoding that ripgrep will use on all files searched.
|
||||||
|
The default value is \[aq]auto\[aq], which will cause ripgrep to do a
|
||||||
|
best effort automatic detection of encoding on a per\-file basis.
|
||||||
|
Other supported values can be found in the list of labels here:
|
||||||
|
https://encoding.spec.whatwg.org/#concept\-encoding\-get
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-f, \-\-file \f[I]FILE\f[] ...
|
||||||
|
Search for patterns from the given file, with one pattern per line.
|
||||||
|
When this flag is used or multiple times or in combination with the
|
||||||
|
\-e/\-\-regexp flag, then all patterns provided are searched.
|
||||||
|
Empty pattern lines will match all input lines, and the newline is not
|
||||||
|
counted as part of the pattern.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-\-files
|
.B \-\-files
|
||||||
Print each file that would be searched (but don\[aq]t search).
|
Print each file that would be searched (but don\[aq]t search).
|
||||||
.RS
|
.RS
|
||||||
|
.PP
|
||||||
|
Combine with the \-g flag to return matched paths, for example:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
rg\ \-g\ \[aq]*.foo\[aq]\ \-\-files
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-l, \-\-files\-with\-matches
|
.B \-l, \-\-files\-with\-matches
|
||||||
@@ -170,9 +292,17 @@ Only show path of each file with matches.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-files\-without\-match
|
||||||
|
Only show path of each file with no matches.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-H, \-\-with\-filename
|
.B \-H, \-\-with\-filename
|
||||||
Prefix each match with the file name that contains it.
|
Display the file name for matches.
|
||||||
This is the default when more than one file is searched.
|
This is the default when more than one file is searched.
|
||||||
|
If \-\-heading is enabled, the file name will be shown above clusters of
|
||||||
|
matches from each file; otherwise, the file name will be shown on each
|
||||||
|
match.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
@@ -183,13 +313,17 @@ This is the default when one file is searched.
|
|||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-\-heading
|
.B \-\-heading
|
||||||
Show the file name above clusters of matches from each file.
|
Show the file name above clusters of matches from each file instead of
|
||||||
|
showing the file name for every match.
|
||||||
This is the default mode at a tty.
|
This is the default mode at a tty.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-\-no\-heading
|
.B \-\-no\-heading
|
||||||
Don\[aq]t show any file name heading.
|
Don\[aq]t group matches by each file.
|
||||||
|
If \-H/\-\-with\-filename is enabled, then file names will be shown for
|
||||||
|
every line matched.
|
||||||
|
This is the default mode when not at a tty.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
@@ -199,11 +333,62 @@ Search hidden directories and files.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-iglob \f[I]GLOB\f[] ...
|
||||||
|
Include or exclude files/directories case insensitively.
|
||||||
|
This always overrides any other ignore logic if there is a conflict, but
|
||||||
|
is otherwise applied in addition to ignore files (e.g., .gitignore or
|
||||||
|
\&.ignore).
|
||||||
|
Multiple glob flags may be used.
|
||||||
|
Globbing rules match .gitignore globs.
|
||||||
|
Precede a glob with a \[aq]!\[aq] to exclude it.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-\-ignore\-file \f[I]FILE\f[] ...
|
||||||
|
Specify additional ignore files for filtering file paths.
|
||||||
|
Ignore files should be in the gitignore format and are matched relative
|
||||||
|
to the current working directory.
|
||||||
|
These ignore files have lower precedence than all other ignore files.
|
||||||
|
When specifying multiple ignore files, earlier files have lower
|
||||||
|
precedence than later files.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-L, \-\-follow
|
.B \-L, \-\-follow
|
||||||
Follow symlinks.
|
Follow symlinks.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-line\-number\-width \f[I]NUM\f[]
|
||||||
|
Specify a width for the displayed line number.
|
||||||
|
If number of digits in the line number is less than this number, it is
|
||||||
|
left padded with spaces.
|
||||||
|
Note: This setting has no effect if \-\-no\-line\-number is enabled.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-M, \-\-max\-columns \f[I]NUM\f[]
|
||||||
|
Don\[aq]t print lines longer than this limit in bytes.
|
||||||
|
Longer lines are omitted, and only the number of matches in that line is
|
||||||
|
printed.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-m, \-\-max\-count \f[I]NUM\f[]
|
||||||
|
Limit the number of matching lines per file searched to NUM.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-\-max\-filesize \f[I]NUM\f[]+\f[I]SUFFIX\f[]?
|
||||||
|
Ignore files larger than \f[I]NUM\f[] in size.
|
||||||
|
Directories will never be ignored.
|
||||||
|
.RS
|
||||||
|
.PP
|
||||||
|
\f[I]SUFFIX\f[] is optional and may be one of K, M or G.
|
||||||
|
These correspond to kilobytes, megabytes and gigabytes respectively.
|
||||||
|
If omitted the input is treated as bytes.
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-\-maxdepth \f[I]NUM\f[]
|
.B \-\-maxdepth \f[I]NUM\f[]
|
||||||
Descend at most NUM directories below the command line arguments.
|
Descend at most NUM directories below the command line arguments.
|
||||||
A value of zero searches only the starting\-points themselves.
|
A value of zero searches only the starting\-points themselves.
|
||||||
@@ -218,6 +403,11 @@ context related options.)
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-\-no\-messages
|
||||||
|
Suppress all error messages.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-\-no\-mmap
|
.B \-\-no\-mmap
|
||||||
Never use memory maps, even when they might be faster.
|
Never use memory maps, even when they might be faster.
|
||||||
.RS
|
.RS
|
||||||
@@ -240,7 +430,7 @@ Note that .ignore files will continue to be respected.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-\-null
|
.B \-0, \-\-null
|
||||||
Whenever a file name is printed, follow it with a NUL byte.
|
Whenever a file name is printed, follow it with a NUL byte.
|
||||||
This includes printing filenames before matches, and when printing a
|
This includes printing filenames before matches, and when printing a
|
||||||
list of matching files such as with \-\-count, \-\-files\-with\-matches
|
list of matching files such as with \-\-count, \-\-files\-with\-matches
|
||||||
@@ -248,8 +438,30 @@ and \-\-files.
|
|||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
|
.B \-o, \-\-only\-matching
|
||||||
|
Print only the matched (non\-empty) parts of a matching line, with each
|
||||||
|
such part on a separate output line.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-\-passthru, \-\-passthrough
|
||||||
|
Show both matching and non\-matching lines.
|
||||||
|
This option cannot be used with \-\-only\-matching or \-\-replace.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-\-path\-separator \f[I]SEPARATOR\f[]
|
||||||
|
The path separator to use when printing file paths.
|
||||||
|
This defaults to your platform\[aq]s path separator, which is / on Unix
|
||||||
|
and \\ on Windows.
|
||||||
|
This flag is intended for overriding the default when the environment
|
||||||
|
demands it (e.g., cygwin).
|
||||||
|
A path separator is limited to a single byte.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
.B \-p, \-\-pretty
|
.B \-p, \-\-pretty
|
||||||
Alias for \-\-color=always \-\-heading \-n.
|
Alias for \-\-color=always \-\-heading \-\-line\-number.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
@@ -260,11 +472,22 @@ Neither this flag nor any other flag will modify your files.
|
|||||||
.PP
|
.PP
|
||||||
Capture group indices (e.g., $5) and names (e.g., $foo) are supported in
|
Capture group indices (e.g., $5) and names (e.g., $foo) are supported in
|
||||||
the replacement string.
|
the replacement string.
|
||||||
|
.PP
|
||||||
|
Note that the replacement by default replaces each match, and NOT the
|
||||||
|
entire line.
|
||||||
|
To replace the entire line, you should match the entire line.
|
||||||
|
For example, to emit only the first phone numbers in each line:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
rg\ \[aq]^.*([0\-9]{3}\-[0\-9]{3}\-[0\-9]{4}).*$\[aq]\ \-\-replace\ \[aq]$1\[aq]
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-s, \-\-case\-sensitive
|
.B \-s, \-\-case\-sensitive
|
||||||
Search case sensitively.
|
Search case sensitively (default).
|
||||||
This overrides \-\-ignore\-case and \-\-smart\-case.
|
Overrides \-\-ignore\-case and \-\-smart\-case.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
@@ -272,12 +495,22 @@ This overrides \-\-ignore\-case and \-\-smart\-case.
|
|||||||
Search case insensitively if the pattern is all lowercase.
|
Search case insensitively if the pattern is all lowercase.
|
||||||
Search case sensitively otherwise.
|
Search case sensitively otherwise.
|
||||||
This is overridden by either \-\-case\-sensitive or \-\-ignore\-case.
|
This is overridden by either \-\-case\-sensitive or \-\-ignore\-case.
|
||||||
|
Note: This feature is smart enough to treat simple classes like \\S as
|
||||||
|
lowercase, but may not handle more complex syntax like \\p{Ll} as
|
||||||
|
expected.
|
||||||
|
.RS
|
||||||
|
.RE
|
||||||
|
.TP
|
||||||
|
.B \-\-sort\-files
|
||||||
|
Sort results by file path.
|
||||||
|
Note that this currently disables all parallelism and runs search in a
|
||||||
|
single thread.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-j, \-\-threads \f[I]ARG\f[]
|
.B \-j, \-\-threads \f[I]ARG\f[]
|
||||||
The number of threads to use.
|
The number of threads to use.
|
||||||
0 means use the number of logical CPUs (capped at 6).
|
0 means use the number of logical CPUs (capped at 12).
|
||||||
[default: 0]
|
[default: 0]
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
@@ -290,9 +523,21 @@ Show the version number of ripgrep and exit.
|
|||||||
.B \-\-vimgrep
|
.B \-\-vimgrep
|
||||||
Show results with every match on its own line, including line numbers
|
Show results with every match on its own line, including line numbers
|
||||||
and column numbers.
|
and column numbers.
|
||||||
(With this option, a line with more than one match of the regex will be
|
With this option, a line with more than one match will be printed more
|
||||||
printed more than once.)
|
than once.
|
||||||
.RS
|
.RS
|
||||||
|
.PP
|
||||||
|
Recommended .vimrc configuration:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
\ \ set\ grepprg=rg\\\ \-\-vimgrep
|
||||||
|
\ \ set\ grepformat^=%f:%l:%c:%m
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Use :grep to grep for something, then :cn and :cp to navigate through
|
||||||
|
the matches.
|
||||||
.RE
|
.RE
|
||||||
.SH FILE TYPE MANAGEMENT OPTIONS
|
.SH FILE TYPE MANAGEMENT OPTIONS
|
||||||
.TP
|
.TP
|
||||||
@@ -309,10 +554,40 @@ Unless \-\-type\-clear is used, globs are added to any existing globs
|
|||||||
inside of ripgrep.
|
inside of ripgrep.
|
||||||
Note that this must be passed to every invocation of rg.
|
Note that this must be passed to every invocation of rg.
|
||||||
Type settings are NOT persisted.
|
Type settings are NOT persisted.
|
||||||
.RS
|
|
||||||
.PP
|
|
||||||
Example:
|
Example:
|
||||||
\f[C]rg\ \-\-type\-add\ \[aq]foo:*.foo\[aq]\ \-tfoo\ PATTERN\f[]
|
.RS
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
\ \ rg\ \-\-type\-add\ \[aq]foo:*.foo\[aq]\ \-tfoo\ PATTERN
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
\-\-type\-add can also be used to include rules from other types with
|
||||||
|
the special include directive.
|
||||||
|
The include directive permits specifying one or more other type names
|
||||||
|
(separated by a comma) that have been defined and its rules will
|
||||||
|
automatically be imported into the type specified.
|
||||||
|
For example, to create a type called src that matches C++, Python and
|
||||||
|
Markdown files, one can use:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
\ \ \-\-type\-add\ \[aq]src:include:cpp,py,md\[aq]
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Additional glob rules can still be added to the src type by using the
|
||||||
|
\-\-type\-add flag again:
|
||||||
|
.IP
|
||||||
|
.nf
|
||||||
|
\f[C]
|
||||||
|
\ \ \-\-type\-add\ \[aq]src:include:cpp,py,md\[aq]\ \-\-type\-add\ \[aq]src:*.foo\[aq]
|
||||||
|
\f[]
|
||||||
|
.fi
|
||||||
|
.PP
|
||||||
|
Note that type names must consist only of Unicode letters or numbers.
|
||||||
|
Punctuation characters are not allowed.
|
||||||
.RE
|
.RE
|
||||||
.TP
|
.TP
|
||||||
.B \-\-type\-clear \f[I]TYPE\f[] ...
|
.B \-\-type\-clear \f[I]TYPE\f[] ...
|
||||||
@@ -322,3 +597,14 @@ ripgrep.
|
|||||||
Note that this must be passed to every invocation of rg.
|
Note that this must be passed to every invocation of rg.
|
||||||
.RS
|
.RS
|
||||||
.RE
|
.RE
|
||||||
|
.SH SHELL COMPLETION
|
||||||
|
.PP
|
||||||
|
Shell completion files are included in the release tarball for Bash,
|
||||||
|
Fish, Zsh and PowerShell.
|
||||||
|
.PP
|
||||||
|
For \f[B]bash\f[], move \f[C]rg.bash\-completion\f[] to
|
||||||
|
\f[C]$XDG_CONFIG_HOME/bash_completion\f[] or
|
||||||
|
\f[C]/etc/bash_completion.d/\f[].
|
||||||
|
.PP
|
||||||
|
For \f[B]fish\f[], move \f[C]rg.fish\f[] to
|
||||||
|
\f[C]$HOME/.config/fish/completions\f[].
|
||||||
|
|||||||
254
doc/rg.1.md
254
doc/rg.1.md
@@ -4,23 +4,43 @@ rg - recursively search current directory for lines matching a pattern
|
|||||||
|
|
||||||
# SYNOPSIS
|
# SYNOPSIS
|
||||||
|
|
||||||
rg [*options*] -e PATTERN ... [*<*path*> ...*]
|
rg [*OPTIONS*] *PATTERN* [*PATH* ...]
|
||||||
|
|
||||||
rg [*options*] <*pattern*> [*<*path*> ...*]
|
rg [*OPTIONS*] [-e *PATTERN* ...] [-f *FILE* ...] [*PATH* ...]
|
||||||
|
|
||||||
rg [*options*] --files [*<*path*> ...*]
|
rg [*OPTIONS*] --files [*PATH* ...]
|
||||||
|
|
||||||
rg [*options*] --type-list
|
rg [*OPTIONS*] --type-list
|
||||||
|
|
||||||
rg [*options*] --help
|
rg [*OPTIONS*] --help
|
||||||
|
|
||||||
rg [*options*] --version
|
rg [*OPTIONS*] --version
|
||||||
|
|
||||||
# DESCRIPTION
|
# DESCRIPTION
|
||||||
|
|
||||||
rg (ripgrep) combines the usability of The Silver Searcher (an ack clone) with
|
ripgrep (rg) combines the usability of The Silver Searcher (an ack clone) with
|
||||||
the raw speed of grep.
|
the raw speed of grep.
|
||||||
|
|
||||||
|
ripgrep's regex engine uses finite automata and guarantees linear time
|
||||||
|
searching. Because of this, features like backreferences and arbitrary
|
||||||
|
lookaround are not supported.
|
||||||
|
|
||||||
|
Note that ripgrep may abort unexpectedly when using default settings if it
|
||||||
|
searches a file that is simultaneously truncated. This behavior can be avoided
|
||||||
|
by passing the --no-mmap flag.
|
||||||
|
|
||||||
|
Project home page: https://github.com/BurntSushi/ripgrep
|
||||||
|
|
||||||
|
# POSITIONAL ARGUMENTS
|
||||||
|
|
||||||
|
*PATTERN*
|
||||||
|
: A regular expression used for searching. To match a pattern beginning with a
|
||||||
|
dash, use the -e/--regexp option.
|
||||||
|
|
||||||
|
*PATH*
|
||||||
|
: A file or directory to search. Directories are searched recursively. Paths
|
||||||
|
specified expicitly on the command line override glob and ignore rules.
|
||||||
|
|
||||||
# COMMON OPTIONS
|
# COMMON OPTIONS
|
||||||
|
|
||||||
-a, --text
|
-a, --text
|
||||||
@@ -30,20 +50,36 @@ the raw speed of grep.
|
|||||||
: Only show count of line matches for each file.
|
: Only show count of line matches for each file.
|
||||||
|
|
||||||
--color *WHEN*
|
--color *WHEN*
|
||||||
: Whether to use coloring in match. Valid values are never, always or auto.
|
: Whether to use color in the output. Valid values are never, auto, always or
|
||||||
[default: auto]
|
ansi. The default is auto. When always is used, coloring is attempted based
|
||||||
|
on your environment. When ansi is used, coloring is forcefully done using
|
||||||
|
ANSI escape color codes.
|
||||||
|
|
||||||
-e, --regexp *PATTERN* ...
|
-e, --regexp *PATTERN* ...
|
||||||
: Use PATTERN to search. This option can be provided multiple times, where all
|
: Use PATTERN to search. This option can be provided multiple times, where all
|
||||||
patterns given are searched.
|
patterns given are searched. This is also useful when searching for patterns
|
||||||
|
that start with a dash.
|
||||||
|
|
||||||
-F, --fixed-strings
|
-F, --fixed-strings
|
||||||
: Treat the pattern as a literal string instead of a regular expression.
|
: Treat the pattern as a literal string instead of a regular expression.
|
||||||
|
|
||||||
-g, --glob *GLOB* ...
|
-g, --glob *GLOB* ...
|
||||||
: Include or exclude files for searching that match the given glob. This always
|
: Include or exclude files for searching that match the given glob. This always
|
||||||
overrides any other ignore logic. Multiple glob flags may be used. Globbing
|
overrides any other ignore logic if there is a conflict, but is otherwise
|
||||||
rules match .gitignore globs. Precede a glob with a '!' to exclude it.
|
applied in addition to ignore files (e.g., .gitignore or .ignore). Multiple
|
||||||
|
glob flags may be used. Globbing rules match .gitignore globs. Precede a
|
||||||
|
glob with a '!' to exclude it.
|
||||||
|
|
||||||
|
The --glob flag subsumes the functionality of both the --include and
|
||||||
|
--exclude flags commonly found in other tools.
|
||||||
|
|
||||||
|
Values given to -g must be quoted or your shell will expand them and result
|
||||||
|
in unexpected behavior.
|
||||||
|
|
||||||
|
Combine with the --files flag to return matched filenames
|
||||||
|
(i.e., to replicate ack/ag's -g flag). For example:
|
||||||
|
|
||||||
|
rg -g '*.foo' --files
|
||||||
|
|
||||||
-h, --help
|
-h, --help
|
||||||
: Show this usage message.
|
: Show this usage message.
|
||||||
@@ -71,8 +107,12 @@ the raw speed of grep.
|
|||||||
-u, --unrestricted ...
|
-u, --unrestricted ...
|
||||||
: Reduce the level of 'smart' searching. A single -u doesn't respect .gitignore
|
: Reduce the level of 'smart' searching. A single -u doesn't respect .gitignore
|
||||||
(etc.) files. Two -u flags will search hidden files and directories. Three
|
(etc.) files. Two -u flags will search hidden files and directories. Three
|
||||||
-u flags will search binary files. -uu is equivalent to grep -r, and -uuu is
|
-u flags will search binary files. -uu is equivalent to `grep -r`, and -uuu
|
||||||
equivalent to grep -a -r.
|
is equivalent to `grep -a -r`.
|
||||||
|
|
||||||
|
Note that the -u flags are convenient aliases for other combinations of
|
||||||
|
flags. -u aliases --no-ignore. -uu aliases --no-ignore --hidden.
|
||||||
|
-uuu aliases --no-ignore --hidden --text.
|
||||||
|
|
||||||
-v, --invert-match
|
-v, --invert-match
|
||||||
: Invert matching.
|
: Invert matching.
|
||||||
@@ -81,6 +121,17 @@ the raw speed of grep.
|
|||||||
: Only show matches surrounded by word boundaries. This is equivalent to
|
: Only show matches surrounded by word boundaries. This is equivalent to
|
||||||
putting \\b before and after the search pattern.
|
putting \\b before and after the search pattern.
|
||||||
|
|
||||||
|
-x, --line-regexp
|
||||||
|
: Only show matches surrounded by line boundaries. This is equivalent to
|
||||||
|
putting ^...$ around the search pattern.
|
||||||
|
|
||||||
|
-z, --search-zip
|
||||||
|
: Search in compressed files. Currently gz, bz2, xz and lzma
|
||||||
|
formats are supported.
|
||||||
|
|
||||||
|
Note that ripgrep expects to find the decompression binaries for the
|
||||||
|
respective formats in your system's PATH for use with this flag.
|
||||||
|
|
||||||
# LESS COMMON OPTIONS
|
# LESS COMMON OPTIONS
|
||||||
|
|
||||||
-A, --after-context *NUM*
|
-A, --after-context *NUM*
|
||||||
@@ -92,46 +143,122 @@ the raw speed of grep.
|
|||||||
-C, --context *NUM*
|
-C, --context *NUM*
|
||||||
: Show NUM lines before and after each match.
|
: Show NUM lines before and after each match.
|
||||||
|
|
||||||
|
--colors *SPEC* ...
|
||||||
|
: This flag specifies color settings for use in the output. This flag may be
|
||||||
|
provided multiple times. Settings are applied iteratively. Colors are limited
|
||||||
|
to one of eight choices: red, blue, green, cyan, magenta, yellow, white and
|
||||||
|
black. Styles are limited to nobold, bold, nointense or intense.
|
||||||
|
|
||||||
|
The format of the flag is {type}:{attribute}:{value}. {type} should be one
|
||||||
|
of path, line, column or match. {attribute} can be fg, bg or style. Value
|
||||||
|
is either a color (for fg and bg) or a text style. A special format,
|
||||||
|
{type}:none, will clear all color settings for {type}.
|
||||||
|
|
||||||
|
For example, the following command will change the match color to magenta
|
||||||
|
and the background color for line numbers to yellow:
|
||||||
|
|
||||||
|
rg --colors 'match:fg:magenta' --colors 'line:bg:yellow' foo.
|
||||||
|
|
||||||
--column
|
--column
|
||||||
: Show column numbers (1 based) in output. This only shows the column
|
: Show column numbers (1 based) in output. This only shows the column
|
||||||
numbers for the first match on each line. Note that this doesn't try
|
numbers for the first match on each line. Note that this doesn't try
|
||||||
to account for Unicode. One byte is equal to one column.
|
to account for Unicode. One byte is equal to one column. This implies
|
||||||
|
--line-number.
|
||||||
|
|
||||||
--context-separator *ARG*
|
--context-separator *SEPARATOR*
|
||||||
: The string to use when separating non-continuous context lines. Escape
|
: The string to use when separating non-continuous context lines. Escape
|
||||||
sequences may be used. [default: --]
|
sequences may be used. [default: --]
|
||||||
|
|
||||||
--debug
|
--debug
|
||||||
: Show debug messages.
|
: Show debug messages.
|
||||||
|
|
||||||
|
-E, --encoding *ENCODING*
|
||||||
|
: Specify the text encoding that ripgrep will use on all files
|
||||||
|
searched. The default value is 'auto', which will cause ripgrep to do
|
||||||
|
a best effort automatic detection of encoding on a per-file basis.
|
||||||
|
Other supported values can be found in the list of labels here:
|
||||||
|
https://encoding.spec.whatwg.org/#concept-encoding-get
|
||||||
|
|
||||||
|
-f, --file *FILE* ...
|
||||||
|
: Search for patterns from the given file, with one pattern per line. When this
|
||||||
|
flag is used or multiple times or in combination with the -e/--regexp flag,
|
||||||
|
then all patterns provided are searched. Empty pattern lines will match all
|
||||||
|
input lines, and the newline is not counted as part of the pattern.
|
||||||
|
|
||||||
--files
|
--files
|
||||||
: Print each file that would be searched (but don't search).
|
: Print each file that would be searched (but don't search).
|
||||||
|
|
||||||
|
Combine with the -g flag to return matched paths, for example:
|
||||||
|
|
||||||
|
rg -g '*.foo' --files
|
||||||
|
|
||||||
-l, --files-with-matches
|
-l, --files-with-matches
|
||||||
: Only show path of each file with matches.
|
: Only show path of each file with matches.
|
||||||
|
|
||||||
|
--files-without-match
|
||||||
|
: Only show path of each file with no matches.
|
||||||
|
|
||||||
-H, --with-filename
|
-H, --with-filename
|
||||||
: Prefix each match with the file name that contains it. This is the
|
: Display the file name for matches. This is the default when
|
||||||
default when more than one file is searched.
|
more than one file is searched. If --heading is enabled, the
|
||||||
|
file name will be shown above clusters of matches from each
|
||||||
|
file; otherwise, the file name will be shown on each match.
|
||||||
|
|
||||||
--no-filename
|
--no-filename
|
||||||
: Never show the filename for a match. This is the default when
|
: Never show the filename for a match. This is the default when
|
||||||
one file is searched.
|
one file is searched.
|
||||||
|
|
||||||
--heading
|
--heading
|
||||||
: Show the file name above clusters of matches from each file.
|
: Show the file name above clusters of matches from each file instead of
|
||||||
This is the default mode at a tty.
|
showing the file name for every match. This is the default mode at a tty.
|
||||||
|
|
||||||
--no-heading
|
--no-heading
|
||||||
: Don't show any file name heading.
|
: Don't group matches by each file. If -H/--with-filename is enabled, then
|
||||||
|
file names will be shown for every line matched. This is the default mode
|
||||||
|
when not at a tty.
|
||||||
|
|
||||||
--hidden
|
--hidden
|
||||||
: Search hidden directories and files. (Hidden directories and files are
|
: Search hidden directories and files. (Hidden directories and files are
|
||||||
skipped by default.)
|
skipped by default.)
|
||||||
|
|
||||||
|
--iglob *GLOB* ...
|
||||||
|
: Include or exclude files/directories case insensitively. This always
|
||||||
|
overrides any other ignore logic if there is a conflict, but is otherwise
|
||||||
|
applied in addition to ignore files (e.g., .gitignore or .ignore). Multiple
|
||||||
|
glob flags may be used. Globbing rules match .gitignore globs. Precede a
|
||||||
|
glob with a '!' to exclude it.
|
||||||
|
|
||||||
|
--ignore-file *FILE* ...
|
||||||
|
: Specify additional ignore files for filtering file paths.
|
||||||
|
Ignore files should be in the gitignore format and are matched
|
||||||
|
relative to the current working directory. These ignore files
|
||||||
|
have lower precedence than all other ignore files. When
|
||||||
|
specifying multiple ignore files, earlier files have lower
|
||||||
|
precedence than later files.
|
||||||
|
|
||||||
-L, --follow
|
-L, --follow
|
||||||
: Follow symlinks.
|
: Follow symlinks.
|
||||||
|
|
||||||
|
--line-number-width *NUM*
|
||||||
|
: Specify a width for the displayed line number. If number of digits
|
||||||
|
in the line number is less than this number, it is left padded with
|
||||||
|
spaces. Note: This setting has no effect if --no-line-number is
|
||||||
|
enabled.
|
||||||
|
|
||||||
|
-M, --max-columns *NUM*
|
||||||
|
: Don't print lines longer than this limit in bytes. Longer lines are omitted,
|
||||||
|
and only the number of matches in that line is printed.
|
||||||
|
|
||||||
|
-m, --max-count *NUM*
|
||||||
|
: Limit the number of matching lines per file searched to NUM.
|
||||||
|
|
||||||
|
--max-filesize *NUM*+*SUFFIX*?
|
||||||
|
: Ignore files larger than *NUM* in size. Directories will never be ignored.
|
||||||
|
|
||||||
|
*SUFFIX* is optional and may be one of K, M or G. These correspond to
|
||||||
|
kilobytes, megabytes and gigabytes respectively. If omitted the input is
|
||||||
|
treated as bytes.
|
||||||
|
|
||||||
--maxdepth *NUM*
|
--maxdepth *NUM*
|
||||||
: Descend at most NUM directories below the command line arguments.
|
: Descend at most NUM directories below the command line arguments.
|
||||||
A value of zero searches only the starting-points themselves.
|
A value of zero searches only the starting-points themselves.
|
||||||
@@ -141,6 +268,9 @@ the raw speed of grep.
|
|||||||
when ripgrep thinks it will be faster. (Note that mmap searching
|
when ripgrep thinks it will be faster. (Note that mmap searching
|
||||||
doesn't currently support the various context related options.)
|
doesn't currently support the various context related options.)
|
||||||
|
|
||||||
|
--no-messages
|
||||||
|
: Suppress all error messages.
|
||||||
|
|
||||||
--no-mmap
|
--no-mmap
|
||||||
: Never use memory maps, even when they might be faster.
|
: Never use memory maps, even when they might be faster.
|
||||||
|
|
||||||
@@ -155,14 +285,28 @@ the raw speed of grep.
|
|||||||
: Don't respect version control ignore files (e.g., .gitignore).
|
: Don't respect version control ignore files (e.g., .gitignore).
|
||||||
Note that .ignore files will continue to be respected.
|
Note that .ignore files will continue to be respected.
|
||||||
|
|
||||||
--null
|
-0, --null
|
||||||
: Whenever a file name is printed, follow it with a NUL byte.
|
: Whenever a file name is printed, follow it with a NUL byte.
|
||||||
This includes printing filenames before matches, and when printing
|
This includes printing filenames before matches, and when printing
|
||||||
a list of matching files such as with --count, --files-with-matches
|
a list of matching files such as with --count, --files-with-matches
|
||||||
and --files.
|
and --files.
|
||||||
|
|
||||||
|
-o, --only-matching
|
||||||
|
: Print only the matched (non-empty) parts of a matching line, with each such
|
||||||
|
part on a separate output line.
|
||||||
|
|
||||||
|
--passthru, --passthrough
|
||||||
|
: Show both matching and non-matching lines. This option cannot be used with
|
||||||
|
--only-matching or --replace.
|
||||||
|
|
||||||
|
--path-separator *SEPARATOR*
|
||||||
|
: The path separator to use when printing file paths. This defaults to your
|
||||||
|
platform's path separator, which is / on Unix and \\ on Windows. This flag is
|
||||||
|
intended for overriding the default when the environment demands it (e.g.,
|
||||||
|
cygwin). A path separator is limited to a single byte.
|
||||||
|
|
||||||
-p, --pretty
|
-p, --pretty
|
||||||
: Alias for --color=always --heading -n.
|
: Alias for --color=always --heading --line-number.
|
||||||
|
|
||||||
-r, --replace *ARG*
|
-r, --replace *ARG*
|
||||||
: Replace every match with the string given when printing search results.
|
: Replace every match with the string given when printing search results.
|
||||||
@@ -171,25 +315,45 @@ the raw speed of grep.
|
|||||||
Capture group indices (e.g., $5) and names (e.g., $foo) are supported
|
Capture group indices (e.g., $5) and names (e.g., $foo) are supported
|
||||||
in the replacement string.
|
in the replacement string.
|
||||||
|
|
||||||
|
Note that the replacement by default replaces each match, and NOT the
|
||||||
|
entire line. To replace the entire line, you should match the entire line.
|
||||||
|
For example, to emit only the first phone numbers in each line:
|
||||||
|
|
||||||
|
rg '^.*([0-9]{3}-[0-9]{3}-[0-9]{4}).*$' --replace '$1'
|
||||||
|
|
||||||
-s, --case-sensitive
|
-s, --case-sensitive
|
||||||
: Search case sensitively. This overrides --ignore-case and --smart-case.
|
: Search case sensitively (default). Overrides --ignore-case and --smart-case.
|
||||||
|
|
||||||
-S, --smart-case
|
-S, --smart-case
|
||||||
: Search case insensitively if the pattern is all lowercase.
|
: Search case insensitively if the pattern is all lowercase.
|
||||||
Search case sensitively otherwise. This is overridden by either
|
Search case sensitively otherwise. This is overridden by either
|
||||||
--case-sensitive or --ignore-case.
|
--case-sensitive or --ignore-case. Note: This feature is smart enough
|
||||||
|
to treat simple classes like \\S as lowercase, but may not handle more
|
||||||
|
complex syntax like \\p{Ll} as expected.
|
||||||
|
|
||||||
|
--sort-files
|
||||||
|
: Sort results by file path. Note that this currently
|
||||||
|
disables all parallelism and runs search in a single thread.
|
||||||
|
|
||||||
-j, --threads *ARG*
|
-j, --threads *ARG*
|
||||||
: The number of threads to use. 0 means use the number of logical CPUs
|
: The number of threads to use. 0 means use the number of logical CPUs
|
||||||
(capped at 6). [default: 0]
|
(capped at 12). [default: 0]
|
||||||
|
|
||||||
--version
|
--version
|
||||||
: Show the version number of ripgrep and exit.
|
: Show the version number of ripgrep and exit.
|
||||||
|
|
||||||
--vimgrep
|
--vimgrep
|
||||||
: Show results with every match on its own line, including line
|
: Show results with every match on its own line, including
|
||||||
numbers and column numbers. (With this option, a line with more
|
line numbers and column numbers. With this option, a line with
|
||||||
than one match of the regex will be printed more than once.)
|
more than one match will be printed more than once.
|
||||||
|
|
||||||
|
Recommended .vimrc configuration:
|
||||||
|
|
||||||
|
set grepprg=rg\ --vimgrep
|
||||||
|
set grepformat^=%f:%l:%c:%m
|
||||||
|
|
||||||
|
Use :grep to grep for something, then :cn and :cp to navigate through the
|
||||||
|
matches.
|
||||||
|
|
||||||
# FILE TYPE MANAGEMENT OPTIONS
|
# FILE TYPE MANAGEMENT OPTIONS
|
||||||
|
|
||||||
@@ -201,11 +365,39 @@ the raw speed of grep.
|
|||||||
at a time. Multiple --type-add flags can be provided. Unless --type-clear
|
at a time. Multiple --type-add flags can be provided. Unless --type-clear
|
||||||
is used, globs are added to any existing globs inside of ripgrep. Note that
|
is used, globs are added to any existing globs inside of ripgrep. Note that
|
||||||
this must be passed to every invocation of rg. Type settings are NOT
|
this must be passed to every invocation of rg. Type settings are NOT
|
||||||
persisted.
|
persisted. Example:
|
||||||
|
|
||||||
Example: `rg --type-add 'foo:*.foo' -tfoo PATTERN`
|
rg --type-add 'foo:*.foo' -tfoo PATTERN
|
||||||
|
|
||||||
|
--type-add can also be used to include rules from other types
|
||||||
|
with the special include directive. The include directive
|
||||||
|
permits specifying one or more other type names (separated by a
|
||||||
|
comma) that have been defined and its rules will automatically
|
||||||
|
be imported into the type specified. For example, to create a
|
||||||
|
type called src that matches C++, Python and Markdown files, one
|
||||||
|
can use:
|
||||||
|
|
||||||
|
--type-add 'src:include:cpp,py,md'
|
||||||
|
|
||||||
|
Additional glob rules can still be added to the src type by
|
||||||
|
using the --type-add flag again:
|
||||||
|
|
||||||
|
--type-add 'src:include:cpp,py,md' --type-add 'src:*.foo'
|
||||||
|
|
||||||
|
Note that type names must consist only of Unicode letters or
|
||||||
|
numbers. Punctuation characters are not allowed.
|
||||||
|
|
||||||
--type-clear *TYPE* ...
|
--type-clear *TYPE* ...
|
||||||
: Clear the file type globs previously defined for TYPE. This only clears
|
: Clear the file type globs previously defined for TYPE. This only clears
|
||||||
the default type definitions that are found inside of ripgrep. Note
|
the default type definitions that are found inside of ripgrep. Note
|
||||||
that this must be passed to every invocation of rg.
|
that this must be passed to every invocation of rg.
|
||||||
|
|
||||||
|
# SHELL COMPLETION
|
||||||
|
|
||||||
|
Shell completion files are included in the release tarball for Bash, Fish, Zsh
|
||||||
|
and PowerShell.
|
||||||
|
|
||||||
|
For **bash**, move `rg.bash-completion` to `$XDG_CONFIG_HOME/bash_completion`
|
||||||
|
or `/etc/bash_completion.d/`.
|
||||||
|
|
||||||
|
For **fish**, move `rg.fish` to `$HOME/.config/fish/completions`.
|
||||||
|
|||||||
3
globset/COPYING
Normal file
3
globset/COPYING
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This project is dual-licensed under the Unlicense and MIT licenses.
|
||||||
|
|
||||||
|
You may use this code under the terms of either license.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "globset"
|
name = "globset"
|
||||||
version = "0.1.1" #:version
|
version = "0.2.1" #:version
|
||||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||||
description = """
|
description = """
|
||||||
Cross platform single glob and glob set matching. Glob set matching is the
|
Cross platform single glob and glob set matching. Glob set matching is the
|
||||||
@@ -19,12 +19,11 @@ name = "globset"
|
|||||||
bench = false
|
bench = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
aho-corasick = "0.5.3"
|
aho-corasick = "0.6.0"
|
||||||
fnv = "1.0"
|
fnv = "1.0"
|
||||||
lazy_static = "0.2"
|
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
memchr = "0.1"
|
memchr = "2"
|
||||||
regex = "0.1.77"
|
regex = "0.2.1"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
glob = "0.2"
|
glob = "0.2"
|
||||||
|
|||||||
21
globset/LICENSE-MIT
Normal file
21
globset/LICENSE-MIT
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Andrew Gallant
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
@@ -20,7 +20,7 @@ Add this to your `Cargo.toml`:
|
|||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
globset = "0.1"
|
globset = "0.2"
|
||||||
```
|
```
|
||||||
|
|
||||||
and this to your crate root:
|
and this to your crate root:
|
||||||
@@ -36,7 +36,7 @@ This example shows how to match a single glob against a single file path.
|
|||||||
```rust
|
```rust
|
||||||
use globset::Glob;
|
use globset::Glob;
|
||||||
|
|
||||||
let glob = try!(Glob::new("*.rs")).compile_matcher();
|
let glob = Glob::new("*.rs")?.compile_matcher();
|
||||||
|
|
||||||
assert!(glob.is_match("foo.rs"));
|
assert!(glob.is_match("foo.rs"));
|
||||||
assert!(glob.is_match("foo/bar.rs"));
|
assert!(glob.is_match("foo/bar.rs"));
|
||||||
@@ -51,8 +51,8 @@ semantics. In this example, we prevent wildcards from matching path separators.
|
|||||||
```rust
|
```rust
|
||||||
use globset::GlobBuilder;
|
use globset::GlobBuilder;
|
||||||
|
|
||||||
let glob = try!(GlobBuilder::new("*.rs")
|
let glob = GlobBuilder::new("*.rs")
|
||||||
.literal_separator(true).build()).compile_matcher();
|
.literal_separator(true).build()?.compile_matcher();
|
||||||
|
|
||||||
assert!(glob.is_match("foo.rs"));
|
assert!(glob.is_match("foo.rs"));
|
||||||
assert!(!glob.is_match("foo/bar.rs")); // no longer matches
|
assert!(!glob.is_match("foo/bar.rs")); // no longer matches
|
||||||
@@ -69,10 +69,10 @@ use globset::{Glob, GlobSetBuilder};
|
|||||||
let mut builder = GlobSetBuilder::new();
|
let mut builder = GlobSetBuilder::new();
|
||||||
// A GlobBuilder can be used to configure each glob's match semantics
|
// A GlobBuilder can be used to configure each glob's match semantics
|
||||||
// independently.
|
// independently.
|
||||||
builder.add(try!(Glob::new("*.rs")));
|
builder.add(Glob::new("*.rs")?);
|
||||||
builder.add(try!(Glob::new("src/lib.rs")));
|
builder.add(Glob::new("src/lib.rs")?);
|
||||||
builder.add(try!(Glob::new("src/**/foo.rs")));
|
builder.add(Glob::new("src/**/foo.rs")?);
|
||||||
let set = try!(builder.build());
|
let set = builder.build()?;
|
||||||
|
|
||||||
assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]);
|
assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]);
|
||||||
```
|
```
|
||||||
|
|||||||
24
globset/UNLICENSE
Normal file
24
globset/UNLICENSE
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
use std::ffi::{OsStr, OsString};
|
use std::ffi::{OsStr, OsString};
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
|
use std::hash;
|
||||||
use std::iter;
|
use std::iter;
|
||||||
use std::ops::{Deref, DerefMut};
|
use std::ops::{Deref, DerefMut};
|
||||||
use std::path::{Path, is_separator};
|
use std::path::{Path, is_separator};
|
||||||
@@ -8,7 +9,7 @@ use std::str;
|
|||||||
use regex;
|
use regex;
|
||||||
use regex::bytes::Regex;
|
use regex::bytes::Regex;
|
||||||
|
|
||||||
use {Candidate, Error, new_regex};
|
use {Candidate, Error, ErrorKind, new_regex};
|
||||||
|
|
||||||
/// Describes a matching strategy for a particular pattern.
|
/// Describes a matching strategy for a particular pattern.
|
||||||
///
|
///
|
||||||
@@ -76,7 +77,7 @@ impl MatchStrategy {
|
|||||||
///
|
///
|
||||||
/// It cannot be used directly to match file paths, but it can be converted
|
/// It cannot be used directly to match file paths, but it can be converted
|
||||||
/// to a regular expression string or a matcher.
|
/// to a regular expression string or a matcher.
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq)]
|
||||||
pub struct Glob {
|
pub struct Glob {
|
||||||
glob: String,
|
glob: String,
|
||||||
re: String,
|
re: String,
|
||||||
@@ -84,6 +85,19 @@ pub struct Glob {
|
|||||||
tokens: Tokens,
|
tokens: Tokens,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for Glob {
|
||||||
|
fn eq(&self, other: &Glob) -> bool {
|
||||||
|
self.glob == other.glob && self.opts == other.opts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl hash::Hash for Glob {
|
||||||
|
fn hash<H: hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.glob.hash(state);
|
||||||
|
self.opts.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl fmt::Display for Glob {
|
impl fmt::Display for Glob {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
self.glob.fmt(f)
|
self.glob.fmt(f)
|
||||||
@@ -173,7 +187,7 @@ pub struct GlobBuilder<'a> {
|
|||||||
opts: GlobOptions,
|
opts: GlobOptions,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Clone, Copy, Debug, Default, Eq, PartialEq)]
|
#[derive(Clone, Copy, Debug, Default, Eq, Hash, PartialEq)]
|
||||||
struct GlobOptions {
|
struct GlobOptions {
|
||||||
/// Whether to match case insensitively.
|
/// Whether to match case insensitively.
|
||||||
case_insensitive: bool,
|
case_insensitive: bool,
|
||||||
@@ -495,7 +509,7 @@ impl Glob {
|
|||||||
Some(&self.tokens[start..])
|
Some(&self.tokens[start..])
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the pattern as a literal if and only if the pattern exclusiely
|
/// Returns the pattern as a literal if and only if the pattern exclusively
|
||||||
/// matches the basename of a file path *and* is a literal.
|
/// matches the basename of a file path *and* is a literal.
|
||||||
///
|
///
|
||||||
/// The basic format of these patterns is `**/{literal}`, where `{literal}`
|
/// The basic format of these patterns is `**/{literal}`, where `{literal}`
|
||||||
@@ -530,16 +544,23 @@ impl<'a> GlobBuilder<'a> {
|
|||||||
/// Parses and builds the pattern.
|
/// Parses and builds the pattern.
|
||||||
pub fn build(&self) -> Result<Glob, Error> {
|
pub fn build(&self) -> Result<Glob, Error> {
|
||||||
let mut p = Parser {
|
let mut p = Parser {
|
||||||
|
glob: &self.glob,
|
||||||
stack: vec![Tokens::default()],
|
stack: vec![Tokens::default()],
|
||||||
chars: self.glob.chars().peekable(),
|
chars: self.glob.chars().peekable(),
|
||||||
prev: None,
|
prev: None,
|
||||||
cur: None,
|
cur: None,
|
||||||
};
|
};
|
||||||
try!(p.parse());
|
p.parse()?;
|
||||||
if p.stack.is_empty() {
|
if p.stack.is_empty() {
|
||||||
Err(Error::UnopenedAlternates)
|
Err(Error {
|
||||||
|
glob: Some(self.glob.to_string()),
|
||||||
|
kind: ErrorKind::UnopenedAlternates,
|
||||||
|
})
|
||||||
} else if p.stack.len() > 1 {
|
} else if p.stack.len() > 1 {
|
||||||
Err(Error::UnclosedAlternates)
|
Err(Error {
|
||||||
|
glob: Some(self.glob.to_string()),
|
||||||
|
kind: ErrorKind::UnclosedAlternates,
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
let tokens = p.stack.pop().unwrap();
|
let tokens = p.stack.pop().unwrap();
|
||||||
Ok(Glob {
|
Ok(Glob {
|
||||||
@@ -645,9 +666,18 @@ impl Tokens {
|
|||||||
for pat in patterns {
|
for pat in patterns {
|
||||||
let mut altre = String::new();
|
let mut altre = String::new();
|
||||||
self.tokens_to_regex(options, &pat, &mut altre);
|
self.tokens_to_regex(options, &pat, &mut altre);
|
||||||
parts.push(altre);
|
if !altre.is_empty() {
|
||||||
|
parts.push(altre);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// It is possible to have an empty set in which case the
|
||||||
|
// resulting alternation '()' would be an error.
|
||||||
|
if !parts.is_empty() {
|
||||||
|
re.push('(');
|
||||||
|
re.push_str(&parts.join("|"));
|
||||||
|
re.push(')');
|
||||||
}
|
}
|
||||||
re.push_str(&parts.join("|"));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -666,7 +696,7 @@ fn bytes_to_escaped_literal(bs: &[u8]) -> String {
|
|||||||
let mut s = String::with_capacity(bs.len());
|
let mut s = String::with_capacity(bs.len());
|
||||||
for &b in bs {
|
for &b in bs {
|
||||||
if b <= 0x7F {
|
if b <= 0x7F {
|
||||||
s.push_str(®ex::quote(&(b as char).to_string()));
|
s.push_str(®ex::escape(&(b as char).to_string()));
|
||||||
} else {
|
} else {
|
||||||
s.push_str(&format!("\\x{:02x}", b));
|
s.push_str(&format!("\\x{:02x}", b));
|
||||||
}
|
}
|
||||||
@@ -675,6 +705,7 @@ fn bytes_to_escaped_literal(bs: &[u8]) -> String {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct Parser<'a> {
|
struct Parser<'a> {
|
||||||
|
glob: &'a str,
|
||||||
stack: Vec<Tokens>,
|
stack: Vec<Tokens>,
|
||||||
chars: iter::Peekable<str::Chars<'a>>,
|
chars: iter::Peekable<str::Chars<'a>>,
|
||||||
prev: Option<char>,
|
prev: Option<char>,
|
||||||
@@ -682,21 +713,25 @@ struct Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Parser<'a> {
|
impl<'a> Parser<'a> {
|
||||||
|
fn error(&self, kind: ErrorKind) -> Error {
|
||||||
|
Error { glob: Some(self.glob.to_string()), kind: kind }
|
||||||
|
}
|
||||||
|
|
||||||
fn parse(&mut self) -> Result<(), Error> {
|
fn parse(&mut self) -> Result<(), Error> {
|
||||||
while let Some(c) = self.bump() {
|
while let Some(c) = self.bump() {
|
||||||
match c {
|
match c {
|
||||||
'?' => try!(self.push_token(Token::Any)),
|
'?' => self.push_token(Token::Any)?,
|
||||||
'*' => try!(self.parse_star()),
|
'*' => self.parse_star()?,
|
||||||
'[' => try!(self.parse_class()),
|
'[' => self.parse_class()?,
|
||||||
'{' => try!(self.push_alternate()),
|
'{' => self.push_alternate()?,
|
||||||
'}' => try!(self.pop_alternate()),
|
'}' => self.pop_alternate()?,
|
||||||
',' => try!(self.parse_comma()),
|
',' => self.parse_comma()?,
|
||||||
c => {
|
c => {
|
||||||
if is_separator(c) {
|
if is_separator(c) {
|
||||||
// Normalize all patterns to use / as a separator.
|
// Normalize all patterns to use / as a separator.
|
||||||
try!(self.push_token(Token::Literal('/')))
|
self.push_token(Token::Literal('/'))?
|
||||||
} else {
|
} else {
|
||||||
try!(self.push_token(Token::Literal(c)))
|
self.push_token(Token::Literal(c))?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -706,7 +741,7 @@ impl<'a> Parser<'a> {
|
|||||||
|
|
||||||
fn push_alternate(&mut self) -> Result<(), Error> {
|
fn push_alternate(&mut self) -> Result<(), Error> {
|
||||||
if self.stack.len() > 1 {
|
if self.stack.len() > 1 {
|
||||||
return Err(Error::NestedAlternates);
|
return Err(self.error(ErrorKind::NestedAlternates));
|
||||||
}
|
}
|
||||||
Ok(self.stack.push(Tokens::default()))
|
Ok(self.stack.push(Tokens::default()))
|
||||||
}
|
}
|
||||||
@@ -720,22 +755,22 @@ impl<'a> Parser<'a> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn push_token(&mut self, tok: Token) -> Result<(), Error> {
|
fn push_token(&mut self, tok: Token) -> Result<(), Error> {
|
||||||
match self.stack.last_mut() {
|
if let Some(ref mut pat) = self.stack.last_mut() {
|
||||||
None => Err(Error::UnopenedAlternates),
|
return Ok(pat.push(tok));
|
||||||
Some(ref mut pat) => Ok(pat.push(tok)),
|
|
||||||
}
|
}
|
||||||
|
Err(self.error(ErrorKind::UnopenedAlternates))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pop_token(&mut self) -> Result<Token, Error> {
|
fn pop_token(&mut self) -> Result<Token, Error> {
|
||||||
match self.stack.last_mut() {
|
if let Some(ref mut pat) = self.stack.last_mut() {
|
||||||
None => Err(Error::UnopenedAlternates),
|
return Ok(pat.pop().unwrap());
|
||||||
Some(ref mut pat) => Ok(pat.pop().unwrap()),
|
|
||||||
}
|
}
|
||||||
|
Err(self.error(ErrorKind::UnopenedAlternates))
|
||||||
}
|
}
|
||||||
|
|
||||||
fn have_tokens(&self) -> Result<bool, Error> {
|
fn have_tokens(&self) -> Result<bool, Error> {
|
||||||
match self.stack.last() {
|
match self.stack.last() {
|
||||||
None => Err(Error::UnopenedAlternates),
|
None => Err(self.error(ErrorKind::UnopenedAlternates)),
|
||||||
Some(ref pat) => Ok(!pat.is_empty()),
|
Some(ref pat) => Ok(!pat.is_empty()),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -754,23 +789,23 @@ impl<'a> Parser<'a> {
|
|||||||
fn parse_star(&mut self) -> Result<(), Error> {
|
fn parse_star(&mut self) -> Result<(), Error> {
|
||||||
let prev = self.prev;
|
let prev = self.prev;
|
||||||
if self.chars.peek() != Some(&'*') {
|
if self.chars.peek() != Some(&'*') {
|
||||||
try!(self.push_token(Token::ZeroOrMore));
|
self.push_token(Token::ZeroOrMore)?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
assert!(self.bump() == Some('*'));
|
assert!(self.bump() == Some('*'));
|
||||||
if !try!(self.have_tokens()) {
|
if !self.have_tokens()? {
|
||||||
try!(self.push_token(Token::RecursivePrefix));
|
self.push_token(Token::RecursivePrefix)?;
|
||||||
let next = self.bump();
|
let next = self.bump();
|
||||||
if !next.map(is_separator).unwrap_or(true) {
|
if !next.map(is_separator).unwrap_or(true) {
|
||||||
return Err(Error::InvalidRecursive);
|
return Err(self.error(ErrorKind::InvalidRecursive));
|
||||||
}
|
}
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
try!(self.pop_token());
|
self.pop_token()?;
|
||||||
if !prev.map(is_separator).unwrap_or(false) {
|
if !prev.map(is_separator).unwrap_or(false) {
|
||||||
if self.stack.len() <= 1
|
if self.stack.len() <= 1
|
||||||
|| (prev != Some(',') && prev != Some('{')) {
|
|| (prev != Some(',') && prev != Some('{')) {
|
||||||
return Err(Error::InvalidRecursive);
|
return Err(self.error(ErrorKind::InvalidRecursive));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
match self.chars.peek() {
|
match self.chars.peek() {
|
||||||
@@ -785,28 +820,35 @@ impl<'a> Parser<'a> {
|
|||||||
assert!(self.bump().map(is_separator).unwrap_or(false));
|
assert!(self.bump().map(is_separator).unwrap_or(false));
|
||||||
self.push_token(Token::RecursiveZeroOrMore)
|
self.push_token(Token::RecursiveZeroOrMore)
|
||||||
}
|
}
|
||||||
_ => Err(Error::InvalidRecursive),
|
_ => Err(self.error(ErrorKind::InvalidRecursive)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn parse_class(&mut self) -> Result<(), Error> {
|
fn parse_class(&mut self) -> Result<(), Error> {
|
||||||
fn add_to_last_range(
|
fn add_to_last_range(
|
||||||
|
glob: &str,
|
||||||
r: &mut (char, char),
|
r: &mut (char, char),
|
||||||
add: char,
|
add: char,
|
||||||
) -> Result<(), Error> {
|
) -> Result<(), Error> {
|
||||||
r.1 = add;
|
r.1 = add;
|
||||||
if r.1 < r.0 {
|
if r.1 < r.0 {
|
||||||
Err(Error::InvalidRange(r.0, r.1))
|
Err(Error {
|
||||||
|
glob: Some(glob.to_string()),
|
||||||
|
kind: ErrorKind::InvalidRange(r.0, r.1),
|
||||||
|
})
|
||||||
} else {
|
} else {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let mut negated = false;
|
|
||||||
let mut ranges = vec![];
|
let mut ranges = vec![];
|
||||||
if self.chars.peek() == Some(&'!') {
|
let negated = match self.chars.peek() {
|
||||||
assert!(self.bump() == Some('!'));
|
Some(&'!') | Some(&'^') => {
|
||||||
negated = true;
|
let bump = self.bump();
|
||||||
}
|
assert!(bump == Some('!') || bump == Some('^'));
|
||||||
|
true
|
||||||
|
}
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
let mut first = true;
|
let mut first = true;
|
||||||
let mut in_range = false;
|
let mut in_range = false;
|
||||||
loop {
|
loop {
|
||||||
@@ -814,7 +856,7 @@ impl<'a> Parser<'a> {
|
|||||||
Some(c) => c,
|
Some(c) => c,
|
||||||
// The only way to successfully break this loop is to observe
|
// The only way to successfully break this loop is to observe
|
||||||
// a ']'.
|
// a ']'.
|
||||||
None => return Err(Error::UnclosedClass),
|
None => return Err(self.error(ErrorKind::UnclosedClass)),
|
||||||
};
|
};
|
||||||
match c {
|
match c {
|
||||||
']' => {
|
']' => {
|
||||||
@@ -831,7 +873,7 @@ impl<'a> Parser<'a> {
|
|||||||
// invariant: in_range is only set when there is
|
// invariant: in_range is only set when there is
|
||||||
// already at least one character seen.
|
// already at least one character seen.
|
||||||
let r = ranges.last_mut().unwrap();
|
let r = ranges.last_mut().unwrap();
|
||||||
try!(add_to_last_range(r, '-'));
|
add_to_last_range(&self.glob, r, '-')?;
|
||||||
in_range = false;
|
in_range = false;
|
||||||
} else {
|
} else {
|
||||||
assert!(!ranges.is_empty());
|
assert!(!ranges.is_empty());
|
||||||
@@ -842,7 +884,8 @@ impl<'a> Parser<'a> {
|
|||||||
if in_range {
|
if in_range {
|
||||||
// invariant: in_range is only set when there is
|
// invariant: in_range is only set when there is
|
||||||
// already at least one character seen.
|
// already at least one character seen.
|
||||||
try!(add_to_last_range(ranges.last_mut().unwrap(), c));
|
add_to_last_range(
|
||||||
|
&self.glob, ranges.last_mut().unwrap(), c)?;
|
||||||
} else {
|
} else {
|
||||||
ranges.push((c, c));
|
ranges.push((c, c));
|
||||||
}
|
}
|
||||||
@@ -886,7 +929,7 @@ fn ends_with(needle: &[u8], haystack: &[u8]) -> bool {
|
|||||||
mod tests {
|
mod tests {
|
||||||
use std::ffi::{OsStr, OsString};
|
use std::ffi::{OsStr, OsString};
|
||||||
|
|
||||||
use {GlobSetBuilder, Error};
|
use {GlobSetBuilder, ErrorKind};
|
||||||
use super::{Glob, GlobBuilder, Token};
|
use super::{Glob, GlobBuilder, Token};
|
||||||
use super::Token::*;
|
use super::Token::*;
|
||||||
|
|
||||||
@@ -911,7 +954,7 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn $name() {
|
fn $name() {
|
||||||
let err = Glob::new($pat).unwrap_err();
|
let err = Glob::new($pat).unwrap_err();
|
||||||
assert_eq!($err, err);
|
assert_eq!(&$err, err.kind());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1033,20 +1076,22 @@ mod tests {
|
|||||||
syntax!(cls17, "[a-z0-9]", vec![rclass(&[('a', 'z'), ('0', '9')])]);
|
syntax!(cls17, "[a-z0-9]", vec![rclass(&[('a', 'z'), ('0', '9')])]);
|
||||||
syntax!(cls18, "[!0-9a-z]", vec![rclassn(&[('0', '9'), ('a', 'z')])]);
|
syntax!(cls18, "[!0-9a-z]", vec![rclassn(&[('0', '9'), ('a', 'z')])]);
|
||||||
syntax!(cls19, "[!a-z0-9]", vec![rclassn(&[('a', 'z'), ('0', '9')])]);
|
syntax!(cls19, "[!a-z0-9]", vec![rclassn(&[('a', 'z'), ('0', '9')])]);
|
||||||
|
syntax!(cls20, "[^a]", vec![classn('a', 'a')]);
|
||||||
|
syntax!(cls21, "[^a-z]", vec![classn('a', 'z')]);
|
||||||
|
|
||||||
syntaxerr!(err_rseq1, "a**", Error::InvalidRecursive);
|
syntaxerr!(err_rseq1, "a**", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_rseq2, "**a", Error::InvalidRecursive);
|
syntaxerr!(err_rseq2, "**a", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_rseq3, "a**b", Error::InvalidRecursive);
|
syntaxerr!(err_rseq3, "a**b", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_rseq4, "***", Error::InvalidRecursive);
|
syntaxerr!(err_rseq4, "***", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_rseq5, "/a**", Error::InvalidRecursive);
|
syntaxerr!(err_rseq5, "/a**", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_rseq6, "/**a", Error::InvalidRecursive);
|
syntaxerr!(err_rseq6, "/**a", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_rseq7, "/a**b", Error::InvalidRecursive);
|
syntaxerr!(err_rseq7, "/a**b", ErrorKind::InvalidRecursive);
|
||||||
syntaxerr!(err_unclosed1, "[", Error::UnclosedClass);
|
syntaxerr!(err_unclosed1, "[", ErrorKind::UnclosedClass);
|
||||||
syntaxerr!(err_unclosed2, "[]", Error::UnclosedClass);
|
syntaxerr!(err_unclosed2, "[]", ErrorKind::UnclosedClass);
|
||||||
syntaxerr!(err_unclosed3, "[!", Error::UnclosedClass);
|
syntaxerr!(err_unclosed3, "[!", ErrorKind::UnclosedClass);
|
||||||
syntaxerr!(err_unclosed4, "[!]", Error::UnclosedClass);
|
syntaxerr!(err_unclosed4, "[!]", ErrorKind::UnclosedClass);
|
||||||
syntaxerr!(err_range1, "[z-a]", Error::InvalidRange('z', 'a'));
|
syntaxerr!(err_range1, "[z-a]", ErrorKind::InvalidRange('z', 'a'));
|
||||||
syntaxerr!(err_range2, "[z--]", Error::InvalidRange('z', '-'));
|
syntaxerr!(err_range2, "[z--]", ErrorKind::InvalidRange('z', '-'));
|
||||||
|
|
||||||
const CASEI: Options = Options {
|
const CASEI: Options = Options {
|
||||||
casei: true,
|
casei: true,
|
||||||
@@ -1122,6 +1167,7 @@ mod tests {
|
|||||||
matches!(matchrange9, "[-a-c]", "b");
|
matches!(matchrange9, "[-a-c]", "b");
|
||||||
matches!(matchrange10, "[a-c-]", "b");
|
matches!(matchrange10, "[a-c-]", "b");
|
||||||
matches!(matchrange11, "[-]", "-");
|
matches!(matchrange11, "[-]", "-");
|
||||||
|
matches!(matchrange12, "a[^0-9]b", "a_b");
|
||||||
|
|
||||||
matches!(matchpat1, "*hello.txt", "hello.txt");
|
matches!(matchpat1, "*hello.txt", "hello.txt");
|
||||||
matches!(matchpat2, "*hello.txt", "gareth_says_hello.txt");
|
matches!(matchpat2, "*hello.txt", "gareth_says_hello.txt");
|
||||||
@@ -1194,6 +1240,9 @@ mod tests {
|
|||||||
nmatches!(matchnot25, "*.c", "mozilla-sha1/sha1.c", SLASHLIT);
|
nmatches!(matchnot25, "*.c", "mozilla-sha1/sha1.c", SLASHLIT);
|
||||||
nmatches!(matchnot26, "**/m4/ltoptions.m4",
|
nmatches!(matchnot26, "**/m4/ltoptions.m4",
|
||||||
"csharp/src/packages/repositories.config", SLASHLIT);
|
"csharp/src/packages/repositories.config", SLASHLIT);
|
||||||
|
nmatches!(matchnot27, "a[^0-9]b", "a0b");
|
||||||
|
nmatches!(matchnot28, "a[^0-9]b", "a9b");
|
||||||
|
nmatches!(matchnot29, "[^-]", "-");
|
||||||
|
|
||||||
macro_rules! extract {
|
macro_rules! extract {
|
||||||
($which:ident, $name:ident, $pat:expr, $expect:expr) => {
|
($which:ident, $name:ident, $pat:expr, $expect:expr) => {
|
||||||
|
|||||||
@@ -14,8 +14,6 @@ src/**/foo.rs
|
|||||||
and a path `src/bar/baz/foo.rs`, then the set would report the first and third
|
and a path `src/bar/baz/foo.rs`, then the set would report the first and third
|
||||||
globs as matching.
|
globs as matching.
|
||||||
|
|
||||||
Single glob matching is also provided and is done by converting globs to
|
|
||||||
|
|
||||||
# Example: one glob
|
# Example: one glob
|
||||||
|
|
||||||
This example shows how to match a single glob against a single file path.
|
This example shows how to match a single glob against a single file path.
|
||||||
@@ -24,7 +22,7 @@ This example shows how to match a single glob against a single file path.
|
|||||||
# fn example() -> Result<(), globset::Error> {
|
# fn example() -> Result<(), globset::Error> {
|
||||||
use globset::Glob;
|
use globset::Glob;
|
||||||
|
|
||||||
let glob = try!(Glob::new("*.rs")).compile_matcher();
|
let glob = Glob::new("*.rs")?.compile_matcher();
|
||||||
|
|
||||||
assert!(glob.is_match("foo.rs"));
|
assert!(glob.is_match("foo.rs"));
|
||||||
assert!(glob.is_match("foo/bar.rs"));
|
assert!(glob.is_match("foo/bar.rs"));
|
||||||
@@ -41,8 +39,8 @@ semantics. In this example, we prevent wildcards from matching path separators.
|
|||||||
# fn example() -> Result<(), globset::Error> {
|
# fn example() -> Result<(), globset::Error> {
|
||||||
use globset::GlobBuilder;
|
use globset::GlobBuilder;
|
||||||
|
|
||||||
let glob = try!(GlobBuilder::new("*.rs")
|
let glob = GlobBuilder::new("*.rs")
|
||||||
.literal_separator(true).build()).compile_matcher();
|
.literal_separator(true).build()?.compile_matcher();
|
||||||
|
|
||||||
assert!(glob.is_match("foo.rs"));
|
assert!(glob.is_match("foo.rs"));
|
||||||
assert!(!glob.is_match("foo/bar.rs")); // no longer matches
|
assert!(!glob.is_match("foo/bar.rs")); // no longer matches
|
||||||
@@ -61,10 +59,10 @@ use globset::{Glob, GlobSetBuilder};
|
|||||||
let mut builder = GlobSetBuilder::new();
|
let mut builder = GlobSetBuilder::new();
|
||||||
// A GlobBuilder can be used to configure each glob's match semantics
|
// A GlobBuilder can be used to configure each glob's match semantics
|
||||||
// independently.
|
// independently.
|
||||||
builder.add(try!(Glob::new("*.rs")));
|
builder.add(Glob::new("*.rs")?);
|
||||||
builder.add(try!(Glob::new("src/lib.rs")));
|
builder.add(Glob::new("src/lib.rs")?);
|
||||||
builder.add(try!(Glob::new("src/**/foo.rs")));
|
builder.add(Glob::new("src/**/foo.rs")?);
|
||||||
let set = try!(builder.build());
|
let set = builder.build()?;
|
||||||
|
|
||||||
assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]);
|
assert_eq!(set.matches("src/bar/baz/foo.rs"), vec![0, 2]);
|
||||||
# Ok(()) } example().unwrap();
|
# Ok(()) } example().unwrap();
|
||||||
@@ -103,8 +101,6 @@ or to enable case insensitive matching.
|
|||||||
extern crate aho_corasick;
|
extern crate aho_corasick;
|
||||||
extern crate fnv;
|
extern crate fnv;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
|
||||||
#[macro_use]
|
|
||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate memchr;
|
extern crate memchr;
|
||||||
extern crate regex;
|
extern crate regex;
|
||||||
@@ -130,16 +126,18 @@ pub use glob::{Glob, GlobBuilder, GlobMatcher};
|
|||||||
mod glob;
|
mod glob;
|
||||||
mod pathutil;
|
mod pathutil;
|
||||||
|
|
||||||
macro_rules! eprintln {
|
|
||||||
($($tt:tt)*) => {{
|
|
||||||
use std::io::Write;
|
|
||||||
let _ = writeln!(&mut ::std::io::stderr(), $($tt)*);
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Represents an error that can occur when parsing a glob pattern.
|
/// Represents an error that can occur when parsing a glob pattern.
|
||||||
#[derive(Clone, Debug, Eq, PartialEq)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub enum Error {
|
pub struct Error {
|
||||||
|
/// The original glob provided by the caller.
|
||||||
|
glob: Option<String>,
|
||||||
|
/// The kind of error.
|
||||||
|
kind: ErrorKind,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The kind of error that can occur when parsing a glob pattern.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub enum ErrorKind {
|
||||||
/// Occurs when a use of `**` is invalid. Namely, `**` can only appear
|
/// Occurs when a use of `**` is invalid. Namely, `**` can only appear
|
||||||
/// adjacent to a path separator, or the beginning/end of a glob.
|
/// adjacent to a path separator, or the beginning/end of a glob.
|
||||||
InvalidRecursive,
|
InvalidRecursive,
|
||||||
@@ -161,45 +159,74 @@ pub enum Error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl StdError for Error {
|
impl StdError for Error {
|
||||||
|
fn description(&self) -> &str {
|
||||||
|
self.kind.description()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Error {
|
||||||
|
/// Return the glob that caused this error, if one exists.
|
||||||
|
pub fn glob(&self) -> Option<&str> {
|
||||||
|
self.glob.as_ref().map(|s| &**s)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the kind of this error.
|
||||||
|
pub fn kind(&self) -> &ErrorKind {
|
||||||
|
&self.kind
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ErrorKind {
|
||||||
fn description(&self) -> &str {
|
fn description(&self) -> &str {
|
||||||
match *self {
|
match *self {
|
||||||
Error::InvalidRecursive => {
|
ErrorKind::InvalidRecursive => {
|
||||||
"invalid use of **; must be one path component"
|
"invalid use of **; must be one path component"
|
||||||
}
|
}
|
||||||
Error::UnclosedClass => {
|
ErrorKind::UnclosedClass => {
|
||||||
"unclosed character class; missing ']'"
|
"unclosed character class; missing ']'"
|
||||||
}
|
}
|
||||||
Error::InvalidRange(_, _) => {
|
ErrorKind::InvalidRange(_, _) => {
|
||||||
"invalid character range"
|
"invalid character range"
|
||||||
}
|
}
|
||||||
Error::UnopenedAlternates => {
|
ErrorKind::UnopenedAlternates => {
|
||||||
"unopened alternate group; missing '{' \
|
"unopened alternate group; missing '{' \
|
||||||
(maybe escape '}' with '[}]'?)"
|
(maybe escape '}' with '[}]'?)"
|
||||||
}
|
}
|
||||||
Error::UnclosedAlternates => {
|
ErrorKind::UnclosedAlternates => {
|
||||||
"unclosed alternate group; missing '}' \
|
"unclosed alternate group; missing '}' \
|
||||||
(maybe escape '{' with '[{]'?)"
|
(maybe escape '{' with '[{]'?)"
|
||||||
}
|
}
|
||||||
Error::NestedAlternates => {
|
ErrorKind::NestedAlternates => {
|
||||||
"nested alternate groups are not allowed"
|
"nested alternate groups are not allowed"
|
||||||
}
|
}
|
||||||
Error::Regex(ref err) => err,
|
ErrorKind::Regex(ref err) => err,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl fmt::Display for Error {
|
impl fmt::Display for Error {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match self.glob {
|
||||||
|
None => self.kind.fmt(f),
|
||||||
|
Some(ref glob) => {
|
||||||
|
write!(f, "error parsing glob '{}': {}", glob, self.kind)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for ErrorKind {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
match *self {
|
match *self {
|
||||||
Error::InvalidRecursive
|
ErrorKind::InvalidRecursive
|
||||||
| Error::UnclosedClass
|
| ErrorKind::UnclosedClass
|
||||||
| Error::UnopenedAlternates
|
| ErrorKind::UnopenedAlternates
|
||||||
| Error::UnclosedAlternates
|
| ErrorKind::UnclosedAlternates
|
||||||
| Error::NestedAlternates
|
| ErrorKind::NestedAlternates
|
||||||
| Error::Regex(_) => {
|
| ErrorKind::Regex(_) => {
|
||||||
write!(f, "{}", self.description())
|
write!(f, "{}", self.description())
|
||||||
}
|
}
|
||||||
Error::InvalidRange(s, e) => {
|
ErrorKind::InvalidRange(s, e) => {
|
||||||
write!(f, "invalid range; '{}' > '{}'", s, e)
|
write!(f, "invalid range; '{}' > '{}'", s, e)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -211,13 +238,23 @@ fn new_regex(pat: &str) -> Result<Regex, Error> {
|
|||||||
.dot_matches_new_line(true)
|
.dot_matches_new_line(true)
|
||||||
.size_limit(10 * (1 << 20))
|
.size_limit(10 * (1 << 20))
|
||||||
.dfa_size_limit(10 * (1 << 20))
|
.dfa_size_limit(10 * (1 << 20))
|
||||||
.compile()
|
.build()
|
||||||
.map_err(|err| Error::Regex(err.to_string()))
|
.map_err(|err| {
|
||||||
|
Error {
|
||||||
|
glob: Some(pat.to_string()),
|
||||||
|
kind: ErrorKind::Regex(err.to_string()),
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn new_regex_set<I, S>(pats: I) -> Result<RegexSet, Error>
|
fn new_regex_set<I, S>(pats: I) -> Result<RegexSet, Error>
|
||||||
where S: AsRef<str>, I: IntoIterator<Item=S> {
|
where S: AsRef<str>, I: IntoIterator<Item=S> {
|
||||||
RegexSet::new(pats).map_err(|err| Error::Regex(err.to_string()))
|
RegexSet::new(pats).map_err(|err| {
|
||||||
|
Error {
|
||||||
|
glob: None,
|
||||||
|
kind: ErrorKind::Regex(err.to_string()),
|
||||||
|
}
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type Fnv = hash::BuildHasherDefault<fnv::FnvHasher>;
|
type Fnv = hash::BuildHasherDefault<fnv::FnvHasher>;
|
||||||
@@ -375,8 +412,8 @@ impl GlobSet {
|
|||||||
GlobSetMatchStrategy::Suffix(suffixes.suffix()),
|
GlobSetMatchStrategy::Suffix(suffixes.suffix()),
|
||||||
GlobSetMatchStrategy::Prefix(prefixes.prefix()),
|
GlobSetMatchStrategy::Prefix(prefixes.prefix()),
|
||||||
GlobSetMatchStrategy::RequiredExtension(
|
GlobSetMatchStrategy::RequiredExtension(
|
||||||
try!(required_exts.build())),
|
required_exts.build()?),
|
||||||
GlobSetMatchStrategy::Regex(try!(regexes.regex_set())),
|
GlobSetMatchStrategy::Regex(regexes.regex_set()?),
|
||||||
],
|
],
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -730,7 +767,7 @@ impl MultiStrategyBuilder {
|
|||||||
|
|
||||||
fn regex_set(self) -> Result<RegexSetStrategy, Error> {
|
fn regex_set(self) -> Result<RegexSetStrategy, Error> {
|
||||||
Ok(RegexSetStrategy {
|
Ok(RegexSetStrategy {
|
||||||
matcher: try!(new_regex_set(self.literals)),
|
matcher: new_regex_set(self.literals)?,
|
||||||
map: self.map,
|
map: self.map,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
@@ -755,7 +792,7 @@ impl RequiredExtensionStrategyBuilder {
|
|||||||
for (ext, regexes) in self.0.into_iter() {
|
for (ext, regexes) in self.0.into_iter() {
|
||||||
exts.insert(ext.clone(), vec![]);
|
exts.insert(ext.clone(), vec![]);
|
||||||
for (global_index, regex) in regexes {
|
for (global_index, regex) in regexes {
|
||||||
let compiled = try!(new_regex(®ex));
|
let compiled = new_regex(®ex)?;
|
||||||
exts.get_mut(&ext).unwrap().push((global_index, compiled));
|
exts.get_mut(&ext).unwrap().push((global_index, compiled));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
grep/COPYING
Normal file
3
grep/COPYING
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This project is dual-licensed under the Unlicense and MIT licenses.
|
||||||
|
|
||||||
|
You may use this code under the terms of either license.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "grep"
|
name = "grep"
|
||||||
version = "0.1.3" #:version
|
version = "0.1.7" #:version
|
||||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||||
description = """
|
description = """
|
||||||
Fast line oriented regex searching as a library.
|
Fast line oriented regex searching as a library.
|
||||||
@@ -14,7 +14,6 @@ license = "Unlicense/MIT"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
memchr = "0.1"
|
memchr = "2"
|
||||||
memmap = "0.5"
|
regex = "0.2.1"
|
||||||
regex = "0.1.77"
|
regex-syntax = "0.4.0"
|
||||||
regex-syntax = "0.3.5"
|
|
||||||
|
|||||||
21
grep/LICENSE-MIT
Normal file
21
grep/LICENSE-MIT
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Andrew Gallant
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
24
grep/UNLICENSE
Normal file
24
grep/UNLICENSE
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
@@ -78,6 +78,6 @@ impl From<regex::Error> for Error {
|
|||||||
|
|
||||||
impl From<syntax::Error> for Error {
|
impl From<syntax::Error> for Error {
|
||||||
fn from(err: syntax::Error) -> Error {
|
fn from(err: syntax::Error) -> Error {
|
||||||
Error::Regex(regex::Error::Syntax(err))
|
Error::Regex(regex::Error::Syntax(err.to_string()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ principled.
|
|||||||
*/
|
*/
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
|
|
||||||
use regex::bytes::Regex;
|
use regex::bytes::RegexBuilder;
|
||||||
use syntax::{
|
use syntax::{
|
||||||
Expr, Literals, Lit,
|
Expr, Literals, Lit,
|
||||||
ByteClass, ByteRange, CharClass, ClassRange, Repeater,
|
ByteClass, ByteRange, CharClass, ClassRange, Repeater,
|
||||||
@@ -33,7 +33,7 @@ impl LiteralSets {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn to_regex(&self) -> Option<Regex> {
|
pub fn to_regex_builder(&self) -> Option<RegexBuilder> {
|
||||||
if self.prefixes.all_complete() && !self.prefixes.is_empty() {
|
if self.prefixes.all_complete() && !self.prefixes.is_empty() {
|
||||||
debug!("literal prefixes detected: {:?}", self.prefixes);
|
debug!("literal prefixes detected: {:?}", self.prefixes);
|
||||||
// When this is true, the regex engine will do a literal scan.
|
// When this is true, the regex engine will do a literal scan.
|
||||||
@@ -79,14 +79,16 @@ impl LiteralSets {
|
|||||||
debug!("required literals found: {:?}", req_lits);
|
debug!("required literals found: {:?}", req_lits);
|
||||||
let alts: Vec<String> =
|
let alts: Vec<String> =
|
||||||
req_lits.into_iter().map(|x| bytes_to_regex(x)).collect();
|
req_lits.into_iter().map(|x| bytes_to_regex(x)).collect();
|
||||||
// Literals always compile.
|
let mut builder = RegexBuilder::new(&alts.join("|"));
|
||||||
Some(Regex::new(&alts.join("|")).unwrap())
|
builder.unicode(false);
|
||||||
|
Some(builder)
|
||||||
} else if lit.is_empty() {
|
} else if lit.is_empty() {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
// Literals always compile.
|
|
||||||
debug!("required literal found: {:?}", show(lit));
|
debug!("required literal found: {:?}", show(lit));
|
||||||
Some(Regex::new(&bytes_to_regex(lit)).unwrap())
|
let mut builder = RegexBuilder::new(&bytes_to_regex(&lit));
|
||||||
|
builder.unicode(false);
|
||||||
|
Some(builder)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,25 +44,23 @@ pub fn remove(expr: Expr, byte: u8) -> Result<Expr> {
|
|||||||
}
|
}
|
||||||
Group { e, i, name } => {
|
Group { e, i, name } => {
|
||||||
Group {
|
Group {
|
||||||
e: Box::new(try!(remove(*e, byte))),
|
e: Box::new(remove(*e, byte)?),
|
||||||
i: i,
|
i: i,
|
||||||
name: name,
|
name: name,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Repeat { e, r, greedy } => {
|
Repeat { e, r, greedy } => {
|
||||||
Repeat {
|
Repeat {
|
||||||
e: Box::new(try!(remove(*e, byte))),
|
e: Box::new(remove(*e, byte)?),
|
||||||
r: r,
|
r: r,
|
||||||
greedy: greedy,
|
greedy: greedy,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Concat(exprs) => {
|
Concat(exprs) => {
|
||||||
Concat(try!(
|
Concat(exprs.into_iter().map(|e| remove(e, byte)).collect::<Result<Vec<Expr>>>()?)
|
||||||
exprs.into_iter().map(|e| remove(e, byte)).collect()))
|
|
||||||
}
|
}
|
||||||
Alternate(exprs) => {
|
Alternate(exprs) => {
|
||||||
Alternate(try!(
|
Alternate(exprs.into_iter().map(|e| remove(e, byte)).collect::<Result<Vec<Expr>>>()?)
|
||||||
exprs.into_iter().map(|e| remove(e, byte)).collect()))
|
|
||||||
}
|
}
|
||||||
e => e,
|
e => e,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -102,9 +102,9 @@ impl GrepBuilder {
|
|||||||
|
|
||||||
/// Whether to enable smart case search or not (disabled by default).
|
/// Whether to enable smart case search or not (disabled by default).
|
||||||
///
|
///
|
||||||
/// Smart case uses case insensitive search if the regex is contains all
|
/// Smart case uses case insensitive search if the pattern contains only
|
||||||
/// lowercase literal characters. Otherwise, a case sensitive search is
|
/// lowercase characters (ignoring any characters which immediately follow
|
||||||
/// used instead.
|
/// a '\'). Otherwise, a case sensitive search is used instead.
|
||||||
///
|
///
|
||||||
/// Enabling the case_insensitive flag overrides this.
|
/// Enabling the case_insensitive flag overrides this.
|
||||||
pub fn case_smart(mut self, yes: bool) -> GrepBuilder {
|
pub fn case_smart(mut self, yes: bool) -> GrepBuilder {
|
||||||
@@ -141,17 +141,22 @@ impl GrepBuilder {
|
|||||||
/// If there was a problem parsing or compiling the regex with the given
|
/// If there was a problem parsing or compiling the regex with the given
|
||||||
/// options, then an error is returned.
|
/// options, then an error is returned.
|
||||||
pub fn build(self) -> Result<Grep> {
|
pub fn build(self) -> Result<Grep> {
|
||||||
let expr = try!(self.parse());
|
let expr = self.parse()?;
|
||||||
let literals = LiteralSets::create(&expr);
|
let literals = LiteralSets::create(&expr);
|
||||||
let re = try!(self.regex(&expr));
|
let re = self.regex(&expr)?;
|
||||||
let required = literals.to_regex().or_else(|| {
|
let required = match literals.to_regex_builder() {
|
||||||
let expr = match strip_unicode_word_boundaries(&expr) {
|
Some(builder) => Some(self.regex_build(builder)?),
|
||||||
None => return None,
|
None => {
|
||||||
Some(expr) => expr,
|
match strip_unicode_word_boundaries(&expr) {
|
||||||
};
|
None => None,
|
||||||
debug!("Stripped Unicode word boundaries. New AST:\n{:?}", expr);
|
Some(expr) => {
|
||||||
self.regex(&expr).ok()
|
debug!("Stripped Unicode word boundaries. \
|
||||||
});
|
New AST:\n{:?}", expr);
|
||||||
|
self.regex(&expr).ok()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
Ok(Grep {
|
Ok(Grep {
|
||||||
re: re,
|
re: re,
|
||||||
required: required,
|
required: required,
|
||||||
@@ -162,16 +167,18 @@ impl GrepBuilder {
|
|||||||
/// Creates a new regex from the given expression with the current
|
/// Creates a new regex from the given expression with the current
|
||||||
/// configuration.
|
/// configuration.
|
||||||
fn regex(&self, expr: &Expr) -> Result<Regex> {
|
fn regex(&self, expr: &Expr) -> Result<Regex> {
|
||||||
let casei =
|
let mut builder = RegexBuilder::new(&expr.to_string());
|
||||||
self.opts.case_insensitive
|
builder.unicode(true);
|
||||||
|| (self.opts.case_smart && !has_uppercase_literal(expr));
|
self.regex_build(builder)
|
||||||
RegexBuilder::new(&expr.to_string())
|
}
|
||||||
.case_insensitive(casei)
|
|
||||||
|
/// Builds a new regex from the given builder using the caller's settings.
|
||||||
|
fn regex_build(&self, mut builder: RegexBuilder) -> Result<Regex> {
|
||||||
|
builder
|
||||||
.multi_line(true)
|
.multi_line(true)
|
||||||
.unicode(true)
|
|
||||||
.size_limit(self.opts.size_limit)
|
.size_limit(self.opts.size_limit)
|
||||||
.dfa_size_limit(self.opts.dfa_size_limit)
|
.dfa_size_limit(self.opts.dfa_size_limit)
|
||||||
.compile()
|
.build()
|
||||||
.map_err(From::from)
|
.map_err(From::from)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,15 +186,26 @@ impl GrepBuilder {
|
|||||||
/// the line terminator.
|
/// the line terminator.
|
||||||
fn parse(&self) -> Result<syntax::Expr> {
|
fn parse(&self) -> Result<syntax::Expr> {
|
||||||
let expr =
|
let expr =
|
||||||
try!(syntax::ExprBuilder::new()
|
syntax::ExprBuilder::new()
|
||||||
.allow_bytes(true)
|
.allow_bytes(true)
|
||||||
.unicode(true)
|
.unicode(true)
|
||||||
.case_insensitive(self.opts.case_insensitive)
|
.case_insensitive(self.is_case_insensitive()?)
|
||||||
.parse(&self.pattern));
|
.parse(&self.pattern)?;
|
||||||
let expr = try!(nonl::remove(expr, self.opts.line_terminator));
|
let expr = nonl::remove(expr, self.opts.line_terminator)?;
|
||||||
debug!("regex ast:\n{:#?}", expr);
|
debug!("regex ast:\n{:#?}", expr);
|
||||||
Ok(expr)
|
Ok(expr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Determines whether the case insensitive flag should be enabled or not.
|
||||||
|
fn is_case_insensitive(&self) -> Result<bool> {
|
||||||
|
if self.opts.case_insensitive {
|
||||||
|
return Ok(true);
|
||||||
|
}
|
||||||
|
if !self.opts.case_smart {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
Ok(!has_uppercase_literal(&self.pattern))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Grep {
|
impl Grep {
|
||||||
@@ -292,21 +310,26 @@ impl<'b, 's> Iterator for Iter<'b, 's> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn has_uppercase_literal(expr: &Expr) -> bool {
|
/// Determine whether the pattern contains an uppercase character which should
|
||||||
use syntax::Expr::*;
|
/// negate the effect of the smart-case option.
|
||||||
match *expr {
|
///
|
||||||
Literal { ref chars, casei } => {
|
/// Ideally we would be able to check the AST in order to correctly handle
|
||||||
casei || chars.iter().any(|c| c.is_uppercase())
|
/// things like '\p{Ll}' and '\p{Lu}' (which should be treated as explicitly
|
||||||
|
/// cased), but we don't currently have that option. For now, our 'good enough'
|
||||||
|
/// solution is to simply perform a semi-naïve scan of the input pattern and
|
||||||
|
/// ignore all characters following a '\'. The ExprBuilder will handle any
|
||||||
|
/// actual errors, and this at least lets us support the most common cases,
|
||||||
|
/// like 'foo\w' and 'foo\S', in an intuitive manner.
|
||||||
|
fn has_uppercase_literal(pattern: &str) -> bool {
|
||||||
|
let mut chars = pattern.chars();
|
||||||
|
while let Some(c) = chars.next() {
|
||||||
|
if c == '\\' {
|
||||||
|
chars.next();
|
||||||
|
} else if c.is_uppercase() {
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
LiteralBytes { ref bytes, casei } => {
|
|
||||||
casei || bytes.iter().any(|&b| b'A' <= b && b <= b'Z')
|
|
||||||
}
|
|
||||||
Group { ref e, .. } => has_uppercase_literal(e),
|
|
||||||
Repeat { ref e, .. } => has_uppercase_literal(e),
|
|
||||||
Concat(ref es) => es.iter().any(has_uppercase_literal),
|
|
||||||
Alternate(ref es) => es.iter().any(has_uppercase_literal),
|
|
||||||
_ => false,
|
|
||||||
}
|
}
|
||||||
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
@@ -316,7 +339,7 @@ mod tests {
|
|||||||
use memchr::{memchr, memrchr};
|
use memchr::{memchr, memrchr};
|
||||||
use regex::bytes::Regex;
|
use regex::bytes::Regex;
|
||||||
|
|
||||||
use super::{GrepBuilder, Match};
|
use super::{GrepBuilder, Match, has_uppercase_literal};
|
||||||
|
|
||||||
static SHERLOCK: &'static [u8] = include_bytes!("./data/sherlock.txt");
|
static SHERLOCK: &'static [u8] = include_bytes!("./data/sherlock.txt");
|
||||||
|
|
||||||
@@ -328,11 +351,11 @@ mod tests {
|
|||||||
fn find_lines(pat: &str, haystack: &[u8]) -> Vec<Match> {
|
fn find_lines(pat: &str, haystack: &[u8]) -> Vec<Match> {
|
||||||
let re = Regex::new(pat).unwrap();
|
let re = Regex::new(pat).unwrap();
|
||||||
let mut lines = vec![];
|
let mut lines = vec![];
|
||||||
for (s, e) in re.find_iter(haystack) {
|
for m in re.find_iter(haystack) {
|
||||||
let start = memrchr(b'\n', &haystack[..s])
|
let start = memrchr(b'\n', &haystack[..m.start()])
|
||||||
.map_or(0, |i| i + 1);
|
.map_or(0, |i| i + 1);
|
||||||
let end = memchr(b'\n', &haystack[e..])
|
let end = memchr(b'\n', &haystack[m.end()..])
|
||||||
.map_or(haystack.len(), |i| e + i + 1);
|
.map_or(haystack.len(), |i| m.end() + i + 1);
|
||||||
lines.push(Match {
|
lines.push(Match {
|
||||||
start: start,
|
start: start,
|
||||||
end: end,
|
end: end,
|
||||||
@@ -353,4 +376,20 @@ mod tests {
|
|||||||
assert_eq!(expected.len(), got.len());
|
assert_eq!(expected.len(), got.len());
|
||||||
assert_eq!(expected, got);
|
assert_eq!(expected, got);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn pattern_case() {
|
||||||
|
assert_eq!(has_uppercase_literal(&"".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"Foo".to_string()), true);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foO".to_string()), true);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo\\\\".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo\\w".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo\\S".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo\\p{Ll}".to_string()), true);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo[a-z]".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo[A-Z]".to_string()), true);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo[\\S\\t]".to_string()), false);
|
||||||
|
assert_eq!(has_uppercase_literal(&"foo\\\\S".to_string()), true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
3
ignore/COPYING
Normal file
3
ignore/COPYING
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This project is dual-licensed under the Unlicense and MIT licenses.
|
||||||
|
|
||||||
|
You may use this code under the terms of either license.
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "ignore"
|
name = "ignore"
|
||||||
version = "0.1.3" #:version
|
version = "0.3.1" #:version
|
||||||
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||||
description = """
|
description = """
|
||||||
A fast library for efficiently matching ignore files such as `.gitignore`
|
A fast library for efficiently matching ignore files such as `.gitignore`
|
||||||
@@ -18,19 +18,22 @@ name = "ignore"
|
|||||||
bench = false
|
bench = false
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
globset = { version = "0.1.1", path = "../globset" }
|
crossbeam = "0.3"
|
||||||
lazy_static = "0.2"
|
globset = { version = "0.2.1", path = "../globset" }
|
||||||
|
lazy_static = "1"
|
||||||
log = "0.3"
|
log = "0.3"
|
||||||
memchr = "0.1"
|
memchr = "2"
|
||||||
regex = "0.1.77"
|
regex = "0.2.1"
|
||||||
thread_local = "0.3.0"
|
same-file = "1"
|
||||||
walkdir = "1"
|
thread_local = "0.3.2"
|
||||||
|
walkdir = "2"
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies.winapi]
|
||||||
|
version = "0.3"
|
||||||
|
features = ["std", "winnt"]
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempdir = "0.3.5"
|
tempdir = "0.3.5"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
simd-accel = ["globset/simd-accel"]
|
simd-accel = ["globset/simd-accel"]
|
||||||
|
|
||||||
[profile.release]
|
|
||||||
debug = true
|
|
||||||
|
|||||||
21
ignore/LICENSE-MIT
Normal file
21
ignore/LICENSE-MIT
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Andrew Gallant
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
@@ -20,7 +20,7 @@ Add this to your `Cargo.toml`:
|
|||||||
|
|
||||||
```toml
|
```toml
|
||||||
[dependencies]
|
[dependencies]
|
||||||
ignore = "0.1"
|
ignore = "0.3"
|
||||||
```
|
```
|
||||||
|
|
||||||
and this to your crate root:
|
and this to your crate root:
|
||||||
|
|||||||
24
ignore/UNLICENSE
Normal file
24
ignore/UNLICENSE
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
@@ -1,28 +1,92 @@
|
|||||||
/*
|
#![allow(dead_code, unused_imports, unused_mut, unused_variables)]
|
||||||
|
|
||||||
|
extern crate crossbeam;
|
||||||
extern crate ignore;
|
extern crate ignore;
|
||||||
extern crate walkdir;
|
extern crate walkdir;
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
use std::io::{self, Write};
|
use std::io::{self, Write};
|
||||||
use std::os::unix::ffi::OsStrExt;
|
use std::path::Path;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
use std::thread;
|
||||||
|
|
||||||
use ignore::ignore::IgnoreBuilder;
|
use crossbeam::sync::MsQueue;
|
||||||
|
use ignore::WalkBuilder;
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let path = env::args().nth(1).unwrap();
|
let mut path = env::args().nth(1).unwrap();
|
||||||
let ig = IgnoreBuilder::new().build();
|
let mut parallel = false;
|
||||||
let wd = WalkDir::new(path);
|
let mut simple = false;
|
||||||
let walker = ignore::walk::Iter::new(ig, wd);
|
let queue: Arc<MsQueue<Option<DirEntry>>> = Arc::new(MsQueue::new());
|
||||||
|
if path == "parallel" {
|
||||||
let mut stdout = io::BufWriter::new(io::stdout());
|
path = env::args().nth(2).unwrap();
|
||||||
// let mut count = 0;
|
parallel = true;
|
||||||
for dirent in walker {
|
} else if path == "walkdir" {
|
||||||
// count += 1;
|
path = env::args().nth(2).unwrap();
|
||||||
stdout.write(dirent.path().as_os_str().as_bytes()).unwrap();
|
simple = true;
|
||||||
stdout.write(b"\n").unwrap();
|
|
||||||
}
|
}
|
||||||
// println!("{}", count);
|
|
||||||
|
let stdout_queue = queue.clone();
|
||||||
|
let stdout_thread = thread::spawn(move || {
|
||||||
|
let mut stdout = io::BufWriter::new(io::stdout());
|
||||||
|
while let Some(dent) = stdout_queue.pop() {
|
||||||
|
write_path(&mut stdout, dent.path());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if parallel {
|
||||||
|
let walker = WalkBuilder::new(path).threads(6).build_parallel();
|
||||||
|
walker.run(|| {
|
||||||
|
let queue = queue.clone();
|
||||||
|
Box::new(move |result| {
|
||||||
|
use ignore::WalkState::*;
|
||||||
|
|
||||||
|
queue.push(Some(DirEntry::Y(result.unwrap())));
|
||||||
|
Continue
|
||||||
|
})
|
||||||
|
});
|
||||||
|
} else if simple {
|
||||||
|
let mut stdout = io::BufWriter::new(io::stdout());
|
||||||
|
let walker = WalkDir::new(path);
|
||||||
|
for result in walker {
|
||||||
|
queue.push(Some(DirEntry::X(result.unwrap())));
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let mut stdout = io::BufWriter::new(io::stdout());
|
||||||
|
let walker = WalkBuilder::new(path).build();
|
||||||
|
for result in walker {
|
||||||
|
queue.push(Some(DirEntry::Y(result.unwrap())));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
queue.push(None);
|
||||||
|
stdout_thread.join().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
enum DirEntry {
|
||||||
|
X(walkdir::DirEntry),
|
||||||
|
Y(ignore::DirEntry),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DirEntry {
|
||||||
|
fn path(&self) -> &Path {
|
||||||
|
match *self {
|
||||||
|
DirEntry::X(ref x) => x.path(),
|
||||||
|
DirEntry::Y(ref y) => y.path(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn write_path<W: Write>(mut wtr: W, path: &Path) {
|
||||||
|
use std::os::unix::ffi::OsStrExt;
|
||||||
|
wtr.write(path.as_os_str().as_bytes()).unwrap();
|
||||||
|
wtr.write(b"\n").unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
fn write_path<W: Write>(mut wtr: W, path: &Path) {
|
||||||
|
wtr.write(path.to_string_lossy().as_bytes()).unwrap();
|
||||||
|
wtr.write(b"\n").unwrap();
|
||||||
}
|
}
|
||||||
*/
|
|
||||||
fn main() {}
|
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
// well.
|
// well.
|
||||||
|
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::ffi::OsString;
|
use std::ffi::{OsString, OsStr};
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ struct IgnoreOptions {
|
|||||||
|
|
||||||
impl IgnoreOptions {
|
impl IgnoreOptions {
|
||||||
/// Returns true if at least one type of ignore rules should be matched.
|
/// Returns true if at least one type of ignore rules should be matched.
|
||||||
fn should_ignores(&self) -> bool {
|
fn has_any_ignore_options(&self) -> bool {
|
||||||
self.ignore || self.git_global || self.git_ignore || self.git_exclude
|
self.ignore || self.git_global || self.git_ignore || self.git_exclude
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -109,8 +109,12 @@ struct IgnoreInner {
|
|||||||
/// The absolute base path of this matcher. Populated only if parent
|
/// The absolute base path of this matcher. Populated only if parent
|
||||||
/// directories are added.
|
/// directories are added.
|
||||||
absolute_base: Option<Arc<PathBuf>>,
|
absolute_base: Option<Arc<PathBuf>>,
|
||||||
/// Explicit ignore matchers specified by the caller.
|
/// Explicit global ignore matchers specified by the caller.
|
||||||
explicit_ignores: Arc<Vec<Gitignore>>,
|
explicit_ignores: Arc<Vec<Gitignore>>,
|
||||||
|
/// Ignore files used in addition to `.ignore`
|
||||||
|
custom_ignore_filenames: Arc<Vec<OsString>>,
|
||||||
|
/// The matcher for custom ignore files
|
||||||
|
custom_ignore_matcher: Gitignore,
|
||||||
/// The matcher for .ignore files.
|
/// The matcher for .ignore files.
|
||||||
ignore_matcher: Gitignore,
|
ignore_matcher: Gitignore,
|
||||||
/// A global gitignore matcher, usually from $XDG_CONFIG_HOME/git/ignore.
|
/// A global gitignore matcher, usually from $XDG_CONFIG_HOME/git/ignore.
|
||||||
@@ -127,7 +131,6 @@ struct IgnoreInner {
|
|||||||
|
|
||||||
impl Ignore {
|
impl Ignore {
|
||||||
/// Return the directory path of this matcher.
|
/// Return the directory path of this matcher.
|
||||||
#[allow(dead_code)]
|
|
||||||
pub fn path(&self) -> &Path {
|
pub fn path(&self) -> &Path {
|
||||||
&self.0.dir
|
&self.0.dir
|
||||||
}
|
}
|
||||||
@@ -137,6 +140,11 @@ impl Ignore {
|
|||||||
self.0.parent.is_none()
|
self.0.parent.is_none()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if this matcher was added via the `add_parents` method.
|
||||||
|
pub fn is_absolute_parent(&self) -> bool {
|
||||||
|
self.0.is_absolute_parent
|
||||||
|
}
|
||||||
|
|
||||||
/// Return this matcher's parent, if one exists.
|
/// Return this matcher's parent, if one exists.
|
||||||
pub fn parent(&self) -> Option<Ignore> {
|
pub fn parent(&self) -> Option<Ignore> {
|
||||||
self.0.parent.clone()
|
self.0.parent.clone()
|
||||||
@@ -206,14 +214,19 @@ impl Ignore {
|
|||||||
|
|
||||||
/// Like add_child, but takes a full path and returns an IgnoreInner.
|
/// Like add_child, but takes a full path and returns an IgnoreInner.
|
||||||
fn add_child_path(&self, dir: &Path) -> (IgnoreInner, Option<Error>) {
|
fn add_child_path(&self, dir: &Path) -> (IgnoreInner, Option<Error>) {
|
||||||
static IG_NAMES: &'static [&'static str] = &[".rgignore", ".ignore"];
|
|
||||||
|
|
||||||
let mut errs = PartialErrorBuilder::default();
|
let mut errs = PartialErrorBuilder::default();
|
||||||
|
let custom_ig_matcher =
|
||||||
|
{
|
||||||
|
let (m, err) =
|
||||||
|
create_gitignore(&dir, &self.0.custom_ignore_filenames);
|
||||||
|
errs.maybe_push(err);
|
||||||
|
m
|
||||||
|
};
|
||||||
let ig_matcher =
|
let ig_matcher =
|
||||||
if !self.0.opts.ignore {
|
if !self.0.opts.ignore {
|
||||||
Gitignore::empty()
|
Gitignore::empty()
|
||||||
} else {
|
} else {
|
||||||
let (m, err) = create_gitignore(&dir, IG_NAMES);
|
let (m, err) = create_gitignore(&dir, &[".ignore"]);
|
||||||
errs.maybe_push(err);
|
errs.maybe_push(err);
|
||||||
m
|
m
|
||||||
};
|
};
|
||||||
@@ -242,6 +255,8 @@ impl Ignore {
|
|||||||
is_absolute_parent: false,
|
is_absolute_parent: false,
|
||||||
absolute_base: self.0.absolute_base.clone(),
|
absolute_base: self.0.absolute_base.clone(),
|
||||||
explicit_ignores: self.0.explicit_ignores.clone(),
|
explicit_ignores: self.0.explicit_ignores.clone(),
|
||||||
|
custom_ignore_filenames: self.0.custom_ignore_filenames.clone(),
|
||||||
|
custom_ignore_matcher: custom_ig_matcher,
|
||||||
ignore_matcher: ig_matcher,
|
ignore_matcher: ig_matcher,
|
||||||
git_global_matcher: self.0.git_global_matcher.clone(),
|
git_global_matcher: self.0.git_global_matcher.clone(),
|
||||||
git_ignore_matcher: gi_matcher,
|
git_ignore_matcher: gi_matcher,
|
||||||
@@ -280,7 +295,7 @@ impl Ignore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let mut whitelisted = Match::None;
|
let mut whitelisted = Match::None;
|
||||||
if self.0.opts.should_ignores() {
|
if self.0.opts.has_any_ignore_options() {
|
||||||
let mat = self.matched_ignore(path, is_dir);
|
let mat = self.matched_ignore(path, is_dir);
|
||||||
if mat.is_ignore() {
|
if mat.is_ignore() {
|
||||||
return mat;
|
return mat;
|
||||||
@@ -310,10 +325,15 @@ impl Ignore {
|
|||||||
path: &Path,
|
path: &Path,
|
||||||
is_dir: bool,
|
is_dir: bool,
|
||||||
) -> Match<IgnoreMatch<'a>> {
|
) -> Match<IgnoreMatch<'a>> {
|
||||||
let (mut m_ignore, mut m_gi, mut m_gi_exclude, mut m_explicit) =
|
let (mut m_custom_ignore, mut m_ignore, mut m_gi, mut m_gi_exclude, mut m_explicit) =
|
||||||
(Match::None, Match::None, Match::None, Match::None);
|
(Match::None, Match::None, Match::None, Match::None, Match::None);
|
||||||
let mut saw_git = false;
|
let mut saw_git = false;
|
||||||
for ig in self.parents().take_while(|ig| !ig.0.is_absolute_parent) {
|
for ig in self.parents().take_while(|ig| !ig.0.is_absolute_parent) {
|
||||||
|
if m_custom_ignore.is_none() {
|
||||||
|
m_custom_ignore =
|
||||||
|
ig.0.custom_ignore_matcher.matched(path, is_dir)
|
||||||
|
.map(IgnoreMatch::gitignore);
|
||||||
|
}
|
||||||
if m_ignore.is_none() {
|
if m_ignore.is_none() {
|
||||||
m_ignore =
|
m_ignore =
|
||||||
ig.0.ignore_matcher.matched(path, is_dir)
|
ig.0.ignore_matcher.matched(path, is_dir)
|
||||||
@@ -334,6 +354,11 @@ impl Ignore {
|
|||||||
if let Some(abs_parent_path) = self.absolute_base() {
|
if let Some(abs_parent_path) = self.absolute_base() {
|
||||||
let path = abs_parent_path.join(path);
|
let path = abs_parent_path.join(path);
|
||||||
for ig in self.parents().skip_while(|ig|!ig.0.is_absolute_parent) {
|
for ig in self.parents().skip_while(|ig|!ig.0.is_absolute_parent) {
|
||||||
|
if m_custom_ignore.is_none() {
|
||||||
|
m_custom_ignore =
|
||||||
|
ig.0.custom_ignore_matcher.matched(&path, is_dir)
|
||||||
|
.map(IgnoreMatch::gitignore);
|
||||||
|
}
|
||||||
if m_ignore.is_none() {
|
if m_ignore.is_none() {
|
||||||
m_ignore =
|
m_ignore =
|
||||||
ig.0.ignore_matcher.matched(&path, is_dir)
|
ig.0.ignore_matcher.matched(&path, is_dir)
|
||||||
@@ -360,23 +385,12 @@ impl Ignore {
|
|||||||
}
|
}
|
||||||
let m_global = self.0.git_global_matcher.matched(&path, is_dir)
|
let m_global = self.0.git_global_matcher.matched(&path, is_dir)
|
||||||
.map(IgnoreMatch::gitignore);
|
.map(IgnoreMatch::gitignore);
|
||||||
if !m_ignore.is_none() {
|
|
||||||
m_ignore
|
m_custom_ignore.or(m_ignore).or(m_gi).or(m_gi_exclude).or(m_global).or(m_explicit)
|
||||||
} else if !m_gi.is_none() {
|
|
||||||
m_gi
|
|
||||||
} else if !m_gi_exclude.is_none() {
|
|
||||||
m_gi_exclude
|
|
||||||
} else if !m_global.is_none() {
|
|
||||||
m_global
|
|
||||||
} else if !m_explicit.is_none() {
|
|
||||||
m_explicit
|
|
||||||
} else {
|
|
||||||
Match::None
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns an iterator over parent ignore matchers, including this one.
|
/// Returns an iterator over parent ignore matchers, including this one.
|
||||||
fn parents(&self) -> Parents {
|
pub fn parents(&self) -> Parents {
|
||||||
Parents(Some(self))
|
Parents(Some(self))
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -387,7 +401,10 @@ impl Ignore {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Parents<'a>(Option<&'a Ignore>);
|
/// An iterator over all parents of an ignore matcher, including itself.
|
||||||
|
///
|
||||||
|
/// The lifetime `'a` refers to the lifetime of the initial `Ignore` matcher.
|
||||||
|
pub struct Parents<'a>(Option<&'a Ignore>);
|
||||||
|
|
||||||
impl<'a> Iterator for Parents<'a> {
|
impl<'a> Iterator for Parents<'a> {
|
||||||
type Item = &'a Ignore;
|
type Item = &'a Ignore;
|
||||||
@@ -412,8 +429,10 @@ pub struct IgnoreBuilder {
|
|||||||
overrides: Arc<Override>,
|
overrides: Arc<Override>,
|
||||||
/// A type matcher (default is empty).
|
/// A type matcher (default is empty).
|
||||||
types: Arc<Types>,
|
types: Arc<Types>,
|
||||||
/// Explicit ignore matchers.
|
/// Explicit global ignore matchers.
|
||||||
explicit_ignores: Vec<Gitignore>,
|
explicit_ignores: Vec<Gitignore>,
|
||||||
|
/// Ignore files in addition to .ignore.
|
||||||
|
custom_ignore_filenames: Vec<OsString>,
|
||||||
/// Ignore config.
|
/// Ignore config.
|
||||||
opts: IgnoreOptions,
|
opts: IgnoreOptions,
|
||||||
}
|
}
|
||||||
@@ -429,6 +448,7 @@ impl IgnoreBuilder {
|
|||||||
overrides: Arc::new(Override::empty()),
|
overrides: Arc::new(Override::empty()),
|
||||||
types: Arc::new(Types::empty()),
|
types: Arc::new(Types::empty()),
|
||||||
explicit_ignores: vec![],
|
explicit_ignores: vec![],
|
||||||
|
custom_ignore_filenames: vec![],
|
||||||
opts: IgnoreOptions {
|
opts: IgnoreOptions {
|
||||||
hidden: true,
|
hidden: true,
|
||||||
ignore: true,
|
ignore: true,
|
||||||
@@ -454,6 +474,7 @@ impl IgnoreBuilder {
|
|||||||
}
|
}
|
||||||
gi
|
gi
|
||||||
};
|
};
|
||||||
|
|
||||||
Ignore(Arc::new(IgnoreInner {
|
Ignore(Arc::new(IgnoreInner {
|
||||||
compiled: Arc::new(RwLock::new(HashMap::new())),
|
compiled: Arc::new(RwLock::new(HashMap::new())),
|
||||||
dir: self.dir.clone(),
|
dir: self.dir.clone(),
|
||||||
@@ -463,6 +484,8 @@ impl IgnoreBuilder {
|
|||||||
is_absolute_parent: true,
|
is_absolute_parent: true,
|
||||||
absolute_base: None,
|
absolute_base: None,
|
||||||
explicit_ignores: Arc::new(self.explicit_ignores.clone()),
|
explicit_ignores: Arc::new(self.explicit_ignores.clone()),
|
||||||
|
custom_ignore_filenames: Arc::new(self.custom_ignore_filenames.clone()),
|
||||||
|
custom_ignore_matcher: Gitignore::empty(),
|
||||||
ignore_matcher: Gitignore::empty(),
|
ignore_matcher: Gitignore::empty(),
|
||||||
git_global_matcher: Arc::new(git_global_matcher),
|
git_global_matcher: Arc::new(git_global_matcher),
|
||||||
git_ignore_matcher: Gitignore::empty(),
|
git_ignore_matcher: Gitignore::empty(),
|
||||||
@@ -498,6 +521,20 @@ impl IgnoreBuilder {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Add a custom ignore file name
|
||||||
|
///
|
||||||
|
/// These ignore files have higher precedence than all other ignore files.
|
||||||
|
///
|
||||||
|
/// When specifying multiple names, earlier names have lower precedence than
|
||||||
|
/// later names.
|
||||||
|
pub fn add_custom_ignore_filename<S: AsRef<OsStr>>(
|
||||||
|
&mut self,
|
||||||
|
file_name: S
|
||||||
|
) -> &mut IgnoreBuilder {
|
||||||
|
self.custom_ignore_filenames.push(file_name.as_ref().to_os_string());
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Enables ignoring hidden files.
|
/// Enables ignoring hidden files.
|
||||||
///
|
///
|
||||||
/// This is enabled by default.
|
/// This is enabled by default.
|
||||||
@@ -559,14 +596,14 @@ impl IgnoreBuilder {
|
|||||||
/// order given (earlier names have lower precedence than later names).
|
/// order given (earlier names have lower precedence than later names).
|
||||||
///
|
///
|
||||||
/// I/O errors are ignored.
|
/// I/O errors are ignored.
|
||||||
pub fn create_gitignore(
|
pub fn create_gitignore<T: AsRef<OsStr>>(
|
||||||
dir: &Path,
|
dir: &Path,
|
||||||
names: &[&str],
|
names: &[T],
|
||||||
) -> (Gitignore, Option<Error>) {
|
) -> (Gitignore, Option<Error>) {
|
||||||
let mut builder = GitignoreBuilder::new(dir);
|
let mut builder = GitignoreBuilder::new(dir);
|
||||||
let mut errs = PartialErrorBuilder::default();
|
let mut errs = PartialErrorBuilder::default();
|
||||||
for name in names {
|
for name in names {
|
||||||
let gipath = dir.join(name);
|
let gipath = dir.join(name.as_ref());
|
||||||
errs.maybe_push_ignore_io(builder.add(gipath));
|
errs.maybe_push_ignore_io(builder.add(gipath));
|
||||||
}
|
}
|
||||||
let gi = match builder.build() {
|
let gi = match builder.build() {
|
||||||
@@ -659,6 +696,53 @@ mod tests {
|
|||||||
assert!(ig.matched("baz", false).is_none());
|
assert!(ig.matched("baz", false).is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn custom_ignore() {
|
||||||
|
let td = TempDir::new("ignore-test-").unwrap();
|
||||||
|
let custom_ignore = ".customignore";
|
||||||
|
wfile(td.path().join(custom_ignore), "foo\n!bar");
|
||||||
|
|
||||||
|
let (ig, err) = IgnoreBuilder::new()
|
||||||
|
.add_custom_ignore_filename(custom_ignore)
|
||||||
|
.build().add_child(td.path());
|
||||||
|
assert!(err.is_none());
|
||||||
|
assert!(ig.matched("foo", false).is_ignore());
|
||||||
|
assert!(ig.matched("bar", false).is_whitelist());
|
||||||
|
assert!(ig.matched("baz", false).is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that a custom ignore file will override an .ignore.
|
||||||
|
#[test]
|
||||||
|
fn custom_ignore_over_ignore() {
|
||||||
|
let td = TempDir::new("ignore-test-").unwrap();
|
||||||
|
let custom_ignore = ".customignore";
|
||||||
|
wfile(td.path().join(".ignore"), "foo");
|
||||||
|
wfile(td.path().join(custom_ignore), "!foo");
|
||||||
|
|
||||||
|
let (ig, err) = IgnoreBuilder::new()
|
||||||
|
.add_custom_ignore_filename(custom_ignore)
|
||||||
|
.build().add_child(td.path());
|
||||||
|
assert!(err.is_none());
|
||||||
|
assert!(ig.matched("foo", false).is_whitelist());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Tests that earlier custom ignore files have lower precedence than later.
|
||||||
|
#[test]
|
||||||
|
fn custom_ignore_precedence() {
|
||||||
|
let td = TempDir::new("ignore-test-").unwrap();
|
||||||
|
let custom_ignore1 = ".customignore1";
|
||||||
|
let custom_ignore2 = ".customignore2";
|
||||||
|
wfile(td.path().join(custom_ignore1), "foo");
|
||||||
|
wfile(td.path().join(custom_ignore2), "!foo");
|
||||||
|
|
||||||
|
let (ig, err) = IgnoreBuilder::new()
|
||||||
|
.add_custom_ignore_filename(custom_ignore1)
|
||||||
|
.add_custom_ignore_filename(custom_ignore2)
|
||||||
|
.build().add_child(td.path());
|
||||||
|
assert!(err.is_none());
|
||||||
|
assert!(ig.matched("foo", false).is_whitelist());
|
||||||
|
}
|
||||||
|
|
||||||
// Tests that an .ignore will override a .gitignore.
|
// Tests that an .ignore will override a .gitignore.
|
||||||
#[test]
|
#[test]
|
||||||
fn ignore_over_gitignore() {
|
fn ignore_over_gitignore() {
|
||||||
|
|||||||
@@ -169,8 +169,8 @@ impl Gitignore {
|
|||||||
self.num_whitelists
|
self.num_whitelists
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns whether the given file path matched a pattern in this gitignore
|
/// Returns whether the given path (file or directory) matched a pattern in
|
||||||
/// matcher.
|
/// this gitignore matcher.
|
||||||
///
|
///
|
||||||
/// `is_dir` should be true if the path refers to a directory and false
|
/// `is_dir` should be true if the path refers to a directory and false
|
||||||
/// otherwise.
|
/// otherwise.
|
||||||
@@ -191,6 +191,48 @@ impl Gitignore {
|
|||||||
self.matched_stripped(self.strip(path.as_ref()), is_dir)
|
self.matched_stripped(self.strip(path.as_ref()), is_dir)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns whether the given path (file or directory, and expected to be
|
||||||
|
/// under the root) or any of its parent directories (up to the root)
|
||||||
|
/// matched a pattern in this gitignore matcher.
|
||||||
|
///
|
||||||
|
/// NOTE: This method is more expensive than walking the directory hierarchy
|
||||||
|
/// top-to-bottom and matching the entries. But, is easier to use in cases
|
||||||
|
/// when a list of paths are available without a hierarchy.
|
||||||
|
///
|
||||||
|
/// `is_dir` should be true if the path refers to a directory and false
|
||||||
|
/// otherwise.
|
||||||
|
///
|
||||||
|
/// The given path is matched relative to the path given when building
|
||||||
|
/// the matcher. Specifically, before matching `path`, its prefix (as
|
||||||
|
/// determined by a common suffix of the directory containing this
|
||||||
|
/// gitignore) is stripped. If there is no common suffix/prefix overlap,
|
||||||
|
/// then `path` is assumed to be relative to this matcher.
|
||||||
|
pub fn matched_path_or_any_parents<P: AsRef<Path>>(
|
||||||
|
&self,
|
||||||
|
path: P,
|
||||||
|
is_dir: bool,
|
||||||
|
) -> Match<&Glob> {
|
||||||
|
if self.is_empty() {
|
||||||
|
return Match::None;
|
||||||
|
}
|
||||||
|
let mut path = self.strip(path.as_ref());
|
||||||
|
debug_assert!(
|
||||||
|
!path.has_root(),
|
||||||
|
"path is expect to be under the root"
|
||||||
|
);
|
||||||
|
match self.matched_stripped(path, is_dir) {
|
||||||
|
Match::None => (), // walk up
|
||||||
|
a_match => return a_match,
|
||||||
|
}
|
||||||
|
while let Some(parent) = path.parent() {
|
||||||
|
match self.matched_stripped(parent, /* is_dir */ true) {
|
||||||
|
Match::None => path = parent, // walk up
|
||||||
|
a_match => return a_match,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Match::None
|
||||||
|
}
|
||||||
|
|
||||||
/// Like matched, but takes a path that has already been stripped.
|
/// Like matched, but takes a path that has already been stripped.
|
||||||
fn matched_stripped<P: AsRef<Path>>(
|
fn matched_stripped<P: AsRef<Path>>(
|
||||||
&self,
|
&self,
|
||||||
@@ -254,6 +296,7 @@ pub struct GitignoreBuilder {
|
|||||||
builder: GlobSetBuilder,
|
builder: GlobSetBuilder,
|
||||||
root: PathBuf,
|
root: PathBuf,
|
||||||
globs: Vec<Glob>,
|
globs: Vec<Glob>,
|
||||||
|
case_insensitive: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl GitignoreBuilder {
|
impl GitignoreBuilder {
|
||||||
@@ -269,6 +312,7 @@ impl GitignoreBuilder {
|
|||||||
builder: GlobSetBuilder::new(),
|
builder: GlobSetBuilder::new(),
|
||||||
root: strip_prefix("./", root).unwrap_or(root).to_path_buf(),
|
root: strip_prefix("./", root).unwrap_or(root).to_path_buf(),
|
||||||
globs: vec![],
|
globs: vec![],
|
||||||
|
case_insensitive: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -278,8 +322,13 @@ impl GitignoreBuilder {
|
|||||||
pub fn build(&self) -> Result<Gitignore, Error> {
|
pub fn build(&self) -> Result<Gitignore, Error> {
|
||||||
let nignore = self.globs.iter().filter(|g| !g.is_whitelist()).count();
|
let nignore = self.globs.iter().filter(|g| !g.is_whitelist()).count();
|
||||||
let nwhite = self.globs.iter().filter(|g| g.is_whitelist()).count();
|
let nwhite = self.globs.iter().filter(|g| g.is_whitelist()).count();
|
||||||
let set = try!(
|
let set =
|
||||||
self.builder.build().map_err(|err| Error::Glob(err.to_string())));
|
self.builder.build().map_err(|err| {
|
||||||
|
Error::Glob {
|
||||||
|
glob: None,
|
||||||
|
err: err.to_string(),
|
||||||
|
}
|
||||||
|
})?;
|
||||||
Ok(Gitignore {
|
Ok(Gitignore {
|
||||||
set: set,
|
set: set,
|
||||||
root: self.root.clone(),
|
root: self.root.clone(),
|
||||||
@@ -311,7 +360,7 @@ impl GitignoreBuilder {
|
|||||||
Ok(line) => line,
|
Ok(line) => line,
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
errs.push(Error::Io(err).tagged(path, lineno));
|
errs.push(Error::Io(err).tagged(path, lineno));
|
||||||
continue;
|
break;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
if let Err(err) = self.add_line(Some(path.to_path_buf()), &line) {
|
if let Err(err) = self.add_line(Some(path.to_path_buf()), &line) {
|
||||||
@@ -334,7 +383,7 @@ impl GitignoreBuilder {
|
|||||||
gitignore: &str,
|
gitignore: &str,
|
||||||
) -> Result<&mut GitignoreBuilder, Error> {
|
) -> Result<&mut GitignoreBuilder, Error> {
|
||||||
for line in gitignore.lines() {
|
for line in gitignore.lines() {
|
||||||
try!(self.add_line(from.clone(), line));
|
self.add_line(from.clone(), line)?;
|
||||||
}
|
}
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
@@ -367,10 +416,10 @@ impl GitignoreBuilder {
|
|||||||
is_only_dir: false,
|
is_only_dir: false,
|
||||||
};
|
};
|
||||||
let mut literal_separator = false;
|
let mut literal_separator = false;
|
||||||
let has_slash = line.chars().any(|c| c == '/');
|
let mut is_absolute = false;
|
||||||
let is_absolute = line.chars().nth(0).unwrap() == '/';
|
|
||||||
if line.starts_with("\\!") || line.starts_with("\\#") {
|
if line.starts_with("\\!") || line.starts_with("\\#") {
|
||||||
line = &line[1..];
|
line = &line[1..];
|
||||||
|
is_absolute = line.chars().nth(0) == Some('/');
|
||||||
} else {
|
} else {
|
||||||
if line.starts_with("!") {
|
if line.starts_with("!") {
|
||||||
glob.is_whitelist = true;
|
glob.is_whitelist = true;
|
||||||
@@ -383,6 +432,7 @@ impl GitignoreBuilder {
|
|||||||
// simply banning wildcards from matching /.
|
// simply banning wildcards from matching /.
|
||||||
literal_separator = true;
|
literal_separator = true;
|
||||||
line = &line[1..];
|
line = &line[1..];
|
||||||
|
is_absolute = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// If it ends with a slash, then this should only match directories,
|
// If it ends with a slash, then this should only match directories,
|
||||||
@@ -396,15 +446,15 @@ impl GitignoreBuilder {
|
|||||||
// If there is a literal slash, then we note that so that globbing
|
// If there is a literal slash, then we note that so that globbing
|
||||||
// doesn't let wildcards match slashes.
|
// doesn't let wildcards match slashes.
|
||||||
glob.actual = line.to_string();
|
glob.actual = line.to_string();
|
||||||
if has_slash {
|
if is_absolute || line.chars().any(|c| c == '/') {
|
||||||
literal_separator = true;
|
literal_separator = true;
|
||||||
}
|
}
|
||||||
// If there was a leading slash, then this is a glob that must
|
// If there was a slash, then this is a glob that must match the entire
|
||||||
// match the entire path name. Otherwise, we should let it match
|
// path name. Otherwise, we should let it match anywhere, so use a **/
|
||||||
// anywhere, so use a **/ prefix.
|
// prefix.
|
||||||
if !is_absolute {
|
if !literal_separator {
|
||||||
// ... but only if we don't already have a **/ prefix.
|
// ... but only if we don't already have a **/ prefix.
|
||||||
if !glob.actual.starts_with("**/") {
|
if !(glob.actual.starts_with("**/") || (glob.actual == "**" && glob.is_only_dir)) {
|
||||||
glob.actual = format!("**/{}", glob.actual);
|
glob.actual = format!("**/{}", glob.actual);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -414,15 +464,31 @@ impl GitignoreBuilder {
|
|||||||
if glob.actual.ends_with("/**") {
|
if glob.actual.ends_with("/**") {
|
||||||
glob.actual = format!("{}/*", glob.actual);
|
glob.actual = format!("{}/*", glob.actual);
|
||||||
}
|
}
|
||||||
let parsed = try!(
|
let parsed =
|
||||||
GlobBuilder::new(&glob.actual)
|
GlobBuilder::new(&glob.actual)
|
||||||
.literal_separator(literal_separator)
|
.literal_separator(literal_separator)
|
||||||
|
.case_insensitive(self.case_insensitive)
|
||||||
.build()
|
.build()
|
||||||
.map_err(|err| Error::Glob(err.to_string())));
|
.map_err(|err| {
|
||||||
|
Error::Glob {
|
||||||
|
glob: Some(glob.original.clone()),
|
||||||
|
err: err.kind().to_string(),
|
||||||
|
}
|
||||||
|
})?;
|
||||||
self.builder.add(parsed);
|
self.builder.add(parsed);
|
||||||
self.globs.push(glob);
|
self.globs.push(glob);
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Toggle whether the globs should be matched case insensitively or not.
|
||||||
|
///
|
||||||
|
/// This is disabled by default.
|
||||||
|
pub fn case_insensitive(
|
||||||
|
&mut self, yes: bool
|
||||||
|
) -> Result<&mut GitignoreBuilder, Error> {
|
||||||
|
self.case_insensitive = yes;
|
||||||
|
Ok(self)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Return the file path of the current environment's global gitignore file.
|
/// Return the file path of the current environment's global gitignore file.
|
||||||
@@ -453,9 +519,9 @@ fn gitconfig_contents() -> Option<Vec<u8>> {
|
|||||||
/// Specifically, this respects XDG_CONFIG_HOME.
|
/// Specifically, this respects XDG_CONFIG_HOME.
|
||||||
fn excludes_file_default() -> Option<PathBuf> {
|
fn excludes_file_default() -> Option<PathBuf> {
|
||||||
env::var_os("XDG_CONFIG_HOME")
|
env::var_os("XDG_CONFIG_HOME")
|
||||||
.and_then(|x| if x.is_empty() { None } else { Some(x) })
|
.and_then(|x| if x.is_empty() { None } else { Some(PathBuf::from(x)) })
|
||||||
.or_else(|| env::var_os("HOME"))
|
.or_else(|| env::home_dir().map(|p| p.join(".config")))
|
||||||
.map(|x| PathBuf::from(x).join("git/ignore"))
|
.map(|x| x.join("git/ignore"))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Extract git's `core.excludesfile` config setting from the raw file contents
|
/// Extract git's `core.excludesfile` config setting from the raw file contents
|
||||||
@@ -550,9 +616,10 @@ mod tests {
|
|||||||
ignored!(ig25, ROOT, "Cargo.lock", "./tabwriter-bin/Cargo.lock");
|
ignored!(ig25, ROOT, "Cargo.lock", "./tabwriter-bin/Cargo.lock");
|
||||||
ignored!(ig26, ROOT, "/foo/bar/baz", "./foo/bar/baz");
|
ignored!(ig26, ROOT, "/foo/bar/baz", "./foo/bar/baz");
|
||||||
ignored!(ig27, ROOT, "foo/", "xyz/foo", true);
|
ignored!(ig27, ROOT, "foo/", "xyz/foo", true);
|
||||||
ignored!(ig28, ROOT, "src/*.rs", "src/grep/src/main.rs");
|
ignored!(ig28, "./src", "/llvm/", "./src/llvm", true);
|
||||||
ignored!(ig29, "./src", "/llvm/", "./src/llvm", true);
|
ignored!(ig29, ROOT, "node_modules/ ", "node_modules", true);
|
||||||
ignored!(ig30, ROOT, "node_modules/ ", "node_modules", true);
|
ignored!(ig30, ROOT, "**/", "foo/bar", true);
|
||||||
|
ignored!(ig31, ROOT, "path1/*", "path1/foo");
|
||||||
|
|
||||||
not_ignored!(ignot1, ROOT, "amonths", "months");
|
not_ignored!(ignot1, ROOT, "amonths", "months");
|
||||||
not_ignored!(ignot2, ROOT, "monthsa", "months");
|
not_ignored!(ignot2, ROOT, "monthsa", "months");
|
||||||
@@ -570,6 +637,10 @@ mod tests {
|
|||||||
not_ignored!(
|
not_ignored!(
|
||||||
ignot14, "./third_party/protobuf", "m4/ltoptions.m4",
|
ignot14, "./third_party/protobuf", "m4/ltoptions.m4",
|
||||||
"./third_party/protobuf/csharp/src/packages/repositories.config");
|
"./third_party/protobuf/csharp/src/packages/repositories.config");
|
||||||
|
not_ignored!(ignot15, ROOT, "!/bar", "foo/bar");
|
||||||
|
not_ignored!(ignot16, ROOT, "*\n!**/", "foo", true);
|
||||||
|
not_ignored!(ignot17, ROOT, "src/*.rs", "src/grep/src/main.rs");
|
||||||
|
not_ignored!(ignot18, ROOT, "path1/*", "path2/path1/foo");
|
||||||
|
|
||||||
fn bytes(s: &str) -> Vec<u8> {
|
fn bytes(s: &str) -> Vec<u8> {
|
||||||
s.to_string().into_bytes()
|
s.to_string().into_bytes()
|
||||||
@@ -604,4 +675,21 @@ mod tests {
|
|||||||
fn regression_106() {
|
fn regression_106() {
|
||||||
gi_from_str("/", " ");
|
gi_from_str("/", " ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn case_insensitive() {
|
||||||
|
let gi = GitignoreBuilder::new(ROOT)
|
||||||
|
.case_insensitive(true).unwrap()
|
||||||
|
.add_str(None, "*.html").unwrap()
|
||||||
|
.build().unwrap();
|
||||||
|
assert!(gi.matched("foo.html", false).is_ignore());
|
||||||
|
assert!(gi.matched("foo.HTML", false).is_ignore());
|
||||||
|
assert!(!gi.matched("foo.htm", false).is_ignore());
|
||||||
|
assert!(!gi.matched("foo.HTM", false).is_ignore());
|
||||||
|
}
|
||||||
|
|
||||||
|
ignored!(cs1, ROOT, "*.html", "foo.html");
|
||||||
|
not_ignored!(cs2, ROOT, "*.html", "foo.HTML");
|
||||||
|
not_ignored!(cs3, ROOT, "*.html", "foo.htm");
|
||||||
|
not_ignored!(cs4, ROOT, "*.html", "foo.HTM");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -44,6 +44,9 @@ for result in WalkBuilder::new("./").hidden(false).build() {
|
|||||||
See the documentation for `WalkBuilder` for many other options.
|
See the documentation for `WalkBuilder` for many other options.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#![deny(missing_docs)]
|
||||||
|
|
||||||
|
extern crate crossbeam;
|
||||||
extern crate globset;
|
extern crate globset;
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
@@ -51,17 +54,20 @@ extern crate lazy_static;
|
|||||||
extern crate log;
|
extern crate log;
|
||||||
extern crate memchr;
|
extern crate memchr;
|
||||||
extern crate regex;
|
extern crate regex;
|
||||||
|
extern crate same_file;
|
||||||
#[cfg(test)]
|
#[cfg(test)]
|
||||||
extern crate tempdir;
|
extern crate tempdir;
|
||||||
extern crate thread_local;
|
extern crate thread_local;
|
||||||
extern crate walkdir;
|
extern crate walkdir;
|
||||||
|
#[cfg(windows)]
|
||||||
|
extern crate winapi;
|
||||||
|
|
||||||
use std::error;
|
use std::error;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
pub use walk::{DirEntry, Walk, WalkBuilder};
|
pub use walk::{DirEntry, Walk, WalkBuilder, WalkParallel, WalkState};
|
||||||
|
|
||||||
mod dir;
|
mod dir;
|
||||||
pub mod gitignore;
|
pub mod gitignore;
|
||||||
@@ -77,13 +83,49 @@ pub enum Error {
|
|||||||
/// file partially succeeded.
|
/// file partially succeeded.
|
||||||
Partial(Vec<Error>),
|
Partial(Vec<Error>),
|
||||||
/// An error associated with a specific line number.
|
/// An error associated with a specific line number.
|
||||||
WithLineNumber { line: u64, err: Box<Error> },
|
WithLineNumber {
|
||||||
|
/// The line number.
|
||||||
|
line: u64,
|
||||||
|
/// The underlying error.
|
||||||
|
err: Box<Error>,
|
||||||
|
},
|
||||||
/// An error associated with a particular file path.
|
/// An error associated with a particular file path.
|
||||||
WithPath { path: PathBuf, err: Box<Error> },
|
WithPath {
|
||||||
|
/// The file path.
|
||||||
|
path: PathBuf,
|
||||||
|
/// The underlying error.
|
||||||
|
err: Box<Error>,
|
||||||
|
},
|
||||||
|
/// An error associated with a particular directory depth when recursively
|
||||||
|
/// walking a directory.
|
||||||
|
WithDepth {
|
||||||
|
/// The directory depth.
|
||||||
|
depth: usize,
|
||||||
|
/// The underlying error.
|
||||||
|
err: Box<Error>,
|
||||||
|
},
|
||||||
|
/// An error that occurs when a file loop is detected when traversing
|
||||||
|
/// symbolic links.
|
||||||
|
Loop {
|
||||||
|
/// The ancestor file path in the loop.
|
||||||
|
ancestor: PathBuf,
|
||||||
|
/// The child file path in the loop.
|
||||||
|
child: PathBuf,
|
||||||
|
},
|
||||||
/// An error that occurs when doing I/O, such as reading an ignore file.
|
/// An error that occurs when doing I/O, such as reading an ignore file.
|
||||||
Io(io::Error),
|
Io(io::Error),
|
||||||
/// An error that occurs when trying to parse a glob.
|
/// An error that occurs when trying to parse a glob.
|
||||||
Glob(String),
|
Glob {
|
||||||
|
/// The original glob that caused this error. This glob, when
|
||||||
|
/// available, always corresponds to the glob provided by an end user.
|
||||||
|
/// e.g., It is the glob as written in a `.gitignore` file.
|
||||||
|
///
|
||||||
|
/// (This glob may be distinct from the glob that is actually
|
||||||
|
/// compiled, after accounting for `gitignore` semantics.)
|
||||||
|
glob: Option<String>,
|
||||||
|
/// The underlying glob error as a string.
|
||||||
|
err: String,
|
||||||
|
},
|
||||||
/// A type selection for a file type that is not defined.
|
/// A type selection for a file type that is not defined.
|
||||||
UnrecognizedFileType(String),
|
UnrecognizedFileType(String),
|
||||||
/// A user specified file type definition could not be parsed.
|
/// A user specified file type definition could not be parsed.
|
||||||
@@ -101,6 +143,7 @@ impl Error {
|
|||||||
Error::Partial(_) => true,
|
Error::Partial(_) => true,
|
||||||
Error::WithLineNumber { ref err, .. } => err.is_partial(),
|
Error::WithLineNumber { ref err, .. } => err.is_partial(),
|
||||||
Error::WithPath { ref err, .. } => err.is_partial(),
|
Error::WithPath { ref err, .. } => err.is_partial(),
|
||||||
|
Error::WithDepth { ref err, .. } => err.is_partial(),
|
||||||
_ => false,
|
_ => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -111,13 +154,25 @@ impl Error {
|
|||||||
Error::Partial(ref errs) => errs.len() == 1 && errs[0].is_io(),
|
Error::Partial(ref errs) => errs.len() == 1 && errs[0].is_io(),
|
||||||
Error::WithLineNumber { ref err, .. } => err.is_io(),
|
Error::WithLineNumber { ref err, .. } => err.is_io(),
|
||||||
Error::WithPath { ref err, .. } => err.is_io(),
|
Error::WithPath { ref err, .. } => err.is_io(),
|
||||||
|
Error::WithDepth { ref err, .. } => err.is_io(),
|
||||||
|
Error::Loop { .. } => false,
|
||||||
Error::Io(_) => true,
|
Error::Io(_) => true,
|
||||||
Error::Glob(_) => false,
|
Error::Glob { .. } => false,
|
||||||
Error::UnrecognizedFileType(_) => false,
|
Error::UnrecognizedFileType(_) => false,
|
||||||
Error::InvalidDefinition => false,
|
Error::InvalidDefinition => false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns a depth associated with recursively walking a directory (if
|
||||||
|
/// this error was generated from a recursive directory iterator).
|
||||||
|
pub fn depth(&self) -> Option<usize> {
|
||||||
|
match *self {
|
||||||
|
Error::WithPath { ref err, .. } => err.depth(),
|
||||||
|
Error::WithDepth { depth, .. } => Some(depth),
|
||||||
|
_ => None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Turn an error into a tagged error with the given file path.
|
/// Turn an error into a tagged error with the given file path.
|
||||||
fn with_path<P: AsRef<Path>>(self, path: P) -> Error {
|
fn with_path<P: AsRef<Path>>(self, path: P) -> Error {
|
||||||
Error::WithPath {
|
Error::WithPath {
|
||||||
@@ -126,6 +181,14 @@ impl Error {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Turn an error into a tagged error with the given depth.
|
||||||
|
fn with_depth(self, depth: usize) -> Error {
|
||||||
|
Error::WithDepth {
|
||||||
|
depth: depth,
|
||||||
|
err: Box::new(self),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Turn an error into a tagged error with the given file path and line
|
/// Turn an error into a tagged error with the given file path and line
|
||||||
/// number. If path is empty, then it is omitted from the error.
|
/// number. If path is empty, then it is omitted from the error.
|
||||||
fn tagged<P: AsRef<Path>>(self, path: P, lineno: u64) -> Error {
|
fn tagged<P: AsRef<Path>>(self, path: P, lineno: u64) -> Error {
|
||||||
@@ -138,6 +201,29 @@ impl Error {
|
|||||||
}
|
}
|
||||||
errline.with_path(path)
|
errline.with_path(path)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Build an error from a walkdir error.
|
||||||
|
fn from_walkdir(err: walkdir::Error) -> Error {
|
||||||
|
let depth = err.depth();
|
||||||
|
if let (Some(anc), Some(child)) = (err.loop_ancestor(), err.path()) {
|
||||||
|
return Error::WithDepth {
|
||||||
|
depth: depth,
|
||||||
|
err: Box::new(Error::Loop {
|
||||||
|
ancestor: anc.to_path_buf(),
|
||||||
|
child: child.to_path_buf(),
|
||||||
|
}),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
let path = err.path().map(|p| p.to_path_buf());
|
||||||
|
let mut ig_err = Error::Io(io::Error::from(err));
|
||||||
|
if let Some(path) = path {
|
||||||
|
ig_err = Error::WithPath {
|
||||||
|
path: path,
|
||||||
|
err: Box::new(ig_err),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
ig_err
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl error::Error for Error {
|
impl error::Error for Error {
|
||||||
@@ -146,8 +232,10 @@ impl error::Error for Error {
|
|||||||
Error::Partial(_) => "partial error",
|
Error::Partial(_) => "partial error",
|
||||||
Error::WithLineNumber { ref err, .. } => err.description(),
|
Error::WithLineNumber { ref err, .. } => err.description(),
|
||||||
Error::WithPath { ref err, .. } => err.description(),
|
Error::WithPath { ref err, .. } => err.description(),
|
||||||
|
Error::WithDepth { ref err, .. } => err.description(),
|
||||||
|
Error::Loop { .. } => "file system loop found",
|
||||||
Error::Io(ref err) => err.description(),
|
Error::Io(ref err) => err.description(),
|
||||||
Error::Glob(ref msg) => msg,
|
Error::Glob { ref err, .. } => err,
|
||||||
Error::UnrecognizedFileType(_) => "unrecognized file type",
|
Error::UnrecognizedFileType(_) => "unrecognized file type",
|
||||||
Error::InvalidDefinition => "invalid definition",
|
Error::InvalidDefinition => "invalid definition",
|
||||||
}
|
}
|
||||||
@@ -168,8 +256,17 @@ impl fmt::Display for Error {
|
|||||||
Error::WithPath { ref path, ref err } => {
|
Error::WithPath { ref path, ref err } => {
|
||||||
write!(f, "{}: {}", path.display(), err)
|
write!(f, "{}: {}", path.display(), err)
|
||||||
}
|
}
|
||||||
|
Error::WithDepth { ref err, .. } => err.fmt(f),
|
||||||
|
Error::Loop { ref ancestor, ref child } => {
|
||||||
|
write!(f, "File system loop found: \
|
||||||
|
{} points to an ancestor {}",
|
||||||
|
child.display(), ancestor.display())
|
||||||
|
}
|
||||||
Error::Io(ref err) => err.fmt(f),
|
Error::Io(ref err) => err.fmt(f),
|
||||||
Error::Glob(ref msg) => write!(f, "{}", msg),
|
Error::Glob { glob: None, ref err } => write!(f, "{}", err),
|
||||||
|
Error::Glob { glob: Some(ref glob), ref err } => {
|
||||||
|
write!(f, "error parsing glob '{}': {}", glob, err)
|
||||||
|
}
|
||||||
Error::UnrecognizedFileType(ref ty) => {
|
Error::UnrecognizedFileType(ref ty) => {
|
||||||
write!(f, "unrecognized file type: {}", ty)
|
write!(f, "unrecognized file type: {}", ty)
|
||||||
}
|
}
|
||||||
@@ -297,4 +394,13 @@ impl<T> Match<T> {
|
|||||||
Match::Whitelist(t) => Match::Whitelist(f(t)),
|
Match::Whitelist(t) => Match::Whitelist(f(t)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Return the match if it is not none. Otherwise, return other.
|
||||||
|
pub fn or(self, other: Self) -> Self {
|
||||||
|
if self.is_none() {
|
||||||
|
other
|
||||||
|
} else {
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -124,7 +124,7 @@ impl OverrideBuilder {
|
|||||||
///
|
///
|
||||||
/// Once a matcher is built, no new globs can be added to it.
|
/// Once a matcher is built, no new globs can be added to it.
|
||||||
pub fn build(&self) -> Result<Override, Error> {
|
pub fn build(&self) -> Result<Override, Error> {
|
||||||
Ok(Override(try!(self.builder.build())))
|
Ok(Override(self.builder.build()?))
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a glob to the set of overrides.
|
/// Add a glob to the set of overrides.
|
||||||
@@ -134,7 +134,17 @@ impl OverrideBuilder {
|
|||||||
/// namely, `!` at the beginning of a glob will ignore a file. Without `!`,
|
/// namely, `!` at the beginning of a glob will ignore a file. Without `!`,
|
||||||
/// all matches of the glob provided are treated as whitelist matches.
|
/// all matches of the glob provided are treated as whitelist matches.
|
||||||
pub fn add(&mut self, glob: &str) -> Result<&mut OverrideBuilder, Error> {
|
pub fn add(&mut self, glob: &str) -> Result<&mut OverrideBuilder, Error> {
|
||||||
try!(self.builder.add_line(None, glob));
|
self.builder.add_line(None, glob)?;
|
||||||
|
Ok(self)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Toggle whether the globs should be matched case insensitively or not.
|
||||||
|
///
|
||||||
|
/// This is disabled by default.
|
||||||
|
pub fn case_insensitive(
|
||||||
|
&mut self, yes: bool
|
||||||
|
) -> Result<&mut OverrideBuilder, Error> {
|
||||||
|
self.builder.case_insensitive(yes)?;
|
||||||
Ok(self)
|
Ok(self)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -192,8 +202,9 @@ mod tests {
|
|||||||
#[test]
|
#[test]
|
||||||
fn gitignore() {
|
fn gitignore() {
|
||||||
let ov = ov(&["/foo", "bar/*.rs", "baz/**"]);
|
let ov = ov(&["/foo", "bar/*.rs", "baz/**"]);
|
||||||
|
assert!(ov.matched("bar/lib.rs", false).is_whitelist());
|
||||||
assert!(ov.matched("bar/wat/lib.rs", false).is_ignore());
|
assert!(ov.matched("bar/wat/lib.rs", false).is_ignore());
|
||||||
assert!(ov.matched("wat/bar/lib.rs", false).is_whitelist());
|
assert!(ov.matched("wat/bar/lib.rs", false).is_ignore());
|
||||||
assert!(ov.matched("foo", false).is_whitelist());
|
assert!(ov.matched("foo", false).is_whitelist());
|
||||||
assert!(ov.matched("wat/foo", false).is_ignore());
|
assert!(ov.matched("wat/foo", false).is_ignore());
|
||||||
assert!(ov.matched("baz", false).is_ignore());
|
assert!(ov.matched("baz", false).is_ignore());
|
||||||
@@ -214,4 +225,33 @@ mod tests {
|
|||||||
assert!(ov.matched("src/foo", false).is_ignore());
|
assert!(ov.matched("src/foo", false).is_ignore());
|
||||||
assert!(ov.matched("src/foo", true).is_none());
|
assert!(ov.matched("src/foo", true).is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn absolute_path() {
|
||||||
|
let ov = ov(&["!/bar"]);
|
||||||
|
assert!(ov.matched("./foo/bar", false).is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn case_insensitive() {
|
||||||
|
let ov = OverrideBuilder::new(ROOT)
|
||||||
|
.case_insensitive(true).unwrap()
|
||||||
|
.add("*.html").unwrap()
|
||||||
|
.build().unwrap();
|
||||||
|
assert!(ov.matched("foo.html", false).is_whitelist());
|
||||||
|
assert!(ov.matched("foo.HTML", false).is_whitelist());
|
||||||
|
assert!(ov.matched("foo.htm", false).is_ignore());
|
||||||
|
assert!(ov.matched("foo.HTM", false).is_ignore());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn default_case_sensitive() {
|
||||||
|
let ov = OverrideBuilder::new(ROOT)
|
||||||
|
.add("*.html").unwrap()
|
||||||
|
.build().unwrap();
|
||||||
|
assert!(ov.matched("foo.html", false).is_whitelist());
|
||||||
|
assert!(ov.matched("foo.HTML", false).is_ignore());
|
||||||
|
assert!(ov.matched("foo.htm", false).is_ignore());
|
||||||
|
assert!(ov.matched("foo.HTM", false).is_ignore());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,6 +66,22 @@ assert!(matcher.matched("x.foo", false).is_whitelist());
|
|||||||
// This is ignored because we only selected the `foo` file type.
|
// This is ignored because we only selected the `foo` file type.
|
||||||
assert!(matcher.matched("x.bar", false).is_ignore());
|
assert!(matcher.matched("x.bar", false).is_ignore());
|
||||||
```
|
```
|
||||||
|
|
||||||
|
We can also add file type definitions based on other definitions.
|
||||||
|
|
||||||
|
```
|
||||||
|
use ignore::types::TypesBuilder;
|
||||||
|
|
||||||
|
let mut builder = TypesBuilder::new();
|
||||||
|
builder.add_defaults();
|
||||||
|
builder.add("foo", "*.foo");
|
||||||
|
builder.add_def("bar:include:foo,cpp");
|
||||||
|
builder.select("bar");
|
||||||
|
let matcher = builder.build().unwrap();
|
||||||
|
|
||||||
|
assert!(matcher.matched("x.foo", false).is_whitelist());
|
||||||
|
assert!(matcher.matched("y.cpp", false).is_whitelist());
|
||||||
|
```
|
||||||
*/
|
*/
|
||||||
|
|
||||||
use std::cell::RefCell;
|
use std::cell::RefCell;
|
||||||
@@ -74,30 +90,45 @@ use std::path::Path;
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use globset::{GlobBuilder, GlobSet, GlobSetBuilder};
|
use globset::{GlobBuilder, GlobSet, GlobSetBuilder};
|
||||||
|
use regex::Regex;
|
||||||
use thread_local::ThreadLocal;
|
use thread_local::ThreadLocal;
|
||||||
|
|
||||||
use pathutil::file_name;
|
use pathutil::file_name;
|
||||||
use {Error, Match};
|
use {Error, Match};
|
||||||
|
|
||||||
const DEFAULT_TYPES: &'static [(&'static str, &'static [&'static str])] = &[
|
const DEFAULT_TYPES: &'static [(&'static str, &'static [&'static str])] = &[
|
||||||
|
("agda", &["*.agda", "*.lagda"]),
|
||||||
|
("asciidoc", &["*.adoc", "*.asc", "*.asciidoc"]),
|
||||||
("asm", &["*.asm", "*.s", "*.S"]),
|
("asm", &["*.asm", "*.s", "*.S"]),
|
||||||
|
("avro", &["*.avdl", "*.avpr", "*.avsc"]),
|
||||||
("awk", &["*.awk"]),
|
("awk", &["*.awk"]),
|
||||||
|
("bitbake", &["*.bb", "*.bbappend", "*.bbclass", "*.conf", "*.inc"]),
|
||||||
|
("bzip2", &["*.bz2"]),
|
||||||
("c", &["*.c", "*.h", "*.H"]),
|
("c", &["*.c", "*.h", "*.H"]),
|
||||||
|
("cabal", &["*.cabal"]),
|
||||||
("cbor", &["*.cbor"]),
|
("cbor", &["*.cbor"]),
|
||||||
|
("ceylon", &["*.ceylon"]),
|
||||||
("clojure", &["*.clj", "*.cljc", "*.cljs", "*.cljx"]),
|
("clojure", &["*.clj", "*.cljc", "*.cljs", "*.cljx"]),
|
||||||
("cmake", &["*.cmake", "CMakeLists.txt"]),
|
("cmake", &["*.cmake", "CMakeLists.txt"]),
|
||||||
("coffeescript", &["*.coffee"]),
|
("coffeescript", &["*.coffee"]),
|
||||||
("config", &["*.config"]),
|
("creole", &["*.creole"]),
|
||||||
|
("config", &["*.cfg", "*.conf", "*.config", "*.ini"]),
|
||||||
("cpp", &[
|
("cpp", &[
|
||||||
"*.C", "*.cc", "*.cpp", "*.cxx",
|
"*.C", "*.cc", "*.cpp", "*.cxx",
|
||||||
"*.h", "*.H", "*.hh", "*.hpp",
|
"*.h", "*.H", "*.hh", "*.hpp", "*.hxx", "*.inl",
|
||||||
]),
|
]),
|
||||||
|
("crystal", &["Projectfile", "*.cr"]),
|
||||||
|
("cs", &["*.cs"]),
|
||||||
("csharp", &["*.cs"]),
|
("csharp", &["*.cs"]),
|
||||||
("css", &["*.css"]),
|
("cshtml", &["*.cshtml"]),
|
||||||
|
("css", &["*.css", "*.scss"]),
|
||||||
("cython", &["*.pyx"]),
|
("cython", &["*.pyx"]),
|
||||||
("dart", &["*.dart"]),
|
("dart", &["*.dart"]),
|
||||||
("d", &["*.d"]),
|
("d", &["*.d"]),
|
||||||
|
("docker", &["*Dockerfile*"]),
|
||||||
("elisp", &["*.el"]),
|
("elisp", &["*.el"]),
|
||||||
|
("elixir", &["*.ex", "*.eex", "*.exs"]),
|
||||||
|
("elm", &["*.elm"]),
|
||||||
("erlang", &["*.erl", "*.hrl"]),
|
("erlang", &["*.erl", "*.hrl"]),
|
||||||
("fish", &["*.fish"]),
|
("fish", &["*.fish"]),
|
||||||
("fortran", &[
|
("fortran", &[
|
||||||
@@ -105,56 +136,160 @@ const DEFAULT_TYPES: &'static [(&'static str, &'static [&'static str])] = &[
|
|||||||
"*.f90", "*.F90", "*.f95", "*.F95",
|
"*.f90", "*.F90", "*.f95", "*.F95",
|
||||||
]),
|
]),
|
||||||
("fsharp", &["*.fs", "*.fsx", "*.fsi"]),
|
("fsharp", &["*.fs", "*.fsx", "*.fsi"]),
|
||||||
|
("gn", &["*.gn", "*.gni"]),
|
||||||
("go", &["*.go"]),
|
("go", &["*.go"]),
|
||||||
|
("gzip", &["*.gz"]),
|
||||||
("groovy", &["*.groovy", "*.gradle"]),
|
("groovy", &["*.groovy", "*.gradle"]),
|
||||||
|
("h", &["*.h", "*.hpp"]),
|
||||||
("hbs", &["*.hbs"]),
|
("hbs", &["*.hbs"]),
|
||||||
("haskell", &["*.hs", "*.lhs"]),
|
("haskell", &["*.hs", "*.lhs"]),
|
||||||
("html", &["*.htm", "*.html"]),
|
("html", &["*.htm", "*.html", "*.ejs"]),
|
||||||
("java", &["*.java"]),
|
("java", &["*.java"]),
|
||||||
("jinja", &["*.jinja", "*.jinja2"]),
|
("jinja", &["*.j2", "*.jinja", "*.jinja2"]),
|
||||||
("js", &[
|
("js", &[
|
||||||
"*.js", "*.jsx", "*.vue",
|
"*.js", "*.jsx", "*.vue",
|
||||||
]),
|
]),
|
||||||
("json", &["*.json"]),
|
("json", &["*.json", "composer.lock"]),
|
||||||
("jsonl", &["*.jsonl"]),
|
("jsonl", &["*.jsonl"]),
|
||||||
|
("julia", &["*.jl"]),
|
||||||
|
("jupyter", &["*.ipynb", "*.jpynb"]),
|
||||||
|
("jl", &["*.jl"]),
|
||||||
|
("kotlin", &["*.kt", "*.kts"]),
|
||||||
|
("less", &["*.less"]),
|
||||||
|
("license", &[
|
||||||
|
// General
|
||||||
|
"COPYING", "COPYING[.-]*",
|
||||||
|
"COPYRIGHT", "COPYRIGHT[.-]*",
|
||||||
|
"EULA", "EULA[.-]*",
|
||||||
|
"licen[cs]e", "licen[cs]e.*",
|
||||||
|
"LICEN[CS]E", "LICEN[CS]E[.-]*", "*[.-]LICEN[CS]E*",
|
||||||
|
"NOTICE", "NOTICE[.-]*",
|
||||||
|
"PATENTS", "PATENTS[.-]*",
|
||||||
|
"UNLICEN[CS]E", "UNLICEN[CS]E[.-]*",
|
||||||
|
// GPL (gpl.txt, etc.)
|
||||||
|
"agpl[.-]*",
|
||||||
|
"gpl[.-]*",
|
||||||
|
"lgpl[.-]*",
|
||||||
|
// Other license-specific (APACHE-2.0.txt, etc.)
|
||||||
|
"AGPL-*[0-9]*",
|
||||||
|
"APACHE-*[0-9]*",
|
||||||
|
"BSD-*[0-9]*",
|
||||||
|
"CC-BY-*",
|
||||||
|
"GFDL-*[0-9]*",
|
||||||
|
"GNU-*[0-9]*",
|
||||||
|
"GPL-*[0-9]*",
|
||||||
|
"LGPL-*[0-9]*",
|
||||||
|
"MIT-*[0-9]*",
|
||||||
|
"MPL-*[0-9]*",
|
||||||
|
"OFL-*[0-9]*",
|
||||||
|
]),
|
||||||
("lisp", &["*.el", "*.jl", "*.lisp", "*.lsp", "*.sc", "*.scm"]),
|
("lisp", &["*.el", "*.jl", "*.lisp", "*.lsp", "*.sc", "*.scm"]),
|
||||||
|
("log", &["*.log"]),
|
||||||
("lua", &["*.lua"]),
|
("lua", &["*.lua"]),
|
||||||
|
("lzma", &["*.lzma"]),
|
||||||
("m4", &["*.ac", "*.m4"]),
|
("m4", &["*.ac", "*.m4"]),
|
||||||
("make", &["gnumakefile", "Gnumakefile", "makefile", "Makefile", "*.mk"]),
|
("make", &[
|
||||||
("markdown", &["*.md"]),
|
"gnumakefile", "Gnumakefile", "GNUmakefile",
|
||||||
("md", &["*.md"]),
|
"makefile", "Makefile",
|
||||||
|
"*.mk", "*.mak"
|
||||||
|
]),
|
||||||
|
("markdown", &["*.markdown", "*.md", "*.mdown", "*.mkdn"]),
|
||||||
|
("md", &["*.markdown", "*.md", "*.mdown", "*.mkdn"]),
|
||||||
|
("man", &["*.[0-9lnpx]", "*.[0-9][cEFMmpSx]"]),
|
||||||
("matlab", &["*.m"]),
|
("matlab", &["*.m"]),
|
||||||
("mk", &["mkfile"]),
|
("mk", &["mkfile"]),
|
||||||
("ml", &["*.ml"]),
|
("ml", &["*.ml"]),
|
||||||
|
("msbuild", &[
|
||||||
|
"*.csproj", "*.fsproj", "*.vcxproj", "*.proj", "*.props", "*.targets"
|
||||||
|
]),
|
||||||
("nim", &["*.nim"]),
|
("nim", &["*.nim"]),
|
||||||
|
("nix", &["*.nix"]),
|
||||||
("objc", &["*.h", "*.m"]),
|
("objc", &["*.h", "*.m"]),
|
||||||
("objcpp", &["*.h", "*.mm"]),
|
("objcpp", &["*.h", "*.mm"]),
|
||||||
("ocaml", &["*.ml", "*.mli", "*.mll", "*.mly"]),
|
("ocaml", &["*.ml", "*.mli", "*.mll", "*.mly"]),
|
||||||
("perl", &["*.perl", "*.pl", "*.PL", "*.plh", "*.plx", "*.pm"]),
|
("org", &["*.org"]),
|
||||||
|
("perl", &["*.perl", "*.pl", "*.PL", "*.plh", "*.plx", "*.pm", "*.t"]),
|
||||||
|
("pdf", &["*.pdf"]),
|
||||||
("php", &["*.php", "*.php3", "*.php4", "*.php5", "*.phtml"]),
|
("php", &["*.php", "*.php3", "*.php4", "*.php5", "*.phtml"]),
|
||||||
|
("pod", &["*.pod"]),
|
||||||
|
("protobuf", &["*.proto"]),
|
||||||
|
("ps", &["*.cdxml", "*.ps1", "*.ps1xml", "*.psd1", "*.psm1"]),
|
||||||
|
("purs", &["*.purs"]),
|
||||||
("py", &["*.py"]),
|
("py", &["*.py"]),
|
||||||
|
("qmake", &["*.pro", "*.pri", "*.prf"]),
|
||||||
("readme", &["README*", "*README"]),
|
("readme", &["README*", "*README"]),
|
||||||
("r", &["*.R", "*.r", "*.Rmd", "*.Rnw"]),
|
("r", &["*.R", "*.r", "*.Rmd", "*.Rnw"]),
|
||||||
|
("rdoc", &["*.rdoc"]),
|
||||||
("rst", &["*.rst"]),
|
("rst", &["*.rst"]),
|
||||||
("ruby", &["*.rb"]),
|
("ruby", &["Gemfile", "*.gemspec", ".irbrc", "Rakefile", "*.rb"]),
|
||||||
("rust", &["*.rs"]),
|
("rust", &["*.rs"]),
|
||||||
|
("sass", &["*.sass", "*.scss"]),
|
||||||
("scala", &["*.scala"]),
|
("scala", &["*.scala"]),
|
||||||
("sh", &["*.bash", "*.csh", "*.ksh", "*.sh", "*.tcsh"]),
|
("sh", &[
|
||||||
|
// Portable/misc. init files
|
||||||
|
".login", ".logout", ".profile", "profile",
|
||||||
|
// bash-specific init files
|
||||||
|
".bash_login", "bash_login",
|
||||||
|
".bash_logout", "bash_logout",
|
||||||
|
".bash_profile", "bash_profile",
|
||||||
|
".bashrc", "bashrc", "*.bashrc",
|
||||||
|
// csh-specific init files
|
||||||
|
".cshrc", "*.cshrc",
|
||||||
|
// ksh-specific init files
|
||||||
|
".kshrc", "*.kshrc",
|
||||||
|
// tcsh-specific init files
|
||||||
|
".tcshrc",
|
||||||
|
// zsh-specific init files
|
||||||
|
".zshenv", "zshenv",
|
||||||
|
".zlogin", "zlogin",
|
||||||
|
".zlogout", "zlogout",
|
||||||
|
".zprofile", "zprofile",
|
||||||
|
".zshrc", "zshrc",
|
||||||
|
// Extensions
|
||||||
|
"*.bash", "*.csh", "*.ksh", "*.sh", "*.tcsh", "*.zsh",
|
||||||
|
]),
|
||||||
|
("smarty", &["*.tpl"]),
|
||||||
|
("sml", &["*.sml", "*.sig"]),
|
||||||
|
("soy", &["*.soy"]),
|
||||||
("spark", &["*.spark"]),
|
("spark", &["*.spark"]),
|
||||||
("sql", &["*.sql"]),
|
("sql", &["*.sql", "*.psql"]),
|
||||||
|
("stylus", &["*.styl"]),
|
||||||
("sv", &["*.v", "*.vg", "*.sv", "*.svh", "*.h"]),
|
("sv", &["*.v", "*.vg", "*.sv", "*.svh", "*.h"]),
|
||||||
|
("svg", &["*.svg"]),
|
||||||
("swift", &["*.swift"]),
|
("swift", &["*.swift"]),
|
||||||
|
("swig", &["*.def", "*.i"]),
|
||||||
|
("systemd", &[
|
||||||
|
"*.automount", "*.conf", "*.device", "*.link", "*.mount", "*.path",
|
||||||
|
"*.scope", "*.service", "*.slice", "*.socket", "*.swap", "*.target",
|
||||||
|
"*.timer",
|
||||||
|
]),
|
||||||
|
("taskpaper", &["*.taskpaper"]),
|
||||||
("tcl", &["*.tcl"]),
|
("tcl", &["*.tcl"]),
|
||||||
("tex", &["*.tex", "*.cls", "*.sty"]),
|
("tex", &["*.tex", "*.ltx", "*.cls", "*.sty", "*.bib"]),
|
||||||
|
("textile", &["*.textile"]),
|
||||||
|
("tf", &["*.tf"]),
|
||||||
("ts", &["*.ts", "*.tsx"]),
|
("ts", &["*.ts", "*.tsx"]),
|
||||||
("txt", &["*.txt"]),
|
("txt", &["*.txt"]),
|
||||||
("toml", &["*.toml", "Cargo.lock"]),
|
("toml", &["*.toml", "Cargo.lock"]),
|
||||||
|
("twig", &["*.twig"]),
|
||||||
("vala", &["*.vala"]),
|
("vala", &["*.vala"]),
|
||||||
("vb", &["*.vb"]),
|
("vb", &["*.vb"]),
|
||||||
|
("vim", &["*.vim"]),
|
||||||
("vimscript", &["*.vim"]),
|
("vimscript", &["*.vim"]),
|
||||||
("xml", &["*.xml"]),
|
("wiki", &["*.mediawiki", "*.wiki"]),
|
||||||
|
("webidl", &["*.idl", "*.webidl", "*.widl"]),
|
||||||
|
("xml", &["*.xml", "*.xml.dist"]),
|
||||||
|
("xz", &["*.xz"]),
|
||||||
("yacc", &["*.y"]),
|
("yacc", &["*.y"]),
|
||||||
("yaml", &["*.yaml", "*.yml"]),
|
("yaml", &["*.yaml", "*.yml"]),
|
||||||
|
("zsh", &[
|
||||||
|
".zshenv", "zshenv",
|
||||||
|
".zlogin", "zlogin",
|
||||||
|
".zlogout", "zlogout",
|
||||||
|
".zprofile", "zprofile",
|
||||||
|
".zshrc", "zshrc",
|
||||||
|
"*.zsh",
|
||||||
|
]),
|
||||||
];
|
];
|
||||||
|
|
||||||
/// Glob represents a single glob in a set of file type definitions.
|
/// Glob represents a single glob in a set of file type definitions.
|
||||||
@@ -200,7 +335,7 @@ impl<'a> Glob<'a> {
|
|||||||
/// File type definitions can be retrieved in aggregate from a file type
|
/// File type definitions can be retrieved in aggregate from a file type
|
||||||
/// matcher. File type definitions are also reported when its responsible
|
/// matcher. File type definitions are also reported when its responsible
|
||||||
/// for a match.
|
/// for a match.
|
||||||
#[derive(Clone, Debug)]
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
pub struct FileTypeDef {
|
pub struct FileTypeDef {
|
||||||
name: String,
|
name: String,
|
||||||
globs: Vec<String>,
|
globs: Vec<String>,
|
||||||
@@ -400,18 +535,23 @@ impl TypesBuilder {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
for (iglob, glob) in def.globs.iter().enumerate() {
|
for (iglob, glob) in def.globs.iter().enumerate() {
|
||||||
build_set.add(try!(
|
build_set.add(
|
||||||
GlobBuilder::new(glob)
|
GlobBuilder::new(glob)
|
||||||
.literal_separator(true)
|
.literal_separator(true)
|
||||||
.build()
|
.build()
|
||||||
.map_err(|err| Error::Glob(err.to_string()))));
|
.map_err(|err| {
|
||||||
|
Error::Glob {
|
||||||
|
glob: Some(glob.to_string()),
|
||||||
|
err: err.kind().to_string(),
|
||||||
|
}
|
||||||
|
})?);
|
||||||
glob_to_selection.push((isel, iglob));
|
glob_to_selection.push((isel, iglob));
|
||||||
}
|
}
|
||||||
selections.push(selection.clone().map(move |_| def));
|
selections.push(selection.clone().map(move |_| def));
|
||||||
}
|
}
|
||||||
let set = try!(build_set.build().map_err(|err| {
|
let set = build_set.build().map_err(|err| {
|
||||||
Error::Glob(err.to_string())
|
Error::Glob { glob: None, err: err.to_string() }
|
||||||
}));
|
})?;
|
||||||
Ok(Types {
|
Ok(Types {
|
||||||
defs: defs,
|
defs: defs,
|
||||||
selections: selections,
|
selections: selections,
|
||||||
@@ -473,10 +613,13 @@ impl TypesBuilder {
|
|||||||
/// Add a new file type definition. `name` can be arbitrary and `pat`
|
/// Add a new file type definition. `name` can be arbitrary and `pat`
|
||||||
/// should be a glob recognizing file paths belonging to the `name` type.
|
/// should be a glob recognizing file paths belonging to the `name` type.
|
||||||
///
|
///
|
||||||
/// If `name` is `all` or otherwise contains a `:`, then an error is
|
/// If `name` is `all` or otherwise contains any character that is not a
|
||||||
/// returned.
|
/// Unicode letter or number, then an error is returned.
|
||||||
pub fn add(&mut self, name: &str, glob: &str) -> Result<(), Error> {
|
pub fn add(&mut self, name: &str, glob: &str) -> Result<(), Error> {
|
||||||
if name == "all" || name.contains(':') {
|
lazy_static! {
|
||||||
|
static ref RE: Regex = Regex::new(r"^[\pL\pN]+$").unwrap();
|
||||||
|
};
|
||||||
|
if name == "all" || !RE.is_match(name) {
|
||||||
return Err(Error::InvalidDefinition);
|
return Err(Error::InvalidDefinition);
|
||||||
}
|
}
|
||||||
let (key, glob) = (name.to_string(), glob.to_string());
|
let (key, glob) = (name.to_string(), glob.to_string());
|
||||||
@@ -486,15 +629,48 @@ impl TypesBuilder {
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a new file type definition specified in string form. The format
|
/// Add a new file type definition specified in string form. There are two
|
||||||
/// is `name:glob`. Names may not include a colon.
|
/// valid formats:
|
||||||
|
/// 1. `{name}:{glob}`. This defines a 'root' definition that associates the
|
||||||
|
/// given name with the given glob.
|
||||||
|
/// 2. `{name}:include:{comma-separated list of already defined names}.
|
||||||
|
/// This defines an 'include' definition that associates the given name
|
||||||
|
/// with the definitions of the given existing types.
|
||||||
|
/// Names may not include any characters that are not
|
||||||
|
/// Unicode letters or numbers.
|
||||||
pub fn add_def(&mut self, def: &str) -> Result<(), Error> {
|
pub fn add_def(&mut self, def: &str) -> Result<(), Error> {
|
||||||
let name: String = def.chars().take_while(|&c| c != ':').collect();
|
let parts: Vec<&str> = def.split(':').collect();
|
||||||
let pat: String = def.chars().skip(name.chars().count() + 1).collect();
|
match parts.len() {
|
||||||
if name.is_empty() || pat.is_empty() {
|
2 => {
|
||||||
return Err(Error::InvalidDefinition);
|
let name = parts[0];
|
||||||
|
let glob = parts[1];
|
||||||
|
if name.is_empty() || glob.is_empty() {
|
||||||
|
return Err(Error::InvalidDefinition);
|
||||||
|
}
|
||||||
|
self.add(name, glob)
|
||||||
|
}
|
||||||
|
3 => {
|
||||||
|
let name = parts[0];
|
||||||
|
let types_string = parts[2];
|
||||||
|
if name.is_empty() || parts[1] != "include" || types_string.is_empty() {
|
||||||
|
return Err(Error::InvalidDefinition);
|
||||||
|
}
|
||||||
|
let types = types_string.split(',');
|
||||||
|
// Check ahead of time to ensure that all types specified are
|
||||||
|
// present and fail fast if not.
|
||||||
|
if types.clone().any(|t| !self.types.contains_key(t)) {
|
||||||
|
return Err(Error::InvalidDefinition);
|
||||||
|
}
|
||||||
|
for type_name in types {
|
||||||
|
let globs = self.types.get(type_name).unwrap().globs.clone();
|
||||||
|
for glob in globs {
|
||||||
|
self.add(name, &glob)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
_ => Err(Error::InvalidDefinition)
|
||||||
}
|
}
|
||||||
self.add(&name, &pat)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Add a set of default file type definitions.
|
/// Add a set of default file type definitions.
|
||||||
@@ -550,6 +726,7 @@ mod tests {
|
|||||||
"rust:*.rs",
|
"rust:*.rs",
|
||||||
"js:*.js",
|
"js:*.js",
|
||||||
"foo:*.{rs,foo}",
|
"foo:*.{rs,foo}",
|
||||||
|
"combo:include:html,rust"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -560,10 +737,35 @@ mod tests {
|
|||||||
matched!(match5, types(), vec![], vec![], "index.html");
|
matched!(match5, types(), vec![], vec![], "index.html");
|
||||||
matched!(match6, types(), vec![], vec!["rust"], "index.html");
|
matched!(match6, types(), vec![], vec!["rust"], "index.html");
|
||||||
matched!(match7, types(), vec!["foo"], vec!["rust"], "main.foo");
|
matched!(match7, types(), vec!["foo"], vec!["rust"], "main.foo");
|
||||||
|
matched!(match8, types(), vec!["combo"], vec![], "index.html");
|
||||||
|
matched!(match9, types(), vec!["combo"], vec![], "lib.rs");
|
||||||
|
|
||||||
matched!(not, matchnot1, types(), vec!["rust"], vec![], "index.html");
|
matched!(not, matchnot1, types(), vec!["rust"], vec![], "index.html");
|
||||||
matched!(not, matchnot2, types(), vec![], vec!["rust"], "main.rs");
|
matched!(not, matchnot2, types(), vec![], vec!["rust"], "main.rs");
|
||||||
matched!(not, matchnot3, types(), vec!["foo"], vec!["rust"], "main.rs");
|
matched!(not, matchnot3, types(), vec!["foo"], vec!["rust"], "main.rs");
|
||||||
matched!(not, matchnot4, types(), vec!["rust"], vec!["foo"], "main.rs");
|
matched!(not, matchnot4, types(), vec!["rust"], vec!["foo"], "main.rs");
|
||||||
matched!(not, matchnot5, types(), vec!["rust"], vec!["foo"], "main.foo");
|
matched!(not, matchnot5, types(), vec!["rust"], vec!["foo"], "main.foo");
|
||||||
|
matched!(not, matchnot6, types(), vec!["combo"], vec![], "leftpad.js");
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_invalid_defs() {
|
||||||
|
let mut btypes = TypesBuilder::new();
|
||||||
|
for tydef in types() {
|
||||||
|
btypes.add_def(tydef).unwrap();
|
||||||
|
}
|
||||||
|
// Preserve the original definitions for later comparison.
|
||||||
|
let original_defs = btypes.definitions();
|
||||||
|
let bad_defs = vec![
|
||||||
|
// Reference to type that does not exist
|
||||||
|
"combo:include:html,python",
|
||||||
|
// Bad format
|
||||||
|
"combo:foobar:html,rust",
|
||||||
|
""
|
||||||
|
];
|
||||||
|
for def in bad_defs {
|
||||||
|
assert!(btypes.add_def(def).is_err());
|
||||||
|
// Ensure that nothing changed, even if some of the includes were valid.
|
||||||
|
assert_eq!(btypes.definitions(), original_defs);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
1387
ignore/src/walk.rs
1387
ignore/src/walk.rs
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,216 @@
|
|||||||
|
# Based on https://github.com/behnam/gitignore-test/blob/master/.gitignore
|
||||||
|
|
||||||
|
### file in root
|
||||||
|
|
||||||
|
# MATCH /file_root_1
|
||||||
|
file_root_00
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
file_root_01/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
file_root_02/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
file_root_03/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /file_root_10
|
||||||
|
/file_root_10
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_root_11/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_root_12/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_root_13/**
|
||||||
|
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_root_20
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_root_21/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_root_22/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_root_23/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /file_root_30
|
||||||
|
**/file_root_30
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
**/file_root_31/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
**/file_root_32/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
**/file_root_33/**
|
||||||
|
|
||||||
|
|
||||||
|
### file in sub-dir
|
||||||
|
|
||||||
|
# MATCH /parent_dir/file_deep_1
|
||||||
|
file_deep_00
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
file_deep_01/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
file_deep_02/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
file_deep_03/**
|
||||||
|
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_deep_10
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_deep_11/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_deep_12/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/file_deep_13/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /parent_dir/file_deep_20
|
||||||
|
*/file_deep_20
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_deep_21/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_deep_22/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/file_deep_23/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /parent_dir/file_deep_30
|
||||||
|
**/file_deep_30
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
**/file_deep_31/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
**/file_deep_32/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
**/file_deep_33/**
|
||||||
|
|
||||||
|
|
||||||
|
### dir in root
|
||||||
|
|
||||||
|
# MATCH /dir_root_00
|
||||||
|
dir_root_00
|
||||||
|
|
||||||
|
# MATCH /dir_root_01
|
||||||
|
dir_root_01/
|
||||||
|
|
||||||
|
# MATCH /dir_root_02
|
||||||
|
dir_root_02/*
|
||||||
|
|
||||||
|
# MATCH /dir_root_03
|
||||||
|
dir_root_03/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /dir_root_10
|
||||||
|
/dir_root_10
|
||||||
|
|
||||||
|
# MATCH /dir_root_11
|
||||||
|
/dir_root_11/
|
||||||
|
|
||||||
|
# MATCH /dir_root_12
|
||||||
|
/dir_root_12/*
|
||||||
|
|
||||||
|
# MATCH /dir_root_13
|
||||||
|
/dir_root_13/**
|
||||||
|
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/dir_root_20
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/dir_root_21/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/dir_root_22/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
*/dir_root_23/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /dir_root_30
|
||||||
|
**/dir_root_30
|
||||||
|
|
||||||
|
# MATCH /dir_root_31
|
||||||
|
**/dir_root_31/
|
||||||
|
|
||||||
|
# MATCH /dir_root_32
|
||||||
|
**/dir_root_32/*
|
||||||
|
|
||||||
|
# MATCH /dir_root_33
|
||||||
|
**/dir_root_33/**
|
||||||
|
|
||||||
|
|
||||||
|
### dir in sub-dir
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_00
|
||||||
|
dir_deep_00
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_01
|
||||||
|
dir_deep_01/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
dir_deep_02/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
dir_deep_03/**
|
||||||
|
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/dir_deep_10
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/dir_deep_11/
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/dir_deep_12/*
|
||||||
|
|
||||||
|
# NO_MATCH
|
||||||
|
/dir_deep_13/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_20
|
||||||
|
*/dir_deep_20
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_21
|
||||||
|
*/dir_deep_21/
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_22
|
||||||
|
*/dir_deep_22/*
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_23
|
||||||
|
*/dir_deep_23/**
|
||||||
|
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_30
|
||||||
|
**/dir_deep_30
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_31
|
||||||
|
**/dir_deep_31/
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_32
|
||||||
|
**/dir_deep_32/*
|
||||||
|
|
||||||
|
# MATCH /parent_dir/dir_deep_33
|
||||||
|
**/dir_deep_33/**
|
||||||
297
ignore/tests/gitignore_matched_path_or_any_parents_tests.rs
Normal file
297
ignore/tests/gitignore_matched_path_or_any_parents_tests.rs
Normal file
@@ -0,0 +1,297 @@
|
|||||||
|
extern crate ignore;
|
||||||
|
|
||||||
|
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use ignore::gitignore::{Gitignore, GitignoreBuilder};
|
||||||
|
|
||||||
|
|
||||||
|
const IGNORE_FILE: &'static str = "tests/gitignore_matched_path_or_any_parents_tests.gitignore";
|
||||||
|
|
||||||
|
|
||||||
|
fn get_gitignore() -> Gitignore {
|
||||||
|
let mut builder = GitignoreBuilder::new("ROOT");
|
||||||
|
let error = builder.add(IGNORE_FILE);
|
||||||
|
assert!(error.is_none(), "failed to open gitignore file");
|
||||||
|
builder.build().unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
#[should_panic(expected = "path is expect to be under the root")]
|
||||||
|
fn test_path_should_be_under_root() {
|
||||||
|
let gitignore = get_gitignore();
|
||||||
|
let path = "/tmp/some_file";
|
||||||
|
gitignore.matched_path_or_any_parents(Path::new(path), false);
|
||||||
|
assert!(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_files_in_root() {
|
||||||
|
let gitignore = get_gitignore();
|
||||||
|
let m = |path: &str| gitignore.matched_path_or_any_parents(Path::new(path), false);
|
||||||
|
|
||||||
|
// 0x
|
||||||
|
assert!(m("ROOT/file_root_00").is_ignore());
|
||||||
|
assert!(m("ROOT/file_root_01").is_none());
|
||||||
|
assert!(m("ROOT/file_root_02").is_none());
|
||||||
|
assert!(m("ROOT/file_root_03").is_none());
|
||||||
|
|
||||||
|
// 1x
|
||||||
|
assert!(m("ROOT/file_root_10").is_ignore());
|
||||||
|
assert!(m("ROOT/file_root_11").is_none());
|
||||||
|
assert!(m("ROOT/file_root_12").is_none());
|
||||||
|
assert!(m("ROOT/file_root_13").is_none());
|
||||||
|
|
||||||
|
// 2x
|
||||||
|
assert!(m("ROOT/file_root_20").is_none());
|
||||||
|
assert!(m("ROOT/file_root_21").is_none());
|
||||||
|
assert!(m("ROOT/file_root_22").is_none());
|
||||||
|
assert!(m("ROOT/file_root_23").is_none());
|
||||||
|
|
||||||
|
// 3x
|
||||||
|
assert!(m("ROOT/file_root_30").is_ignore());
|
||||||
|
assert!(m("ROOT/file_root_31").is_none());
|
||||||
|
assert!(m("ROOT/file_root_32").is_none());
|
||||||
|
assert!(m("ROOT/file_root_33").is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_files_in_deep() {
|
||||||
|
let gitignore = get_gitignore();
|
||||||
|
let m = |path: &str| gitignore.matched_path_or_any_parents(Path::new(path), false);
|
||||||
|
|
||||||
|
// 0x
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_00").is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_01").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_02").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_03").is_none());
|
||||||
|
|
||||||
|
// 1x
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_10").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_11").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_12").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_13").is_none());
|
||||||
|
|
||||||
|
// 2x
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_20").is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_21").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_22").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_23").is_none());
|
||||||
|
|
||||||
|
// 3x
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_30").is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_31").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_32").is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/file_deep_33").is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_dirs_in_root() {
|
||||||
|
let gitignore = get_gitignore();
|
||||||
|
let m =
|
||||||
|
|path: &str, is_dir: bool| gitignore.matched_path_or_any_parents(Path::new(path), is_dir);
|
||||||
|
|
||||||
|
// 00
|
||||||
|
assert!(m("ROOT/dir_root_00", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_00/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_00/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_00/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 01
|
||||||
|
assert!(m("ROOT/dir_root_01", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_01/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_01/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_01/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 02
|
||||||
|
assert!(m("ROOT/dir_root_02", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/dir_root_02/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_02/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_02/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 03
|
||||||
|
assert!(m("ROOT/dir_root_03", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/dir_root_03/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_03/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_03/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 10
|
||||||
|
assert!(m("ROOT/dir_root_10", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_10/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_10/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_10/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 11
|
||||||
|
assert!(m("ROOT/dir_root_11", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_11/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_11/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_11/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 12
|
||||||
|
assert!(m("ROOT/dir_root_12", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/dir_root_12/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_12/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_12/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 13
|
||||||
|
assert!(m("ROOT/dir_root_13", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_13/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_13/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_13/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 20
|
||||||
|
assert!(m("ROOT/dir_root_20", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_20/file", false).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_20/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_20/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 21
|
||||||
|
assert!(m("ROOT/dir_root_21", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_21/file", false).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_21/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_21/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 22
|
||||||
|
assert!(m("ROOT/dir_root_22", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_22/file", false).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_22/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_22/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 23
|
||||||
|
assert!(m("ROOT/dir_root_23", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_23/file", false).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_23/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/dir_root_23/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 30
|
||||||
|
assert!(m("ROOT/dir_root_30", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_30/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_30/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_30/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 31
|
||||||
|
assert!(m("ROOT/dir_root_31", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_31/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_31/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_31/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 32
|
||||||
|
assert!(m("ROOT/dir_root_32", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/dir_root_32/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_32/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_32/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 33
|
||||||
|
assert!(m("ROOT/dir_root_33", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/dir_root_33/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_33/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/dir_root_33/child_dir/file", false).is_ignore());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_dirs_in_deep() {
|
||||||
|
let gitignore = get_gitignore();
|
||||||
|
let m =
|
||||||
|
|path: &str, is_dir: bool| gitignore.matched_path_or_any_parents(Path::new(path), is_dir);
|
||||||
|
|
||||||
|
// 00
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_00", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_00/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_00/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_00/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 01
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_01", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_01/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_01/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_01/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 02
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_02", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_02/file", false).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_02/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_02/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 03
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_03", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_03/file", false).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_03/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_03/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 10
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_10", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_10/file", false).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_10/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_10/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 11
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_11", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_11/file", false).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_11/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_11/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 12
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_12", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_12/file", false).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_12/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_12/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 13
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_13", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_13/file", false).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_13/child_dir", true).is_none());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_13/child_dir/file", false).is_none());
|
||||||
|
|
||||||
|
// 20
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_20", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_20/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_20/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_20/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 21
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_21", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_21/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_21/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_21/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 22
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_22", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_22/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_22/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_22/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 23
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_23", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_23/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_23/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_23/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 30
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_30", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_30/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_30/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_30/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 31
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_31", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_31/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_31/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_31/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 32
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_32", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_32/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_32/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_32/child_dir/file", false).is_ignore());
|
||||||
|
|
||||||
|
// 33
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_33", true).is_none()); // dir itself doesn't match
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_33/file", false).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_33/child_dir", true).is_ignore());
|
||||||
|
assert!(m("ROOT/parent_dir/dir_deep_33/child_dir/file", false).is_ignore());
|
||||||
|
}
|
||||||
@@ -1,14 +1,24 @@
|
|||||||
class RipgrepBin < Formula
|
class RipgrepBin < Formula
|
||||||
version '0.2.5'
|
version '0.7.1'
|
||||||
desc "Search tool like grep and The Silver Searcher."
|
desc "Search tool like grep and The Silver Searcher."
|
||||||
homepage "https://github.com/BurntSushi/ripgrep"
|
homepage "https://github.com/BurntSushi/ripgrep"
|
||||||
url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-apple-darwin.tar.gz"
|
|
||||||
sha256 "c6775a50c6f769de2ee66892a700961ec60a85219aa414ef6880dfcc17bf2467"
|
if OS.mac?
|
||||||
|
url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-apple-darwin.tar.gz"
|
||||||
|
sha256 "ee670b0fba46323ee9a2d1c5b8bee46fa3e45778f6f105f2e8e9ee29e8bd0d45"
|
||||||
|
elsif OS.linux?
|
||||||
|
url "https://github.com/BurntSushi/ripgrep/releases/download/#{version}/ripgrep-#{version}-x86_64-unknown-linux-musl.tar.gz"
|
||||||
|
sha256 "ac595c2239b9a30e0e0744578afa6b73e32cdd8ae61d4f1c0ee5d6b55adbadcf"
|
||||||
|
end
|
||||||
|
|
||||||
conflicts_with "ripgrep"
|
conflicts_with "ripgrep"
|
||||||
|
|
||||||
def install
|
def install
|
||||||
bin.install "rg"
|
bin.install "rg"
|
||||||
man1.install "rg.1"
|
man1.install "rg.1"
|
||||||
|
|
||||||
|
bash_completion.install "complete/rg.bash-completion"
|
||||||
|
fish_completion.install "complete/rg.fish"
|
||||||
|
zsh_completion.install "complete/_rg"
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
15
snapcraft.yaml
Normal file
15
snapcraft.yaml
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
name: ripgrep # you probably want to 'snapcraft register <name>'
|
||||||
|
version: '0.5.1' # just for humans, typically '1.2+git' or '1.3.2'
|
||||||
|
summary: Fast file searcher # 79 char long summary
|
||||||
|
description: |
|
||||||
|
ripgrep combines the usability of The Silver Searcher with the raw speed of grep.
|
||||||
|
grade: stable # must be 'stable' to release into candidate/stable channels
|
||||||
|
confinement: classic # use 'strict' once you have the right plugs and slots
|
||||||
|
parts:
|
||||||
|
ripgrep:
|
||||||
|
plugin: rust
|
||||||
|
source: .
|
||||||
|
apps:
|
||||||
|
rg:
|
||||||
|
command: env PATH=$SNAP/bin:$PATH rg
|
||||||
|
aliases: [rg]
|
||||||
619
src/app.rs
Normal file
619
src/app.rs
Normal file
@@ -0,0 +1,619 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use clap::{App, AppSettings, Arg, ArgSettings};
|
||||||
|
|
||||||
|
const ABOUT: &str = "
|
||||||
|
ripgrep (rg) recursively searches your current directory for a regex pattern.
|
||||||
|
|
||||||
|
ripgrep's regex engine uses finite automata and guarantees linear time
|
||||||
|
searching. Because of this, features like backreferences and arbitrary
|
||||||
|
lookaround are not supported.
|
||||||
|
|
||||||
|
Note that ripgrep may abort unexpectedly when using default settings if it
|
||||||
|
searches a file that is simultaneously truncated. This behavior can be avoided
|
||||||
|
by passing the --no-mmap flag.
|
||||||
|
|
||||||
|
Project home page: https://github.com/BurntSushi/ripgrep
|
||||||
|
|
||||||
|
Use -h for short descriptions and --help for more details.";
|
||||||
|
|
||||||
|
const USAGE: &str = "
|
||||||
|
rg [OPTIONS] PATTERN [PATH ...]
|
||||||
|
rg [OPTIONS] [-e PATTERN ...] [-f FILE ...] [PATH ...]
|
||||||
|
rg [OPTIONS] --files [PATH ...]
|
||||||
|
rg [OPTIONS] --type-list";
|
||||||
|
|
||||||
|
const TEMPLATE: &str = "\
|
||||||
|
{bin} {version}
|
||||||
|
{author}
|
||||||
|
{about}
|
||||||
|
|
||||||
|
USAGE:{usage}
|
||||||
|
|
||||||
|
ARGS:
|
||||||
|
{positionals}
|
||||||
|
|
||||||
|
OPTIONS:
|
||||||
|
{unified}";
|
||||||
|
|
||||||
|
/// Build a clap application parameterized by usage strings.
|
||||||
|
///
|
||||||
|
/// The function given should take a clap argument name and return a help
|
||||||
|
/// string. `app` will panic if a usage string is not defined.
|
||||||
|
///
|
||||||
|
/// This is an intentionally stand-alone module so that it can be used easily
|
||||||
|
/// in a `build.rs` script to build shell completion files.
|
||||||
|
pub fn app() -> App<'static, 'static> {
|
||||||
|
let arg = |name| {
|
||||||
|
Arg::with_name(name)
|
||||||
|
.help(USAGES[name].short)
|
||||||
|
.long_help(USAGES[name].long)
|
||||||
|
};
|
||||||
|
let flag = |name| arg(name).long(name);
|
||||||
|
|
||||||
|
App::new("ripgrep")
|
||||||
|
.author(crate_authors!())
|
||||||
|
.version(crate_version!())
|
||||||
|
.long_version(LONG_VERSION.as_str())
|
||||||
|
.about(ABOUT)
|
||||||
|
.max_term_width(100)
|
||||||
|
.setting(AppSettings::UnifiedHelpMessage)
|
||||||
|
.usage(USAGE)
|
||||||
|
.template(TEMPLATE)
|
||||||
|
.help_message("Prints help information. Use --help for more details.")
|
||||||
|
// First, set up primary positional/flag arguments.
|
||||||
|
.arg(arg("PATTERN")
|
||||||
|
.required_unless_one(&[
|
||||||
|
"file", "files", "help-short", "help", "regexp", "type-list",
|
||||||
|
"ripgrep-version",
|
||||||
|
]))
|
||||||
|
.arg(arg("PATH").multiple(true))
|
||||||
|
.arg(flag("regexp").short("e")
|
||||||
|
.takes_value(true).multiple(true).number_of_values(1)
|
||||||
|
.set(ArgSettings::AllowLeadingHyphen)
|
||||||
|
.value_name("PATTERN"))
|
||||||
|
.arg(flag("files")
|
||||||
|
// This should also conflict with `PATTERN`, but the first file
|
||||||
|
// path will actually be in `PATTERN`.
|
||||||
|
.conflicts_with_all(&["file", "regexp", "type-list"]))
|
||||||
|
.arg(flag("type-list")
|
||||||
|
.conflicts_with_all(&["file", "files", "PATTERN", "regexp"]))
|
||||||
|
// Second, set up common flags.
|
||||||
|
.arg(flag("text").short("a"))
|
||||||
|
.arg(flag("count").short("c"))
|
||||||
|
.arg(flag("color")
|
||||||
|
.value_name("WHEN")
|
||||||
|
.takes_value(true)
|
||||||
|
.hide_possible_values(true)
|
||||||
|
.possible_values(&["never", "auto", "always", "ansi"])
|
||||||
|
.default_value_if("vimgrep", None, "never"))
|
||||||
|
.arg(flag("colors").value_name("SPEC")
|
||||||
|
.takes_value(true).multiple(true).number_of_values(1))
|
||||||
|
.arg(flag("encoding").short("E").value_name("ENCODING")
|
||||||
|
.takes_value(true).number_of_values(1))
|
||||||
|
.arg(flag("fixed-strings").short("F"))
|
||||||
|
.arg(flag("glob").short("g")
|
||||||
|
.takes_value(true).multiple(true).number_of_values(1)
|
||||||
|
.set(ArgSettings::AllowLeadingHyphen)
|
||||||
|
.value_name("GLOB"))
|
||||||
|
.arg(flag("iglob")
|
||||||
|
.takes_value(true).multiple(true).number_of_values(1)
|
||||||
|
.set(ArgSettings::AllowLeadingHyphen)
|
||||||
|
.value_name("GLOB"))
|
||||||
|
.arg(flag("ignore-case").short("i"))
|
||||||
|
.arg(flag("line-number").short("n"))
|
||||||
|
.arg(flag("line-number-width")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_line_number_width))
|
||||||
|
.arg(flag("no-line-number").short("N").overrides_with("line-number"))
|
||||||
|
.arg(flag("quiet").short("q"))
|
||||||
|
.arg(flag("type").short("t")
|
||||||
|
.takes_value(true).multiple(true).number_of_values(1)
|
||||||
|
.value_name("TYPE"))
|
||||||
|
.arg(flag("type-not").short("T")
|
||||||
|
.takes_value(true).multiple(true).number_of_values(1)
|
||||||
|
.value_name("TYPE"))
|
||||||
|
.arg(flag("unrestricted").short("u")
|
||||||
|
.multiple(true))
|
||||||
|
.arg(flag("invert-match").short("v"))
|
||||||
|
.arg(flag("word-regexp").short("w").overrides_with("line-regexp"))
|
||||||
|
.arg(flag("line-regexp").short("x"))
|
||||||
|
// Third, set up less common flags.
|
||||||
|
.arg(flag("after-context").short("A")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("before-context").short("B")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("context").short("C")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("column"))
|
||||||
|
.arg(flag("context-separator")
|
||||||
|
.value_name("SEPARATOR").takes_value(true))
|
||||||
|
.arg(flag("dfa-size-limit")
|
||||||
|
.value_name("NUM+SUFFIX?").takes_value(true))
|
||||||
|
.arg(flag("debug"))
|
||||||
|
.arg(flag("file").short("f")
|
||||||
|
.value_name("FILE").takes_value(true)
|
||||||
|
.set(ArgSettings::AllowLeadingHyphen)
|
||||||
|
.multiple(true).number_of_values(1))
|
||||||
|
.arg(flag("files-with-matches").short("l"))
|
||||||
|
.arg(flag("files-without-match"))
|
||||||
|
.arg(flag("with-filename").short("H"))
|
||||||
|
.arg(flag("no-filename").overrides_with("with-filename"))
|
||||||
|
.arg(flag("heading"))
|
||||||
|
.arg(flag("no-heading").overrides_with("heading"))
|
||||||
|
.arg(flag("hidden"))
|
||||||
|
.arg(flag("ignore-file")
|
||||||
|
.value_name("FILE").takes_value(true)
|
||||||
|
.set(ArgSettings::AllowLeadingHyphen)
|
||||||
|
.multiple(true).number_of_values(1))
|
||||||
|
.arg(flag("follow").short("L"))
|
||||||
|
.arg(flag("max-count")
|
||||||
|
.short("m").value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("max-filesize")
|
||||||
|
.value_name("NUM+SUFFIX?").takes_value(true))
|
||||||
|
.arg(flag("maxdepth")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("mmap"))
|
||||||
|
.arg(flag("no-messages"))
|
||||||
|
.arg(flag("no-mmap"))
|
||||||
|
.arg(flag("no-ignore"))
|
||||||
|
.arg(flag("no-ignore-parent"))
|
||||||
|
.arg(flag("no-ignore-vcs"))
|
||||||
|
.arg(flag("null").short("0"))
|
||||||
|
.arg(flag("only-matching").short("o"))
|
||||||
|
.arg(flag("passthru").alias("passthrough")
|
||||||
|
.conflicts_with_all(&["only-matching", "replace"]))
|
||||||
|
.arg(flag("path-separator").value_name("SEPARATOR").takes_value(true))
|
||||||
|
.arg(flag("pretty").short("p"))
|
||||||
|
.arg(flag("replace").short("r")
|
||||||
|
.set(ArgSettings::AllowLeadingHyphen)
|
||||||
|
.value_name("ARG").takes_value(true))
|
||||||
|
.arg(flag("regex-size-limit")
|
||||||
|
.value_name("NUM+SUFFIX?").takes_value(true))
|
||||||
|
.arg(flag("case-sensitive").short("s"))
|
||||||
|
.arg(flag("smart-case").short("S"))
|
||||||
|
.arg(flag("sort-files"))
|
||||||
|
.arg(flag("threads")
|
||||||
|
.short("j").value_name("ARG").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("vimgrep").overrides_with("count"))
|
||||||
|
.arg(flag("max-columns").short("M")
|
||||||
|
.value_name("NUM").takes_value(true)
|
||||||
|
.validator(validate_number))
|
||||||
|
.arg(flag("type-add")
|
||||||
|
.value_name("TYPE").takes_value(true)
|
||||||
|
.multiple(true).number_of_values(1))
|
||||||
|
.arg(flag("type-clear")
|
||||||
|
.value_name("TYPE").takes_value(true)
|
||||||
|
.multiple(true).number_of_values(1))
|
||||||
|
.arg(flag("search-zip").short("z"))
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Usage {
|
||||||
|
short: &'static str,
|
||||||
|
long: &'static str,
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! doc {
|
||||||
|
($map:expr, $name:expr, $short:expr) => {
|
||||||
|
doc!($map, $name, $short, $short)
|
||||||
|
};
|
||||||
|
($map:expr, $name:expr, $short:expr, $long:expr) => {
|
||||||
|
$map.insert($name, Usage {
|
||||||
|
short: $short,
|
||||||
|
long: concat!($long, "\n "),
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref LONG_VERSION: String = {
|
||||||
|
let mut features: Vec<&str> = vec![];
|
||||||
|
|
||||||
|
if cfg!(feature = "avx-accel") {
|
||||||
|
features.push("+AVX");
|
||||||
|
} else {
|
||||||
|
features.push("-AVX");
|
||||||
|
}
|
||||||
|
|
||||||
|
if cfg!(feature = "simd-accel") {
|
||||||
|
features.push("+SIMD");
|
||||||
|
} else {
|
||||||
|
features.push("-SIMD");
|
||||||
|
}
|
||||||
|
|
||||||
|
format!("{}\n{}", crate_version!(), features.join(" "))
|
||||||
|
};
|
||||||
|
|
||||||
|
static ref USAGES: HashMap<&'static str, Usage> = {
|
||||||
|
let mut h = HashMap::new();
|
||||||
|
doc!(h, "help-short",
|
||||||
|
"Show short help output.",
|
||||||
|
"Show short help output. Use --help to show more details.");
|
||||||
|
doc!(h, "help",
|
||||||
|
"Show verbose help output.",
|
||||||
|
"When given, more details about flags are provided.");
|
||||||
|
doc!(h, "ripgrep-version",
|
||||||
|
"Prints version information.");
|
||||||
|
|
||||||
|
doc!(h, "PATTERN",
|
||||||
|
"A regular expression used for searching.",
|
||||||
|
"A regular expression used for searching. To match a pattern \
|
||||||
|
beginning with a dash, use the -e/--regexp option.");
|
||||||
|
doc!(h, "regexp",
|
||||||
|
"Use pattern to search.",
|
||||||
|
"Use pattern to search. This option can be provided multiple \
|
||||||
|
times, where all patterns given are searched. This is also \
|
||||||
|
useful when searching for patterns that start with a dash.");
|
||||||
|
doc!(h, "PATH",
|
||||||
|
"A file or directory to search.",
|
||||||
|
"A file or directory to search. Directories are searched \
|
||||||
|
recursively. Paths specified on the command line override glob \
|
||||||
|
and ignore rules.");
|
||||||
|
doc!(h, "files",
|
||||||
|
"Print each file that would be searched.",
|
||||||
|
"Print each file that would be searched without actually \
|
||||||
|
performing the search. This is useful to determine whether a \
|
||||||
|
particular file is being searched or not.");
|
||||||
|
doc!(h, "type-list",
|
||||||
|
"Show all supported file types.",
|
||||||
|
"Show all supported file types and their corresponding globs.");
|
||||||
|
|
||||||
|
doc!(h, "text",
|
||||||
|
"Search binary files as if they were text.");
|
||||||
|
doc!(h, "count",
|
||||||
|
"Only show count of matches for each file.");
|
||||||
|
doc!(h, "color",
|
||||||
|
"When to use color. [default: auto]",
|
||||||
|
"When to use color in the output. The possible values are never, \
|
||||||
|
auto, always or ansi. The default is auto. When always is used, \
|
||||||
|
coloring is attempted based on your environment. When ansi is \
|
||||||
|
used, coloring is forcefully done using ANSI escape color \
|
||||||
|
codes.");
|
||||||
|
doc!(h, "colors",
|
||||||
|
"Configure color settings and styles.",
|
||||||
|
"This flag specifies color settings for use in the output. \
|
||||||
|
This flag may be provided multiple times. Settings are applied \
|
||||||
|
iteratively. Colors are limited to one of eight choices: \
|
||||||
|
red, blue, green, cyan, magenta, yellow, white and black. \
|
||||||
|
Styles are limited to nobold, bold, nointense or intense.\n\n\
|
||||||
|
The format of the flag is {type}:{attribute}:{value}. {type} \
|
||||||
|
should be one of path, line, column or match. {attribute} can \
|
||||||
|
be fg, bg or style. {value} is either a color (for fg and bg) \
|
||||||
|
or a text style. A special format, {type}:none, will clear all \
|
||||||
|
color settings for {type}.\n\nFor example, the following \
|
||||||
|
command will change the match color to magenta and the \
|
||||||
|
background color for line numbers to yellow:\n\n\
|
||||||
|
rg --colors 'match:fg:magenta' --colors 'line:bg:yellow' foo.\n\n\
|
||||||
|
Extended colors can be used for {value} when the terminal \
|
||||||
|
supports ANSI color sequences. These are specified as either \
|
||||||
|
'x' (256-color) or 'x,x,x' (24-bit truecolor) where x is a \
|
||||||
|
number between 0 and 255 inclusive. \n\nFor example, the \
|
||||||
|
following command will change the match background color to that \
|
||||||
|
represented by the rgb value (0,128,255):\n\n\
|
||||||
|
rg --colors 'match:bg:0,128,255'\n\nNote that the the intense \
|
||||||
|
and nointense style flags will have no effect when used \
|
||||||
|
alongside these extended color codes.");
|
||||||
|
doc!(h, "encoding",
|
||||||
|
"Specify the text encoding of files to search.",
|
||||||
|
"Specify the text encoding that ripgrep will use on all files \
|
||||||
|
searched. The default value is 'auto', which will cause ripgrep \
|
||||||
|
to do a best effort automatic detection of encoding on a \
|
||||||
|
per-file basis. Other supported values can be found in the list \
|
||||||
|
of labels here: \
|
||||||
|
https://encoding.spec.whatwg.org/#concept-encoding-get");
|
||||||
|
doc!(h, "fixed-strings",
|
||||||
|
"Treat the pattern as a literal string.",
|
||||||
|
"Treat the pattern as a literal string instead of a regular \
|
||||||
|
expression. When this flag is used, special regular expression \
|
||||||
|
meta characters such as (){}*+. do not need to be escaped.");
|
||||||
|
doc!(h, "glob",
|
||||||
|
"Include or exclude files/directories.",
|
||||||
|
"Include or exclude files/directories for searching that \
|
||||||
|
match the given glob. This always overrides any other \
|
||||||
|
ignore logic. Multiple glob flags may be used. Globbing \
|
||||||
|
rules match .gitignore globs. Precede a glob with a ! \
|
||||||
|
to exclude it.");
|
||||||
|
doc!(h, "iglob",
|
||||||
|
"Include or exclude files/directories case insensitively.",
|
||||||
|
"Include or exclude files/directories for searching that \
|
||||||
|
match the given glob. This always overrides any other \
|
||||||
|
ignore logic. Multiple glob flags may be used. Globbing \
|
||||||
|
rules match .gitignore globs. Precede a glob with a ! \
|
||||||
|
to exclude it. Globs are matched case insensitively.");
|
||||||
|
doc!(h, "ignore-case",
|
||||||
|
"Case insensitive search.",
|
||||||
|
"Case insensitive search. This is overridden by \
|
||||||
|
--case-sensitive.");
|
||||||
|
doc!(h, "line-number",
|
||||||
|
"Show line numbers.",
|
||||||
|
"Show line numbers (1-based). This is enabled by default when \
|
||||||
|
searching in a tty.");
|
||||||
|
doc!(h, "line-number-width",
|
||||||
|
"Left pad line numbers upto NUM width.",
|
||||||
|
"Left pad line numbers upto NUM width. Space is used as \
|
||||||
|
the default padding character. This has no effect if \
|
||||||
|
--no-line-number is enabled.");
|
||||||
|
doc!(h, "no-line-number",
|
||||||
|
"Suppress line numbers.",
|
||||||
|
"Suppress line numbers. This is enabled by default when NOT \
|
||||||
|
searching in a tty.");
|
||||||
|
doc!(h, "quiet",
|
||||||
|
"Do not print anything to stdout.",
|
||||||
|
"Do not print anything to stdout. If a match is found in a file, \
|
||||||
|
stop searching. This is useful when ripgrep is used only for \
|
||||||
|
its exit code.");
|
||||||
|
doc!(h, "type",
|
||||||
|
"Only search files matching TYPE.",
|
||||||
|
"Only search files matching TYPE. Multiple type flags may be \
|
||||||
|
provided. Use the --type-list flag to list all available \
|
||||||
|
types.");
|
||||||
|
doc!(h, "type-not",
|
||||||
|
"Do not search files matching TYPE.",
|
||||||
|
"Do not search files matching TYPE. Multiple type-not flags may \
|
||||||
|
be provided. Use the --type-list flag to list all available \
|
||||||
|
types.");
|
||||||
|
doc!(h, "unrestricted",
|
||||||
|
"Reduce the level of \"smart\" searching.",
|
||||||
|
"Reduce the level of \"smart\" searching. A single -u \
|
||||||
|
won't respect .gitignore (etc.) files. Two -u flags will \
|
||||||
|
additionally search hidden files and directories. Three \
|
||||||
|
-u flags will additionally search binary files. -uu is \
|
||||||
|
roughly equivalent to grep -r and -uuu is roughly \
|
||||||
|
equivalent to grep -a -r.");
|
||||||
|
doc!(h, "invert-match",
|
||||||
|
"Invert matching.",
|
||||||
|
"Invert matching. Show lines that don't match given patterns.");
|
||||||
|
doc!(h, "word-regexp",
|
||||||
|
"Only show matches surrounded by word boundaries.",
|
||||||
|
"Only show matches surrounded by word boundaries. This is \
|
||||||
|
equivalent to putting \\b before and after all of the search \
|
||||||
|
patterns.");
|
||||||
|
doc!(h, "line-regexp",
|
||||||
|
"Only show matches surrounded by line boundaries.",
|
||||||
|
"Only show matches surrounded by line boundaries. This is \
|
||||||
|
equivalent to putting ^...$ around all of the search patterns.");
|
||||||
|
|
||||||
|
doc!(h, "after-context",
|
||||||
|
"Show NUM lines after each match.");
|
||||||
|
doc!(h, "before-context",
|
||||||
|
"Show NUM lines before each match.");
|
||||||
|
doc!(h, "context",
|
||||||
|
"Show NUM lines before and after each match.");
|
||||||
|
doc!(h, "column",
|
||||||
|
"Show column numbers",
|
||||||
|
"Show column numbers (1-based). This only shows the column \
|
||||||
|
numbers for the first match on each line. This does not try \
|
||||||
|
to account for Unicode. One byte is equal to one column. This \
|
||||||
|
implies --line-number.");
|
||||||
|
doc!(h, "context-separator",
|
||||||
|
"Set the context separator string. [default: --]",
|
||||||
|
"The string used to separate non-contiguous context lines in the \
|
||||||
|
output. Escape sequences like \\x7F or \\t may be used. The \
|
||||||
|
default value is --.");
|
||||||
|
doc!(h, "debug",
|
||||||
|
"Show debug messages.",
|
||||||
|
"Show debug messages. Please use this when filing a bug report.");
|
||||||
|
doc!(h, "dfa-size-limit",
|
||||||
|
"The upper size limit of the generated dfa.",
|
||||||
|
"The upper size limit of the generated dfa. The default limit is \
|
||||||
|
10M. This should only be changed on very large regex inputs \
|
||||||
|
where the (slower) fallback regex engine may otherwise be used. \
|
||||||
|
\n\nThe argument accepts the same size suffixes as allowed in \
|
||||||
|
the 'max-filesize' argument.");
|
||||||
|
doc!(h, "file",
|
||||||
|
"Search for patterns from the given file.",
|
||||||
|
"Search for patterns from the given file, with one pattern per \
|
||||||
|
line. When this flag is used or multiple times or in \
|
||||||
|
combination with the -e/--regexp flag, then all patterns \
|
||||||
|
provided are searched. Empty pattern lines will match all input \
|
||||||
|
lines, and the newline is not counted as part of the pattern.");
|
||||||
|
doc!(h, "files-with-matches",
|
||||||
|
"Only show the paths with at least one match.");
|
||||||
|
doc!(h, "files-without-match",
|
||||||
|
"Only show the paths that contains zero matches.");
|
||||||
|
doc!(h, "with-filename",
|
||||||
|
"Show file name for each match.",
|
||||||
|
"Display the file name for matches. This is the default when \
|
||||||
|
more than one file is searched. If --heading is enabled, the \
|
||||||
|
file name will be shown above clusters of matches from each \
|
||||||
|
file; otherwise, the file name will be shown on each match.");
|
||||||
|
doc!(h, "no-filename",
|
||||||
|
"Never show the file name for a match.",
|
||||||
|
"Never show the file name for a match. This is the default when \
|
||||||
|
one file is searched.");
|
||||||
|
doc!(h, "heading",
|
||||||
|
"Show matches grouped by each file.",
|
||||||
|
"This shows the file name above clusters of matches from each \
|
||||||
|
file instead of showing the file name for every match. This is \
|
||||||
|
the default mode at a tty.");
|
||||||
|
doc!(h, "no-heading",
|
||||||
|
"Don't group matches by each file.",
|
||||||
|
"Don't group matches by each file. If -H/--with-filename is \
|
||||||
|
enabled, then file names will be shown for every line matched. \
|
||||||
|
This is the default mode when not at a tty.");
|
||||||
|
doc!(h, "hidden",
|
||||||
|
"Search hidden files and directories.",
|
||||||
|
"Search hidden files and directories. By default, hidden files \
|
||||||
|
and directories are skipped.");
|
||||||
|
doc!(h, "ignore-file",
|
||||||
|
"Specify additional ignore files.",
|
||||||
|
"Specify one or more files which contain ignore patterns. \
|
||||||
|
These patterns are applied after the patterns found in \
|
||||||
|
.gitignore and .ignore are applied. Ignore patterns should \
|
||||||
|
be in the gitignore format and are matched relative to the \
|
||||||
|
current working directory. Multiple additional ignore files \
|
||||||
|
can be specified by using the --ignore-file flag several times. \
|
||||||
|
When specifying multiple ignore files, earlier files have lower \
|
||||||
|
precedence than later files. If you are looking for a way to \
|
||||||
|
include or exclude files and directories directly used -g \
|
||||||
|
instead.");
|
||||||
|
doc!(h, "follow",
|
||||||
|
"Follow symbolic links.");
|
||||||
|
doc!(h, "max-count",
|
||||||
|
"Limit the number of matches.",
|
||||||
|
"Limit the number of matching lines per file searched to NUM.");
|
||||||
|
doc!(h, "max-filesize",
|
||||||
|
"Ignore files larger than NUM in size.",
|
||||||
|
"Ignore files larger than NUM in size. Does not ignore \
|
||||||
|
directories. \
|
||||||
|
\n\nThe input format accepts suffixes of K, M or G which \
|
||||||
|
correspond to kilobytes, megabytes and gigabytes. If no suffix \
|
||||||
|
is provided the input is treated as bytes. \
|
||||||
|
\n\nExample: --max-filesize 50K or --max-filesize 80M");
|
||||||
|
doc!(h, "maxdepth",
|
||||||
|
"Descend at most NUM directories.",
|
||||||
|
"Limit the depth of directory traversal to NUM levels beyond \
|
||||||
|
the paths given. A value of zero only searches the \
|
||||||
|
starting-points themselves.\n\nFor example, \
|
||||||
|
'rg --maxdepth 0 dir/' is a no-op because dir/ will not be \
|
||||||
|
descended into. 'rg --maxdepth 1 dir/' will search only the \
|
||||||
|
direct children of dir/.");
|
||||||
|
doc!(h, "mmap",
|
||||||
|
"Searching using memory maps when possible.",
|
||||||
|
"Search using memory maps when possible. This is enabled by \
|
||||||
|
default when ripgrep thinks it will be faster. Note that memory \
|
||||||
|
map searching doesn't currently support all options, so if an \
|
||||||
|
incompatible option (e.g., --context) is given with --mmap, \
|
||||||
|
then memory maps will not be used.");
|
||||||
|
doc!(h, "no-messages",
|
||||||
|
"Suppress all error messages.",
|
||||||
|
"Suppress all error messages. This is equivalent to redirecting \
|
||||||
|
stderr to /dev/null.");
|
||||||
|
doc!(h, "no-mmap",
|
||||||
|
"Never use memory maps.",
|
||||||
|
"Never use memory maps, even when they might be faster.");
|
||||||
|
doc!(h, "no-ignore",
|
||||||
|
"Don't respect ignore files.",
|
||||||
|
"Don't respect ignore files (.gitignore, .ignore, etc.). This \
|
||||||
|
implies --no-ignore-parent and --no-ignore-vcs.");
|
||||||
|
doc!(h, "no-ignore-parent",
|
||||||
|
"Don't respect ignore files in parent directories.",
|
||||||
|
"Don't respect ignore files (.gitignore, .ignore, etc.) in \
|
||||||
|
parent directories.");
|
||||||
|
doc!(h, "no-ignore-vcs",
|
||||||
|
"Don't respect VCS ignore files",
|
||||||
|
"Don't respect version control ignore files (.gitignore, etc.). \
|
||||||
|
This implies --no-ignore-parent. Note that .ignore files will \
|
||||||
|
continue to be respected.");
|
||||||
|
doc!(h, "null",
|
||||||
|
"Print NUL byte after file names",
|
||||||
|
"Whenever a file name is printed, follow it with a NUL byte. \
|
||||||
|
This includes printing file names before matches, and when \
|
||||||
|
printing a list of matching files such as with --count, \
|
||||||
|
--files-with-matches and --files. This option is useful for use \
|
||||||
|
with xargs.");
|
||||||
|
doc!(h, "only-matching",
|
||||||
|
"Print only matched parts of a line.",
|
||||||
|
"Print only the matched (non-empty) parts of a matching line, \
|
||||||
|
with each such part on a separate output line.");
|
||||||
|
doc!(h, "passthru",
|
||||||
|
"Show both matching and non-matching lines.");
|
||||||
|
doc!(h, "path-separator",
|
||||||
|
"Path separator to use when printing file paths.",
|
||||||
|
"The path separator to use when printing file paths. This \
|
||||||
|
defaults to your platform's path separator, which is / on Unix \
|
||||||
|
and \\ on Windows. This flag is intended for overriding the \
|
||||||
|
default when the environment demands it (e.g., cygwin). A path \
|
||||||
|
separator is limited to a single byte.");
|
||||||
|
doc!(h, "pretty",
|
||||||
|
"Alias for --color always --heading --line-number.");
|
||||||
|
doc!(h, "replace",
|
||||||
|
"Replace matches with string given.",
|
||||||
|
"Replace every match with the string given when printing \
|
||||||
|
results. Neither this flag nor any other flag will modify your \
|
||||||
|
files.\n\nCapture group indices (e.g., $5) and names \
|
||||||
|
(e.g., $foo) are supported in the replacement string.\n\n\
|
||||||
|
Note that the replacement by default replaces each match, and \
|
||||||
|
NOT the entire line. To replace the entire line, you should \
|
||||||
|
match the entire line.");
|
||||||
|
doc!(h, "regex-size-limit",
|
||||||
|
"The upper size limit of the compiled regex.",
|
||||||
|
"The upper size limit of the compiled regex. The default limit \
|
||||||
|
is 10M. \n\nThe argument accepts the same size suffixes as \
|
||||||
|
allowed in the 'max-filesize' argument.");
|
||||||
|
doc!(h, "case-sensitive",
|
||||||
|
"Search case sensitively (default).",
|
||||||
|
"Search case sensitively. This overrides -i/--ignore-case and \
|
||||||
|
-S/--smart-case.");
|
||||||
|
doc!(h, "smart-case",
|
||||||
|
"Smart case search.",
|
||||||
|
"Searches case insensitively if the pattern is all lowercase. \
|
||||||
|
Search case sensitively otherwise. This is overridden by \
|
||||||
|
either -s/--case-sensitive or -i/--ignore-case.");
|
||||||
|
doc!(h, "sort-files",
|
||||||
|
"Sort results by file path. Implies --threads=1.",
|
||||||
|
"Sort results by file path. Note that this currently \
|
||||||
|
disables all parallelism and runs search in a single thread.");
|
||||||
|
doc!(h, "threads",
|
||||||
|
"The approximate number of threads to use.",
|
||||||
|
"The approximate number of threads to use. A value of 0 (which \
|
||||||
|
is the default) causes ripgrep to choose the thread count \
|
||||||
|
using heuristics.");
|
||||||
|
doc!(h, "vimgrep",
|
||||||
|
"Show results in vim compatible format.",
|
||||||
|
"Show results with every match on its own line, including \
|
||||||
|
line numbers and column numbers. With this option, a line with \
|
||||||
|
more than one match will be printed more than once.");
|
||||||
|
doc!(h, "max-columns",
|
||||||
|
"Don't print lines longer than this limit in bytes.",
|
||||||
|
"Don't print lines longer than this limit in bytes. Longer lines \
|
||||||
|
are omitted, and only the number of matches in that line is \
|
||||||
|
printed.");
|
||||||
|
|
||||||
|
doc!(h, "type-add",
|
||||||
|
"Add a new glob for a file type.",
|
||||||
|
"Add a new glob for a particular file type. Only one glob can be \
|
||||||
|
added at a time. Multiple --type-add flags can be provided. \
|
||||||
|
Unless --type-clear is used, globs are added to any existing \
|
||||||
|
globs defined inside of ripgrep.\n\nNote that this MUST be \
|
||||||
|
passed to every invocation of ripgrep. Type settings are NOT \
|
||||||
|
persisted.\n\nExample: \
|
||||||
|
rg --type-add 'foo:*.foo' -tfoo PATTERN.\n\n\
|
||||||
|
--type-add can also be used to include rules from other types \
|
||||||
|
with the special include directive. The include directive \
|
||||||
|
permits specifying one or more other type names (separated by a \
|
||||||
|
comma) that have been defined and its rules will automatically \
|
||||||
|
be imported into the type specified. For example, to create a \
|
||||||
|
type called src that matches C++, Python and Markdown files, \
|
||||||
|
one can use:\n\n\
|
||||||
|
--type-add 'src:include:cpp,py,md'\n\n\
|
||||||
|
Additional glob rules can still be added to the src type by \
|
||||||
|
using the --type-add flag again:\n\n\
|
||||||
|
--type-add 'src:include:cpp,py,md' --type-add 'src:*.foo'\n\n\
|
||||||
|
Note that type names must consist only of Unicode letters or \
|
||||||
|
numbers. Punctuation characters are not allowed.");
|
||||||
|
doc!(h, "type-clear",
|
||||||
|
"Clear globs for given file type.",
|
||||||
|
"Clear the file type globs previously defined for TYPE. This \
|
||||||
|
only clears the default type definitions that are found inside \
|
||||||
|
of ripgrep.\n\nNote that this MUST be passed to every \
|
||||||
|
invocation of ripgrep. Type settings are NOT persisted.");
|
||||||
|
doc!(h, "search-zip",
|
||||||
|
"Search in compressed files.",
|
||||||
|
"Search in compressed files. Currently gz, bz2, xz, and \
|
||||||
|
lzma files are supported. This option expects the decompression \
|
||||||
|
binaries to be available in the system PATH.");
|
||||||
|
|
||||||
|
h
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_line_number_width(s: String) -> Result<(), String> {
|
||||||
|
if s.starts_with("0") {
|
||||||
|
Err(String::from(
|
||||||
|
"Custom padding characters are currently not supported. \
|
||||||
|
Please enter only a numeric value."))
|
||||||
|
} else {
|
||||||
|
validate_number(s)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn validate_number(s: String) -> Result<(), String> {
|
||||||
|
s.parse::<usize>().map(|_|()).map_err(|err| err.to_string())
|
||||||
|
}
|
||||||
1600
src/args.rs
1600
src/args.rs
File diff suppressed because it is too large
Load Diff
69
src/atty.rs
69
src/atty.rs
@@ -1,69 +0,0 @@
|
|||||||
/*!
|
|
||||||
This atty module contains functions for detecting whether ripgrep is being fed
|
|
||||||
from (or to) a terminal. Windows and Unix do this differently, so implement
|
|
||||||
both here.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub fn stdin_is_readable() -> bool {
|
|
||||||
use std::fs::File;
|
|
||||||
use std::os::unix::fs::FileTypeExt;
|
|
||||||
use std::os::unix::io::{FromRawFd, IntoRawFd};
|
|
||||||
use libc;
|
|
||||||
|
|
||||||
let file = unsafe { File::from_raw_fd(libc::STDIN_FILENO) };
|
|
||||||
let md = file.metadata();
|
|
||||||
let _ = file.into_raw_fd();
|
|
||||||
let ft = match md {
|
|
||||||
Err(_) => return false,
|
|
||||||
Ok(md) => md.file_type(),
|
|
||||||
};
|
|
||||||
ft.is_file() || ft.is_fifo()
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
pub fn stdin_is_readable() -> bool {
|
|
||||||
// ???
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if there is a tty on stdin.
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub fn on_stdin() -> bool {
|
|
||||||
use libc;
|
|
||||||
0 < unsafe { libc::isatty(libc::STDIN_FILENO) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if there is a tty on stdout.
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub fn on_stdout() -> bool {
|
|
||||||
use libc;
|
|
||||||
0 < unsafe { libc::isatty(libc::STDOUT_FILENO) }
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if there is a tty on stdin.
|
|
||||||
#[cfg(windows)]
|
|
||||||
pub fn on_stdin() -> bool {
|
|
||||||
// BUG: https://github.com/BurntSushi/ripgrep/issues/19
|
|
||||||
// It's not clear to me how to determine whether there is a tty on stdin.
|
|
||||||
// Checking GetConsoleMode(GetStdHandle(stdin)) != 0 appears to report
|
|
||||||
// that stdin is a pipe, even if it's not in a cygwin terminal, for
|
|
||||||
// example.
|
|
||||||
//
|
|
||||||
// To fix this, we just assume there is always a tty on stdin. If Windows
|
|
||||||
// users need to search stdin, they'll have to pass -. Ug.
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Returns true if there is a tty on stdout.
|
|
||||||
#[cfg(windows)]
|
|
||||||
pub fn on_stdout() -> bool {
|
|
||||||
use kernel32;
|
|
||||||
use winapi;
|
|
||||||
|
|
||||||
unsafe {
|
|
||||||
let fd = winapi::winbase::STD_OUTPUT_HANDLE;
|
|
||||||
let mut out = 0;
|
|
||||||
kernel32::GetConsoleMode(kernel32::GetStdHandle(fd), &mut out) != 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
456
src/decoder.rs
Normal file
456
src/decoder.rs
Normal file
@@ -0,0 +1,456 @@
|
|||||||
|
use std::cmp;
|
||||||
|
use std::io::{self, Read};
|
||||||
|
|
||||||
|
use encoding_rs::{Decoder, Encoding, UTF_8};
|
||||||
|
|
||||||
|
/// A BOM is at least 2 bytes and at most 3 bytes.
|
||||||
|
///
|
||||||
|
/// If fewer than 2 bytes are available to be read at the beginning of a
|
||||||
|
/// reader, then a BOM is `None`.
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
struct Bom {
|
||||||
|
bytes: [u8; 3],
|
||||||
|
len: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Bom {
|
||||||
|
fn as_slice(&self) -> &[u8] {
|
||||||
|
&self.bytes[0..self.len]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn decoder(&self) -> Option<Decoder> {
|
||||||
|
let bom = self.as_slice();
|
||||||
|
if bom.len() < 3 {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
if let Some((enc, _)) = Encoding::for_bom(bom) {
|
||||||
|
if enc != UTF_8 {
|
||||||
|
return Some(enc.new_decoder_with_bom_removal());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `BomPeeker` wraps `R` and satisfies the `io::Read` interface while also
|
||||||
|
/// providing a peek at the BOM if one exists. Peeking at the BOM does not
|
||||||
|
/// advance the reader.
|
||||||
|
struct BomPeeker<R> {
|
||||||
|
rdr: R,
|
||||||
|
bom: Option<Bom>,
|
||||||
|
nread: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: io::Read> BomPeeker<R> {
|
||||||
|
/// Create a new BomPeeker.
|
||||||
|
///
|
||||||
|
/// The first three bytes can be read using the `peek_bom` method, but
|
||||||
|
/// will not advance the reader.
|
||||||
|
fn new(rdr: R) -> BomPeeker<R> {
|
||||||
|
BomPeeker { rdr: rdr, bom: None, nread: 0 }
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Peek at the first three bytes of the underlying reader.
|
||||||
|
///
|
||||||
|
/// This does not advance the reader provided by `BomPeeker`.
|
||||||
|
///
|
||||||
|
/// If the underlying reader does not have at least two bytes available,
|
||||||
|
/// then `None` is returned.
|
||||||
|
fn peek_bom(&mut self) -> io::Result<Bom> {
|
||||||
|
if let Some(bom) = self.bom {
|
||||||
|
return Ok(bom);
|
||||||
|
}
|
||||||
|
self.bom = Some(Bom { bytes: [0; 3], len: 0 });
|
||||||
|
let mut buf = [0u8; 3];
|
||||||
|
let bom_len = read_full(&mut self.rdr, &mut buf)?;
|
||||||
|
self.bom = Some(Bom { bytes: buf, len: bom_len });
|
||||||
|
Ok(self.bom.unwrap())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: io::Read> io::Read for BomPeeker<R> {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
if self.nread < 3 {
|
||||||
|
let bom = self.peek_bom()?;
|
||||||
|
let bom = bom.as_slice();
|
||||||
|
if self.nread < bom.len() {
|
||||||
|
let rest = &bom[self.nread..];
|
||||||
|
let len = cmp::min(buf.len(), rest.len());
|
||||||
|
buf[..len].copy_from_slice(&rest[..len]);
|
||||||
|
self.nread += len;
|
||||||
|
return Ok(len);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let nread = self.rdr.read(buf)?;
|
||||||
|
self.nread += nread;
|
||||||
|
Ok(nread)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Like `io::Read::read_exact`, except it never returns `UnexpectedEof` and
|
||||||
|
/// instead returns the number of bytes read if EOF is seen before filling
|
||||||
|
/// `buf`.
|
||||||
|
fn read_full<R: io::Read>(
|
||||||
|
mut rdr: R,
|
||||||
|
mut buf: &mut [u8],
|
||||||
|
) -> io::Result<usize> {
|
||||||
|
let mut nread = 0;
|
||||||
|
while !buf.is_empty() {
|
||||||
|
match rdr.read(buf) {
|
||||||
|
Ok(0) => break,
|
||||||
|
Ok(n) => {
|
||||||
|
nread += n;
|
||||||
|
let tmp = buf;
|
||||||
|
buf = &mut tmp[n..];
|
||||||
|
}
|
||||||
|
Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {}
|
||||||
|
Err(e) => return Err(e),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(nread)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A reader that transcodes to UTF-8. The source encoding is determined by
|
||||||
|
/// inspecting the BOM from the stream read from `R`, if one exists. If a
|
||||||
|
/// UTF-16 BOM exists, then the source stream is transcoded to UTF-8 with
|
||||||
|
/// invalid UTF-16 sequences translated to the Unicode replacement character.
|
||||||
|
/// In all other cases, the underlying reader is passed through unchanged.
|
||||||
|
///
|
||||||
|
/// `R` is the type of the underlying reader and `B` is the type of an internal
|
||||||
|
/// buffer used to store the results of transcoding.
|
||||||
|
///
|
||||||
|
/// Note that not all methods on `io::Read` work with this implementation.
|
||||||
|
/// For example, the `bytes` adapter method attempts to read a single byte at
|
||||||
|
/// a time, but this implementation requires a buffer of size at least `4`. If
|
||||||
|
/// a buffer of size less than 4 is given, then an error is returned.
|
||||||
|
pub struct DecodeReader<R, B> {
|
||||||
|
/// The underlying reader, wrapped in a peeker for reading a BOM if one
|
||||||
|
/// exists.
|
||||||
|
rdr: BomPeeker<R>,
|
||||||
|
/// The internal buffer to store transcoded bytes before they are read by
|
||||||
|
/// callers.
|
||||||
|
buf: B,
|
||||||
|
/// The current position in `buf`. Subsequent reads start here.
|
||||||
|
pos: usize,
|
||||||
|
/// The number of transcoded bytes in `buf`. Subsequent reads end here.
|
||||||
|
buflen: usize,
|
||||||
|
/// Whether this is the first read or not (in which we inspect the BOM).
|
||||||
|
first: bool,
|
||||||
|
/// Whether a "last" read has occurred. After this point, EOF will always
|
||||||
|
/// be returned.
|
||||||
|
last: bool,
|
||||||
|
/// The underlying text decoder derived from the BOM, if one exists.
|
||||||
|
decoder: Option<Decoder>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: io::Read, B: AsMut<[u8]>> DecodeReader<R, B> {
|
||||||
|
/// Create a new transcoder that converts a source stream to valid UTF-8.
|
||||||
|
///
|
||||||
|
/// If an encoding is specified, then it is used to transcode `rdr` to
|
||||||
|
/// UTF-8. Otherwise, if no encoding is specified, and if a UTF-16 BOM is
|
||||||
|
/// found, then the corresponding UTF-16 encoding is used to transcode
|
||||||
|
/// `rdr` to UTF-8. In all other cases, `rdr` is assumed to be at least
|
||||||
|
/// ASCII-compatible and passed through untouched.
|
||||||
|
///
|
||||||
|
/// Errors in the encoding of `rdr` are handled with the Unicode
|
||||||
|
/// replacement character. If no encoding of `rdr` is specified, then
|
||||||
|
/// errors are not handled.
|
||||||
|
pub fn new(
|
||||||
|
rdr: R,
|
||||||
|
buf: B,
|
||||||
|
enc: Option<&'static Encoding>,
|
||||||
|
) -> DecodeReader<R, B> {
|
||||||
|
DecodeReader {
|
||||||
|
rdr: BomPeeker::new(rdr),
|
||||||
|
buf: buf,
|
||||||
|
buflen: 0,
|
||||||
|
pos: 0,
|
||||||
|
first: enc.is_none(),
|
||||||
|
last: false,
|
||||||
|
decoder: enc.map(|enc| enc.new_decoder_with_bom_removal()),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Fill the internal buffer from the underlying reader.
|
||||||
|
///
|
||||||
|
/// If there are unread bytes in the internal buffer, then we move them
|
||||||
|
/// to the beginning of the internal buffer and fill the remainder.
|
||||||
|
///
|
||||||
|
/// If the internal buffer is too small to read additional bytes, then an
|
||||||
|
/// error is returned.
|
||||||
|
#[inline(always)] // massive perf benefit (???)
|
||||||
|
fn fill(&mut self) -> io::Result<()> {
|
||||||
|
if self.pos < self.buflen {
|
||||||
|
if self.buflen >= self.buf.as_mut().len() {
|
||||||
|
return Err(io::Error::new(
|
||||||
|
io::ErrorKind::Other,
|
||||||
|
"DecodeReader: internal buffer exhausted"));
|
||||||
|
}
|
||||||
|
let newlen = self.buflen - self.pos;
|
||||||
|
let mut tmp = Vec::with_capacity(newlen);
|
||||||
|
tmp.extend_from_slice(&self.buf.as_mut()[self.pos..self.buflen]);
|
||||||
|
self.buf.as_mut()[..newlen].copy_from_slice(&tmp);
|
||||||
|
self.buflen = newlen;
|
||||||
|
} else {
|
||||||
|
self.buflen = 0;
|
||||||
|
}
|
||||||
|
self.pos = 0;
|
||||||
|
self.buflen +=
|
||||||
|
self.rdr.read(&mut self.buf.as_mut()[self.buflen..])?;
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transcode the inner stream to UTF-8 in `buf`. This assumes that there
|
||||||
|
/// is a decoder capable of transcoding the inner stream to UTF-8. This
|
||||||
|
/// returns the number of bytes written to `buf`.
|
||||||
|
///
|
||||||
|
/// When this function returns, exactly one of the following things will
|
||||||
|
/// be true:
|
||||||
|
///
|
||||||
|
/// 1. A non-zero number of bytes were written to `buf`.
|
||||||
|
/// 2. The underlying reader reached EOF.
|
||||||
|
/// 3. An error is returned: the internal buffer ran out of room.
|
||||||
|
/// 4. An I/O error occurred.
|
||||||
|
///
|
||||||
|
/// Note that `buf` must have at least 4 bytes of space.
|
||||||
|
fn transcode(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
assert!(buf.len() >= 4);
|
||||||
|
if self.last {
|
||||||
|
return Ok(0);
|
||||||
|
}
|
||||||
|
if self.pos >= self.buflen {
|
||||||
|
self.fill()?;
|
||||||
|
}
|
||||||
|
let mut nwrite = 0;
|
||||||
|
loop {
|
||||||
|
let (_, nin, nout, _) =
|
||||||
|
self.decoder.as_mut().unwrap().decode_to_utf8(
|
||||||
|
&self.buf.as_mut()[self.pos..self.buflen], buf, false);
|
||||||
|
self.pos += nin;
|
||||||
|
nwrite += nout;
|
||||||
|
// If we've written at least one byte to the caller-provided
|
||||||
|
// buffer, then our mission is complete.
|
||||||
|
if nwrite > 0 {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
// Otherwise, we know that our internal buffer has insufficient
|
||||||
|
// data to transcode at least one char, so we attempt to refill it.
|
||||||
|
self.fill()?;
|
||||||
|
// Quit on EOF.
|
||||||
|
if self.buflen == 0 {
|
||||||
|
self.pos = 0;
|
||||||
|
self.last = true;
|
||||||
|
let (_, _, nout, _) =
|
||||||
|
self.decoder.as_mut().unwrap().decode_to_utf8(
|
||||||
|
&[], buf, true);
|
||||||
|
return Ok(nout);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(nwrite)
|
||||||
|
}
|
||||||
|
|
||||||
|
#[inline(never)] // impacts perf...
|
||||||
|
fn detect(&mut self) -> io::Result<()> {
|
||||||
|
let bom = self.rdr.peek_bom()?;
|
||||||
|
self.decoder = bom.decoder();
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<R: io::Read, B: AsMut<[u8]>> io::Read for DecodeReader<R, B> {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
if self.first {
|
||||||
|
self.first = false;
|
||||||
|
self.detect()?;
|
||||||
|
}
|
||||||
|
if self.decoder.is_none() {
|
||||||
|
return self.rdr.read(buf);
|
||||||
|
}
|
||||||
|
// When decoding UTF-8, we need at least 4 bytes of space to guarantee
|
||||||
|
// that we can decode at least one codepoint. If we don't have it, we
|
||||||
|
// can either return `0` for the number of bytes read or return an
|
||||||
|
// error. Since `0` would be interpreted as a possibly premature EOF,
|
||||||
|
// we opt for an error.
|
||||||
|
if buf.len() < 4 {
|
||||||
|
return Err(io::Error::new(
|
||||||
|
io::ErrorKind::Other,
|
||||||
|
"DecodeReader: byte buffer must have length at least 4"));
|
||||||
|
}
|
||||||
|
self.transcode(buf)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use std::io::Read;
|
||||||
|
|
||||||
|
use encoding_rs::Encoding;
|
||||||
|
|
||||||
|
use super::{Bom, BomPeeker, DecodeReader};
|
||||||
|
|
||||||
|
fn read_to_string<R: Read>(mut rdr: R) -> String {
|
||||||
|
let mut s = String::new();
|
||||||
|
rdr.read_to_string(&mut s).unwrap();
|
||||||
|
s
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn peeker_empty() {
|
||||||
|
let buf = [];
|
||||||
|
let mut peeker = BomPeeker::new(&buf[..]);
|
||||||
|
assert_eq!(Bom { bytes: [0; 3], len: 0}, peeker.peek_bom().unwrap());
|
||||||
|
|
||||||
|
let mut tmp = [0; 100];
|
||||||
|
assert_eq!(0, peeker.read(&mut tmp).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn peeker_one() {
|
||||||
|
let buf = [1];
|
||||||
|
let mut peeker = BomPeeker::new(&buf[..]);
|
||||||
|
assert_eq!(
|
||||||
|
Bom { bytes: [1, 0, 0], len: 1},
|
||||||
|
peeker.peek_bom().unwrap());
|
||||||
|
|
||||||
|
let mut tmp = [0; 100];
|
||||||
|
assert_eq!(1, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(1, tmp[0]);
|
||||||
|
assert_eq!(0, peeker.read(&mut tmp).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn peeker_two() {
|
||||||
|
let buf = [1, 2];
|
||||||
|
let mut peeker = BomPeeker::new(&buf[..]);
|
||||||
|
assert_eq!(
|
||||||
|
Bom { bytes: [1, 2, 0], len: 2},
|
||||||
|
peeker.peek_bom().unwrap());
|
||||||
|
|
||||||
|
let mut tmp = [0; 100];
|
||||||
|
assert_eq!(2, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(1, tmp[0]);
|
||||||
|
assert_eq!(2, tmp[1]);
|
||||||
|
assert_eq!(0, peeker.read(&mut tmp).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn peeker_three() {
|
||||||
|
let buf = [1, 2, 3];
|
||||||
|
let mut peeker = BomPeeker::new(&buf[..]);
|
||||||
|
assert_eq!(
|
||||||
|
Bom { bytes: [1, 2, 3], len: 3},
|
||||||
|
peeker.peek_bom().unwrap());
|
||||||
|
|
||||||
|
let mut tmp = [0; 100];
|
||||||
|
assert_eq!(3, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(1, tmp[0]);
|
||||||
|
assert_eq!(2, tmp[1]);
|
||||||
|
assert_eq!(3, tmp[2]);
|
||||||
|
assert_eq!(0, peeker.read(&mut tmp).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn peeker_four() {
|
||||||
|
let buf = [1, 2, 3, 4];
|
||||||
|
let mut peeker = BomPeeker::new(&buf[..]);
|
||||||
|
assert_eq!(
|
||||||
|
Bom { bytes: [1, 2, 3], len: 3},
|
||||||
|
peeker.peek_bom().unwrap());
|
||||||
|
|
||||||
|
let mut tmp = [0; 100];
|
||||||
|
assert_eq!(3, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(1, tmp[0]);
|
||||||
|
assert_eq!(2, tmp[1]);
|
||||||
|
assert_eq!(3, tmp[2]);
|
||||||
|
assert_eq!(1, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(4, tmp[0]);
|
||||||
|
assert_eq!(0, peeker.read(&mut tmp).unwrap());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn peeker_one_at_a_time() {
|
||||||
|
let buf = [1, 2, 3, 4];
|
||||||
|
let mut peeker = BomPeeker::new(&buf[..]);
|
||||||
|
|
||||||
|
let mut tmp = [0; 1];
|
||||||
|
assert_eq!(0, peeker.read(&mut tmp[..0]).unwrap());
|
||||||
|
assert_eq!(0, tmp[0]);
|
||||||
|
assert_eq!(1, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(1, tmp[0]);
|
||||||
|
assert_eq!(1, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(2, tmp[0]);
|
||||||
|
assert_eq!(1, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(3, tmp[0]);
|
||||||
|
assert_eq!(1, peeker.read(&mut tmp).unwrap());
|
||||||
|
assert_eq!(4, tmp[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// In cases where all we have is a bom, we expect the bytes to be
|
||||||
|
// passed through unchanged.
|
||||||
|
#[test]
|
||||||
|
fn trans_utf16_bom() {
|
||||||
|
let srcbuf = vec![0xFF, 0xFE];
|
||||||
|
let mut dstbuf = vec![0; 8 * (1<<10)];
|
||||||
|
let mut rdr = DecodeReader::new(&*srcbuf, vec![0; 8 * (1<<10)], None);
|
||||||
|
let n = rdr.read(&mut dstbuf).unwrap();
|
||||||
|
assert_eq!(&*srcbuf, &dstbuf[..n]);
|
||||||
|
|
||||||
|
let srcbuf = vec![0xFE, 0xFF];
|
||||||
|
let mut rdr = DecodeReader::new(&*srcbuf, vec![0; 8 * (1<<10)], None);
|
||||||
|
let n = rdr.read(&mut dstbuf).unwrap();
|
||||||
|
assert_eq!(&*srcbuf, &dstbuf[..n]);
|
||||||
|
|
||||||
|
let srcbuf = vec![0xEF, 0xBB, 0xBF];
|
||||||
|
let mut rdr = DecodeReader::new(&*srcbuf, vec![0; 8 * (1<<10)], None);
|
||||||
|
let n = rdr.read(&mut dstbuf).unwrap();
|
||||||
|
assert_eq!(&*srcbuf, &dstbuf[..n]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test basic UTF-16 decoding.
|
||||||
|
#[test]
|
||||||
|
fn trans_utf16_basic() {
|
||||||
|
let srcbuf = vec![0xFF, 0xFE, 0x61, 0x00];
|
||||||
|
let mut rdr = DecodeReader::new(&*srcbuf, vec![0; 8 * (1<<10)], None);
|
||||||
|
assert_eq!("a", read_to_string(&mut rdr));
|
||||||
|
|
||||||
|
let srcbuf = vec![0xFE, 0xFF, 0x00, 0x61];
|
||||||
|
let mut rdr = DecodeReader::new(&*srcbuf, vec![0; 8 * (1<<10)], None);
|
||||||
|
assert_eq!("a", read_to_string(&mut rdr));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Test incomplete UTF-16 decoding. This ensures we see a replacement char
|
||||||
|
// if the stream ends with an unpaired code unit.
|
||||||
|
#[test]
|
||||||
|
fn trans_utf16_incomplete() {
|
||||||
|
let srcbuf = vec![0xFF, 0xFE, 0x61, 0x00, 0x00];
|
||||||
|
let mut rdr = DecodeReader::new(&*srcbuf, vec![0; 8 * (1<<10)], None);
|
||||||
|
assert_eq!("a\u{FFFD}", read_to_string(&mut rdr));
|
||||||
|
}
|
||||||
|
|
||||||
|
macro_rules! test_trans_simple {
|
||||||
|
($name:ident, $enc:expr, $srcbytes:expr, $dst:expr) => {
|
||||||
|
#[test]
|
||||||
|
fn $name() {
|
||||||
|
let srcbuf = &$srcbytes[..];
|
||||||
|
let enc = Encoding::for_label($enc.as_bytes());
|
||||||
|
let mut rdr = DecodeReader::new(
|
||||||
|
&*srcbuf, vec![0; 8 * (1<<10)], enc);
|
||||||
|
assert_eq!($dst, read_to_string(&mut rdr));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// This isn't exhaustive obviously, but it lets us test base level support.
|
||||||
|
test_trans_simple!(trans_simple_auto, "does not exist", b"\xD0\x96", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_utf8, "utf-8", b"\xD0\x96", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_utf16le, "utf-16le", b"\x16\x04", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_utf16be, "utf-16be", b"\x04\x16", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_chinese, "chinese", b"\xA7\xA8", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_korean, "korean", b"\xAC\xA8", "Ж");
|
||||||
|
test_trans_simple!(
|
||||||
|
trans_simple_big5_hkscs, "big5-hkscs", b"\xC7\xFA", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_gbk, "gbk", b"\xA7\xA8", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_sjis, "sjis", b"\x84\x47", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_eucjp, "euc-jp", b"\xA7\xA8", "Ж");
|
||||||
|
test_trans_simple!(trans_simple_latin1, "latin1", b"\xA9", "©");
|
||||||
|
}
|
||||||
191
src/decompressor.rs
Normal file
191
src/decompressor.rs
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
use std::ffi::OsStr;
|
||||||
|
use std::fmt;
|
||||||
|
use std::io::{self, Read};
|
||||||
|
use std::path::Path;
|
||||||
|
use std::process::{self, Stdio};
|
||||||
|
|
||||||
|
use globset::{Glob, GlobSet, GlobSetBuilder};
|
||||||
|
|
||||||
|
/// A decompression command, contains the command to be spawned as well as any
|
||||||
|
/// necessary CLI args.
|
||||||
|
#[derive(Clone, Copy, Debug)]
|
||||||
|
struct DecompressionCommand {
|
||||||
|
cmd: &'static str,
|
||||||
|
args: &'static [&'static str],
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DecompressionCommand {
|
||||||
|
/// Create a new decompress command
|
||||||
|
fn new(
|
||||||
|
cmd: &'static str,
|
||||||
|
args: &'static [&'static str],
|
||||||
|
) -> DecompressionCommand {
|
||||||
|
DecompressionCommand {
|
||||||
|
cmd, args
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for DecompressionCommand {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
write!(f, "{} {}", self.cmd, self.args.join(" "))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
lazy_static! {
|
||||||
|
static ref DECOMPRESSION_COMMANDS: HashMap<
|
||||||
|
&'static str,
|
||||||
|
DecompressionCommand,
|
||||||
|
> = {
|
||||||
|
let mut m = HashMap::new();
|
||||||
|
|
||||||
|
const ARGS: &[&str] = &["-d", "-c"];
|
||||||
|
m.insert("gz", DecompressionCommand::new("gzip", ARGS));
|
||||||
|
m.insert("bz2", DecompressionCommand::new("bzip2", ARGS));
|
||||||
|
m.insert("xz", DecompressionCommand::new("xz", ARGS));
|
||||||
|
|
||||||
|
const LZMA_ARGS: &[&str] = &["--format=lzma", "-d", "-c"];
|
||||||
|
m.insert("lzma", DecompressionCommand::new("xz", LZMA_ARGS));
|
||||||
|
|
||||||
|
m
|
||||||
|
};
|
||||||
|
static ref SUPPORTED_COMPRESSION_FORMATS: GlobSet = {
|
||||||
|
let mut builder = GlobSetBuilder::new();
|
||||||
|
builder.add(Glob::new("*.gz").unwrap());
|
||||||
|
builder.add(Glob::new("*.bz2").unwrap());
|
||||||
|
builder.add(Glob::new("*.xz").unwrap());
|
||||||
|
builder.add(Glob::new("*.lzma").unwrap());
|
||||||
|
builder.build().unwrap()
|
||||||
|
};
|
||||||
|
static ref TAR_ARCHIVE_FORMATS: GlobSet = {
|
||||||
|
let mut builder = GlobSetBuilder::new();
|
||||||
|
builder.add(Glob::new("*.tar.gz").unwrap());
|
||||||
|
builder.add(Glob::new("*.tar.xz").unwrap());
|
||||||
|
builder.add(Glob::new("*.tar.bz2").unwrap());
|
||||||
|
builder.add(Glob::new("*.tgz").unwrap());
|
||||||
|
builder.add(Glob::new("*.txz").unwrap());
|
||||||
|
builder.add(Glob::new("*.tbz2").unwrap());
|
||||||
|
builder.build().unwrap()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/// DecompressionReader provides an `io::Read` implementation for a limited
|
||||||
|
/// set of compression formats.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct DecompressionReader {
|
||||||
|
cmd: DecompressionCommand,
|
||||||
|
child: process::Child,
|
||||||
|
done: bool,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl DecompressionReader {
|
||||||
|
/// Returns a handle to the stdout of the spawned decompression process for
|
||||||
|
/// `path`, which can be directly searched in the worker. When the returned
|
||||||
|
/// value is exhausted, the underlying process is reaped. If the underlying
|
||||||
|
/// process fails, then its stderr is read and converted into a normal
|
||||||
|
/// io::Error.
|
||||||
|
///
|
||||||
|
/// If there is any error in spawning the decompression command, then
|
||||||
|
/// return `None`, after outputting any necessary debug or error messages.
|
||||||
|
pub fn from_path(path: &Path) -> Option<DecompressionReader> {
|
||||||
|
if is_tar_archive(path) {
|
||||||
|
debug!("{}: skipping tar archive", path.display());
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
let extension = match path.extension().and_then(OsStr::to_str) {
|
||||||
|
Some(extension) => extension,
|
||||||
|
None => {
|
||||||
|
debug!(
|
||||||
|
"{}: failed to get compresson extension", path.display());
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let decompression_cmd = match DECOMPRESSION_COMMANDS.get(extension) {
|
||||||
|
Some(cmd) => cmd,
|
||||||
|
None => {
|
||||||
|
debug!(
|
||||||
|
"{}: failed to get decompression command", path.display());
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
let cmd = process::Command::new(decompression_cmd.cmd)
|
||||||
|
.args(decompression_cmd.args)
|
||||||
|
.arg(path)
|
||||||
|
.stdout(Stdio::piped())
|
||||||
|
.stderr(Stdio::piped())
|
||||||
|
.spawn();
|
||||||
|
let child = match cmd {
|
||||||
|
Ok(process) => process,
|
||||||
|
Err(_) => {
|
||||||
|
debug!(
|
||||||
|
"{}: decompression command '{}' not found",
|
||||||
|
path.display(), decompression_cmd.cmd);
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Some(DecompressionReader::new(*decompression_cmd, child))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn new(
|
||||||
|
cmd: DecompressionCommand,
|
||||||
|
child: process::Child,
|
||||||
|
) -> DecompressionReader {
|
||||||
|
DecompressionReader {
|
||||||
|
cmd: cmd,
|
||||||
|
child: child,
|
||||||
|
done: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_error(&mut self) -> io::Result<io::Error> {
|
||||||
|
let mut errbytes = vec![];
|
||||||
|
self.child.stderr.as_mut().unwrap().read_to_end(&mut errbytes)?;
|
||||||
|
let errstr = String::from_utf8_lossy(&errbytes);
|
||||||
|
let errstr = errstr.trim();
|
||||||
|
|
||||||
|
Ok(if errstr.is_empty() {
|
||||||
|
let msg = format!("decompression command failed: '{}'", self.cmd);
|
||||||
|
io::Error::new(io::ErrorKind::Other, msg)
|
||||||
|
} else {
|
||||||
|
let msg = format!(
|
||||||
|
"decompression command '{}' failed: {}", self.cmd, errstr);
|
||||||
|
io::Error::new(io::ErrorKind::Other, msg)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl io::Read for DecompressionReader {
|
||||||
|
fn read(&mut self, buf: &mut [u8]) -> io::Result<usize> {
|
||||||
|
if self.done {
|
||||||
|
return Ok(0);
|
||||||
|
}
|
||||||
|
let nread = self.child.stdout.as_mut().unwrap().read(buf)?;
|
||||||
|
if nread == 0 {
|
||||||
|
self.done = true;
|
||||||
|
// Reap the child now that we're done reading.
|
||||||
|
// If the command failed, report stderr as an error.
|
||||||
|
if !self.child.wait()?.success() {
|
||||||
|
return Err(self.read_error()?);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(nread)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if the given path contains a supported compression format or
|
||||||
|
/// is a TAR archive.
|
||||||
|
pub fn is_compressed(path: &Path) -> bool {
|
||||||
|
is_supported_compression_format(path) || is_tar_archive(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if the given path matches any one of the supported compression
|
||||||
|
/// formats
|
||||||
|
fn is_supported_compression_format(path: &Path) -> bool {
|
||||||
|
SUPPORTED_COMPRESSION_FORMATS.is_match(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if the given path matches any of the known TAR file formats.
|
||||||
|
fn is_tar_archive(path: &Path) -> bool {
|
||||||
|
TAR_ARCHIVE_FORMATS.is_match(path)
|
||||||
|
}
|
||||||
607
src/main.rs
607
src/main.rs
@@ -1,11 +1,12 @@
|
|||||||
extern crate ctrlc;
|
extern crate atty;
|
||||||
extern crate deque;
|
extern crate bytecount;
|
||||||
extern crate docopt;
|
#[macro_use]
|
||||||
|
extern crate clap;
|
||||||
|
extern crate encoding_rs;
|
||||||
extern crate env_logger;
|
extern crate env_logger;
|
||||||
|
extern crate globset;
|
||||||
extern crate grep;
|
extern crate grep;
|
||||||
extern crate ignore;
|
extern crate ignore;
|
||||||
#[cfg(windows)]
|
|
||||||
extern crate kernel32;
|
|
||||||
#[macro_use]
|
#[macro_use]
|
||||||
extern crate lazy_static;
|
extern crate lazy_static;
|
||||||
extern crate libc;
|
extern crate libc;
|
||||||
@@ -15,36 +16,21 @@ extern crate memchr;
|
|||||||
extern crate memmap;
|
extern crate memmap;
|
||||||
extern crate num_cpus;
|
extern crate num_cpus;
|
||||||
extern crate regex;
|
extern crate regex;
|
||||||
extern crate rustc_serialize;
|
extern crate same_file;
|
||||||
extern crate term;
|
extern crate termcolor;
|
||||||
#[cfg(windows)]
|
#[cfg(windows)]
|
||||||
extern crate winapi;
|
extern crate winapi;
|
||||||
|
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::fs::File;
|
|
||||||
use std::io;
|
|
||||||
use std::io::Write;
|
|
||||||
use std::path::Path;
|
|
||||||
use std::process;
|
use std::process;
|
||||||
use std::result;
|
use std::result;
|
||||||
use std::sync::{Arc, Mutex};
|
use std::sync::Arc;
|
||||||
use std::sync::atomic::{AtomicBool, Ordering};
|
use std::sync::atomic::{AtomicUsize, Ordering};
|
||||||
|
use std::sync::mpsc;
|
||||||
use std::thread;
|
use std::thread;
|
||||||
use std::cmp;
|
|
||||||
|
|
||||||
use deque::{Stealer, Stolen};
|
|
||||||
use grep::Grep;
|
|
||||||
use memmap::{Mmap, Protection};
|
|
||||||
use term::Terminal;
|
|
||||||
use ignore::DirEntry;
|
|
||||||
|
|
||||||
use args::Args;
|
use args::Args;
|
||||||
use out::{ColoredTerminal, Out};
|
use worker::Work;
|
||||||
use pathutil::strip_prefix;
|
|
||||||
use printer::Printer;
|
|
||||||
use search_stream::InputBuffer;
|
|
||||||
#[cfg(windows)]
|
|
||||||
use terminal_win::WindowsBuffer;
|
|
||||||
|
|
||||||
macro_rules! errored {
|
macro_rules! errored {
|
||||||
($($tt:tt)*) => {
|
($($tt:tt)*) => {
|
||||||
@@ -52,28 +38,23 @@ macro_rules! errored {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
macro_rules! eprintln {
|
mod app;
|
||||||
($($tt:tt)*) => {{
|
|
||||||
use std::io::Write;
|
|
||||||
let _ = writeln!(&mut ::std::io::stderr(), $($tt)*);
|
|
||||||
}}
|
|
||||||
}
|
|
||||||
|
|
||||||
mod args;
|
mod args;
|
||||||
mod atty;
|
mod decoder;
|
||||||
mod out;
|
mod decompressor;
|
||||||
mod pathutil;
|
mod pathutil;
|
||||||
mod printer;
|
mod printer;
|
||||||
mod search_buffer;
|
mod search_buffer;
|
||||||
mod search_stream;
|
mod search_stream;
|
||||||
#[cfg(windows)]
|
mod unescape;
|
||||||
mod terminal_win;
|
mod worker;
|
||||||
|
|
||||||
pub type Result<T> = result::Result<T, Box<Error + Send + Sync>>;
|
pub type Result<T> = result::Result<T, Box<Error + Send + Sync>>;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
match Args::parse().and_then(run) {
|
reset_sigpipe();
|
||||||
Ok(count) if count == 0 => process::exit(1),
|
match Args::parse().map(Arc::new).and_then(run) {
|
||||||
|
Ok(0) => process::exit(1),
|
||||||
Ok(_) => process::exit(0),
|
Ok(_) => process::exit(0),
|
||||||
Err(err) => {
|
Err(err) => {
|
||||||
eprintln!("{}", err);
|
eprintln!("{}", err);
|
||||||
@@ -82,95 +63,104 @@ fn main() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run(args: Args) -> Result<u64> {
|
fn run(args: Arc<Args>) -> Result<u64> {
|
||||||
let args = Arc::new(args);
|
if args.never_match() {
|
||||||
|
return Ok(0);
|
||||||
let handler_args = args.clone();
|
}
|
||||||
ctrlc::set_handler(move || {
|
let threads = args.threads();
|
||||||
let stdout = io::stdout();
|
|
||||||
let mut stdout = stdout.lock();
|
|
||||||
|
|
||||||
let _ = handler_args.stdout().reset();
|
|
||||||
let _ = stdout.flush();
|
|
||||||
|
|
||||||
process::exit(1);
|
|
||||||
});
|
|
||||||
|
|
||||||
let paths = args.paths();
|
|
||||||
let threads = cmp::max(1, args.threads() - 1);
|
|
||||||
let isone =
|
|
||||||
paths.len() == 1 && (paths[0] == Path::new("-") || paths[0].is_file());
|
|
||||||
if args.files() {
|
if args.files() {
|
||||||
return run_files(args.clone());
|
if threads == 1 || args.is_one_path() {
|
||||||
}
|
run_files_one_thread(&args)
|
||||||
if args.type_list() {
|
|
||||||
return run_types(args.clone());
|
|
||||||
}
|
|
||||||
if threads == 1 || isone {
|
|
||||||
return run_one_thread(args.clone());
|
|
||||||
}
|
|
||||||
let out = Arc::new(Mutex::new(args.out()));
|
|
||||||
let quiet_matched = QuietMatched::new(args.quiet());
|
|
||||||
let mut workers = vec![];
|
|
||||||
|
|
||||||
let workq = {
|
|
||||||
let (workq, stealer) = deque::new();
|
|
||||||
for _ in 0..threads {
|
|
||||||
let worker = MultiWorker {
|
|
||||||
chan_work: stealer.clone(),
|
|
||||||
quiet_matched: quiet_matched.clone(),
|
|
||||||
out: out.clone(),
|
|
||||||
outbuf: Some(args.outbuf()),
|
|
||||||
worker: Worker {
|
|
||||||
args: args.clone(),
|
|
||||||
inpbuf: args.input_buffer(),
|
|
||||||
grep: args.grep(),
|
|
||||||
match_count: 0,
|
|
||||||
},
|
|
||||||
};
|
|
||||||
workers.push(thread::spawn(move || worker.run()));
|
|
||||||
}
|
|
||||||
workq
|
|
||||||
};
|
|
||||||
let mut paths_searched: u64 = 0;
|
|
||||||
for dent in args.walker() {
|
|
||||||
if quiet_matched.has_match() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
paths_searched += 1;
|
|
||||||
if dent.is_stdin() {
|
|
||||||
workq.push(Work::Stdin);
|
|
||||||
} else {
|
} else {
|
||||||
workq.push(Work::File(dent));
|
run_files_parallel(args)
|
||||||
}
|
}
|
||||||
|
} else if args.type_list() {
|
||||||
|
run_types(&args)
|
||||||
|
} else if threads == 1 || args.is_one_path() {
|
||||||
|
run_one_thread(&args)
|
||||||
|
} else {
|
||||||
|
run_parallel(&args)
|
||||||
}
|
}
|
||||||
if !paths.is_empty() && paths_searched == 0 {
|
|
||||||
eprintln!("No files were searched, which means ripgrep probably \
|
|
||||||
applied a filter you didn't expect. \
|
|
||||||
Try running again with --debug.");
|
|
||||||
}
|
|
||||||
for _ in 0..workers.len() {
|
|
||||||
workq.push(Work::Quit);
|
|
||||||
}
|
|
||||||
let mut match_count = 0;
|
|
||||||
for worker in workers {
|
|
||||||
match_count += worker.join().unwrap();
|
|
||||||
}
|
|
||||||
Ok(match_count)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_one_thread(args: Arc<Args>) -> Result<u64> {
|
fn run_parallel(args: &Arc<Args>) -> Result<u64> {
|
||||||
let mut worker = Worker {
|
let bufwtr = Arc::new(args.buffer_writer());
|
||||||
args: args.clone(),
|
let quiet_matched = args.quiet_matched();
|
||||||
inpbuf: args.input_buffer(),
|
let paths_searched = Arc::new(AtomicUsize::new(0));
|
||||||
grep: args.grep(),
|
let match_count = Arc::new(AtomicUsize::new(0));
|
||||||
match_count: 0,
|
|
||||||
};
|
args.walker_parallel().run(|| {
|
||||||
let mut term = args.stdout();
|
let args = Arc::clone(args);
|
||||||
|
let quiet_matched = quiet_matched.clone();
|
||||||
|
let paths_searched = paths_searched.clone();
|
||||||
|
let match_count = match_count.clone();
|
||||||
|
let bufwtr = Arc::clone(&bufwtr);
|
||||||
|
let mut buf = bufwtr.buffer();
|
||||||
|
let mut worker = args.worker();
|
||||||
|
Box::new(move |result| {
|
||||||
|
use ignore::WalkState::*;
|
||||||
|
|
||||||
|
if quiet_matched.has_match() {
|
||||||
|
return Quit;
|
||||||
|
}
|
||||||
|
let dent = match get_or_log_dir_entry(
|
||||||
|
result,
|
||||||
|
args.stdout_handle(),
|
||||||
|
args.files(),
|
||||||
|
args.no_messages(),
|
||||||
|
) {
|
||||||
|
None => return Continue,
|
||||||
|
Some(dent) => dent,
|
||||||
|
};
|
||||||
|
paths_searched.fetch_add(1, Ordering::SeqCst);
|
||||||
|
buf.clear();
|
||||||
|
{
|
||||||
|
// This block actually executes the search and prints the
|
||||||
|
// results into outbuf.
|
||||||
|
let mut printer = args.printer(&mut buf);
|
||||||
|
let count =
|
||||||
|
if dent.is_stdin() {
|
||||||
|
worker.run(&mut printer, Work::Stdin)
|
||||||
|
} else {
|
||||||
|
worker.run(&mut printer, Work::DirEntry(dent))
|
||||||
|
};
|
||||||
|
match_count.fetch_add(count as usize, Ordering::SeqCst);
|
||||||
|
if quiet_matched.set_match(count > 0) {
|
||||||
|
return Quit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// BUG(burntsushi): We should handle this error instead of ignoring
|
||||||
|
// it. See: https://github.com/BurntSushi/ripgrep/issues/200
|
||||||
|
let _ = bufwtr.print(&buf);
|
||||||
|
Continue
|
||||||
|
})
|
||||||
|
});
|
||||||
|
if !args.paths().is_empty() && paths_searched.load(Ordering::SeqCst) == 0 {
|
||||||
|
if !args.no_messages() {
|
||||||
|
eprint_nothing_searched();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(match_count.load(Ordering::SeqCst) as u64)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_one_thread(args: &Arc<Args>) -> Result<u64> {
|
||||||
|
let stdout = args.stdout();
|
||||||
|
let mut stdout = stdout.lock();
|
||||||
|
let mut worker = args.worker();
|
||||||
let mut paths_searched: u64 = 0;
|
let mut paths_searched: u64 = 0;
|
||||||
for dent in args.walker() {
|
let mut match_count = 0;
|
||||||
let mut printer = args.printer(&mut term);
|
for result in args.walker() {
|
||||||
if worker.match_count > 0 {
|
let dent = match get_or_log_dir_entry(
|
||||||
|
result,
|
||||||
|
args.stdout_handle(),
|
||||||
|
args.files(),
|
||||||
|
args.no_messages(),
|
||||||
|
) {
|
||||||
|
None => continue,
|
||||||
|
Some(dent) => dent,
|
||||||
|
};
|
||||||
|
let mut printer = args.printer(&mut stdout);
|
||||||
|
if match_count > 0 {
|
||||||
if args.quiet() {
|
if args.quiet() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -179,41 +169,79 @@ fn run_one_thread(args: Arc<Args>) -> Result<u64> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
paths_searched += 1;
|
paths_searched += 1;
|
||||||
if dent.is_stdin() {
|
match_count +=
|
||||||
worker.do_work(&mut printer, WorkReady::Stdin);
|
if dent.is_stdin() {
|
||||||
} else {
|
worker.run(&mut printer, Work::Stdin)
|
||||||
let file = match File::open(dent.path()) {
|
} else {
|
||||||
Ok(file) => file,
|
worker.run(&mut printer, Work::DirEntry(dent))
|
||||||
Err(err) => {
|
|
||||||
eprintln!("{}: {}", dent.path().display(), err);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
worker.do_work(&mut printer, WorkReady::DirFile(dent, file));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if !args.paths().is_empty() && paths_searched == 0 {
|
if !args.paths().is_empty() && paths_searched == 0 {
|
||||||
eprintln!("No files were searched, which means ripgrep probably \
|
if !args.no_messages() {
|
||||||
applied a filter you didn't expect. \
|
eprint_nothing_searched();
|
||||||
Try running again with --debug.");
|
}
|
||||||
}
|
}
|
||||||
Ok(worker.match_count)
|
Ok(match_count)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_files(args: Arc<Args>) -> Result<u64> {
|
fn run_files_parallel(args: Arc<Args>) -> Result<u64> {
|
||||||
let term = args.stdout();
|
let print_args = Arc::clone(&args);
|
||||||
let mut printer = args.printer(term);
|
let (tx, rx) = mpsc::channel::<ignore::DirEntry>();
|
||||||
|
let print_thread = thread::spawn(move || {
|
||||||
|
let stdout = print_args.stdout();
|
||||||
|
let mut printer = print_args.printer(stdout.lock());
|
||||||
|
let mut file_count = 0;
|
||||||
|
for dent in rx.iter() {
|
||||||
|
if !print_args.quiet() {
|
||||||
|
printer.path(dent.path());
|
||||||
|
}
|
||||||
|
file_count += 1;
|
||||||
|
}
|
||||||
|
file_count
|
||||||
|
});
|
||||||
|
args.walker_parallel().run(move || {
|
||||||
|
let args = Arc::clone(&args);
|
||||||
|
let tx = tx.clone();
|
||||||
|
Box::new(move |result| {
|
||||||
|
if let Some(dent) = get_or_log_dir_entry(
|
||||||
|
result,
|
||||||
|
args.stdout_handle(),
|
||||||
|
args.files(),
|
||||||
|
args.no_messages(),
|
||||||
|
) {
|
||||||
|
tx.send(dent).unwrap();
|
||||||
|
}
|
||||||
|
ignore::WalkState::Continue
|
||||||
|
})
|
||||||
|
});
|
||||||
|
Ok(print_thread.join().unwrap())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn run_files_one_thread(args: &Arc<Args>) -> Result<u64> {
|
||||||
|
let stdout = args.stdout();
|
||||||
|
let mut printer = args.printer(stdout.lock());
|
||||||
let mut file_count = 0;
|
let mut file_count = 0;
|
||||||
for dent in args.walker() {
|
for result in args.walker() {
|
||||||
printer.path(dent.path());
|
let dent = match get_or_log_dir_entry(
|
||||||
|
result,
|
||||||
|
args.stdout_handle(),
|
||||||
|
args.files(),
|
||||||
|
args.no_messages(),
|
||||||
|
) {
|
||||||
|
None => continue,
|
||||||
|
Some(dent) => dent,
|
||||||
|
};
|
||||||
|
if !args.quiet() {
|
||||||
|
printer.path(dent.path());
|
||||||
|
}
|
||||||
file_count += 1;
|
file_count += 1;
|
||||||
}
|
}
|
||||||
Ok(file_count)
|
Ok(file_count)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_types(args: Arc<Args>) -> Result<u64> {
|
fn run_types(args: &Arc<Args>) -> Result<u64> {
|
||||||
let term = args.stdout();
|
let stdout = args.stdout();
|
||||||
let mut printer = args.printer(term);
|
let mut printer = args.printer(stdout.lock());
|
||||||
let mut ty_count = 0;
|
let mut ty_count = 0;
|
||||||
for def in args.type_defs() {
|
for def in args.type_defs() {
|
||||||
printer.type_def(def);
|
printer.type_def(def);
|
||||||
@@ -222,167 +250,142 @@ fn run_types(args: Arc<Args>) -> Result<u64> {
|
|||||||
Ok(ty_count)
|
Ok(ty_count)
|
||||||
}
|
}
|
||||||
|
|
||||||
enum Work {
|
fn get_or_log_dir_entry(
|
||||||
Stdin,
|
result: result::Result<ignore::DirEntry, ignore::Error>,
|
||||||
File(DirEntry),
|
stdout_handle: Option<&same_file::Handle>,
|
||||||
Quit,
|
files_only: bool,
|
||||||
}
|
no_messages: bool,
|
||||||
|
) -> Option<ignore::DirEntry> {
|
||||||
enum WorkReady {
|
match result {
|
||||||
Stdin,
|
Err(err) => {
|
||||||
DirFile(DirEntry, File),
|
if !no_messages {
|
||||||
}
|
|
||||||
|
|
||||||
struct MultiWorker {
|
|
||||||
chan_work: Stealer<Work>,
|
|
||||||
quiet_matched: QuietMatched,
|
|
||||||
out: Arc<Mutex<Out>>,
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
outbuf: Option<ColoredTerminal<term::TerminfoTerminal<Vec<u8>>>>,
|
|
||||||
#[cfg(windows)]
|
|
||||||
outbuf: Option<ColoredTerminal<WindowsBuffer>>,
|
|
||||||
worker: Worker,
|
|
||||||
}
|
|
||||||
|
|
||||||
struct Worker {
|
|
||||||
args: Arc<Args>,
|
|
||||||
inpbuf: InputBuffer,
|
|
||||||
grep: Grep,
|
|
||||||
match_count: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl MultiWorker {
|
|
||||||
fn run(mut self) -> u64 {
|
|
||||||
loop {
|
|
||||||
if self.quiet_matched.has_match() {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
let work = match self.chan_work.steal() {
|
|
||||||
Stolen::Empty | Stolen::Abort => continue,
|
|
||||||
Stolen::Data(Work::Quit) => break,
|
|
||||||
Stolen::Data(Work::Stdin) => WorkReady::Stdin,
|
|
||||||
Stolen::Data(Work::File(ent)) => {
|
|
||||||
match File::open(ent.path()) {
|
|
||||||
Ok(file) => WorkReady::DirFile(ent, file),
|
|
||||||
Err(err) => {
|
|
||||||
eprintln!("{}: {}", ent.path().display(), err);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let mut outbuf = self.outbuf.take().unwrap();
|
|
||||||
outbuf.clear();
|
|
||||||
let mut printer = self.worker.args.printer(outbuf);
|
|
||||||
self.worker.do_work(&mut printer, work);
|
|
||||||
if self.quiet_matched.set_match(self.worker.match_count > 0) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
let outbuf = printer.into_inner();
|
|
||||||
if !outbuf.get_ref().is_empty() {
|
|
||||||
let mut out = self.out.lock().unwrap();
|
|
||||||
out.write(&outbuf);
|
|
||||||
}
|
|
||||||
self.outbuf = Some(outbuf);
|
|
||||||
}
|
|
||||||
self.worker.match_count
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Worker {
|
|
||||||
fn do_work<W: Terminal + Send>(
|
|
||||||
&mut self,
|
|
||||||
printer: &mut Printer<W>,
|
|
||||||
work: WorkReady,
|
|
||||||
) {
|
|
||||||
let result = match work {
|
|
||||||
WorkReady::Stdin => {
|
|
||||||
let stdin = io::stdin();
|
|
||||||
let stdin = stdin.lock();
|
|
||||||
self.search(printer, &Path::new("<stdin>"), stdin)
|
|
||||||
}
|
|
||||||
WorkReady::DirFile(ent, file) => {
|
|
||||||
let mut path = ent.path();
|
|
||||||
if let Some(p) = strip_prefix("./", path) {
|
|
||||||
path = p;
|
|
||||||
}
|
|
||||||
if self.args.mmap() {
|
|
||||||
self.search_mmap(printer, path, &file)
|
|
||||||
} else {
|
|
||||||
self.search(printer, path, file)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
match result {
|
|
||||||
Ok(count) => {
|
|
||||||
self.match_count += count;
|
|
||||||
}
|
|
||||||
Err(err) => {
|
|
||||||
eprintln!("{}", err);
|
eprintln!("{}", err);
|
||||||
}
|
}
|
||||||
|
None
|
||||||
}
|
}
|
||||||
}
|
Ok(dent) => {
|
||||||
|
if let Some(err) = dent.error() {
|
||||||
fn search<R: io::Read, W: Terminal + Send>(
|
if !no_messages {
|
||||||
&mut self,
|
eprintln!("{}", err);
|
||||||
printer: &mut Printer<W>,
|
}
|
||||||
path: &Path,
|
}
|
||||||
rdr: R,
|
if dent.file_type().is_none() {
|
||||||
) -> Result<u64> {
|
return Some(dent); // entry is stdin
|
||||||
self.args.searcher(
|
}
|
||||||
&mut self.inpbuf,
|
// A depth of 0 means the user gave the path explicitly, so we
|
||||||
printer,
|
// should always try to search it.
|
||||||
&self.grep,
|
if dent.depth() == 0 && !ignore_entry_is_dir(&dent) {
|
||||||
path,
|
return Some(dent);
|
||||||
rdr,
|
} else if !ignore_entry_is_file(&dent) {
|
||||||
).run().map_err(From::from)
|
return None;
|
||||||
}
|
}
|
||||||
|
// If we are redirecting stdout to a file, then don't search that
|
||||||
fn search_mmap<W: Terminal + Send>(
|
// file.
|
||||||
&mut self,
|
if !files_only && is_stdout_file(&dent, stdout_handle, no_messages) {
|
||||||
printer: &mut Printer<W>,
|
return None;
|
||||||
path: &Path,
|
}
|
||||||
file: &File,
|
Some(dent)
|
||||||
) -> Result<u64> {
|
|
||||||
if try!(file.metadata()).len() == 0 {
|
|
||||||
// Opening a memory map with an empty file results in an error.
|
|
||||||
// However, this may not actually be an empty file! For example,
|
|
||||||
// /proc/cpuinfo reports itself as an empty file, but it can
|
|
||||||
// produce data when it's read from. Therefore, we fall back to
|
|
||||||
// regular read calls.
|
|
||||||
return self.search(printer, path, file);
|
|
||||||
}
|
|
||||||
let mmap = try!(Mmap::open(file, Protection::Read));
|
|
||||||
Ok(self.args.searcher_buffer(
|
|
||||||
printer,
|
|
||||||
&self.grep,
|
|
||||||
path,
|
|
||||||
unsafe { mmap.as_slice() },
|
|
||||||
).run())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
struct QuietMatched(Arc<Option<AtomicBool>>);
|
|
||||||
|
|
||||||
impl QuietMatched {
|
|
||||||
fn new(quiet: bool) -> QuietMatched {
|
|
||||||
let atomic = if quiet { Some(AtomicBool::new(false)) } else { None };
|
|
||||||
QuietMatched(Arc::new(atomic))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn has_match(&self) -> bool {
|
|
||||||
match *self.0 {
|
|
||||||
None => false,
|
|
||||||
Some(ref matched) => matched.load(Ordering::SeqCst),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn set_match(&self, yes: bool) -> bool {
|
|
||||||
match *self.0 {
|
|
||||||
None => false,
|
|
||||||
Some(_) if !yes => false,
|
|
||||||
Some(ref m) => { m.store(true, Ordering::SeqCst); true }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns true if and only if the given `ignore::DirEntry` points to a
|
||||||
|
/// directory.
|
||||||
|
///
|
||||||
|
/// This works around a bug in Rust's standard library:
|
||||||
|
/// https://github.com/rust-lang/rust/issues/46484
|
||||||
|
#[cfg(windows)]
|
||||||
|
fn ignore_entry_is_dir(dent: &ignore::DirEntry) -> bool {
|
||||||
|
use std::os::windows::fs::MetadataExt;
|
||||||
|
use winapi::um::winnt::FILE_ATTRIBUTE_DIRECTORY;
|
||||||
|
|
||||||
|
dent.metadata().map(|md| {
|
||||||
|
md.file_attributes() & FILE_ATTRIBUTE_DIRECTORY != 0
|
||||||
|
}).unwrap_or(false)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if and only if the given `ignore::DirEntry` points to a
|
||||||
|
/// directory.
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
fn ignore_entry_is_dir(dent: &ignore::DirEntry) -> bool {
|
||||||
|
dent.file_type().map_or(false, |ft| ft.is_dir())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if and only if the given `ignore::DirEntry` points to a
|
||||||
|
/// file.
|
||||||
|
///
|
||||||
|
/// This works around a bug in Rust's standard library:
|
||||||
|
/// https://github.com/rust-lang/rust/issues/46484
|
||||||
|
#[cfg(windows)]
|
||||||
|
fn ignore_entry_is_file(dent: &ignore::DirEntry) -> bool {
|
||||||
|
!ignore_entry_is_dir(dent)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if and only if the given `ignore::DirEntry` points to a
|
||||||
|
/// file.
|
||||||
|
#[cfg(not(windows))]
|
||||||
|
fn ignore_entry_is_file(dent: &ignore::DirEntry) -> bool {
|
||||||
|
dent.file_type().map_or(false, |ft| ft.is_file())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn is_stdout_file(
|
||||||
|
dent: &ignore::DirEntry,
|
||||||
|
stdout_handle: Option<&same_file::Handle>,
|
||||||
|
no_messages: bool,
|
||||||
|
) -> bool {
|
||||||
|
let stdout_handle = match stdout_handle {
|
||||||
|
None => return false,
|
||||||
|
Some(stdout_handle) => stdout_handle,
|
||||||
|
};
|
||||||
|
// If we know for sure that these two things aren't equal, then avoid
|
||||||
|
// the costly extra stat call to determine equality.
|
||||||
|
if !maybe_dent_eq_handle(dent, stdout_handle) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
match same_file::Handle::from_path(dent.path()) {
|
||||||
|
Ok(h) => stdout_handle == &h,
|
||||||
|
Err(err) => {
|
||||||
|
if !no_messages {
|
||||||
|
eprintln!("{}: {}", dent.path().display(), err);
|
||||||
|
}
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn maybe_dent_eq_handle(
|
||||||
|
dent: &ignore::DirEntry,
|
||||||
|
handle: &same_file::Handle,
|
||||||
|
) -> bool {
|
||||||
|
dent.ino() == Some(handle.ino())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
fn maybe_dent_eq_handle(_: &ignore::DirEntry, _: &same_file::Handle) -> bool {
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
|
fn eprint_nothing_searched() {
|
||||||
|
eprintln!("No files were searched, which means ripgrep probably \
|
||||||
|
applied a filter you didn't expect. \
|
||||||
|
Try running again with --debug.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// The Rust standard library suppresses the default SIGPIPE behavior, so that
|
||||||
|
// writing to a closed pipe doesn't kill the process. The goal is to instead
|
||||||
|
// handle errors through the normal result mechanism. Ripgrep needs some
|
||||||
|
// refactoring before it will be able to do that, however, so we re-enable the
|
||||||
|
// standard SIGPIPE behavior as a workaround. See
|
||||||
|
// https://github.com/BurntSushi/ripgrep/issues/200.
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn reset_sigpipe() {
|
||||||
|
unsafe {
|
||||||
|
libc::signal(libc::SIGPIPE, libc::SIG_DFL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
fn reset_sigpipe() {
|
||||||
|
// no-op
|
||||||
|
}
|
||||||
|
|||||||
374
src/out.rs
374
src/out.rs
@@ -1,374 +0,0 @@
|
|||||||
use std::io::{self, Write};
|
|
||||||
|
|
||||||
use term::{self, Terminal};
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
use term::terminfo::TermInfo;
|
|
||||||
#[cfg(windows)]
|
|
||||||
use term::WinConsole;
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
use terminal_win::WindowsBuffer;
|
|
||||||
|
|
||||||
/// Out controls the actual output of all search results for a particular file
|
|
||||||
/// to the end user.
|
|
||||||
///
|
|
||||||
/// (The difference between Out and Printer is that a Printer works with
|
|
||||||
/// individual search results where as Out works with search results for each
|
|
||||||
/// file as a whole. For example, it knows when to print a file separator.)
|
|
||||||
pub struct Out {
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
term: ColoredTerminal<term::TerminfoTerminal<io::BufWriter<io::Stdout>>>,
|
|
||||||
#[cfg(windows)]
|
|
||||||
term: ColoredTerminal<WinConsole<io::Stdout>>,
|
|
||||||
printed: bool,
|
|
||||||
file_separator: Option<Vec<u8>>,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Out {
|
|
||||||
/// Create a new Out that writes to the wtr given.
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
pub fn new(color: bool) -> Out {
|
|
||||||
let wtr = io::BufWriter::new(io::stdout());
|
|
||||||
Out {
|
|
||||||
term: ColoredTerminal::new(wtr, color),
|
|
||||||
printed: false,
|
|
||||||
file_separator: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Create a new Out that writes to the wtr given.
|
|
||||||
#[cfg(windows)]
|
|
||||||
pub fn new(color: bool) -> Out {
|
|
||||||
Out {
|
|
||||||
term: ColoredTerminal::new_stdout(color),
|
|
||||||
printed: false,
|
|
||||||
file_separator: None,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// If set, the separator is printed between matches from different files.
|
|
||||||
/// By default, no separator is printed.
|
|
||||||
pub fn file_separator(mut self, sep: Vec<u8>) -> Out {
|
|
||||||
self.file_separator = Some(sep);
|
|
||||||
self
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Write the search results of a single file to the underlying wtr and
|
|
||||||
/// flush wtr.
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
pub fn write(
|
|
||||||
&mut self,
|
|
||||||
buf: &ColoredTerminal<term::TerminfoTerminal<Vec<u8>>>,
|
|
||||||
) {
|
|
||||||
self.write_sep();
|
|
||||||
match *buf {
|
|
||||||
ColoredTerminal::Colored(ref tt) => {
|
|
||||||
let _ = self.term.write_all(tt.get_ref());
|
|
||||||
}
|
|
||||||
ColoredTerminal::NoColor(ref buf) => {
|
|
||||||
let _ = self.term.write_all(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.write_done();
|
|
||||||
}
|
|
||||||
/// Write the search results of a single file to the underlying wtr and
|
|
||||||
/// flush wtr.
|
|
||||||
#[cfg(windows)]
|
|
||||||
pub fn write(
|
|
||||||
&mut self,
|
|
||||||
buf: &ColoredTerminal<WindowsBuffer>,
|
|
||||||
) {
|
|
||||||
self.write_sep();
|
|
||||||
match *buf {
|
|
||||||
ColoredTerminal::Colored(ref tt) => {
|
|
||||||
tt.print_stdout(&mut self.term);
|
|
||||||
}
|
|
||||||
ColoredTerminal::NoColor(ref buf) => {
|
|
||||||
let _ = self.term.write_all(buf);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
self.write_done();
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_sep(&mut self) {
|
|
||||||
if let Some(ref sep) = self.file_separator {
|
|
||||||
if self.printed {
|
|
||||||
let _ = self.term.write_all(sep);
|
|
||||||
let _ = self.term.write_all(b"\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_done(&mut self) {
|
|
||||||
let _ = self.term.flush();
|
|
||||||
self.printed = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// ColoredTerminal provides optional colored output through the term::Terminal
|
|
||||||
/// trait. In particular, it will dynamically configure itself to use coloring
|
|
||||||
/// if it's available in the environment.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub enum ColoredTerminal<T: Terminal + Send> {
|
|
||||||
Colored(T),
|
|
||||||
NoColor(T::Output),
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
impl<W: io::Write + Send> ColoredTerminal<term::TerminfoTerminal<W>> {
|
|
||||||
/// Create a new output buffer.
|
|
||||||
///
|
|
||||||
/// When color is true, the buffer will attempt to support coloring.
|
|
||||||
pub fn new(wtr: W, color: bool) -> Self {
|
|
||||||
lazy_static! {
|
|
||||||
// Only pay for parsing the terminfo once.
|
|
||||||
static ref TERMINFO: Option<TermInfo> = {
|
|
||||||
match TermInfo::from_env() {
|
|
||||||
Ok(info) => Some(info),
|
|
||||||
Err(err) => {
|
|
||||||
debug!("error loading terminfo for coloring: {}", err);
|
|
||||||
None
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// If we want color, build a term::TerminfoTerminal and see if the
|
|
||||||
// current environment supports coloring. If not, bail with NoColor. To
|
|
||||||
// avoid losing our writer (ownership), do this the long way.
|
|
||||||
if !color {
|
|
||||||
return ColoredTerminal::NoColor(wtr);
|
|
||||||
}
|
|
||||||
let terminfo = match *TERMINFO {
|
|
||||||
None => return ColoredTerminal::NoColor(wtr),
|
|
||||||
Some(ref ti) => {
|
|
||||||
// Ug, this should go away with the next release of `term`.
|
|
||||||
TermInfo {
|
|
||||||
names: ti.names.clone(),
|
|
||||||
bools: ti.bools.clone(),
|
|
||||||
numbers: ti.numbers.clone(),
|
|
||||||
strings: ti.strings.clone(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let tt = term::TerminfoTerminal::new_with_terminfo(wtr, terminfo);
|
|
||||||
if !tt.supports_color() {
|
|
||||||
debug!("environment doesn't support coloring");
|
|
||||||
return ColoredTerminal::NoColor(tt.into_inner());
|
|
||||||
}
|
|
||||||
ColoredTerminal::Colored(tt)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(windows))]
|
|
||||||
impl ColoredTerminal<term::TerminfoTerminal<Vec<u8>>> {
|
|
||||||
/// Clear the give buffer of all search results such that it is reusable
|
|
||||||
/// in another search.
|
|
||||||
pub fn clear(&mut self) {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref mut tt) => {
|
|
||||||
tt.get_mut().clear();
|
|
||||||
}
|
|
||||||
ColoredTerminal::NoColor(ref mut buf) => {
|
|
||||||
buf.clear();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
impl ColoredTerminal<WindowsBuffer> {
|
|
||||||
/// Create a new output buffer.
|
|
||||||
///
|
|
||||||
/// When color is true, the buffer will attempt to support coloring.
|
|
||||||
pub fn new_buffer(color: bool) -> Self {
|
|
||||||
if !color {
|
|
||||||
ColoredTerminal::NoColor(vec![])
|
|
||||||
} else {
|
|
||||||
ColoredTerminal::Colored(WindowsBuffer::new())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear the give buffer of all search results such that it is reusable
|
|
||||||
/// in another search.
|
|
||||||
pub fn clear(&mut self) {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref mut win) => win.clear(),
|
|
||||||
ColoredTerminal::NoColor(ref mut buf) => buf.clear(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(windows)]
|
|
||||||
impl ColoredTerminal<WinConsole<io::Stdout>> {
|
|
||||||
/// Create a new output buffer.
|
|
||||||
///
|
|
||||||
/// When color is true, the buffer will attempt to support coloring.
|
|
||||||
pub fn new_stdout(color: bool) -> Self {
|
|
||||||
if !color {
|
|
||||||
return ColoredTerminal::NoColor(io::stdout());
|
|
||||||
}
|
|
||||||
match WinConsole::new(io::stdout()) {
|
|
||||||
Ok(win) => ColoredTerminal::Colored(win),
|
|
||||||
Err(_) => ColoredTerminal::NoColor(io::stdout()),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Terminal + Send> ColoredTerminal<T> {
|
|
||||||
fn map_result<F>(
|
|
||||||
&mut self,
|
|
||||||
mut f: F,
|
|
||||||
) -> term::Result<()>
|
|
||||||
where F: FnMut(&mut T) -> term::Result<()> {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref mut w) => f(w),
|
|
||||||
ColoredTerminal::NoColor(_) => Err(term::Error::NotSupported),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn map_bool<F>(
|
|
||||||
&self,
|
|
||||||
mut f: F,
|
|
||||||
) -> bool
|
|
||||||
where F: FnMut(&T) -> bool {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref w) => f(w),
|
|
||||||
ColoredTerminal::NoColor(_) => false,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Terminal + Send> io::Write for ColoredTerminal<T> {
|
|
||||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref mut w) => w.write(buf),
|
|
||||||
ColoredTerminal::NoColor(ref mut w) => w.write(buf),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(&mut self) -> io::Result<()> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<T: Terminal + Send> term::Terminal for ColoredTerminal<T> {
|
|
||||||
type Output = T::Output;
|
|
||||||
|
|
||||||
fn fg(&mut self, fg: term::color::Color) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.fg(fg))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bg(&mut self, bg: term::color::Color) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.bg(bg))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn attr(&mut self, attr: term::Attr) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.attr(attr))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_attr(&self, attr: term::Attr) -> bool {
|
|
||||||
self.map_bool(|w| w.supports_attr(attr))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn reset(&mut self) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.reset())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_reset(&self) -> bool {
|
|
||||||
self.map_bool(|w| w.supports_reset())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_color(&self) -> bool {
|
|
||||||
self.map_bool(|w| w.supports_color())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn cursor_up(&mut self) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.cursor_up())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn delete_line(&mut self) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.delete_line())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn carriage_return(&mut self) -> term::Result<()> {
|
|
||||||
self.map_result(|w| w.carriage_return())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_ref(&self) -> &Self::Output {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref w) => w.get_ref(),
|
|
||||||
ColoredTerminal::NoColor(ref w) => w,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_mut(&mut self) -> &mut Self::Output {
|
|
||||||
match *self {
|
|
||||||
ColoredTerminal::Colored(ref mut w) => w.get_mut(),
|
|
||||||
ColoredTerminal::NoColor(ref mut w) => w,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn into_inner(self) -> Self::Output {
|
|
||||||
match self {
|
|
||||||
ColoredTerminal::Colored(w) => w.into_inner(),
|
|
||||||
ColoredTerminal::NoColor(w) => w,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<'a, T: Terminal + Send> term::Terminal for &'a mut ColoredTerminal<T> {
|
|
||||||
type Output = T::Output;
|
|
||||||
|
|
||||||
fn fg(&mut self, fg: term::color::Color) -> term::Result<()> {
|
|
||||||
(**self).fg(fg)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bg(&mut self, bg: term::color::Color) -> term::Result<()> {
|
|
||||||
(**self).bg(bg)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn attr(&mut self, attr: term::Attr) -> term::Result<()> {
|
|
||||||
(**self).attr(attr)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_attr(&self, attr: term::Attr) -> bool {
|
|
||||||
(**self).supports_attr(attr)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn reset(&mut self) -> term::Result<()> {
|
|
||||||
(**self).reset()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_reset(&self) -> bool {
|
|
||||||
(**self).supports_reset()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_color(&self) -> bool {
|
|
||||||
(**self).supports_color()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn cursor_up(&mut self) -> term::Result<()> {
|
|
||||||
(**self).cursor_up()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn delete_line(&mut self) -> term::Result<()> {
|
|
||||||
(**self).delete_line()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn carriage_return(&mut self) -> term::Result<()> {
|
|
||||||
(**self).carriage_return()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_ref(&self) -> &Self::Output {
|
|
||||||
(**self).get_ref()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_mut(&mut self) -> &mut Self::Output {
|
|
||||||
(**self).get_mut()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn into_inner(self) -> Self::Output {
|
|
||||||
// Good golly miss molly...
|
|
||||||
unimplemented!()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
/*!
|
/*!
|
||||||
The pathutil module provides platform specific operations on paths that are
|
The pathutil module provides platform specific operations on paths that are
|
||||||
typically faster than the same operations as provided in std::path. In
|
typically faster than the same operations as provided in `std::path`. In
|
||||||
particular, we really want to avoid the costly operation of parsing the path
|
particular, we really want to avoid the costly operation of parsing the path
|
||||||
into its constituent components. We give up on Windows, but on Unix, we deal
|
into its constituent components. We give up on Windows, but on Unix, we deal
|
||||||
with the raw bytes directly.
|
with the raw bytes directly.
|
||||||
@@ -26,7 +26,7 @@ pub fn strip_prefix<'a, P: AsRef<Path> + ?Sized>(
|
|||||||
if prefix.len() > path.len() || prefix != &path[0..prefix.len()] {
|
if prefix.len() > path.len() || prefix != &path[0..prefix.len()] {
|
||||||
None
|
None
|
||||||
} else {
|
} else {
|
||||||
Some(&Path::new(OsStr::from_bytes(&path[prefix.len()..])))
|
Some(Path::new(OsStr::from_bytes(&path[prefix.len()..])))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
766
src/printer.rs
766
src/printer.rs
@@ -1,12 +1,63 @@
|
|||||||
|
use std::error;
|
||||||
|
use std::fmt;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
use std::str::FromStr;
|
||||||
|
|
||||||
use regex::bytes::Regex;
|
use regex::bytes::{Captures, Match, Regex, Replacer};
|
||||||
use term::{Attr, Terminal};
|
use termcolor::{Color, ColorSpec, ParseColorError, WriteColor};
|
||||||
use term::color;
|
|
||||||
|
|
||||||
use pathutil::strip_prefix;
|
use pathutil::strip_prefix;
|
||||||
use ignore::types::FileTypeDef;
|
use ignore::types::FileTypeDef;
|
||||||
|
|
||||||
|
/// Track the start and end of replacements to allow coloring them on output.
|
||||||
|
#[derive(Debug)]
|
||||||
|
struct Offset {
|
||||||
|
start: usize,
|
||||||
|
end: usize,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Offset {
|
||||||
|
fn new(start: usize, end: usize) -> Offset {
|
||||||
|
Offset { start: start, end: end }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'m, 'r> From<&'m Match<'r>> for Offset {
|
||||||
|
fn from(m: &'m Match<'r>) -> Self {
|
||||||
|
Offset{ start: m.start(), end: m.end() }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// `CountingReplacer` implements the Replacer interface for Regex,
|
||||||
|
/// and counts how often replacement is being performed.
|
||||||
|
struct CountingReplacer<'r> {
|
||||||
|
replace: &'r [u8],
|
||||||
|
count: &'r mut usize,
|
||||||
|
offsets: &'r mut Vec<Offset>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'r> CountingReplacer<'r> {
|
||||||
|
fn new(
|
||||||
|
replace: &'r [u8],
|
||||||
|
count: &'r mut usize,
|
||||||
|
offsets: &'r mut Vec<Offset>,
|
||||||
|
) -> CountingReplacer<'r> {
|
||||||
|
CountingReplacer { replace: replace, count: count, offsets: offsets, }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'r> Replacer for CountingReplacer<'r> {
|
||||||
|
fn replace_append(&mut self, caps: &Captures, dst: &mut Vec<u8>) {
|
||||||
|
*self.count += 1;
|
||||||
|
let start = dst.len();
|
||||||
|
caps.expand(self.replace, dst);
|
||||||
|
let end = dst.len();
|
||||||
|
if start != end {
|
||||||
|
self.offsets.push(Offset::new(start, end));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Printer encapsulates all output logic for searching.
|
/// Printer encapsulates all output logic for searching.
|
||||||
///
|
///
|
||||||
/// Note that we currently ignore all write errors. It's probably worthwhile
|
/// Note that we currently ignore all write errors. It's probably worthwhile
|
||||||
@@ -36,42 +87,26 @@ pub struct Printer<W> {
|
|||||||
/// Whether to print NUL bytes after a file path instead of new lines
|
/// Whether to print NUL bytes after a file path instead of new lines
|
||||||
/// or `:`.
|
/// or `:`.
|
||||||
null: bool,
|
null: bool,
|
||||||
|
/// Print only the matched (non-empty) parts of a matching line
|
||||||
|
only_matching: bool,
|
||||||
/// A string to use as a replacement of each match in a matching line.
|
/// A string to use as a replacement of each match in a matching line.
|
||||||
replace: Option<Vec<u8>>,
|
replace: Option<Vec<u8>>,
|
||||||
/// Whether to prefix each match with the corresponding file name.
|
/// Whether to prefix each match with the corresponding file name.
|
||||||
with_filename: bool,
|
with_filename: bool,
|
||||||
/// The choice of colors.
|
/// The color specifications.
|
||||||
color_choice: ColorChoice
|
colors: ColorSpecs,
|
||||||
|
/// The separator to use for file paths. If empty, this is ignored.
|
||||||
|
path_separator: Option<u8>,
|
||||||
|
/// Restrict lines to this many columns.
|
||||||
|
max_columns: Option<usize>,
|
||||||
|
/// Width of line number displayed. If the number of digits in the
|
||||||
|
/// line number is less than this, it is left padded with
|
||||||
|
/// spaces.
|
||||||
|
line_number_width: Option<usize>
|
||||||
}
|
}
|
||||||
|
|
||||||
struct ColorChoice {
|
impl<W: WriteColor> Printer<W> {
|
||||||
matched_line: color::Color,
|
/// Create a new printer that writes to wtr with the given color settings.
|
||||||
heading: color::Color,
|
|
||||||
line_number: color::Color
|
|
||||||
}
|
|
||||||
|
|
||||||
impl ColorChoice {
|
|
||||||
#[cfg(unix)]
|
|
||||||
pub fn new() -> ColorChoice {
|
|
||||||
ColorChoice {
|
|
||||||
matched_line: color::RED,
|
|
||||||
heading: color::GREEN,
|
|
||||||
line_number: color::BLUE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(not(unix))]
|
|
||||||
pub fn new() -> ColorChoice {
|
|
||||||
ColorChoice {
|
|
||||||
matched_line: color::BRIGHT_RED,
|
|
||||||
heading: color::BRIGHT_GREEN,
|
|
||||||
line_number: color::BRIGHT_BLUE
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl<W: Terminal + Send> Printer<W> {
|
|
||||||
/// Create a new printer that writes to wtr.
|
|
||||||
pub fn new(wtr: W) -> Printer<W> {
|
pub fn new(wtr: W) -> Printer<W> {
|
||||||
Printer {
|
Printer {
|
||||||
wtr: wtr,
|
wtr: wtr,
|
||||||
@@ -83,12 +118,22 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
heading: false,
|
heading: false,
|
||||||
line_per_match: false,
|
line_per_match: false,
|
||||||
null: false,
|
null: false,
|
||||||
|
only_matching: false,
|
||||||
replace: None,
|
replace: None,
|
||||||
with_filename: false,
|
with_filename: false,
|
||||||
color_choice: ColorChoice::new()
|
colors: ColorSpecs::default(),
|
||||||
|
path_separator: None,
|
||||||
|
max_columns: None,
|
||||||
|
line_number_width: None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Set the color specifications.
|
||||||
|
pub fn colors(mut self, colors: ColorSpecs) -> Printer<W> {
|
||||||
|
self.colors = colors;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// When set, column numbers will be printed for the first match on each
|
/// When set, column numbers will be printed for the first match on each
|
||||||
/// line.
|
/// line.
|
||||||
pub fn column(mut self, yes: bool) -> Printer<W> {
|
pub fn column(mut self, yes: bool) -> Printer<W> {
|
||||||
@@ -136,11 +181,21 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Print only the matched (non-empty) parts of a matching line
|
||||||
|
pub fn only_matching(mut self, yes: bool) -> Printer<W> {
|
||||||
|
self.only_matching = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A separator to use when printing file paths. When empty, use the
|
||||||
|
/// default separator for the current platform. (/ on Unix, \ on Windows.)
|
||||||
|
pub fn path_separator(mut self, sep: Option<u8>) -> Printer<W> {
|
||||||
|
self.path_separator = sep;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Replace every match in each matching line with the replacement string
|
/// Replace every match in each matching line with the replacement string
|
||||||
/// given.
|
/// given.
|
||||||
///
|
|
||||||
/// The replacement string syntax is documented here:
|
|
||||||
/// https://doc.rust-lang.org/regex/regex/bytes/struct.Captures.html#method.expand
|
|
||||||
pub fn replace(mut self, replacement: Vec<u8>) -> Printer<W> {
|
pub fn replace(mut self, replacement: Vec<u8>) -> Printer<W> {
|
||||||
self.replace = Some(replacement);
|
self.replace = Some(replacement);
|
||||||
self
|
self
|
||||||
@@ -152,12 +207,25 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Configure the max. number of columns used for printing matching lines.
|
||||||
|
pub fn max_columns(mut self, max_columns: Option<usize>) -> Printer<W> {
|
||||||
|
self.max_columns = max_columns;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Configure the width of the displayed line number
|
||||||
|
pub fn line_number_width(mut self, line_number_width: Option<usize>) -> Printer<W> {
|
||||||
|
self.line_number_width = line_number_width;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns true if and only if something has been printed.
|
/// Returns true if and only if something has been printed.
|
||||||
pub fn has_printed(&self) -> bool {
|
pub fn has_printed(&self) -> bool {
|
||||||
self.has_printed
|
self.has_printed
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Flushes the underlying writer and returns it.
|
/// Flushes the underlying writer and returns it.
|
||||||
|
#[allow(dead_code)]
|
||||||
pub fn into_inner(mut self) -> W {
|
pub fn into_inner(mut self) -> W {
|
||||||
let _ = self.wtr.flush();
|
let _ = self.wtr.flush();
|
||||||
self.wtr
|
self.wtr
|
||||||
@@ -182,22 +250,14 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
pub fn path<P: AsRef<Path>>(&mut self, path: P) {
|
pub fn path<P: AsRef<Path>>(&mut self, path: P) {
|
||||||
let path = strip_prefix("./", path.as_ref()).unwrap_or(path.as_ref());
|
let path = strip_prefix("./", path.as_ref()).unwrap_or(path.as_ref());
|
||||||
self.write_path(path);
|
self.write_path(path);
|
||||||
if self.null {
|
self.write_path_eol();
|
||||||
self.write(b"\x00");
|
|
||||||
} else {
|
|
||||||
self.write_eol();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Prints the given path and a count of the number of matches found.
|
/// Prints the given path and a count of the number of matches found.
|
||||||
pub fn path_count<P: AsRef<Path>>(&mut self, path: P, count: u64) {
|
pub fn path_count<P: AsRef<Path>>(&mut self, path: P, count: u64) {
|
||||||
if self.with_filename {
|
if self.with_filename {
|
||||||
self.write_path(path);
|
self.write_path(path);
|
||||||
if self.null {
|
self.write_path_sep(b':');
|
||||||
self.write(b"\x00");
|
|
||||||
} else {
|
|
||||||
self.write(b":");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
self.write(count.to_string().as_bytes());
|
self.write(count.to_string().as_bytes());
|
||||||
self.write_eol();
|
self.write_eol();
|
||||||
@@ -205,13 +265,11 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
|
|
||||||
/// Prints the context separator.
|
/// Prints the context separator.
|
||||||
pub fn context_separate(&mut self) {
|
pub fn context_separate(&mut self) {
|
||||||
// N.B. We can't use `write` here because of borrowing restrictions.
|
|
||||||
if self.context_separator.is_empty() {
|
if self.context_separator.is_empty() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
self.has_printed = true;
|
|
||||||
let _ = self.wtr.write_all(&self.context_separator);
|
let _ = self.wtr.write_all(&self.context_separator);
|
||||||
let _ = self.wtr.write_all(&[self.eol]);
|
self.write_eol();
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn matched<P: AsRef<Path>>(
|
pub fn matched<P: AsRef<Path>>(
|
||||||
@@ -223,21 +281,18 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
end: usize,
|
end: usize,
|
||||||
line_number: Option<u64>,
|
line_number: Option<u64>,
|
||||||
) {
|
) {
|
||||||
if !self.line_per_match {
|
if !self.line_per_match && !self.only_matching {
|
||||||
let column =
|
let mat = re
|
||||||
if self.column {
|
.find(&buf[start..end])
|
||||||
Some(re.find(&buf[start..end])
|
.map(|m| (m.start(), m.end()))
|
||||||
.map(|(s, _)| s).unwrap_or(0) as u64)
|
.unwrap_or((0, 0));
|
||||||
} else {
|
|
||||||
None
|
|
||||||
};
|
|
||||||
return self.write_match(
|
return self.write_match(
|
||||||
re, path, buf, start, end, line_number, column);
|
re, path, buf, start, end, line_number, mat.0, mat.1);
|
||||||
}
|
}
|
||||||
for (s, _) in re.find_iter(&buf[start..end]) {
|
for m in re.find_iter(&buf[start..end]) {
|
||||||
let column = if self.column { Some(s as u64) } else { None };
|
|
||||||
self.write_match(
|
self.write_match(
|
||||||
re, path.as_ref(), buf, start, end, line_number, column);
|
re, path.as_ref(), buf, start, end,
|
||||||
|
line_number, m.start(), m.end());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -249,48 +304,88 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
start: usize,
|
start: usize,
|
||||||
end: usize,
|
end: usize,
|
||||||
line_number: Option<u64>,
|
line_number: Option<u64>,
|
||||||
column: Option<u64>,
|
match_start: usize,
|
||||||
|
match_end: usize,
|
||||||
) {
|
) {
|
||||||
if self.heading && self.with_filename && !self.has_printed {
|
if self.heading && self.with_filename && !self.has_printed {
|
||||||
self.write_file_sep();
|
self.write_file_sep();
|
||||||
self.write_heading(path.as_ref());
|
self.write_path(path);
|
||||||
|
self.write_path_eol();
|
||||||
} else if !self.heading && self.with_filename {
|
} else if !self.heading && self.with_filename {
|
||||||
self.write_non_heading_path(path.as_ref());
|
self.write_path(path);
|
||||||
|
self.write_path_sep(b':');
|
||||||
}
|
}
|
||||||
if let Some(line_number) = line_number {
|
if let Some(line_number) = line_number {
|
||||||
self.line_number(line_number, b':');
|
self.line_number(line_number, b':');
|
||||||
}
|
}
|
||||||
if let Some(c) = column {
|
if self.column {
|
||||||
self.write((c + 1).to_string().as_bytes());
|
self.column_number(match_start as u64 + 1, b':');
|
||||||
self.write(b":");
|
|
||||||
}
|
}
|
||||||
if self.replace.is_some() {
|
if self.replace.is_some() {
|
||||||
let line = re.replace_all(
|
let mut count = 0;
|
||||||
&buf[start..end], &**self.replace.as_ref().unwrap());
|
let mut offsets = Vec::new();
|
||||||
self.write(&line);
|
let line = {
|
||||||
|
let replacer = CountingReplacer::new(
|
||||||
|
self.replace.as_ref().unwrap(), &mut count, &mut offsets);
|
||||||
|
if self.only_matching {
|
||||||
|
re.replace_all(
|
||||||
|
&buf[start + match_start..start + match_end], replacer)
|
||||||
|
} else {
|
||||||
|
re.replace_all(&buf[start..end], replacer)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if self.max_columns.map_or(false, |m| line.len() > m) {
|
||||||
|
let msg = format!(
|
||||||
|
"[Omitted long line with {} replacements]", count);
|
||||||
|
self.write_colored(msg.as_bytes(), |colors| colors.matched());
|
||||||
|
self.write_eol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
self.write_matched_line(offsets, &*line, false);
|
||||||
} else {
|
} else {
|
||||||
self.write_matched_line(re, &buf[start..end]);
|
let buf = if self.only_matching {
|
||||||
}
|
&buf[start + match_start..start + match_end]
|
||||||
if buf[start..end].last() != Some(&self.eol) {
|
} else {
|
||||||
self.write_eol();
|
&buf[start..end]
|
||||||
|
};
|
||||||
|
if self.max_columns.map_or(false, |m| buf.len() > m) {
|
||||||
|
let count = re.find_iter(buf).count();
|
||||||
|
let msg = format!("[Omitted long line with {} matches]", count);
|
||||||
|
self.write_colored(msg.as_bytes(), |colors| colors.matched());
|
||||||
|
self.write_eol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let only_match = self.only_matching;
|
||||||
|
self.write_matched_line(
|
||||||
|
re.find_iter(buf).map(|x| Offset::from(&x)), buf, only_match);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_matched_line(&mut self, re: &Regex, buf: &[u8]) {
|
fn write_matched_line<I>(&mut self, offsets: I, buf: &[u8], only_match: bool)
|
||||||
if !self.wtr.supports_color() {
|
where I: IntoIterator<Item=Offset>,
|
||||||
|
{
|
||||||
|
if !self.wtr.supports_color() || self.colors.matched().is_none() {
|
||||||
self.write(buf);
|
self.write(buf);
|
||||||
return;
|
} else if only_match {
|
||||||
|
self.write_colored(buf, |colors| colors.matched());
|
||||||
|
} else {
|
||||||
|
let mut last_written = 0;
|
||||||
|
for o in offsets {
|
||||||
|
self.write(&buf[last_written..o.start]);
|
||||||
|
// This conditional checks if the match is both empty *and*
|
||||||
|
// past the end of the line. In this case, we never want to
|
||||||
|
// emit an additional color escape.
|
||||||
|
if o.start != o.end || o.end != buf.len() {
|
||||||
|
self.write_colored(
|
||||||
|
&buf[o.start..o.end], |colors| colors.matched());
|
||||||
|
}
|
||||||
|
last_written = o.end;
|
||||||
|
}
|
||||||
|
self.write(&buf[last_written..]);
|
||||||
}
|
}
|
||||||
let mut last_written = 0;
|
if buf.last() != Some(&self.eol) {
|
||||||
for (s, e) in re.find_iter(buf) {
|
self.write_eol();
|
||||||
self.write(&buf[last_written..s]);
|
|
||||||
let _ = self.wtr.fg(self.color_choice.matched_line);
|
|
||||||
let _ = self.wtr.attr(Attr::Bold);
|
|
||||||
self.write(&buf[s..e]);
|
|
||||||
let _ = self.wtr.reset();
|
|
||||||
last_written = e;
|
|
||||||
}
|
}
|
||||||
self.write(&buf[last_written..]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn context<P: AsRef<Path>>(
|
pub fn context<P: AsRef<Path>>(
|
||||||
@@ -303,79 +398,87 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
) {
|
) {
|
||||||
if self.heading && self.with_filename && !self.has_printed {
|
if self.heading && self.with_filename && !self.has_printed {
|
||||||
self.write_file_sep();
|
self.write_file_sep();
|
||||||
self.write_heading(path.as_ref());
|
self.write_path(path);
|
||||||
|
self.write_path_eol();
|
||||||
} else if !self.heading && self.with_filename {
|
} else if !self.heading && self.with_filename {
|
||||||
self.write_path(path.as_ref());
|
self.write_path(path);
|
||||||
if self.null {
|
self.write_path_sep(b'-');
|
||||||
self.write(b"\x00");
|
|
||||||
} else {
|
|
||||||
self.write(b"-");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
if let Some(line_number) = line_number {
|
if let Some(line_number) = line_number {
|
||||||
self.line_number(line_number, b'-');
|
self.line_number(line_number, b'-');
|
||||||
}
|
}
|
||||||
|
if self.max_columns.map_or(false, |m| end - start > m) {
|
||||||
|
self.write(b"[Omitted long context line]");
|
||||||
|
self.write_eol();
|
||||||
|
return;
|
||||||
|
}
|
||||||
self.write(&buf[start..end]);
|
self.write(&buf[start..end]);
|
||||||
if buf[start..end].last() != Some(&self.eol) {
|
if buf[start..end].last() != Some(&self.eol) {
|
||||||
self.write_eol();
|
self.write_eol();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_heading<P: AsRef<Path>>(&mut self, path: P) {
|
fn separator(&mut self, sep: &[u8]) {
|
||||||
if self.wtr.supports_color() {
|
self.write(sep);
|
||||||
let _ = self.wtr.fg(self.color_choice.heading);
|
}
|
||||||
let _ = self.wtr.attr(Attr::Bold);
|
|
||||||
|
fn write_path_sep(&mut self, sep: u8) {
|
||||||
|
if self.null {
|
||||||
|
self.write(b"\x00");
|
||||||
|
} else {
|
||||||
|
self.separator(&[sep]);
|
||||||
}
|
}
|
||||||
self.write_path(path.as_ref());
|
}
|
||||||
|
|
||||||
|
fn write_path_eol(&mut self) {
|
||||||
if self.null {
|
if self.null {
|
||||||
self.write(b"\x00");
|
self.write(b"\x00");
|
||||||
} else {
|
} else {
|
||||||
self.write_eol();
|
self.write_eol();
|
||||||
}
|
}
|
||||||
if self.wtr.supports_color() {
|
|
||||||
let _ = self.wtr.reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn write_non_heading_path<P: AsRef<Path>>(&mut self, path: P) {
|
|
||||||
if self.wtr.supports_color() {
|
|
||||||
let _ = self.wtr.fg(self.color_choice.heading);
|
|
||||||
let _ = self.wtr.attr(Attr::Bold);
|
|
||||||
}
|
|
||||||
self.write_path(path.as_ref());
|
|
||||||
if self.wtr.supports_color() {
|
|
||||||
let _ = self.wtr.reset();
|
|
||||||
}
|
|
||||||
if self.null {
|
|
||||||
self.write(b"\x00");
|
|
||||||
} else {
|
|
||||||
self.write(b":");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn line_number(&mut self, n: u64, sep: u8) {
|
|
||||||
if self.wtr.supports_color() {
|
|
||||||
let _ = self.wtr.fg(self.color_choice.line_number);
|
|
||||||
let _ = self.wtr.attr(Attr::Bold);
|
|
||||||
}
|
|
||||||
self.write(n.to_string().as_bytes());
|
|
||||||
if self.wtr.supports_color() {
|
|
||||||
let _ = self.wtr.reset();
|
|
||||||
}
|
|
||||||
self.write(&[sep]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(unix)]
|
#[cfg(unix)]
|
||||||
fn write_path<P: AsRef<Path>>(&mut self, path: P) {
|
fn write_path<P: AsRef<Path>>(&mut self, path: P) {
|
||||||
use std::os::unix::ffi::OsStrExt;
|
use std::os::unix::ffi::OsStrExt;
|
||||||
|
|
||||||
let path = path.as_ref().as_os_str().as_bytes();
|
let path = path.as_ref().as_os_str().as_bytes();
|
||||||
self.write(path);
|
self.write_path_replace_separator(path);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(unix))]
|
#[cfg(not(unix))]
|
||||||
fn write_path<P: AsRef<Path>>(&mut self, path: P) {
|
fn write_path<P: AsRef<Path>>(&mut self, path: P) {
|
||||||
self.write(path.as_ref().to_string_lossy().as_bytes());
|
let path = path.as_ref().to_string_lossy();
|
||||||
|
self.write_path_replace_separator(path.as_bytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
fn write_path_replace_separator(&mut self, path: &[u8]) {
|
||||||
|
match self.path_separator {
|
||||||
|
None => self.write_colored(path, |colors| colors.path()),
|
||||||
|
Some(sep) => {
|
||||||
|
let transformed_path: Vec<_> = path.iter().map(|&b| {
|
||||||
|
if b == b'/' || (cfg!(windows) && b == b'\\') {
|
||||||
|
sep
|
||||||
|
} else {
|
||||||
|
b
|
||||||
|
}
|
||||||
|
}).collect();
|
||||||
|
self.write_colored(&transformed_path, |colors| colors.path());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn line_number(&mut self, n: u64, sep: u8) {
|
||||||
|
let mut line_number = n.to_string();
|
||||||
|
if let Some(width) = self.line_number_width {
|
||||||
|
line_number = format!("{:>width$}", line_number, width = width);
|
||||||
|
}
|
||||||
|
self.write_colored(line_number.as_bytes(), |colors| colors.line());
|
||||||
|
self.separator(&[sep]);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn column_number(&mut self, n: u64, sep: u8) {
|
||||||
|
self.write_colored(n.to_string().as_bytes(), |colors| colors.column());
|
||||||
|
self.separator(&[sep]);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write(&mut self, buf: &[u8]) {
|
fn write(&mut self, buf: &[u8]) {
|
||||||
@@ -388,6 +491,14 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
self.write(&[eol]);
|
self.write(&[eol]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn write_colored<F>(&mut self, buf: &[u8], get_color: F)
|
||||||
|
where F: Fn(&ColorSpecs) -> &ColorSpec
|
||||||
|
{
|
||||||
|
let _ = self.wtr.set_color(get_color(&self.colors));
|
||||||
|
self.write(buf);
|
||||||
|
let _ = self.wtr.reset();
|
||||||
|
}
|
||||||
|
|
||||||
fn write_file_sep(&mut self) {
|
fn write_file_sep(&mut self) {
|
||||||
if let Some(ref sep) = self.file_separator {
|
if let Some(ref sep) = self.file_separator {
|
||||||
self.has_printed = true;
|
self.has_printed = true;
|
||||||
@@ -396,3 +507,392 @@ impl<W: Terminal + Send> Printer<W> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// An error that can occur when parsing color specifications.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub enum Error {
|
||||||
|
/// This occurs when an unrecognized output type is used.
|
||||||
|
UnrecognizedOutType(String),
|
||||||
|
/// This occurs when an unrecognized spec type is used.
|
||||||
|
UnrecognizedSpecType(String),
|
||||||
|
/// This occurs when an unrecognized color name is used.
|
||||||
|
UnrecognizedColor(String, String),
|
||||||
|
/// This occurs when an unrecognized style attribute is used.
|
||||||
|
UnrecognizedStyle(String),
|
||||||
|
/// This occurs when the format of a color specification is invalid.
|
||||||
|
InvalidFormat(String),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl error::Error for Error {
|
||||||
|
fn description(&self) -> &str {
|
||||||
|
match *self {
|
||||||
|
Error::UnrecognizedOutType(_) => "unrecognized output type",
|
||||||
|
Error::UnrecognizedSpecType(_) => "unrecognized spec type",
|
||||||
|
Error::UnrecognizedColor(_, _) => "unrecognized color name",
|
||||||
|
Error::UnrecognizedStyle(_) => "unrecognized style attribute",
|
||||||
|
Error::InvalidFormat(_) => "invalid color spec",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn cause(&self) -> Option<&error::Error> {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Error {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
|
||||||
|
match *self {
|
||||||
|
Error::UnrecognizedOutType(ref name) => {
|
||||||
|
write!(f, "Unrecognized output type '{}'. Choose from: \
|
||||||
|
path, line, column, match.", name)
|
||||||
|
}
|
||||||
|
Error::UnrecognizedSpecType(ref name) => {
|
||||||
|
write!(f, "Unrecognized spec type '{}'. Choose from: \
|
||||||
|
fg, bg, style, none.", name)
|
||||||
|
}
|
||||||
|
Error::UnrecognizedColor(_, ref msg) => {
|
||||||
|
write!(f, "{}", msg)
|
||||||
|
}
|
||||||
|
Error::UnrecognizedStyle(ref name) => {
|
||||||
|
write!(f, "Unrecognized style attribute '{}'. Choose from: \
|
||||||
|
nobold, bold, nointense, intense.", name)
|
||||||
|
}
|
||||||
|
Error::InvalidFormat(ref original) => {
|
||||||
|
write!(
|
||||||
|
f,
|
||||||
|
"Invalid color spec format: '{}'. Valid format \
|
||||||
|
is '(path|line|column|match):(fg|bg|style):(value)'.",
|
||||||
|
original)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl From<ParseColorError> for Error {
|
||||||
|
fn from(err: ParseColorError) -> Error {
|
||||||
|
Error::UnrecognizedColor(err.invalid().to_string(), err.to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A merged set of color specifications.
|
||||||
|
#[derive(Clone, Debug, Default, Eq, PartialEq)]
|
||||||
|
pub struct ColorSpecs {
|
||||||
|
path: ColorSpec,
|
||||||
|
line: ColorSpec,
|
||||||
|
column: ColorSpec,
|
||||||
|
matched: ColorSpec,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A single color specification provided by the user.
|
||||||
|
///
|
||||||
|
/// A `ColorSpecs` can be built by merging a sequence of `Spec`s.
|
||||||
|
///
|
||||||
|
/// ## Example
|
||||||
|
///
|
||||||
|
/// The only way to build a `Spec` is to parse it from a string. Once multiple
|
||||||
|
/// `Spec`s have been constructed, then can be merged into a single
|
||||||
|
/// `ColorSpecs` value.
|
||||||
|
///
|
||||||
|
/// ```rust
|
||||||
|
/// use termcolor::{Color, ColorSpecs, Spec};
|
||||||
|
///
|
||||||
|
/// let spec1: Spec = "path:fg:blue".parse().unwrap();
|
||||||
|
/// let spec2: Spec = "match:bg:green".parse().unwrap();
|
||||||
|
/// let specs = ColorSpecs::new(&[spec1, spec2]);
|
||||||
|
///
|
||||||
|
/// assert_eq!(specs.path().fg(), Some(Color::Blue));
|
||||||
|
/// assert_eq!(specs.matched().bg(), Some(Color::Green));
|
||||||
|
/// ```
|
||||||
|
///
|
||||||
|
/// ## Format
|
||||||
|
///
|
||||||
|
/// The format of a `Spec` is a triple: `{type}:{attribute}:{value}`. Each
|
||||||
|
/// component is defined as follows:
|
||||||
|
///
|
||||||
|
/// * `{type}` can be one of `path`, `line`, `column` or `match`.
|
||||||
|
/// * `{attribute}` can be one of `fg`, `bg` or `style`. `{attribute}` may also
|
||||||
|
/// be the special value `none`, in which case, `{value}` can be omitted.
|
||||||
|
/// * `{value}` is either a color name (for `fg`/`bg`) or a style instruction.
|
||||||
|
///
|
||||||
|
/// `{type}` controls which part of the output should be styled and is
|
||||||
|
/// application dependent.
|
||||||
|
///
|
||||||
|
/// When `{attribute}` is `none`, then this should cause any existing color
|
||||||
|
/// settings to be cleared.
|
||||||
|
///
|
||||||
|
/// `{value}` should be a color when `{attribute}` is `fg` or `bg`, or it
|
||||||
|
/// should be a style instruction when `{attribute}` is `style`. When
|
||||||
|
/// `{attribute}` is `none`, `{value}` must be omitted.
|
||||||
|
///
|
||||||
|
/// Valid colors are `black`, `blue`, `green`, `red`, `cyan`, `magenta`,
|
||||||
|
/// `yellow`, `white`.
|
||||||
|
///
|
||||||
|
/// Valid style instructions are `nobold`, `bold`, `intense`, `nointense`.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
pub struct Spec {
|
||||||
|
ty: OutType,
|
||||||
|
value: SpecValue,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The actual value given by the specification.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
enum SpecValue {
|
||||||
|
None,
|
||||||
|
Fg(Color),
|
||||||
|
Bg(Color),
|
||||||
|
Style(Style),
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The set of configurable portions of ripgrep's output.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
enum OutType {
|
||||||
|
Path,
|
||||||
|
Line,
|
||||||
|
Column,
|
||||||
|
Match,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The specification type.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
enum SpecType {
|
||||||
|
Fg,
|
||||||
|
Bg,
|
||||||
|
Style,
|
||||||
|
None,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The set of available styles for use in the terminal.
|
||||||
|
#[derive(Clone, Debug, Eq, PartialEq)]
|
||||||
|
enum Style {
|
||||||
|
Bold,
|
||||||
|
NoBold,
|
||||||
|
Intense,
|
||||||
|
NoIntense,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl ColorSpecs {
|
||||||
|
/// Create color specifications from a list of user supplied
|
||||||
|
/// specifications.
|
||||||
|
pub fn new(user_specs: &[Spec]) -> ColorSpecs {
|
||||||
|
let mut specs = ColorSpecs::default();
|
||||||
|
for user_spec in user_specs {
|
||||||
|
match user_spec.ty {
|
||||||
|
OutType::Path => user_spec.merge_into(&mut specs.path),
|
||||||
|
OutType::Line => user_spec.merge_into(&mut specs.line),
|
||||||
|
OutType::Column => user_spec.merge_into(&mut specs.column),
|
||||||
|
OutType::Match => user_spec.merge_into(&mut specs.matched),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
specs
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the color specification for coloring file paths.
|
||||||
|
fn path(&self) -> &ColorSpec {
|
||||||
|
&self.path
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the color specification for coloring line numbers.
|
||||||
|
fn line(&self) -> &ColorSpec {
|
||||||
|
&self.line
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the color specification for coloring column numbers.
|
||||||
|
fn column(&self) -> &ColorSpec {
|
||||||
|
&self.column
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Return the color specification for coloring matched text.
|
||||||
|
fn matched(&self) -> &ColorSpec {
|
||||||
|
&self.matched
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Spec {
|
||||||
|
/// Merge this spec into the given color specification.
|
||||||
|
fn merge_into(&self, cspec: &mut ColorSpec) {
|
||||||
|
self.value.merge_into(cspec);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SpecValue {
|
||||||
|
/// Merge this spec value into the given color specification.
|
||||||
|
fn merge_into(&self, cspec: &mut ColorSpec) {
|
||||||
|
match *self {
|
||||||
|
SpecValue::None => cspec.clear(),
|
||||||
|
SpecValue::Fg(ref color) => { cspec.set_fg(Some(color.clone())); }
|
||||||
|
SpecValue::Bg(ref color) => { cspec.set_bg(Some(color.clone())); }
|
||||||
|
SpecValue::Style(ref style) => {
|
||||||
|
match *style {
|
||||||
|
Style::Bold => { cspec.set_bold(true); }
|
||||||
|
Style::NoBold => { cspec.set_bold(false); }
|
||||||
|
Style::Intense => { cspec.set_intense(true); }
|
||||||
|
Style::NoIntense => { cspec.set_intense(false); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Spec {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Spec, Error> {
|
||||||
|
let pieces: Vec<&str> = s.split(':').collect();
|
||||||
|
if pieces.len() <= 1 || pieces.len() > 3 {
|
||||||
|
return Err(Error::InvalidFormat(s.to_string()));
|
||||||
|
}
|
||||||
|
let otype: OutType = pieces[0].parse()?;
|
||||||
|
match pieces[1].parse()? {
|
||||||
|
SpecType::None => Ok(Spec { ty: otype, value: SpecValue::None }),
|
||||||
|
SpecType::Style => {
|
||||||
|
if pieces.len() < 3 {
|
||||||
|
return Err(Error::InvalidFormat(s.to_string()));
|
||||||
|
}
|
||||||
|
let style: Style = pieces[2].parse()?;
|
||||||
|
Ok(Spec { ty: otype, value: SpecValue::Style(style) })
|
||||||
|
}
|
||||||
|
SpecType::Fg => {
|
||||||
|
if pieces.len() < 3 {
|
||||||
|
return Err(Error::InvalidFormat(s.to_string()));
|
||||||
|
}
|
||||||
|
let color: Color = pieces[2].parse()?;
|
||||||
|
Ok(Spec { ty: otype, value: SpecValue::Fg(color) })
|
||||||
|
}
|
||||||
|
SpecType::Bg => {
|
||||||
|
if pieces.len() < 3 {
|
||||||
|
return Err(Error::InvalidFormat(s.to_string()));
|
||||||
|
}
|
||||||
|
let color: Color = pieces[2].parse()?;
|
||||||
|
Ok(Spec { ty: otype, value: SpecValue::Bg(color) })
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for OutType {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<OutType, Error> {
|
||||||
|
match &*s.to_lowercase() {
|
||||||
|
"path" => Ok(OutType::Path),
|
||||||
|
"line" => Ok(OutType::Line),
|
||||||
|
"column" => Ok(OutType::Column),
|
||||||
|
"match" => Ok(OutType::Match),
|
||||||
|
_ => Err(Error::UnrecognizedOutType(s.to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for SpecType {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<SpecType, Error> {
|
||||||
|
match &*s.to_lowercase() {
|
||||||
|
"fg" => Ok(SpecType::Fg),
|
||||||
|
"bg" => Ok(SpecType::Bg),
|
||||||
|
"style" => Ok(SpecType::Style),
|
||||||
|
"none" => Ok(SpecType::None),
|
||||||
|
_ => Err(Error::UnrecognizedSpecType(s.to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl FromStr for Style {
|
||||||
|
type Err = Error;
|
||||||
|
|
||||||
|
fn from_str(s: &str) -> Result<Style, Error> {
|
||||||
|
match &*s.to_lowercase() {
|
||||||
|
"bold" => Ok(Style::Bold),
|
||||||
|
"nobold" => Ok(Style::NoBold),
|
||||||
|
"intense" => Ok(Style::Intense),
|
||||||
|
"nointense" => Ok(Style::NoIntense),
|
||||||
|
_ => Err(Error::UnrecognizedStyle(s.to_string())),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use termcolor::{Color, ColorSpec};
|
||||||
|
use super::{ColorSpecs, Error, OutType, Spec, SpecValue, Style};
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn merge() {
|
||||||
|
let user_specs: &[Spec] = &[
|
||||||
|
"match:fg:blue".parse().unwrap(),
|
||||||
|
"match:none".parse().unwrap(),
|
||||||
|
"match:style:bold".parse().unwrap(),
|
||||||
|
];
|
||||||
|
let mut expect_matched = ColorSpec::new();
|
||||||
|
expect_matched.set_bold(true);
|
||||||
|
assert_eq!(ColorSpecs::new(user_specs), ColorSpecs {
|
||||||
|
path: ColorSpec::default(),
|
||||||
|
line: ColorSpec::default(),
|
||||||
|
column: ColorSpec::default(),
|
||||||
|
matched: expect_matched,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn specs() {
|
||||||
|
let spec: Spec = "path:fg:blue".parse().unwrap();
|
||||||
|
assert_eq!(spec, Spec {
|
||||||
|
ty: OutType::Path,
|
||||||
|
value: SpecValue::Fg(Color::Blue),
|
||||||
|
});
|
||||||
|
|
||||||
|
let spec: Spec = "path:bg:red".parse().unwrap();
|
||||||
|
assert_eq!(spec, Spec {
|
||||||
|
ty: OutType::Path,
|
||||||
|
value: SpecValue::Bg(Color::Red),
|
||||||
|
});
|
||||||
|
|
||||||
|
let spec: Spec = "match:style:bold".parse().unwrap();
|
||||||
|
assert_eq!(spec, Spec {
|
||||||
|
ty: OutType::Match,
|
||||||
|
value: SpecValue::Style(Style::Bold),
|
||||||
|
});
|
||||||
|
|
||||||
|
let spec: Spec = "match:style:intense".parse().unwrap();
|
||||||
|
assert_eq!(spec, Spec {
|
||||||
|
ty: OutType::Match,
|
||||||
|
value: SpecValue::Style(Style::Intense),
|
||||||
|
});
|
||||||
|
|
||||||
|
let spec: Spec = "line:none".parse().unwrap();
|
||||||
|
assert_eq!(spec, Spec {
|
||||||
|
ty: OutType::Line,
|
||||||
|
value: SpecValue::None,
|
||||||
|
});
|
||||||
|
|
||||||
|
let spec: Spec = "column:bg:green".parse().unwrap();
|
||||||
|
assert_eq!(spec, Spec {
|
||||||
|
ty: OutType::Column,
|
||||||
|
value: SpecValue::Bg(Color::Green),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn spec_errors() {
|
||||||
|
let err = "line:nonee".parse::<Spec>().unwrap_err();
|
||||||
|
assert_eq!(err, Error::UnrecognizedSpecType("nonee".to_string()));
|
||||||
|
|
||||||
|
let err = "".parse::<Spec>().unwrap_err();
|
||||||
|
assert_eq!(err, Error::InvalidFormat("".to_string()));
|
||||||
|
|
||||||
|
let err = "foo".parse::<Spec>().unwrap_err();
|
||||||
|
assert_eq!(err, Error::InvalidFormat("foo".to_string()));
|
||||||
|
|
||||||
|
let err = "line:style:italic".parse::<Spec>().unwrap_err();
|
||||||
|
assert_eq!(err, Error::UnrecognizedStyle("italic".to_string()));
|
||||||
|
|
||||||
|
let err = "line:fg:brown".parse::<Spec>().unwrap_err();
|
||||||
|
match err {
|
||||||
|
Error::UnrecognizedColor(name, _) => assert_eq!(name, "brown"),
|
||||||
|
err => assert!(false, "unexpected error: {:?}", err),
|
||||||
|
}
|
||||||
|
|
||||||
|
let err = "foo:fg:brown".parse::<Spec>().unwrap_err();
|
||||||
|
assert_eq!(err, Error::UnrecognizedOutType("foo".to_string()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,16 +1,16 @@
|
|||||||
/*!
|
/*!
|
||||||
The search_buffer module is responsible for searching a single file all in a
|
The `search_buffer` module is responsible for searching a single file all in a
|
||||||
single buffer. Typically, the source of the buffer is a memory map. This can
|
single buffer. Typically, the source of the buffer is a memory map. This can
|
||||||
be useful for when memory maps are faster than streaming search.
|
be useful for when memory maps are faster than streaming search.
|
||||||
|
|
||||||
Note that this module doesn't quite support everything that search_stream does.
|
Note that this module doesn't quite support everything that `search_stream`
|
||||||
Notably, showing contexts.
|
does. Notably, showing contexts.
|
||||||
*/
|
*/
|
||||||
use std::cmp;
|
use std::cmp;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use grep::Grep;
|
use grep::Grep;
|
||||||
use term::Terminal;
|
use termcolor::WriteColor;
|
||||||
|
|
||||||
use printer::Printer;
|
use printer::Printer;
|
||||||
use search_stream::{IterLines, Options, count_lines, is_binary};
|
use search_stream::{IterLines, Options, count_lines, is_binary};
|
||||||
@@ -26,7 +26,7 @@ pub struct BufferSearcher<'a, W: 'a> {
|
|||||||
last_line: usize,
|
last_line: usize,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
impl<'a, W: WriteColor> BufferSearcher<'a, W> {
|
||||||
pub fn new(
|
pub fn new(
|
||||||
printer: &'a mut Printer<W>,
|
printer: &'a mut Printer<W>,
|
||||||
grep: &'a Grep,
|
grep: &'a Grep,
|
||||||
@@ -61,6 +61,15 @@ impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If enabled, searching will print the path of files that *don't* match
|
||||||
|
/// the given pattern.
|
||||||
|
///
|
||||||
|
/// Disabled by default.
|
||||||
|
pub fn files_without_matches(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.files_without_matches = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the end-of-line byte used by this searcher.
|
/// Set the end-of-line byte used by this searcher.
|
||||||
pub fn eol(mut self, eol: u8) -> Self {
|
pub fn eol(mut self, eol: u8) -> Self {
|
||||||
self.opts.eol = eol;
|
self.opts.eol = eol;
|
||||||
@@ -81,6 +90,14 @@ impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Limit the number of matches to the given count.
|
||||||
|
///
|
||||||
|
/// The default is None, which corresponds to no limit.
|
||||||
|
pub fn max_count(mut self, count: Option<u64>) -> Self {
|
||||||
|
self.opts.max_count = count;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// If enabled, don't show any output and quit searching after the first
|
/// If enabled, don't show any output and quit searching after the first
|
||||||
/// match is found.
|
/// match is found.
|
||||||
pub fn quiet(mut self, yes: bool) -> Self {
|
pub fn quiet(mut self, yes: bool) -> Self {
|
||||||
@@ -96,8 +113,8 @@ impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
|||||||
|
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
pub fn run(mut self) -> u64 {
|
pub fn run(mut self) -> u64 {
|
||||||
let binary_upto = cmp::min(4096, self.buf.len());
|
let binary_upto = cmp::min(10_240, self.buf.len());
|
||||||
if !self.opts.text && is_binary(&self.buf[..binary_upto]) {
|
if !self.opts.text && is_binary(&self.buf[..binary_upto], true) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,11 +128,11 @@ impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
|||||||
self.print_match(m.start(), m.end());
|
self.print_match(m.start(), m.end());
|
||||||
}
|
}
|
||||||
last_end = m.end();
|
last_end = m.end();
|
||||||
if self.opts.stop_after_first_match() {
|
if self.opts.terminate(self.match_count) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if self.opts.invert_match {
|
if self.opts.invert_match && !self.opts.terminate(self.match_count) {
|
||||||
let upto = self.buf.len();
|
let upto = self.buf.len();
|
||||||
self.print_inverted_matches(last_end, upto);
|
self.print_inverted_matches(last_end, upto);
|
||||||
}
|
}
|
||||||
@@ -125,6 +142,9 @@ impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
|||||||
if self.opts.files_with_matches && self.match_count > 0 {
|
if self.opts.files_with_matches && self.match_count > 0 {
|
||||||
self.printer.path(self.path);
|
self.printer.path(self.path);
|
||||||
}
|
}
|
||||||
|
if self.opts.files_without_matches && self.match_count == 0 {
|
||||||
|
self.printer.path(self.path);
|
||||||
|
}
|
||||||
self.match_count
|
self.match_count
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -146,6 +166,9 @@ impl<'a, W: Send + Terminal> BufferSearcher<'a, W> {
|
|||||||
debug_assert!(self.opts.invert_match);
|
debug_assert!(self.opts.invert_match);
|
||||||
let mut it = IterLines::new(self.opts.eol, start);
|
let mut it = IterLines::new(self.opts.eol, start);
|
||||||
while let Some((s, e)) = it.next(&self.buf[..end]) {
|
while let Some((s, e)) = it.next(&self.buf[..end]) {
|
||||||
|
if self.opts.terminate(self.match_count) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
self.print_match(s, e);
|
self.print_match(s, e);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -173,10 +196,9 @@ mod tests {
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use grep::GrepBuilder;
|
use grep::GrepBuilder;
|
||||||
use term::{Terminal, TerminfoTerminal};
|
|
||||||
|
|
||||||
use out::ColoredTerminal;
|
|
||||||
use printer::Printer;
|
use printer::Printer;
|
||||||
|
use termcolor;
|
||||||
|
|
||||||
use super::BufferSearcher;
|
use super::BufferSearcher;
|
||||||
|
|
||||||
@@ -193,15 +215,14 @@ and exhibited clearly, with a label attached.\
|
|||||||
&Path::new("/baz.rs")
|
&Path::new("/baz.rs")
|
||||||
}
|
}
|
||||||
|
|
||||||
type TestSearcher<'a> =
|
type TestSearcher<'a> = BufferSearcher<'a, termcolor::NoColor<Vec<u8>>>;
|
||||||
BufferSearcher<'a, ColoredTerminal<TerminfoTerminal<Vec<u8>>>>;
|
|
||||||
|
|
||||||
fn search<F: FnMut(TestSearcher) -> TestSearcher>(
|
fn search<F: FnMut(TestSearcher) -> TestSearcher>(
|
||||||
pat: &str,
|
pat: &str,
|
||||||
haystack: &str,
|
haystack: &str,
|
||||||
mut map: F,
|
mut map: F,
|
||||||
) -> (u64, String) {
|
) -> (u64, String) {
|
||||||
let outbuf = ColoredTerminal::NoColor(vec![]);
|
let outbuf = termcolor::NoColor::new(vec![]);
|
||||||
let mut pp = Printer::new(outbuf).with_filename(true);
|
let mut pp = Printer::new(outbuf).with_filename(true);
|
||||||
let grep = GrepBuilder::new(pat).build().unwrap();
|
let grep = GrepBuilder::new(pat).build().unwrap();
|
||||||
let count = {
|
let count = {
|
||||||
@@ -266,6 +287,34 @@ and exhibited clearly, with a label attached.\
|
|||||||
assert_eq!(out, "/baz.rs\n");
|
assert_eq!(out, "/baz.rs\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn files_without_matches() {
|
||||||
|
let (count, out) = search(
|
||||||
|
"zzzz", SHERLOCK, |s| s.files_without_matches(true));
|
||||||
|
assert_eq!(0, count);
|
||||||
|
assert_eq!(out, "/baz.rs\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn max_count() {
|
||||||
|
let (count, out) = search(
|
||||||
|
"Sherlock", SHERLOCK, |s| s.max_count(Some(1)));
|
||||||
|
assert_eq!(1, count);
|
||||||
|
assert_eq!(out, "\
|
||||||
|
/baz.rs:For the Doctor Watsons of this world, as opposed to the Sherlock
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn invert_match_max_count() {
|
||||||
|
let (count, out) = search(
|
||||||
|
"zzzz", SHERLOCK, |s| s.invert_match(true).max_count(Some(1)));
|
||||||
|
assert_eq!(1, count);
|
||||||
|
assert_eq!(out, "\
|
||||||
|
/baz.rs:For the Doctor Watsons of this world, as opposed to the Sherlock
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn invert_match() {
|
fn invert_match() {
|
||||||
let (count, out) = search(
|
let (count, out) = search(
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
/*!
|
/*!
|
||||||
The search_stream module is responsible for searching a single file and
|
The `search_stream` module is responsible for searching a single file and
|
||||||
printing matches. In particular, it searches the file in a streaming fashion
|
printing matches. In particular, it searches the file in a streaming fashion
|
||||||
using `read` calls and a (roughly) fixed size buffer.
|
using `read` calls and a (roughly) fixed size buffer.
|
||||||
*/
|
*/
|
||||||
@@ -10,9 +10,10 @@ use std::fmt;
|
|||||||
use std::io;
|
use std::io;
|
||||||
use std::path::{Path, PathBuf};
|
use std::path::{Path, PathBuf};
|
||||||
|
|
||||||
|
use bytecount;
|
||||||
use grep::{Grep, Match};
|
use grep::{Grep, Match};
|
||||||
use memchr::{memchr, memrchr};
|
use memchr::{memchr, memrchr};
|
||||||
use term::Terminal;
|
use termcolor::WriteColor;
|
||||||
|
|
||||||
use printer::Printer;
|
use printer::Printer;
|
||||||
|
|
||||||
@@ -81,9 +82,11 @@ pub struct Options {
|
|||||||
pub before_context: usize,
|
pub before_context: usize,
|
||||||
pub count: bool,
|
pub count: bool,
|
||||||
pub files_with_matches: bool,
|
pub files_with_matches: bool,
|
||||||
|
pub files_without_matches: bool,
|
||||||
pub eol: u8,
|
pub eol: u8,
|
||||||
pub invert_match: bool,
|
pub invert_match: bool,
|
||||||
pub line_number: bool,
|
pub line_number: bool,
|
||||||
|
pub max_count: Option<u64>,
|
||||||
pub quiet: bool,
|
pub quiet: bool,
|
||||||
pub text: bool,
|
pub text: bool,
|
||||||
}
|
}
|
||||||
@@ -95,9 +98,11 @@ impl Default for Options {
|
|||||||
before_context: 0,
|
before_context: 0,
|
||||||
count: false,
|
count: false,
|
||||||
files_with_matches: false,
|
files_with_matches: false,
|
||||||
|
files_without_matches: false,
|
||||||
eol: b'\n',
|
eol: b'\n',
|
||||||
invert_match: false,
|
invert_match: false,
|
||||||
line_number: false,
|
line_number: false,
|
||||||
|
max_count: None,
|
||||||
quiet: false,
|
quiet: false,
|
||||||
text: false,
|
text: false,
|
||||||
}
|
}
|
||||||
@@ -106,20 +111,32 @@ impl Default for Options {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Options {
|
impl Options {
|
||||||
/// Several options (--quiet, --count, --files-with-matches) imply that
|
/// Several options (--quiet, --count, --files-with-matches,
|
||||||
/// we shouldn't ever display matches.
|
/// --files-without-match) imply that we shouldn't ever display matches.
|
||||||
pub fn skip_matches(&self) -> bool {
|
pub fn skip_matches(&self) -> bool {
|
||||||
self.count || self.files_with_matches || self.quiet
|
self.count || self.files_with_matches || self.files_without_matches
|
||||||
|
|| self.quiet
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Some options (--quiet, --files-with-matches) imply that we can stop
|
/// Some options (--quiet, --files-with-matches, --files-without-match)
|
||||||
/// searching after the first match.
|
/// imply that we can stop searching after the first match.
|
||||||
pub fn stop_after_first_match(&self) -> bool {
|
pub fn stop_after_first_match(&self) -> bool {
|
||||||
self.files_with_matches || self.quiet
|
self.files_with_matches || self.files_without_matches || self.quiet
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true if the search should terminate based on the match count.
|
||||||
|
pub fn terminate(&self, match_count: u64) -> bool {
|
||||||
|
if match_count > 0 && self.stop_after_first_match() {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
if self.max_count.map_or(false, |max| match_count >= max) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
impl<'a, R: io::Read, W: WriteColor> Searcher<'a, R, W> {
|
||||||
/// Create a new searcher.
|
/// Create a new searcher.
|
||||||
///
|
///
|
||||||
/// `inp` is a reusable input buffer that is used as scratch space by this
|
/// `inp` is a reusable input buffer that is used as scratch space by this
|
||||||
@@ -185,6 +202,14 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// If enabled, searching will print the path of files without any matches.
|
||||||
|
///
|
||||||
|
/// Disabled by default.
|
||||||
|
pub fn files_without_matches(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.files_without_matches = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Set the end-of-line byte used by this searcher.
|
/// Set the end-of-line byte used by this searcher.
|
||||||
pub fn eol(mut self, eol: u8) -> Self {
|
pub fn eol(mut self, eol: u8) -> Self {
|
||||||
self.opts.eol = eol;
|
self.opts.eol = eol;
|
||||||
@@ -205,6 +230,14 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Limit the number of matches to the given count.
|
||||||
|
///
|
||||||
|
/// The default is None, which corresponds to no limit.
|
||||||
|
pub fn max_count(mut self, count: Option<u64>) -> Self {
|
||||||
|
self.opts.max_count = count;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// If enabled, don't show any output and quit searching after the first
|
/// If enabled, don't show any output and quit searching after the first
|
||||||
/// match is found.
|
/// match is found.
|
||||||
pub fn quiet(mut self, yes: bool) -> Self {
|
pub fn quiet(mut self, yes: bool) -> Self {
|
||||||
@@ -215,6 +248,7 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
/// If enabled, search binary files as if they were text.
|
/// If enabled, search binary files as if they were text.
|
||||||
pub fn text(mut self, yes: bool) -> Self {
|
pub fn text(mut self, yes: bool) -> Self {
|
||||||
self.opts.text = yes;
|
self.opts.text = yes;
|
||||||
|
self.inp.text(yes);
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -230,16 +264,13 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
while !self.terminate() {
|
while !self.terminate() {
|
||||||
let upto = self.inp.lastnl;
|
let upto = self.inp.lastnl;
|
||||||
self.print_after_context(upto);
|
self.print_after_context(upto);
|
||||||
if !try!(self.fill()) {
|
if !self.fill()? {
|
||||||
break;
|
|
||||||
}
|
|
||||||
if !self.opts.text && self.inp.is_binary {
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
while !self.terminate() && self.inp.pos < self.inp.lastnl {
|
while !self.terminate() && self.inp.pos < self.inp.lastnl {
|
||||||
let matched = self.grep.read_match(
|
let matched = self.grep.read_match(
|
||||||
&mut self.last_match,
|
&mut self.last_match,
|
||||||
&mut self.inp.buf[..self.inp.lastnl],
|
&self.inp.buf[..self.inp.lastnl],
|
||||||
self.inp.pos);
|
self.inp.pos);
|
||||||
if self.opts.invert_match {
|
if self.opts.invert_match {
|
||||||
let upto =
|
let upto =
|
||||||
@@ -268,47 +299,59 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if self.after_context_remaining > 0 {
|
||||||
|
if self.last_printed == self.inp.lastnl {
|
||||||
|
self.fill()?;
|
||||||
|
}
|
||||||
|
let upto = self.inp.lastnl;
|
||||||
|
if upto > 0 {
|
||||||
|
self.print_after_context(upto);
|
||||||
|
}
|
||||||
|
}
|
||||||
if self.match_count > 0 {
|
if self.match_count > 0 {
|
||||||
if self.opts.count {
|
if self.opts.count {
|
||||||
self.printer.path_count(self.path, self.match_count);
|
self.printer.path_count(self.path, self.match_count);
|
||||||
} else if self.opts.files_with_matches {
|
} else if self.opts.files_with_matches {
|
||||||
self.printer.path(self.path);
|
self.printer.path(self.path);
|
||||||
}
|
}
|
||||||
|
} else if self.opts.files_without_matches {
|
||||||
|
self.printer.path(self.path);
|
||||||
}
|
}
|
||||||
Ok(self.match_count)
|
Ok(self.match_count)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn terminate(&self) -> bool {
|
fn terminate(&self) -> bool {
|
||||||
self.match_count > 0 && self.opts.stop_after_first_match()
|
self.opts.terminate(self.match_count)
|
||||||
}
|
}
|
||||||
|
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
fn fill(&mut self) -> Result<bool, Error> {
|
fn fill(&mut self) -> Result<bool, Error> {
|
||||||
let mut keep = self.inp.lastnl;
|
let keep = if self.opts.before_context > 0 || self.opts.after_context > 0 {
|
||||||
if self.opts.before_context > 0 || self.opts.after_context > 0 {
|
|
||||||
let lines = 1 + cmp::max(
|
let lines = 1 + cmp::max(
|
||||||
self.opts.before_context, self.opts.after_context);
|
self.opts.before_context, self.opts.after_context);
|
||||||
keep = start_of_previous_lines(
|
start_of_previous_lines(
|
||||||
self.opts.eol,
|
self.opts.eol,
|
||||||
&self.inp.buf,
|
&self.inp.buf,
|
||||||
self.inp.lastnl.saturating_sub(1),
|
self.inp.lastnl.saturating_sub(1),
|
||||||
lines);
|
lines)
|
||||||
}
|
} else {
|
||||||
|
self.inp.lastnl
|
||||||
|
};
|
||||||
if keep < self.last_printed {
|
if keep < self.last_printed {
|
||||||
self.last_printed = self.last_printed - keep;
|
self.last_printed -= keep;
|
||||||
} else {
|
} else {
|
||||||
self.last_printed = 0;
|
self.last_printed = 0;
|
||||||
}
|
}
|
||||||
if keep <= self.last_line {
|
if keep <= self.last_line {
|
||||||
self.last_line = self.last_line - keep;
|
self.last_line -= keep;
|
||||||
} else {
|
} else {
|
||||||
self.count_lines(keep);
|
self.count_lines(keep);
|
||||||
self.last_line = 0;
|
self.last_line = 0;
|
||||||
}
|
}
|
||||||
let ok = try!(self.inp.fill(&mut self.haystack, keep).map_err(|err| {
|
let ok = self.inp.fill(&mut self.haystack, keep).map_err(|err| {
|
||||||
Error::from_io(err, &self.path)
|
Error::from_io(err, &self.path)
|
||||||
}));
|
})?;
|
||||||
Ok(ok)
|
Ok(ok)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -317,6 +360,9 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
debug_assert!(self.opts.invert_match);
|
debug_assert!(self.opts.invert_match);
|
||||||
let mut it = IterLines::new(self.opts.eol, self.inp.pos);
|
let mut it = IterLines::new(self.opts.eol, self.inp.pos);
|
||||||
while let Some((start, end)) = it.next(&self.inp.buf[..upto]) {
|
while let Some((start, end)) = it.next(&self.inp.buf[..upto]) {
|
||||||
|
if self.terminate() {
|
||||||
|
return;
|
||||||
|
}
|
||||||
self.print_match(start, end);
|
self.print_match(start, end);
|
||||||
self.inp.pos = end;
|
self.inp.pos = end;
|
||||||
}
|
}
|
||||||
@@ -419,7 +465,7 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// InputBuffer encapsulates the logic of maintaining a ~fixed sized buffer
|
/// `InputBuffer` encapsulates the logic of maintaining a ~fixed sized buffer
|
||||||
/// on which to search. There are three key pieces of complexity:
|
/// on which to search. There are three key pieces of complexity:
|
||||||
///
|
///
|
||||||
/// 1. We must be able to handle lines that are longer than the size of the
|
/// 1. We must be able to handle lines that are longer than the size of the
|
||||||
@@ -435,7 +481,7 @@ impl<'a, R: io::Read, W: Terminal + Send> Searcher<'a, R, W> {
|
|||||||
/// may occur at the beginning of a buffer, in which case, lines at the end
|
/// may occur at the beginning of a buffer, in which case, lines at the end
|
||||||
/// of the previous contents of the buffer need to be printed.
|
/// of the previous contents of the buffer need to be printed.
|
||||||
///
|
///
|
||||||
/// An InputBuffer is designed to be reused and isn't tied to any particular
|
/// An `InputBuffer` is designed to be reused and isn't tied to any particular
|
||||||
/// reader.
|
/// reader.
|
||||||
pub struct InputBuffer {
|
pub struct InputBuffer {
|
||||||
/// The number of bytes to attempt to read at a time. Once set, this is
|
/// The number of bytes to attempt to read at a time. Once set, this is
|
||||||
@@ -463,10 +509,8 @@ pub struct InputBuffer {
|
|||||||
end: usize,
|
end: usize,
|
||||||
/// Set to true if and only if no reads have occurred yet.
|
/// Set to true if and only if no reads have occurred yet.
|
||||||
first: bool,
|
first: bool,
|
||||||
/// Set to true if and only if the contents of buf are determined to be
|
/// Set to true if all binary data should be treated as if it were text.
|
||||||
/// "binary" (i.e., not searchable text). Note that its value may be
|
text: bool,
|
||||||
/// falsely negative *or* falsely positive. It is only a heuristic.
|
|
||||||
is_binary: bool,
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl InputBuffer {
|
impl InputBuffer {
|
||||||
@@ -494,13 +538,23 @@ impl InputBuffer {
|
|||||||
lastnl: 0,
|
lastnl: 0,
|
||||||
end: 0,
|
end: 0,
|
||||||
first: true,
|
first: true,
|
||||||
is_binary: false,
|
text: false,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Set the end-of-line terminator used by this input buffer.
|
/// Set the end-of-line terminator used by this input buffer.
|
||||||
pub fn eol(&mut self, eol: u8) {
|
pub fn eol(&mut self, eol: u8) -> &mut Self {
|
||||||
self.eol = eol;
|
self.eol = eol;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, search binary files as if they were text.
|
||||||
|
///
|
||||||
|
/// Note that this may cause the buffer to load the entire contents of a
|
||||||
|
/// file into memory.
|
||||||
|
pub fn text(&mut self, yes: bool) -> &mut Self {
|
||||||
|
self.text = yes;
|
||||||
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Resets this buffer so that it may be reused with a new reader.
|
/// Resets this buffer so that it may be reused with a new reader.
|
||||||
@@ -509,7 +563,6 @@ impl InputBuffer {
|
|||||||
self.lastnl = 0;
|
self.lastnl = 0;
|
||||||
self.end = 0;
|
self.end = 0;
|
||||||
self.first = true;
|
self.first = true;
|
||||||
self.is_binary = false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Fill the contents of this buffer with the reader given. The reader
|
/// Fill the contents of this buffer with the reader given. The reader
|
||||||
@@ -524,9 +577,10 @@ impl InputBuffer {
|
|||||||
keep_from: usize,
|
keep_from: usize,
|
||||||
) -> Result<bool, io::Error> {
|
) -> Result<bool, io::Error> {
|
||||||
// Rollover bytes from buf[keep_from..end] and update our various
|
// Rollover bytes from buf[keep_from..end] and update our various
|
||||||
// pointers. N.B. This could be done with the unsafe ptr::copy, but
|
// pointers. N.B. This could be done with the ptr::copy, but I haven't
|
||||||
// I haven't been able to produce a benchmark that notices a difference
|
// been able to produce a benchmark that notices a difference in
|
||||||
// in performance. (Invariably, ptr::copy is also clearer IMO.)
|
// performance. (Invariably, ptr::copy is seems clearer IMO, but it is
|
||||||
|
// not safe.)
|
||||||
self.tmp.clear();
|
self.tmp.clear();
|
||||||
self.tmp.extend_from_slice(&self.buf[keep_from..self.end]);
|
self.tmp.extend_from_slice(&self.buf[keep_from..self.end]);
|
||||||
self.buf[0..self.tmp.len()].copy_from_slice(&self.tmp);
|
self.buf[0..self.tmp.len()].copy_from_slice(&self.tmp);
|
||||||
@@ -541,10 +595,12 @@ impl InputBuffer {
|
|||||||
let new_len = cmp::max(min_len, self.buf.len() * 2);
|
let new_len = cmp::max(min_len, self.buf.len() * 2);
|
||||||
self.buf.resize(new_len, 0);
|
self.buf.resize(new_len, 0);
|
||||||
}
|
}
|
||||||
let n = try!(rdr.read(
|
let n = rdr.read(
|
||||||
&mut self.buf[self.end..self.end + self.read_size]));
|
&mut self.buf[self.end..self.end + self.read_size])?;
|
||||||
if self.first && is_binary(&self.buf[self.end..self.end + n]) {
|
if !self.text {
|
||||||
self.is_binary = true;
|
if is_binary(&self.buf[self.end..self.end + n], self.first) {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
self.first = false;
|
self.first = false;
|
||||||
// We assume that reading 0 bytes means we've hit EOF.
|
// We assume that reading 0 bytes means we've hit EOF.
|
||||||
@@ -574,97 +630,17 @@ impl InputBuffer {
|
|||||||
///
|
///
|
||||||
/// Note that this may return both false positives and false negatives.
|
/// Note that this may return both false positives and false negatives.
|
||||||
#[inline(always)]
|
#[inline(always)]
|
||||||
pub fn is_binary(buf: &[u8]) -> bool {
|
pub fn is_binary(buf: &[u8], first: bool) -> bool {
|
||||||
if buf.len() >= 4 && &buf[0..4] == b"%PDF" {
|
if first && buf.len() >= 4 && &buf[0..4] == b"%PDF" {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
memchr(b'\x00', &buf[0..cmp::min(1024, buf.len())]).is_some()
|
memchr(b'\x00', buf).is_some()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Count the number of lines in the given buffer.
|
/// Count the number of lines in the given buffer.
|
||||||
#[inline(never)]
|
|
||||||
|
|
||||||
#[inline(never)]
|
#[inline(never)]
|
||||||
pub fn count_lines(buf: &[u8], eol: u8) -> u64 {
|
pub fn count_lines(buf: &[u8], eol: u8) -> u64 {
|
||||||
// This was adapted from code in the memchr crate. The specific benefit
|
bytecount::count(buf, eol) as u64
|
||||||
// here is that we can avoid a branch in the inner loop because all we're
|
|
||||||
// doing is counting.
|
|
||||||
|
|
||||||
// The technique to count EOL bytes was adapted from:
|
|
||||||
// http://bits.stephan-brumme.com/null.html
|
|
||||||
const LO_U64: u64 = 0x0101010101010101;
|
|
||||||
const HI_U64: u64 = 0x8080808080808080;
|
|
||||||
|
|
||||||
// use truncation
|
|
||||||
const LO_USIZE: usize = LO_U64 as usize;
|
|
||||||
const HI_USIZE: usize = HI_U64 as usize;
|
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "32")]
|
|
||||||
const USIZE_BYTES: usize = 4;
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
|
||||||
const USIZE_BYTES: usize = 8;
|
|
||||||
|
|
||||||
fn count_eol(eol: usize) -> u64 {
|
|
||||||
// Ideally, this would compile down to a POPCNT instruction, but
|
|
||||||
// it looks like you need to set RUSTFLAGS="-C target-cpu=native"
|
|
||||||
// (or target-feature=+popcnt) to get that to work. Bummer.
|
|
||||||
(eol.wrapping_sub(LO_USIZE) & !eol & HI_USIZE).count_ones() as u64
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "32")]
|
|
||||||
fn repeat_byte(b: u8) -> usize {
|
|
||||||
let mut rep = (b as usize) << 8 | b as usize;
|
|
||||||
rep = rep << 16 | rep;
|
|
||||||
rep
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_pointer_width = "64")]
|
|
||||||
fn repeat_byte(b: u8) -> usize {
|
|
||||||
let mut rep = (b as usize) << 8 | b as usize;
|
|
||||||
rep = rep << 16 | rep;
|
|
||||||
rep = rep << 32 | rep;
|
|
||||||
rep
|
|
||||||
}
|
|
||||||
|
|
||||||
fn count_lines_slow(mut buf: &[u8], eol: u8) -> u64 {
|
|
||||||
let mut count = 0;
|
|
||||||
while let Some(pos) = memchr(eol, buf) {
|
|
||||||
count += 1;
|
|
||||||
buf = &buf[pos + 1..];
|
|
||||||
}
|
|
||||||
count
|
|
||||||
}
|
|
||||||
|
|
||||||
let len = buf.len();
|
|
||||||
let ptr = buf.as_ptr();
|
|
||||||
let mut count = 0;
|
|
||||||
|
|
||||||
// Search up to an aligned boundary...
|
|
||||||
let align = (ptr as usize) & (USIZE_BYTES - 1);
|
|
||||||
let mut i = 0;
|
|
||||||
if align > 0 {
|
|
||||||
i = cmp::min(USIZE_BYTES - align, len);
|
|
||||||
count += count_lines_slow(&buf[..i], eol);
|
|
||||||
}
|
|
||||||
|
|
||||||
// ... and search the rest.
|
|
||||||
let repeated_eol = repeat_byte(eol);
|
|
||||||
|
|
||||||
if len >= 2 * USIZE_BYTES {
|
|
||||||
while i <= len - (2 * USIZE_BYTES) {
|
|
||||||
unsafe {
|
|
||||||
let u = *(ptr.offset(i as isize) as *const usize);
|
|
||||||
let v = *(ptr.offset((i + USIZE_BYTES) as isize)
|
|
||||||
as *const usize);
|
|
||||||
|
|
||||||
count += count_eol(u ^ repeated_eol);
|
|
||||||
count += count_eol(v ^ repeated_eol);
|
|
||||||
}
|
|
||||||
i += USIZE_BYTES * 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
count += count_lines_slow(&buf[i..], eol);
|
|
||||||
count
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Replaces a with b in buf.
|
/// Replaces a with b in buf.
|
||||||
@@ -804,10 +780,8 @@ mod tests {
|
|||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
|
||||||
use grep::GrepBuilder;
|
use grep::GrepBuilder;
|
||||||
use term::{Terminal, TerminfoTerminal};
|
|
||||||
|
|
||||||
use out::ColoredTerminal;
|
|
||||||
use printer::Printer;
|
use printer::Printer;
|
||||||
|
use termcolor;
|
||||||
|
|
||||||
use super::{InputBuffer, Searcher, start_of_previous_lines};
|
use super::{InputBuffer, Searcher, start_of_previous_lines};
|
||||||
|
|
||||||
@@ -847,7 +821,7 @@ fn main() {
|
|||||||
type TestSearcher<'a> = Searcher<
|
type TestSearcher<'a> = Searcher<
|
||||||
'a,
|
'a,
|
||||||
io::Cursor<Vec<u8>>,
|
io::Cursor<Vec<u8>>,
|
||||||
ColoredTerminal<TerminfoTerminal<Vec<u8>>>,
|
termcolor::NoColor<Vec<u8>>,
|
||||||
>;
|
>;
|
||||||
|
|
||||||
fn search_smallcap<F: FnMut(TestSearcher) -> TestSearcher>(
|
fn search_smallcap<F: FnMut(TestSearcher) -> TestSearcher>(
|
||||||
@@ -856,7 +830,7 @@ fn main() {
|
|||||||
mut map: F,
|
mut map: F,
|
||||||
) -> (u64, String) {
|
) -> (u64, String) {
|
||||||
let mut inp = InputBuffer::with_capacity(1);
|
let mut inp = InputBuffer::with_capacity(1);
|
||||||
let outbuf = ColoredTerminal::NoColor(vec![]);
|
let outbuf = termcolor::NoColor::new(vec![]);
|
||||||
let mut pp = Printer::new(outbuf).with_filename(true);
|
let mut pp = Printer::new(outbuf).with_filename(true);
|
||||||
let grep = GrepBuilder::new(pat).build().unwrap();
|
let grep = GrepBuilder::new(pat).build().unwrap();
|
||||||
let count = {
|
let count = {
|
||||||
@@ -873,7 +847,7 @@ fn main() {
|
|||||||
mut map: F,
|
mut map: F,
|
||||||
) -> (u64, String) {
|
) -> (u64, String) {
|
||||||
let mut inp = InputBuffer::with_capacity(4096);
|
let mut inp = InputBuffer::with_capacity(4096);
|
||||||
let outbuf = ColoredTerminal::NoColor(vec![]);
|
let outbuf = termcolor::NoColor::new(vec![]);
|
||||||
let mut pp = Printer::new(outbuf).with_filename(true);
|
let mut pp = Printer::new(outbuf).with_filename(true);
|
||||||
let grep = GrepBuilder::new(pat).build().unwrap();
|
let grep = GrepBuilder::new(pat).build().unwrap();
|
||||||
let count = {
|
let count = {
|
||||||
@@ -1040,6 +1014,34 @@ fn main() {
|
|||||||
assert_eq!(out, "/baz.rs\n");
|
assert_eq!(out, "/baz.rs\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn files_without_matches() {
|
||||||
|
let (count, out) = search_smallcap(
|
||||||
|
"zzzz", SHERLOCK, |s| s.files_without_matches(true));
|
||||||
|
assert_eq!(0, count);
|
||||||
|
assert_eq!(out, "/baz.rs\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn max_count() {
|
||||||
|
let (count, out) = search_smallcap(
|
||||||
|
"Sherlock", SHERLOCK, |s| s.max_count(Some(1)));
|
||||||
|
assert_eq!(1, count);
|
||||||
|
assert_eq!(out, "\
|
||||||
|
/baz.rs:For the Doctor Watsons of this world, as opposed to the Sherlock
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn invert_match_max_count() {
|
||||||
|
let (count, out) = search(
|
||||||
|
"zzzz", SHERLOCK, |s| s.invert_match(true).max_count(Some(1)));
|
||||||
|
assert_eq!(1, count);
|
||||||
|
assert_eq!(out, "\
|
||||||
|
/baz.rs:For the Doctor Watsons of this world, as opposed to the Sherlock
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn invert_match() {
|
fn invert_match() {
|
||||||
let (count, out) = search_smallcap(
|
let (count, out) = search_smallcap(
|
||||||
@@ -1255,6 +1257,23 @@ fn main() {
|
|||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn after_context_invert_one_max_count_two() {
|
||||||
|
let (count, out) = search_smallcap("Sherlock", SHERLOCK, |s| {
|
||||||
|
s.line_number(true)
|
||||||
|
.invert_match(true)
|
||||||
|
.after_context(1)
|
||||||
|
.max_count(Some(2))
|
||||||
|
});
|
||||||
|
assert_eq!(2, count);
|
||||||
|
assert_eq!(out, "\
|
||||||
|
/baz.rs:2:Holmeses, success in the province of detective work must always
|
||||||
|
/baz.rs-3-be, to a very large extent, the result of luck. Sherlock Holmes
|
||||||
|
/baz.rs:4:can extract a clew from a wisp of straw or a flake of cigar ash;
|
||||||
|
/baz.rs-5-but Doctor Watson has to have it taken out for him and dusted,
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn after_context_two1() {
|
fn after_context_two1() {
|
||||||
let (count, out) = search_smallcap("Sherlock", SHERLOCK, |s| {
|
let (count, out) = search_smallcap("Sherlock", SHERLOCK, |s| {
|
||||||
@@ -1298,6 +1317,23 @@ fn main() {
|
|||||||
");
|
");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn after_context_two_max_count_two() {
|
||||||
|
let (count, out) = search_smallcap(
|
||||||
|
"Doctor", SHERLOCK, |s| {
|
||||||
|
s.line_number(true).after_context(2).max_count(Some(2))
|
||||||
|
});
|
||||||
|
assert_eq!(2, count);
|
||||||
|
assert_eq!(out, "\
|
||||||
|
/baz.rs:1:For the Doctor Watsons of this world, as opposed to the Sherlock
|
||||||
|
/baz.rs-2-Holmeses, success in the province of detective work must always
|
||||||
|
/baz.rs-3-be, to a very large extent, the result of luck. Sherlock Holmes
|
||||||
|
--
|
||||||
|
/baz.rs:5:but Doctor Watson has to have it taken out for him and dusted,
|
||||||
|
/baz.rs-6-and exhibited clearly, with a label attached.
|
||||||
|
");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn after_context_three1() {
|
fn after_context_three1() {
|
||||||
let (count, out) = search_smallcap("Sherlock", SHERLOCK, |s| {
|
let (count, out) = search_smallcap("Sherlock", SHERLOCK, |s| {
|
||||||
|
|||||||
@@ -1,176 +0,0 @@
|
|||||||
/*!
|
|
||||||
This module contains a Windows-only *in-memory* implementation of the
|
|
||||||
`term::Terminal` trait.
|
|
||||||
|
|
||||||
This particular implementation is a bit idiosyncratic, and the "in-memory"
|
|
||||||
specification is to blame. In particular, on Windows, coloring requires
|
|
||||||
communicating with the console synchronously as data is written to stdout.
|
|
||||||
This is anathema to how ripgrep fundamentally works: by writing search results
|
|
||||||
to intermediate thread local buffers in order to maximize parallelism.
|
|
||||||
|
|
||||||
Eliminating parallelism on Windows isn't an option, because that would negate
|
|
||||||
a tremendous performance benefit just for coloring.
|
|
||||||
|
|
||||||
We've worked around this by providing an implementation of `term::Terminal`
|
|
||||||
that records precisely where a color or a reset should be invoked, according
|
|
||||||
to a byte offset in the in memory buffer. When the buffer is actually printed,
|
|
||||||
we copy the bytes from the buffer to stdout incrementally while invoking the
|
|
||||||
corresponding console APIs for coloring at the right location.
|
|
||||||
|
|
||||||
(Another approach would be to do ANSI coloring unconditionally, then parse that
|
|
||||||
and translate it to console commands. The advantage of that approach is that
|
|
||||||
it doesn't require any additional memory for storing offsets. In practice
|
|
||||||
though, coloring is only used in the terminal, which tends to correspond to
|
|
||||||
searches that produce very few results with respect to the corpus searched.
|
|
||||||
Therefore, this is an acceptable trade off. Namely, we do not pay for it when
|
|
||||||
coloring is disabled.
|
|
||||||
*/
|
|
||||||
use std::io;
|
|
||||||
|
|
||||||
use term::{self, Terminal};
|
|
||||||
use term::color::Color;
|
|
||||||
|
|
||||||
/// An in-memory buffer that provides Windows console coloring.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
pub struct WindowsBuffer {
|
|
||||||
buf: Vec<u8>,
|
|
||||||
pos: usize,
|
|
||||||
colors: Vec<WindowsColor>,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A color associated with a particular location in a buffer.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
struct WindowsColor {
|
|
||||||
pos: usize,
|
|
||||||
opt: WindowsOption,
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A color or reset directive that can be translated into an instruction to
|
|
||||||
/// the Windows console.
|
|
||||||
#[derive(Clone, Debug)]
|
|
||||||
enum WindowsOption {
|
|
||||||
Foreground(Color),
|
|
||||||
Background(Color),
|
|
||||||
Reset,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl WindowsBuffer {
|
|
||||||
/// Create a new empty buffer for Windows console coloring.
|
|
||||||
pub fn new() -> WindowsBuffer {
|
|
||||||
WindowsBuffer {
|
|
||||||
buf: vec![],
|
|
||||||
pos: 0,
|
|
||||||
colors: vec![],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
fn push(&mut self, opt: WindowsOption) {
|
|
||||||
let pos = self.pos;
|
|
||||||
self.colors.push(WindowsColor { pos: pos, opt: opt });
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Print the contents to the given terminal.
|
|
||||||
pub fn print_stdout<T: Terminal + Send>(&self, tt: &mut T) {
|
|
||||||
if !tt.supports_color() {
|
|
||||||
let _ = tt.write_all(&self.buf);
|
|
||||||
let _ = tt.flush();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
let mut last = 0;
|
|
||||||
for col in &self.colors {
|
|
||||||
let _ = tt.write_all(&self.buf[last..col.pos]);
|
|
||||||
match col.opt {
|
|
||||||
WindowsOption::Foreground(c) => {
|
|
||||||
let _ = tt.fg(c);
|
|
||||||
}
|
|
||||||
WindowsOption::Background(c) => {
|
|
||||||
let _ = tt.bg(c);
|
|
||||||
}
|
|
||||||
WindowsOption::Reset => {
|
|
||||||
let _ = tt.reset();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
last = col.pos;
|
|
||||||
}
|
|
||||||
let _ = tt.write_all(&self.buf[last..]);
|
|
||||||
let _ = tt.flush();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Clear the buffer.
|
|
||||||
pub fn clear(&mut self) {
|
|
||||||
self.buf.clear();
|
|
||||||
self.colors.clear();
|
|
||||||
self.pos = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl io::Write for WindowsBuffer {
|
|
||||||
fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
|
|
||||||
let n = try!(self.buf.write(buf));
|
|
||||||
self.pos += n;
|
|
||||||
Ok(n)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn flush(&mut self) -> io::Result<()> {
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Terminal for WindowsBuffer {
|
|
||||||
type Output = Vec<u8>;
|
|
||||||
|
|
||||||
fn fg(&mut self, fg: Color) -> term::Result<()> {
|
|
||||||
self.push(WindowsOption::Foreground(fg));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn bg(&mut self, bg: Color) -> term::Result<()> {
|
|
||||||
self.push(WindowsOption::Background(bg));
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn attr(&mut self, _attr: term::Attr) -> term::Result<()> {
|
|
||||||
Err(term::Error::NotSupported)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_attr(&self, _attr: term::Attr) -> bool {
|
|
||||||
false
|
|
||||||
}
|
|
||||||
|
|
||||||
fn reset(&mut self) -> term::Result<()> {
|
|
||||||
self.push(WindowsOption::Reset);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_reset(&self) -> bool {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn supports_color(&self) -> bool {
|
|
||||||
true
|
|
||||||
}
|
|
||||||
|
|
||||||
fn cursor_up(&mut self) -> term::Result<()> {
|
|
||||||
Err(term::Error::NotSupported)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn delete_line(&mut self) -> term::Result<()> {
|
|
||||||
Err(term::Error::NotSupported)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn carriage_return(&mut self) -> term::Result<()> {
|
|
||||||
Err(term::Error::NotSupported)
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_ref(&self) -> &Vec<u8> {
|
|
||||||
&self.buf
|
|
||||||
}
|
|
||||||
|
|
||||||
fn get_mut(&mut self) -> &mut Vec<u8> {
|
|
||||||
&mut self.buf
|
|
||||||
}
|
|
||||||
|
|
||||||
fn into_inner(self) -> Vec<u8> {
|
|
||||||
self.buf
|
|
||||||
}
|
|
||||||
}
|
|
||||||
128
src/unescape.rs
Normal file
128
src/unescape.rs
Normal file
@@ -0,0 +1,128 @@
|
|||||||
|
/// A single state in the state machine used by `unescape`.
|
||||||
|
#[derive(Clone, Copy, Eq, PartialEq)]
|
||||||
|
enum State {
|
||||||
|
/// The state after seeing a `\`.
|
||||||
|
Escape,
|
||||||
|
/// The state after seeing a `\x`.
|
||||||
|
HexFirst,
|
||||||
|
/// The state after seeing a `\x[0-9A-Fa-f]`.
|
||||||
|
HexSecond(char),
|
||||||
|
/// Default state.
|
||||||
|
Literal,
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Unescapes a string given on the command line. It supports a limited set of
|
||||||
|
/// escape sequences:
|
||||||
|
///
|
||||||
|
/// * `\t`, `\r` and `\n` are mapped to their corresponding ASCII bytes.
|
||||||
|
/// * `\xZZ` hexadecimal escapes are mapped to their byte.
|
||||||
|
pub fn unescape(s: &str) -> Vec<u8> {
|
||||||
|
use self::State::*;
|
||||||
|
|
||||||
|
let mut bytes = vec![];
|
||||||
|
let mut state = Literal;
|
||||||
|
for c in s.chars() {
|
||||||
|
match state {
|
||||||
|
Escape => {
|
||||||
|
match c {
|
||||||
|
'n' => { bytes.push(b'\n'); state = Literal; }
|
||||||
|
'r' => { bytes.push(b'\r'); state = Literal; }
|
||||||
|
't' => { bytes.push(b'\t'); state = Literal; }
|
||||||
|
'x' => { state = HexFirst; }
|
||||||
|
c => {
|
||||||
|
bytes.extend(format!(r"\{}", c).into_bytes());
|
||||||
|
state = Literal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HexFirst => {
|
||||||
|
match c {
|
||||||
|
'0'...'9' | 'A'...'F' | 'a'...'f' => {
|
||||||
|
state = HexSecond(c);
|
||||||
|
}
|
||||||
|
c => {
|
||||||
|
bytes.extend(format!(r"\x{}", c).into_bytes());
|
||||||
|
state = Literal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
HexSecond(first) => {
|
||||||
|
match c {
|
||||||
|
'0'...'9' | 'A'...'F' | 'a'...'f' => {
|
||||||
|
let ordinal = format!("{}{}", first, c);
|
||||||
|
let byte = u8::from_str_radix(&ordinal, 16).unwrap();
|
||||||
|
bytes.push(byte);
|
||||||
|
state = Literal;
|
||||||
|
}
|
||||||
|
c => {
|
||||||
|
let original = format!(r"\x{}{}", first, c);
|
||||||
|
bytes.extend(original.into_bytes());
|
||||||
|
state = Literal;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Literal => {
|
||||||
|
match c {
|
||||||
|
'\\' => { state = Escape; }
|
||||||
|
c => { bytes.extend(c.to_string().as_bytes()); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
match state {
|
||||||
|
Escape => bytes.push(b'\\'),
|
||||||
|
HexFirst => bytes.extend(b"\\x"),
|
||||||
|
HexSecond(c) => bytes.extend(format!("\\x{}", c).into_bytes()),
|
||||||
|
Literal => {}
|
||||||
|
}
|
||||||
|
bytes
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use super::unescape;
|
||||||
|
|
||||||
|
fn b(bytes: &'static [u8]) -> Vec<u8> {
|
||||||
|
bytes.to_vec()
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_nul() {
|
||||||
|
assert_eq!(b(b"\x00"), unescape(r"\x00"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_nl() {
|
||||||
|
assert_eq!(b(b"\n"), unescape(r"\n"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_tab() {
|
||||||
|
assert_eq!(b(b"\t"), unescape(r"\t"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_carriage() {
|
||||||
|
assert_eq!(b(b"\r"), unescape(r"\r"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_nothing_simple() {
|
||||||
|
assert_eq!(b(b"\\a"), unescape(r"\a"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_nothing_hex0() {
|
||||||
|
assert_eq!(b(b"\\x"), unescape(r"\x"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_nothing_hex1() {
|
||||||
|
assert_eq!(b(b"\\xz"), unescape(r"\xz"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn unescape_nothing_hex2() {
|
||||||
|
assert_eq!(b(b"\\xzz"), unescape(r"\xzz"));
|
||||||
|
}
|
||||||
|
}
|
||||||
360
src/worker.rs
Normal file
360
src/worker.rs
Normal file
@@ -0,0 +1,360 @@
|
|||||||
|
use std::fs::File;
|
||||||
|
use std::io;
|
||||||
|
use std::path::Path;
|
||||||
|
|
||||||
|
use encoding_rs::Encoding;
|
||||||
|
use grep::Grep;
|
||||||
|
use ignore::DirEntry;
|
||||||
|
use memmap::Mmap;
|
||||||
|
use termcolor::WriteColor;
|
||||||
|
|
||||||
|
use decoder::DecodeReader;
|
||||||
|
use decompressor::{self, DecompressionReader};
|
||||||
|
use pathutil::strip_prefix;
|
||||||
|
use printer::Printer;
|
||||||
|
use search_buffer::BufferSearcher;
|
||||||
|
use search_stream::{InputBuffer, Searcher};
|
||||||
|
|
||||||
|
use Result;
|
||||||
|
|
||||||
|
pub enum Work {
|
||||||
|
Stdin,
|
||||||
|
DirEntry(DirEntry),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct WorkerBuilder {
|
||||||
|
grep: Grep,
|
||||||
|
opts: Options,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Clone, Debug)]
|
||||||
|
struct Options {
|
||||||
|
mmap: bool,
|
||||||
|
encoding: Option<&'static Encoding>,
|
||||||
|
after_context: usize,
|
||||||
|
before_context: usize,
|
||||||
|
count: bool,
|
||||||
|
files_with_matches: bool,
|
||||||
|
files_without_matches: bool,
|
||||||
|
eol: u8,
|
||||||
|
invert_match: bool,
|
||||||
|
line_number: bool,
|
||||||
|
max_count: Option<u64>,
|
||||||
|
no_messages: bool,
|
||||||
|
quiet: bool,
|
||||||
|
text: bool,
|
||||||
|
search_zip_files: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Options {
|
||||||
|
fn default() -> Options {
|
||||||
|
Options {
|
||||||
|
mmap: false,
|
||||||
|
encoding: None,
|
||||||
|
after_context: 0,
|
||||||
|
before_context: 0,
|
||||||
|
count: false,
|
||||||
|
files_with_matches: false,
|
||||||
|
files_without_matches: false,
|
||||||
|
eol: b'\n',
|
||||||
|
invert_match: false,
|
||||||
|
line_number: false,
|
||||||
|
max_count: None,
|
||||||
|
no_messages: false,
|
||||||
|
quiet: false,
|
||||||
|
text: false,
|
||||||
|
search_zip_files: false,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl WorkerBuilder {
|
||||||
|
/// Create a new builder for a worker.
|
||||||
|
///
|
||||||
|
/// A reusable input buffer and a grep matcher are required, but there
|
||||||
|
/// are numerous additional options that can be configured on this builder.
|
||||||
|
pub fn new(grep: Grep) -> WorkerBuilder {
|
||||||
|
WorkerBuilder {
|
||||||
|
grep: grep,
|
||||||
|
opts: Options::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create the worker from this builder.
|
||||||
|
pub fn build(self) -> Worker {
|
||||||
|
let mut inpbuf = InputBuffer::new();
|
||||||
|
inpbuf.eol(self.opts.eol);
|
||||||
|
Worker {
|
||||||
|
grep: self.grep,
|
||||||
|
inpbuf: inpbuf,
|
||||||
|
decodebuf: vec![0; 8 * (1<<10)],
|
||||||
|
opts: self.opts,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The number of contextual lines to show after each match. The default
|
||||||
|
/// is zero.
|
||||||
|
pub fn after_context(mut self, count: usize) -> Self {
|
||||||
|
self.opts.after_context = count;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The number of contextual lines to show before each match. The default
|
||||||
|
/// is zero.
|
||||||
|
pub fn before_context(mut self, count: usize) -> Self {
|
||||||
|
self.opts.before_context = count;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, searching will print a count instead of each match.
|
||||||
|
///
|
||||||
|
/// Disabled by default.
|
||||||
|
pub fn count(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.count = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the encoding to use to read each file.
|
||||||
|
///
|
||||||
|
/// If the encoding is `None` (the default), then the encoding is
|
||||||
|
/// automatically detected on a best-effort per-file basis.
|
||||||
|
pub fn encoding(mut self, enc: Option<&'static Encoding>) -> Self {
|
||||||
|
self.opts.encoding = enc;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, searching will print the path instead of each match.
|
||||||
|
///
|
||||||
|
/// Disabled by default.
|
||||||
|
pub fn files_with_matches(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.files_with_matches = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, searching will print the path of files without any matches.
|
||||||
|
///
|
||||||
|
/// Disabled by default.
|
||||||
|
pub fn files_without_matches(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.files_without_matches = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Set the end-of-line byte used by this searcher.
|
||||||
|
pub fn eol(mut self, eol: u8) -> Self {
|
||||||
|
self.opts.eol = eol;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, matching is inverted so that lines that *don't* match the
|
||||||
|
/// given pattern are treated as matches.
|
||||||
|
pub fn invert_match(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.invert_match = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, compute line numbers and prefix each line of output with
|
||||||
|
/// them.
|
||||||
|
pub fn line_number(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.line_number = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Limit the number of matches to the given count.
|
||||||
|
///
|
||||||
|
/// The default is None, which corresponds to no limit.
|
||||||
|
pub fn max_count(mut self, count: Option<u64>) -> Self {
|
||||||
|
self.opts.max_count = count;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, try to use memory maps for searching if possible.
|
||||||
|
pub fn mmap(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.mmap = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, error messages are suppressed.
|
||||||
|
///
|
||||||
|
/// This is disabled by default.
|
||||||
|
pub fn no_messages(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.no_messages = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, don't show any output and quit searching after the first
|
||||||
|
/// match is found.
|
||||||
|
pub fn quiet(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.quiet = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, search binary files as if they were text.
|
||||||
|
pub fn text(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.text = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If enabled, search through compressed files as well
|
||||||
|
pub fn search_zip_files(mut self, yes: bool) -> Self {
|
||||||
|
self.opts.search_zip_files = yes;
|
||||||
|
self
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Worker is responsible for executing searches on file paths, while choosing
|
||||||
|
/// streaming search or memory map search as appropriate.
|
||||||
|
pub struct Worker {
|
||||||
|
grep: Grep,
|
||||||
|
inpbuf: InputBuffer,
|
||||||
|
decodebuf: Vec<u8>,
|
||||||
|
opts: Options,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Worker {
|
||||||
|
/// Execute the worker with the given printer and work item.
|
||||||
|
///
|
||||||
|
/// A work item can either be stdin or a file path.
|
||||||
|
pub fn run<W: WriteColor>(
|
||||||
|
&mut self,
|
||||||
|
printer: &mut Printer<W>,
|
||||||
|
work: Work,
|
||||||
|
) -> u64 {
|
||||||
|
let result = match work {
|
||||||
|
Work::Stdin => {
|
||||||
|
let stdin = io::stdin();
|
||||||
|
let stdin = stdin.lock();
|
||||||
|
self.search(printer, Path::new("<stdin>"), stdin)
|
||||||
|
}
|
||||||
|
Work::DirEntry(dent) => {
|
||||||
|
let mut path = dent.path();
|
||||||
|
if self.opts.search_zip_files
|
||||||
|
&& decompressor::is_compressed(path)
|
||||||
|
{
|
||||||
|
match DecompressionReader::from_path(path) {
|
||||||
|
Some(reader) => self.search(printer, path, reader),
|
||||||
|
None => {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let file = match File::open(path) {
|
||||||
|
Ok(file) => file,
|
||||||
|
Err(err) => {
|
||||||
|
if !self.opts.no_messages {
|
||||||
|
eprintln!("{}: {}", path.display(), err);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
if let Some(p) = strip_prefix("./", path) {
|
||||||
|
path = p;
|
||||||
|
}
|
||||||
|
if self.opts.mmap {
|
||||||
|
self.search_mmap(printer, path, &file)
|
||||||
|
} else {
|
||||||
|
self.search(printer, path, file)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
match result {
|
||||||
|
Ok(count) => {
|
||||||
|
count
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
if !self.opts.no_messages {
|
||||||
|
eprintln!("{}", err);
|
||||||
|
}
|
||||||
|
0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn search<R: io::Read, W: WriteColor>(
|
||||||
|
&mut self,
|
||||||
|
printer: &mut Printer<W>,
|
||||||
|
path: &Path,
|
||||||
|
rdr: R,
|
||||||
|
) -> Result<u64> {
|
||||||
|
let rdr = DecodeReader::new(
|
||||||
|
rdr, &mut self.decodebuf, self.opts.encoding);
|
||||||
|
let searcher = Searcher::new(
|
||||||
|
&mut self.inpbuf, printer, &self.grep, path, rdr);
|
||||||
|
searcher
|
||||||
|
.after_context(self.opts.after_context)
|
||||||
|
.before_context(self.opts.before_context)
|
||||||
|
.count(self.opts.count)
|
||||||
|
.files_with_matches(self.opts.files_with_matches)
|
||||||
|
.files_without_matches(self.opts.files_without_matches)
|
||||||
|
.eol(self.opts.eol)
|
||||||
|
.line_number(self.opts.line_number)
|
||||||
|
.invert_match(self.opts.invert_match)
|
||||||
|
.max_count(self.opts.max_count)
|
||||||
|
.quiet(self.opts.quiet)
|
||||||
|
.text(self.opts.text)
|
||||||
|
.run()
|
||||||
|
.map_err(From::from)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn search_mmap<W: WriteColor>(
|
||||||
|
&mut self,
|
||||||
|
printer: &mut Printer<W>,
|
||||||
|
path: &Path,
|
||||||
|
file: &File,
|
||||||
|
) -> Result<u64> {
|
||||||
|
if file.metadata()?.len() == 0 {
|
||||||
|
// Opening a memory map with an empty file results in an error.
|
||||||
|
// However, this may not actually be an empty file! For example,
|
||||||
|
// /proc/cpuinfo reports itself as an empty file, but it can
|
||||||
|
// produce data when it's read from. Therefore, we fall back to
|
||||||
|
// regular read calls.
|
||||||
|
return self.search(printer, path, file);
|
||||||
|
}
|
||||||
|
let mmap = match self.mmap(file)? {
|
||||||
|
None => return self.search(printer, path, file),
|
||||||
|
Some(mmap) => mmap,
|
||||||
|
};
|
||||||
|
let buf = &*mmap;
|
||||||
|
if buf.len() >= 3 && Encoding::for_bom(buf).is_some() {
|
||||||
|
// If we have a UTF-16 bom in our memory map, then we need to fall
|
||||||
|
// back to the stream reader, which will do transcoding.
|
||||||
|
return self.search(printer, path, file);
|
||||||
|
}
|
||||||
|
let searcher = BufferSearcher::new(printer, &self.grep, path, buf);
|
||||||
|
Ok(searcher
|
||||||
|
.count(self.opts.count)
|
||||||
|
.files_with_matches(self.opts.files_with_matches)
|
||||||
|
.files_without_matches(self.opts.files_without_matches)
|
||||||
|
.eol(self.opts.eol)
|
||||||
|
.line_number(self.opts.line_number)
|
||||||
|
.invert_match(self.opts.invert_match)
|
||||||
|
.max_count(self.opts.max_count)
|
||||||
|
.quiet(self.opts.quiet)
|
||||||
|
.text(self.opts.text)
|
||||||
|
.run())
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(not(unix))]
|
||||||
|
fn mmap(&self, file: &File) -> Result<Option<Mmap>> {
|
||||||
|
Ok(Some(mmap_readonly(file)?))
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(unix)]
|
||||||
|
fn mmap(&self, file: &File) -> Result<Option<Mmap>> {
|
||||||
|
use libc::{ENODEV, EOVERFLOW};
|
||||||
|
|
||||||
|
let err = match mmap_readonly(file) {
|
||||||
|
Ok(mmap) => return Ok(Some(mmap)),
|
||||||
|
Err(err) => err,
|
||||||
|
};
|
||||||
|
let code = err.raw_os_error();
|
||||||
|
if code == Some(ENODEV) || code == Some(EOVERFLOW) {
|
||||||
|
return Ok(None);
|
||||||
|
}
|
||||||
|
Err(From::from(err))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn mmap_readonly(file: &File) -> io::Result<Mmap> {
|
||||||
|
unsafe { Mmap::map(file) }
|
||||||
|
}
|
||||||
3
termcolor/COPYING
Normal file
3
termcolor/COPYING
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This project is dual-licensed under the Unlicense and MIT licenses.
|
||||||
|
|
||||||
|
You may use this code under the terms of either license.
|
||||||
20
termcolor/Cargo.toml
Normal file
20
termcolor/Cargo.toml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[package]
|
||||||
|
name = "termcolor"
|
||||||
|
version = "0.3.3" #:version
|
||||||
|
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||||
|
description = """
|
||||||
|
A simple cross platform library for writing colored text to a terminal.
|
||||||
|
"""
|
||||||
|
documentation = "https://docs.rs/termcolor"
|
||||||
|
homepage = "https://github.com/BurntSushi/ripgrep/tree/master/termcolor"
|
||||||
|
repository = "https://github.com/BurntSushi/ripgrep/tree/master/termcolor"
|
||||||
|
readme = "README.md"
|
||||||
|
keywords = ["windows", "win", "color", "ansi", "console"]
|
||||||
|
license = "Unlicense/MIT"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "termcolor"
|
||||||
|
bench = false
|
||||||
|
|
||||||
|
[target.'cfg(windows)'.dependencies]
|
||||||
|
wincolor = { version = "0.1.3", path = "../wincolor" }
|
||||||
21
termcolor/LICENSE-MIT
Normal file
21
termcolor/LICENSE-MIT
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Andrew Gallant
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
86
termcolor/README.md
Normal file
86
termcolor/README.md
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
termcolor
|
||||||
|
=========
|
||||||
|
A simple cross platform library for writing colored text to a terminal. This
|
||||||
|
library writes colored text either using standard ANSI escape sequences or
|
||||||
|
by interacting with the Windows console. Several convenient abstractions
|
||||||
|
are provided for use in single-threaded or multi-threaded command line
|
||||||
|
applications.
|
||||||
|
|
||||||
|
[](https://travis-ci.org/BurntSushi/ripgrep)
|
||||||
|
[](https://ci.appveyor.com/project/BurntSushi/ripgrep)
|
||||||
|
[](https://crates.io/crates/termcolor)
|
||||||
|
|
||||||
|
Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
[https://docs.rs/termcolor](https://docs.rs/termcolor)
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
Add this to your `Cargo.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
termcolor = "0.3"
|
||||||
|
```
|
||||||
|
|
||||||
|
and this to your crate root:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
extern crate termcolor;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Organization
|
||||||
|
|
||||||
|
The `WriteColor` trait extends the `io::Write` trait with methods for setting
|
||||||
|
colors or resetting them.
|
||||||
|
|
||||||
|
`StandardStream` and `StandardStreamLock` both satisfy `WriteColor` and are
|
||||||
|
analogous to `std::io::Stdout` and `std::io::StdoutLock`, or `std::io::Stderr`
|
||||||
|
and `std::io::StderrLock`.
|
||||||
|
|
||||||
|
`Buffer` is an in memory buffer that supports colored text. In a parallel
|
||||||
|
program, each thread might write to its own buffer. A buffer can be printed to
|
||||||
|
stdout or stderr using a `BufferWriter`. The advantage of this design is that
|
||||||
|
each thread can work in parallel on a buffer without having to synchronize
|
||||||
|
access to global resources such as the Windows console. Moreover, this design
|
||||||
|
also prevents interleaving of buffer output.
|
||||||
|
|
||||||
|
`Ansi` and `NoColor` both satisfy `WriteColor` for arbitrary implementors of
|
||||||
|
`io::Write`. These types are useful when you know exactly what you need. An
|
||||||
|
analogous type for the Windows console is not provided since it cannot exist.
|
||||||
|
|
||||||
|
### Example: using `StandardStream`
|
||||||
|
|
||||||
|
The `StandardStream` type in this crate works similarly to `std::io::Stdout`,
|
||||||
|
except it is augmented with methods for coloring by the `WriteColor` trait.
|
||||||
|
For example, to write some green text:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use std::io::Write;
|
||||||
|
use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor};
|
||||||
|
|
||||||
|
let mut stdout = StandardStream::stdout(ColorChoice::Always);
|
||||||
|
stdout.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
|
||||||
|
writeln!(&mut stdout, "green text!")?;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example: using `BufferWriter`
|
||||||
|
|
||||||
|
A `BufferWriter` can create buffers and write buffers to stdout or stderr. It
|
||||||
|
does *not* implement `io::Write` or `WriteColor` itself. Instead, `Buffer`
|
||||||
|
implements `io::Write` and `io::WriteColor`.
|
||||||
|
|
||||||
|
This example shows how to print some green text to stderr.
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use std::io::Write;
|
||||||
|
use termcolor::{BufferWriter, Color, ColorChoice, ColorSpec, WriteColor};
|
||||||
|
|
||||||
|
let mut bufwtr = BufferWriter::stderr(ColorChoice::Always);
|
||||||
|
let mut buffer = bufwtr.buffer();
|
||||||
|
buffer.set_color(ColorSpec::new().set_fg(Some(Color::Green)))?;
|
||||||
|
writeln!(&mut buffer, "green text!")?;
|
||||||
|
bufwtr.print(&buffer)?;
|
||||||
|
```
|
||||||
24
termcolor/UNLICENSE
Normal file
24
termcolor/UNLICENSE
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
1617
termcolor/src/lib.rs
Normal file
1617
termcolor/src/lib.rs
Normal file
File diff suppressed because it is too large
Load Diff
BIN
tests/data/sherlock.bz2
Normal file
BIN
tests/data/sherlock.bz2
Normal file
Binary file not shown.
BIN
tests/data/sherlock.gz
Normal file
BIN
tests/data/sherlock.gz
Normal file
Binary file not shown.
BIN
tests/data/sherlock.lzma
Normal file
BIN
tests/data/sherlock.lzma
Normal file
Binary file not shown.
BIN
tests/data/sherlock.xz
Normal file
BIN
tests/data/sherlock.xz
Normal file
Binary file not shown.
889
tests/tests.rs
889
tests/tests.rs
File diff suppressed because it is too large
Load Diff
113
tests/workdir.rs
113
tests/workdir.rs
@@ -13,7 +13,7 @@ use std::time::Duration;
|
|||||||
static TEST_DIR: &'static str = "ripgrep-tests";
|
static TEST_DIR: &'static str = "ripgrep-tests";
|
||||||
static NEXT_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
static NEXT_ID: AtomicUsize = ATOMIC_USIZE_INIT;
|
||||||
|
|
||||||
/// WorkDir represents a directory in which tests are run.
|
/// `WorkDir` represents a directory in which tests are run.
|
||||||
///
|
///
|
||||||
/// Directories are created from a global atomic counter to avoid duplicates.
|
/// Directories are created from a global atomic counter to avoid duplicates.
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -41,12 +41,39 @@ impl WorkDir {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Create a new file with the given name and contents in this directory.
|
/// Create a new file with the given name and contents in this directory,
|
||||||
|
/// or panic on error.
|
||||||
pub fn create<P: AsRef<Path>>(&self, name: P, contents: &str) {
|
pub fn create<P: AsRef<Path>>(&self, name: P, contents: &str) {
|
||||||
|
self.create_bytes(name, contents.as_bytes());
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Try to create a new file with the given name and contents in this
|
||||||
|
/// directory.
|
||||||
|
pub fn try_create<P: AsRef<Path>>(&self, name: P, contents: &str) -> io::Result<()> {
|
||||||
let path = self.dir.join(name);
|
let path = self.dir.join(name);
|
||||||
let mut file = nice_err(&path, File::create(&path));
|
self.try_create_bytes(path, contents.as_bytes())
|
||||||
nice_err(&path, file.write_all(contents.as_bytes()));
|
}
|
||||||
nice_err(&path, file.flush());
|
|
||||||
|
/// Create a new file with the given name and size.
|
||||||
|
pub fn create_size<P: AsRef<Path>>(&self, name: P, filesize: u64) {
|
||||||
|
let path = self.dir.join(name);
|
||||||
|
let file = nice_err(&path, File::create(&path));
|
||||||
|
nice_err(&path, file.set_len(filesize));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new file with the given name and contents in this directory,
|
||||||
|
/// or panic on error.
|
||||||
|
pub fn create_bytes<P: AsRef<Path>>(&self, name: P, contents: &[u8]) {
|
||||||
|
let path = self.dir.join(name);
|
||||||
|
nice_err(&path, self.try_create_bytes(&path, contents));
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Try to create a new file with the given name and contents in this
|
||||||
|
/// directory.
|
||||||
|
fn try_create_bytes<P: AsRef<Path>>(&self, path: P, contents: &[u8]) -> io::Result<()> {
|
||||||
|
let mut file = File::create(&path)?;
|
||||||
|
file.write_all(contents)?;
|
||||||
|
file.flush()
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Remove a file with the given name from this directory.
|
/// Remove a file with the given name from this directory.
|
||||||
@@ -71,8 +98,29 @@ impl WorkDir {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to the ripgrep executable.
|
/// Returns the path to the ripgrep executable.
|
||||||
|
#[cfg(not(windows))]
|
||||||
pub fn bin(&self) -> PathBuf {
|
pub fn bin(&self) -> PathBuf {
|
||||||
self.root.join("rg")
|
let path = self.root.join("rg");
|
||||||
|
if !path.is_file() {
|
||||||
|
// Looks like a recent version of Cargo changed the cwd or the
|
||||||
|
// location of the test executable.
|
||||||
|
self.root.join("../rg")
|
||||||
|
} else {
|
||||||
|
path
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns the path to the ripgrep executable.
|
||||||
|
#[cfg(windows)]
|
||||||
|
pub fn bin(&self) -> PathBuf {
|
||||||
|
let path = self.root.join("rg.exe");
|
||||||
|
if !path.is_file() {
|
||||||
|
// Looks like a recent version of Cargo changed the cwd or the
|
||||||
|
// location of the test executable.
|
||||||
|
self.root.join("../rg.exe")
|
||||||
|
} else {
|
||||||
|
path
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns the path to this directory.
|
/// Returns the path to this directory.
|
||||||
@@ -148,7 +196,41 @@ impl WorkDir {
|
|||||||
|
|
||||||
/// Gets the output of a command. If the command failed, then this panics.
|
/// Gets the output of a command. If the command failed, then this panics.
|
||||||
pub fn output(&self, cmd: &mut process::Command) -> process::Output {
|
pub fn output(&self, cmd: &mut process::Command) -> process::Output {
|
||||||
let o = cmd.output().unwrap();
|
let output = cmd.output().unwrap();
|
||||||
|
self.expect_success(cmd, output)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Pipe `input` to a command, and collect the output.
|
||||||
|
pub fn pipe(
|
||||||
|
&self,
|
||||||
|
cmd: &mut process::Command,
|
||||||
|
input: &str
|
||||||
|
) -> process::Output {
|
||||||
|
cmd.stdin(process::Stdio::piped());
|
||||||
|
cmd.stdout(process::Stdio::piped());
|
||||||
|
cmd.stderr(process::Stdio::piped());
|
||||||
|
|
||||||
|
let mut child = cmd.spawn().unwrap();
|
||||||
|
|
||||||
|
// Pipe input to child process using a separate thread to avoid
|
||||||
|
// risk of deadlock between parent and child process.
|
||||||
|
let mut stdin = child.stdin.take().expect("expected standard input");
|
||||||
|
let input = input.to_owned();
|
||||||
|
let worker = thread::spawn(move || {
|
||||||
|
write!(stdin, "{}", input)
|
||||||
|
});
|
||||||
|
|
||||||
|
let output = self.expect_success(cmd, child.wait_with_output().unwrap());
|
||||||
|
worker.join().unwrap().unwrap();
|
||||||
|
output
|
||||||
|
}
|
||||||
|
|
||||||
|
/// If `o` is not the output of a successful process run
|
||||||
|
fn expect_success(
|
||||||
|
&self,
|
||||||
|
cmd: &process::Command,
|
||||||
|
o: process::Output
|
||||||
|
) -> process::Output {
|
||||||
if !o.status.success() {
|
if !o.status.success() {
|
||||||
let suggest =
|
let suggest =
|
||||||
if o.stderr.is_empty() {
|
if o.stderr.is_empty() {
|
||||||
@@ -189,6 +271,23 @@ impl WorkDir {
|
|||||||
String::from_utf8_lossy(&o.stderr));
|
String::from_utf8_lossy(&o.stderr));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Runs the given command and asserts that something was printed to
|
||||||
|
/// stderr.
|
||||||
|
pub fn assert_non_empty_stderr(&self, cmd: &mut process::Command) {
|
||||||
|
let o = cmd.output().unwrap();
|
||||||
|
if o.status.success() || o.stderr.is_empty() {
|
||||||
|
panic!("\n\n===== {:?} =====\n\
|
||||||
|
command succeeded but expected failure!\
|
||||||
|
\n\ncwd: {}\
|
||||||
|
\n\nstatus: {}\
|
||||||
|
\n\nstdout: {}\n\nstderr: {}\
|
||||||
|
\n\n=====\n",
|
||||||
|
cmd, self.dir.display(), o.status,
|
||||||
|
String::from_utf8_lossy(&o.stdout),
|
||||||
|
String::from_utf8_lossy(&o.stderr));
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn nice_err<P: AsRef<Path>, T, E: error::Error>(
|
fn nice_err<P: AsRef<Path>, T, E: error::Error>(
|
||||||
|
|||||||
3
wincolor/COPYING
Normal file
3
wincolor/COPYING
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
This project is dual-licensed under the Unlicense and MIT licenses.
|
||||||
|
|
||||||
|
You may use this code under the terms of either license.
|
||||||
20
wincolor/Cargo.toml
Normal file
20
wincolor/Cargo.toml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
[package]
|
||||||
|
name = "wincolor"
|
||||||
|
version = "0.1.5" #:version
|
||||||
|
authors = ["Andrew Gallant <jamslam@gmail.com>"]
|
||||||
|
description = """
|
||||||
|
A simple Windows specific API for controlling text color in a Windows console.
|
||||||
|
"""
|
||||||
|
documentation = "https://docs.rs/wincolor"
|
||||||
|
homepage = "https://github.com/BurntSushi/ripgrep/tree/master/wincolor"
|
||||||
|
repository = "https://github.com/BurntSushi/ripgrep/tree/master/wincolor"
|
||||||
|
readme = "README.md"
|
||||||
|
keywords = ["windows", "win", "color", "ansi", "console"]
|
||||||
|
license = "Unlicense/MIT"
|
||||||
|
|
||||||
|
[lib]
|
||||||
|
name = "wincolor"
|
||||||
|
bench = false
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
winapi = { version = "0.3", features = ["minwindef", "processenv", "winbase", "wincon"] }
|
||||||
21
wincolor/LICENSE-MIT
Normal file
21
wincolor/LICENSE-MIT
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2015 Andrew Gallant
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in
|
||||||
|
all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
|
THE SOFTWARE.
|
||||||
44
wincolor/README.md
Normal file
44
wincolor/README.md
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
wincolor
|
||||||
|
========
|
||||||
|
A simple Windows specific API for controlling text color in a Windows console.
|
||||||
|
The purpose of this crate is to expose the full inflexibility of the Windows
|
||||||
|
console without any platform independent abstraction.
|
||||||
|
|
||||||
|
[](https://ci.appveyor.com/project/BurntSushi/ripgrep)
|
||||||
|
[](https://crates.io/crates/wincolor)
|
||||||
|
|
||||||
|
Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org).
|
||||||
|
|
||||||
|
### Documentation
|
||||||
|
|
||||||
|
[https://docs.rs/wincolor](https://docs.rs/wincolor)
|
||||||
|
|
||||||
|
### Usage
|
||||||
|
|
||||||
|
Add this to your `Cargo.toml`:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
wincolor = "0.1"
|
||||||
|
```
|
||||||
|
|
||||||
|
and this to your crate root:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
extern crate wincolor;
|
||||||
|
```
|
||||||
|
|
||||||
|
### Example
|
||||||
|
|
||||||
|
This is a simple example that shows how to write text with a foreground color
|
||||||
|
of cyan and the intense attribute set:
|
||||||
|
|
||||||
|
```rust
|
||||||
|
use wincolor::{Console, Color, Intense};
|
||||||
|
|
||||||
|
let mut con = Console::stdout().unwrap();
|
||||||
|
con.fg(Intense::Yes, Color::Cyan).unwrap();
|
||||||
|
println!("This text will be intense cyan.");
|
||||||
|
con.reset().unwrap();
|
||||||
|
println!("This text will be normal.");
|
||||||
|
```
|
||||||
24
wincolor/UNLICENSE
Normal file
24
wincolor/UNLICENSE
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
This is free and unencumbered software released into the public domain.
|
||||||
|
|
||||||
|
Anyone is free to copy, modify, publish, use, compile, sell, or
|
||||||
|
distribute this software, either in source code form or as a compiled
|
||||||
|
binary, for any purpose, commercial or non-commercial, and by any
|
||||||
|
means.
|
||||||
|
|
||||||
|
In jurisdictions that recognize copyright laws, the author or authors
|
||||||
|
of this software dedicate any and all copyright interest in the
|
||||||
|
software to the public domain. We make this dedication for the benefit
|
||||||
|
of the public at large and to the detriment of our heirs and
|
||||||
|
successors. We intend this dedication to be an overt act of
|
||||||
|
relinquishment in perpetuity of all present and future rights to this
|
||||||
|
software under copyright law.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||||||
|
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
||||||
|
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
||||||
|
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||||
|
OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
|
For more information, please refer to <http://unlicense.org/>
|
||||||
33
wincolor/src/lib.rs
Normal file
33
wincolor/src/lib.rs
Normal file
@@ -0,0 +1,33 @@
|
|||||||
|
/*!
|
||||||
|
This crate provides a safe and simple Windows specific API to control
|
||||||
|
text attributes in the Windows console. Text attributes are limited to
|
||||||
|
foreground/background colors, as well as whether to make colors intense or not.
|
||||||
|
|
||||||
|
Note that on non-Windows platforms, this crate is empty but will compile.
|
||||||
|
|
||||||
|
# Example
|
||||||
|
|
||||||
|
```no_run
|
||||||
|
# #[cfg(windows)]
|
||||||
|
# {
|
||||||
|
use wincolor::{Console, Color, Intense};
|
||||||
|
|
||||||
|
let mut con = Console::stdout().unwrap();
|
||||||
|
con.fg(Intense::Yes, Color::Cyan).unwrap();
|
||||||
|
println!("This text will be intense cyan.");
|
||||||
|
con.reset().unwrap();
|
||||||
|
println!("This text will be normal.");
|
||||||
|
# }
|
||||||
|
```
|
||||||
|
*/
|
||||||
|
|
||||||
|
#![deny(missing_docs)]
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
extern crate winapi;
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
pub use win::*;
|
||||||
|
|
||||||
|
#[cfg(windows)]
|
||||||
|
mod win;
|
||||||
230
wincolor/src/win.rs
Normal file
230
wincolor/src/win.rs
Normal file
@@ -0,0 +1,230 @@
|
|||||||
|
use std::io;
|
||||||
|
use std::mem;
|
||||||
|
|
||||||
|
use winapi::shared::minwindef::{DWORD, WORD};
|
||||||
|
use winapi::um::processenv;
|
||||||
|
use winapi::um::winbase::{STD_ERROR_HANDLE, STD_OUTPUT_HANDLE};
|
||||||
|
use winapi::um::wincon::{
|
||||||
|
self,
|
||||||
|
FOREGROUND_BLUE as FG_BLUE,
|
||||||
|
FOREGROUND_GREEN as FG_GREEN,
|
||||||
|
FOREGROUND_RED as FG_RED,
|
||||||
|
FOREGROUND_INTENSITY as FG_INTENSITY,
|
||||||
|
};
|
||||||
|
|
||||||
|
const FG_CYAN: WORD = FG_BLUE | FG_GREEN;
|
||||||
|
const FG_MAGENTA: WORD = FG_BLUE | FG_RED;
|
||||||
|
const FG_YELLOW: WORD = FG_GREEN | FG_RED;
|
||||||
|
const FG_WHITE: WORD = FG_BLUE | FG_GREEN | FG_RED;
|
||||||
|
|
||||||
|
/// A Windows console.
|
||||||
|
///
|
||||||
|
/// This represents a very limited set of functionality available to a Windows
|
||||||
|
/// console. In particular, it can only change text attributes such as color
|
||||||
|
/// and intensity.
|
||||||
|
///
|
||||||
|
/// There is no way to "write" to this console. Simply write to
|
||||||
|
/// stdout or stderr instead, while interleaving instructions to the console
|
||||||
|
/// to change text attributes.
|
||||||
|
///
|
||||||
|
/// A common pitfall when using a console is to forget to flush writes to
|
||||||
|
/// stdout before setting new text attributes.
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub struct Console {
|
||||||
|
handle_id: DWORD,
|
||||||
|
start_attr: TextAttributes,
|
||||||
|
cur_attr: TextAttributes,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Console {
|
||||||
|
/// Get a console for a standard I/O stream.
|
||||||
|
fn create_for_stream(handle_id: DWORD) -> io::Result<Console> {
|
||||||
|
let mut info = unsafe { mem::zeroed() };
|
||||||
|
let res = unsafe {
|
||||||
|
let handle = processenv::GetStdHandle(handle_id);
|
||||||
|
wincon::GetConsoleScreenBufferInfo(handle, &mut info)
|
||||||
|
};
|
||||||
|
if res == 0 {
|
||||||
|
return Err(io::Error::last_os_error());
|
||||||
|
}
|
||||||
|
let attr = TextAttributes::from_word(info.wAttributes);
|
||||||
|
Ok(Console {
|
||||||
|
handle_id: handle_id,
|
||||||
|
start_attr: attr,
|
||||||
|
cur_attr: attr,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new Console to stdout.
|
||||||
|
///
|
||||||
|
/// If there was a problem creating the console, then an error is returned.
|
||||||
|
pub fn stdout() -> io::Result<Console> {
|
||||||
|
Self::create_for_stream(STD_OUTPUT_HANDLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Create a new Console to stderr.
|
||||||
|
///
|
||||||
|
/// If there was a problem creating the console, then an error is returned.
|
||||||
|
pub fn stderr() -> io::Result<Console> {
|
||||||
|
Self::create_for_stream(STD_ERROR_HANDLE)
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Applies the current text attributes.
|
||||||
|
fn set(&mut self) -> io::Result<()> {
|
||||||
|
let attr = self.cur_attr.to_word();
|
||||||
|
let res = unsafe {
|
||||||
|
let handle = processenv::GetStdHandle(self.handle_id);
|
||||||
|
wincon::SetConsoleTextAttribute(handle, attr)
|
||||||
|
};
|
||||||
|
if res == 0 {
|
||||||
|
return Err(io::Error::last_os_error());
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Apply the given intensity and color attributes to the console
|
||||||
|
/// foreground.
|
||||||
|
///
|
||||||
|
/// If there was a problem setting attributes on the console, then an error
|
||||||
|
/// is returned.
|
||||||
|
pub fn fg(&mut self, intense: Intense, color: Color) -> io::Result<()> {
|
||||||
|
self.cur_attr.fg_color = color;
|
||||||
|
self.cur_attr.fg_intense = intense;
|
||||||
|
self.set()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Apply the given intensity and color attributes to the console
|
||||||
|
/// background.
|
||||||
|
///
|
||||||
|
/// If there was a problem setting attributes on the console, then an error
|
||||||
|
/// is returned.
|
||||||
|
pub fn bg(&mut self, intense: Intense, color: Color) -> io::Result<()> {
|
||||||
|
self.cur_attr.bg_color = color;
|
||||||
|
self.cur_attr.bg_intense = intense;
|
||||||
|
self.set()
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Reset the console text attributes to their original settings.
|
||||||
|
///
|
||||||
|
/// The original settings correspond to the text attributes on the console
|
||||||
|
/// when this `Console` value was created.
|
||||||
|
///
|
||||||
|
/// If there was a problem setting attributes on the console, then an error
|
||||||
|
/// is returned.
|
||||||
|
pub fn reset(&mut self) -> io::Result<()> {
|
||||||
|
self.cur_attr = self.start_attr;
|
||||||
|
self.set()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// A representation of text attributes for the Windows console.
|
||||||
|
#[derive(Copy, Clone, Debug, Eq, PartialEq)]
|
||||||
|
struct TextAttributes {
|
||||||
|
fg_color: Color,
|
||||||
|
fg_intense: Intense,
|
||||||
|
bg_color: Color,
|
||||||
|
bg_intense: Intense,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TextAttributes {
|
||||||
|
fn to_word(&self) -> WORD {
|
||||||
|
let mut w = 0;
|
||||||
|
w |= self.fg_color.to_fg();
|
||||||
|
w |= self.fg_intense.to_fg();
|
||||||
|
w |= self.bg_color.to_bg();
|
||||||
|
w |= self.bg_intense.to_bg();
|
||||||
|
w
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_word(word: WORD) -> TextAttributes {
|
||||||
|
TextAttributes {
|
||||||
|
fg_color: Color::from_fg(word),
|
||||||
|
fg_intense: Intense::from_fg(word),
|
||||||
|
bg_color: Color::from_bg(word),
|
||||||
|
bg_intense: Intense::from_bg(word),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Whether to use intense colors or not.
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
pub enum Intense {
|
||||||
|
Yes,
|
||||||
|
No,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Intense {
|
||||||
|
fn to_bg(&self) -> WORD {
|
||||||
|
self.to_fg() << 4
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_bg(word: WORD) -> Intense {
|
||||||
|
Intense::from_fg(word >> 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_fg(&self) -> WORD {
|
||||||
|
match *self {
|
||||||
|
Intense::No => 0,
|
||||||
|
Intense::Yes => FG_INTENSITY,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_fg(word: WORD) -> Intense {
|
||||||
|
if word & FG_INTENSITY > 0 {
|
||||||
|
Intense::Yes
|
||||||
|
} else {
|
||||||
|
Intense::No
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// The set of available colors for use with a Windows console.
|
||||||
|
#[allow(missing_docs)]
|
||||||
|
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
|
||||||
|
pub enum Color {
|
||||||
|
Black,
|
||||||
|
Blue,
|
||||||
|
Green,
|
||||||
|
Red,
|
||||||
|
Cyan,
|
||||||
|
Magenta,
|
||||||
|
Yellow,
|
||||||
|
White,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Color {
|
||||||
|
fn to_bg(&self) -> WORD {
|
||||||
|
self.to_fg() << 4
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_bg(word: WORD) -> Color {
|
||||||
|
Color::from_fg(word >> 4)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_fg(&self) -> WORD {
|
||||||
|
match *self {
|
||||||
|
Color::Black => 0,
|
||||||
|
Color::Blue => FG_BLUE,
|
||||||
|
Color::Green => FG_GREEN,
|
||||||
|
Color::Red => FG_RED,
|
||||||
|
Color::Cyan => FG_CYAN,
|
||||||
|
Color::Magenta => FG_MAGENTA,
|
||||||
|
Color::Yellow => FG_YELLOW,
|
||||||
|
Color::White => FG_WHITE,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_fg(word: WORD) -> Color {
|
||||||
|
match word & 0b111 {
|
||||||
|
FG_BLUE => Color::Blue,
|
||||||
|
FG_GREEN => Color::Green,
|
||||||
|
FG_RED => Color::Red,
|
||||||
|
FG_CYAN => Color::Cyan,
|
||||||
|
FG_MAGENTA => Color::Magenta,
|
||||||
|
FG_YELLOW => Color::Yellow,
|
||||||
|
FG_WHITE => Color::White,
|
||||||
|
_ => Color::Black,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user