mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-08-01 12:41:58 -07:00
This PR introduces a new sub-crate, `ignore`, which primarily provides a fast recursive directory iterator that respects ignore files like gitignore and other configurable filtering rules based on globs or even file types. This results in a substantial source of complexity moved out of ripgrep's core and into a reusable component that others can now (hopefully) benefit from. While much of the ignore code carried over from ripgrep's core, a substantial portion of it was rewritten with the following goals in mind: 1. Reuse matchers built from gitignore files across directory iteration. 2. Design the matcher data structure to be amenable for parallelizing directory iteration. (Indeed, writing the parallel iterator is the next step.) Fixes #9, #44, #45
43 lines
1.3 KiB
Rust
43 lines
1.3 KiB
Rust
/*!
|
|
The pathutil module provides platform specific operations on paths that are
|
|
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
|
|
into its constituent components. We give up on Windows, but on Unix, we deal
|
|
with the raw bytes directly.
|
|
|
|
On large repositories (like chromium), this can have a ~25% performance
|
|
improvement on just listing the files to search (!).
|
|
*/
|
|
use std::path::Path;
|
|
|
|
/// Strip `prefix` from the `path` and return the remainder.
|
|
///
|
|
/// If `path` doesn't have a prefix `prefix`, then return `None`.
|
|
#[cfg(unix)]
|
|
pub fn strip_prefix<'a, P: AsRef<Path> + ?Sized>(
|
|
prefix: &'a P,
|
|
path: &'a Path,
|
|
) -> Option<&'a Path> {
|
|
use std::ffi::OsStr;
|
|
use std::os::unix::ffi::OsStrExt;
|
|
|
|
let prefix = prefix.as_ref().as_os_str().as_bytes();
|
|
let path = path.as_os_str().as_bytes();
|
|
if prefix.len() > path.len() || prefix != &path[0..prefix.len()] {
|
|
None
|
|
} else {
|
|
Some(&Path::new(OsStr::from_bytes(&path[prefix.len()..])))
|
|
}
|
|
}
|
|
|
|
/// Strip `prefix` from the `path` and return the remainder.
|
|
///
|
|
/// If `path` doesn't have a prefix `prefix`, then return `None`.
|
|
#[cfg(not(unix))]
|
|
pub fn strip_prefix<'a, P: AsRef<Path> + ?Sized>(
|
|
prefix: &'a P,
|
|
path: &'a Path,
|
|
) -> Option<&'a Path> {
|
|
path.strip_prefix(prefix).ok()
|
|
}
|