Ripgrep code review
blog.mbrt.it
blog.mbrt.it
I'd like to respond to a few of the bad things pointed out. :P
The search code is indeed in a less than ideal state. I've mostly avoided refactoring it because I want to move it to its own separate crate. I've been steadily doing this for other things. Namely, ripgrep used to be a single main crate plus a small regex handling crate (grep), but now it's several: globset, grep, ignore, termcolor and wincolor. I'd like to roll the search code into the grep crate so that others can use it. Once that's done, ripgrep proper will be a pretty small, limited mostly to argv handling and output handling.
I do sometimes get overzealous with inline(always) and inline(never). Both are almost always a result of trying things while profiling, and then forgetting to remove them. If you look closely, most of them are in the core searching code where performance is quite important!
Finally, this code review was done while I was in the middle of moving more of ripgrep code out into the `ignore` and `termcolor` crates. The `ignore` crate does all the gitignore handling (which is quite tricky and is now being used by the tokei project: https://github.com/Aaronepower/tokei) and provides a parallel recursive directory iterator, which made ripgrep even faster! The `termcolor` crate handles cross platform coloring shenanigans, including Windows consoles and mintty. It wasn't fun: https://github.com/BurntSushi/ripgrep/issues/94#issuecomment... --- The author did a great job reviewing the previous solution I used for colors though, and was something I really wasn't proud of!
By the way, shouldn't msys_tty_on_handle be marked 'unsafe' too? I'm wondering if what happens I pass in some garbage as a handle...
Possibly. How would you construct said garbage? Would it require unsafe?
Mostly video game related.
The short version:
1. It's faster.
2. It's not just faster on code repos, it's also faster than grep itself on single files, so you can use ripgrep in lieu of both ag and grep.
3. It has Unicode support. (More importantly, its Unicode support is fast, and doesn't exhibit huge slow downs like GNU grep does.)
4. Its support for reading gitignore files is quite a bit less buggy than ag.
5. I've heard folks tell me ag was hard to install on Windows, but ripgrep provides first class support for Windows. I've never personally tried ag on Windows, so take that with a grain of salt.
The (much) longer version is my blog post, which goes into a lot more detail, specifically on 1+2+3: http://blog.burntsushi.net/ripgrep/
[plantuml]: http://plantuml.com/
[manually created]: view-source:http://blog.mbrt.it/2016-12-01-ripgrep-code-review/crates.sv...
digraph G {
"Ripgrep" -> "ignore"
"ignore" -> "globset"
"Ripgrep" -> "globset"
"Ripgrep" -> "grep"
}
http://www.webgraphviz.comYou could also set color, note I didn't do that in this example.
@startuml
component ripgrep
component ignore
component globset
component grep
ripgrep --> ignore
ignore --> globset
ripgrep --> globset
ripgrep --> grep
@enduml
You can get the structure right, and easily, but those beautiful icons are not something that I know how to create, and the 90-degree turns are I think actually impossible.The fact that it is so elegantly expressed in plantuml but it's still so ugly (by default) makes me really wish for a theme that's as nice as the hand-created diagram the author wrote.
[1]: http://www.plantuml.com/plantuml/uml/SoWkIImgAStDuU9ApiyjoCz...