Move glob implementation to new crate.

It is isolated and complex enough that it deserves attention all on its
own. It's also eminently reusable.
This commit is contained in:
Andrew Gallant
2016-09-30 19:42:41 -04:00
parent b9d5f22a4d
commit fdf24317ac
9 changed files with 88 additions and 24 deletions

View File

@@ -28,15 +28,15 @@ use std::fs::File;
use std::io::{self, BufRead};
use std::path::{Path, PathBuf};
use globset;
use regex;
use glob;
use pathutil::{is_file_name, strip_prefix};
/// Represents an error that can occur when parsing a gitignore file.
#[derive(Debug)]
pub enum Error {
Glob(glob::Error),
Glob(globset::Error),
Regex(regex::Error),
Io(io::Error),
}
@@ -61,8 +61,8 @@ impl fmt::Display for Error {
}
}
impl From<glob::Error> for Error {
fn from(err: glob::Error) -> Error {
impl From<globset::Error> for Error {
fn from(err: globset::Error) -> Error {
Error::Glob(err)
}
}
@@ -82,7 +82,7 @@ impl From<io::Error> for Error {
/// Gitignore is a matcher for the glob patterns in a single gitignore file.
#[derive(Clone, Debug)]
pub struct Gitignore {
set: glob::Set,
set: globset::Set,
root: PathBuf,
patterns: Vec<Pattern>,
num_ignores: u64,
@@ -207,7 +207,7 @@ impl<'a> Match<'a> {
/// GitignoreBuilder constructs a matcher for a single set of globs from a
/// .gitignore file.
pub struct GitignoreBuilder {
builder: glob::SetBuilder,
builder: globset::SetBuilder,
root: PathBuf,
patterns: Vec<Pattern>,
}
@@ -237,7 +237,7 @@ impl GitignoreBuilder {
pub fn new<P: AsRef<Path>>(root: P) -> GitignoreBuilder {
let root = strip_prefix("./", root.as_ref()).unwrap_or(root.as_ref());
GitignoreBuilder {
builder: glob::SetBuilder::new(),
builder: globset::SetBuilder::new(),
root: root.to_path_buf(),
patterns: vec![],
}
@@ -299,7 +299,7 @@ impl GitignoreBuilder {
whitelist: false,
only_dir: false,
};
let mut opts = glob::MatchOptions::default();
let mut opts = globset::MatchOptions::default();
let has_slash = line.chars().any(|c| c == '/');
let is_absolute = line.chars().nth(0).unwrap() == '/';
if line.starts_with("\\!") || line.starts_with("\\#") {

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
extern crate deque;
extern crate docopt;
extern crate env_logger;
extern crate fnv;
extern crate globset;
extern crate grep;
#[cfg(windows)]
extern crate kernel32;
@@ -61,7 +61,6 @@ macro_rules! eprintln {
mod args;
mod atty;
mod gitignore;
mod glob;
mod ignore;
mod out;
mod pathutil;

View File

@@ -11,7 +11,7 @@ use std::path::Path;
use regex;
use gitignore::{Match, Pattern};
use glob::{self, MatchOptions};
use globset::{self, MatchOptions};
const TYPE_EXTENSIONS: &'static [(&'static str, &'static [&'static str])] = &[
("asm", &["*.asm", "*.s", "*.S"]),
@@ -93,7 +93,7 @@ pub enum Error {
/// A user specified file type definition could not be parsed.
InvalidDefinition,
/// There was an error building the matcher (probably a bad glob).
Glob(glob::Error),
Glob(globset::Error),
/// There was an error compiling a glob as a regex.
Regex(regex::Error),
}
@@ -125,8 +125,8 @@ impl fmt::Display for Error {
}
}
impl From<glob::Error> for Error {
fn from(err: glob::Error) -> Error {
impl From<globset::Error> for Error {
fn from(err: globset::Error) -> Error {
Error::Glob(err)
}
}
@@ -160,8 +160,8 @@ impl FileTypeDef {
#[derive(Clone, Debug)]
pub struct Types {
defs: Vec<FileTypeDef>,
selected: Option<glob::SetYesNo>,
negated: Option<glob::SetYesNo>,
selected: Option<globset::SetYesNo>,
negated: Option<globset::SetYesNo>,
has_selected: bool,
unmatched_pat: Pattern,
}
@@ -174,8 +174,8 @@ impl Types {
/// If has_selected is true, then at least one file type was selected.
/// Therefore, any non-matches should be ignored.
fn new(
selected: Option<glob::SetYesNo>,
negated: Option<glob::SetYesNo>,
selected: Option<globset::SetYesNo>,
negated: Option<globset::SetYesNo>,
has_selected: bool,
defs: Vec<FileTypeDef>,
) -> Types {
@@ -271,7 +271,7 @@ impl TypesBuilder {
if self.selected.is_empty() {
None
} else {
let mut bset = glob::SetBuilder::new();
let mut bset = globset::SetBuilder::new();
for name in &self.selected {
let globs = match self.types.get(name) {
Some(globs) => globs,
@@ -290,7 +290,7 @@ impl TypesBuilder {
if self.negated.is_empty() {
None
} else {
let mut bset = glob::SetBuilder::new();
let mut bset = globset::SetBuilder::new();
for name in &self.negated {
let globs = match self.types.get(name) {
Some(globs) => globs,