Skip to content

Commit

Permalink
ignore: fix custom ignore name bug
Browse files Browse the repository at this point in the history
This commit fixes a bug in the handling of custom gitignore file names.
Previously, the directory walker would check for whether there were any
ignore rules present, but this check didn't incorporate the custom gitignore
rules. At a high level, this permits custom gitignore names to be used
even if no other source of gitignore rules is used.

Fixes BurntSushi#800
  • Loading branch information
sharkdp authored and BurntSushi committed Feb 14, 2018
1 parent 5c1af3c commit b71a110
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 8 deletions.
18 changes: 10 additions & 8 deletions ignore/src/dir.rs
Original file line number Diff line number Diff line change
Expand Up @@ -73,13 +73,6 @@ struct IgnoreOptions {
git_exclude: bool,
}

impl IgnoreOptions {
/// Returns true if at least one type of ignore rules should be matched.
fn has_any_ignore_options(&self) -> bool {
self.ignore || self.git_global || self.git_ignore || self.git_exclude
}
}

/// Ignore is a matcher useful for recursively walking one or more directories.
#[derive(Clone, Debug)]
pub struct Ignore(Arc<IgnoreInner>);
Expand Down Expand Up @@ -267,6 +260,15 @@ impl Ignore {
(ig, errs.into_error_option())
}

/// Returns true if at least one type of ignore rule should be matched.
fn has_any_ignore_rules(&self) -> bool {
let opts = self.0.opts;
let has_custom_ignore_files = !self.0.custom_ignore_filenames.is_empty();

opts.ignore || opts.git_global || opts.git_ignore
|| opts.git_exclude || has_custom_ignore_files
}

/// Returns a match indicating whether the given file path should be
/// ignored or not.
///
Expand Down Expand Up @@ -295,7 +297,7 @@ impl Ignore {
}
}
let mut whitelisted = Match::None;
if self.0.opts.has_any_ignore_options() {
if self.has_any_ignore_rules() {
let mat = self.matched_ignore(path, is_dir);
if mat.is_ignore() {
return mat;
Expand Down
20 changes: 20 additions & 0 deletions ignore/src/walk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1585,6 +1585,26 @@ mod tests {
assert_paths(td.path(), &builder, &["bar", "a", "a/bar"]);
}

#[test]
fn custom_ignore_exclusive_use() {
let td = TempDir::new("walk-test-").unwrap();
let custom_ignore = ".customignore";
mkdirp(td.path().join("a"));
wfile(td.path().join(custom_ignore), "foo");
wfile(td.path().join("foo"), "");
wfile(td.path().join("a/foo"), "");
wfile(td.path().join("bar"), "");
wfile(td.path().join("a/bar"), "");

let mut builder = WalkBuilder::new(td.path());
builder.ignore(false);
builder.git_ignore(false);
builder.git_global(false);
builder.git_exclude(false);
builder.add_custom_ignore_filename(&custom_ignore);
assert_paths(td.path(), &builder, &["bar", "a", "a/bar"]);
}

#[test]
fn gitignore() {
let td = TempDir::new("walk-test-").unwrap();
Expand Down

0 comments on commit b71a110

Please sign in to comment.