The .gitignore file is now searched for recursively.

Removed a warning if .gitignore is missing.
This commit is contained in:
Kim Hermansson 2019-10-04 22:56:56 +02:00
parent a3d1afdd1f
commit 930f730361
1 changed files with 36 additions and 21 deletions

View File

@ -53,10 +53,33 @@ fn remove_ignored_files(book_root: &PathBuf, paths: &[PathBuf]) -> Vec<PathBuf>
return vec![]; return vec![];
} }
let gitignore_path = book_root.join(".gitignore"); match find_gitignore(book_root) {
Some(gitignore_path) => {
match gitignore::File::new(gitignore_path.as_path()) { match gitignore::File::new(gitignore_path.as_path()) {
Ok(exclusion_checker) => paths Ok(exclusion_checker) => filter_ignored_files(exclusion_checker, paths),
Err(_) => {
// We're unable to read the .gitignore file, so we'll silently allow everything.
// Please see discussion: https://github.com/rust-lang-nursery/mdBook/pull/1051
paths.iter().map(|path| path.to_path_buf()).collect()
}
}
}
None => {
// There is no .gitignore file.
paths.iter().map(|path| path.to_path_buf()).collect()
}
}
}
fn find_gitignore(book_root: &PathBuf) -> Option<PathBuf> {
book_root
.ancestors()
.map(|p| p.join(".gitignore"))
.find(|p| p.exists())
}
fn filter_ignored_files(exclusion_checker: gitignore::File, paths: &[PathBuf]) -> Vec<PathBuf> {
paths
.iter() .iter()
.filter(|path| match exclusion_checker.is_excluded(path) { .filter(|path| match exclusion_checker.is_excluded(path) {
Ok(exclude) => !exclude, Ok(exclude) => !exclude,
@ -69,15 +92,7 @@ fn remove_ignored_files(book_root: &PathBuf, paths: &[PathBuf]) -> Vec<PathBuf>
} }
}) })
.map(|path| path.to_path_buf()) .map(|path| path.to_path_buf())
.collect(), .collect()
Err(error) => {
warn!(
"Unable to read gitignore file at {:?} file: {:?}. All files will be allowed.",
gitignore_path, error
);
paths.iter().map(|path| path.to_path_buf()).collect()
}
}
} }
/// Calls the closure when a book source file is changed, blocking indefinitely. /// Calls the closure when a book source file is changed, blocking indefinitely.