diff options
Diffstat (limited to 'cli')
-rw-r--r-- | cli/util/fs.rs | 25 | ||||
-rw-r--r-- | cli/util/gitignore.rs | 20 |
2 files changed, 42 insertions, 3 deletions
diff --git a/cli/util/fs.rs b/cli/util/fs.rs index f6354097a..352e09999 100644 --- a/cli/util/fs.rs +++ b/cli/util/fs.rs @@ -326,7 +326,30 @@ impl<TFilter: Fn(WalkEntry) -> bool> FileCollector<TFilter> { } let mut maybe_git_ignores = if self.use_gitignore { - Some(GitIgnoreTree::new(Arc::new(deno_runtime::deno_fs::RealFs))) + // Override explicitly specified include paths in the + // .gitignore file. This does not apply to globs because + // that is way too complicated to reason about. + let include_paths = file_patterns + .include + .as_ref() + .map(|include| { + include + .inner() + .iter() + .filter_map(|path_or_pattern| { + if let PathOrPattern::Path(p) = path_or_pattern { + Some(p.clone()) + } else { + None + } + }) + .collect::<Vec<_>>() + }) + .unwrap_or_default(); + Some(GitIgnoreTree::new( + Arc::new(deno_runtime::deno_fs::RealFs), + include_paths, + )) } else { None }; diff --git a/cli/util/gitignore.rs b/cli/util/gitignore.rs index da9065494..f4185aa0d 100644 --- a/cli/util/gitignore.rs +++ b/cli/util/gitignore.rs @@ -38,13 +38,19 @@ impl DirGitIgnores { pub struct GitIgnoreTree { fs: Arc<dyn deno_runtime::deno_fs::FileSystem>, ignores: HashMap<PathBuf, Option<Rc<DirGitIgnores>>>, + include_paths: Vec<PathBuf>, } impl GitIgnoreTree { - pub fn new(fs: Arc<dyn deno_runtime::deno_fs::FileSystem>) -> Self { + pub fn new( + fs: Arc<dyn deno_runtime::deno_fs::FileSystem>, + // paths that should override what's in the gitignore + include_paths: Vec<PathBuf>, + ) -> Self { Self { fs, ignores: Default::default(), + include_paths, } } @@ -94,6 +100,16 @@ impl GitIgnoreTree { for line in text.lines() { builder.add_line(None, line).ok()?; } + // override the gitignore contents to include these paths + for path in &self.include_paths { + if let Ok(suffix) = path.strip_prefix(dir_path) { + let suffix = suffix.to_string_lossy().replace('\\', "/"); + let _ignore = builder.add_line(None, &format!("!/{}", suffix)); + if !suffix.ends_with('/') { + let _ignore = builder.add_line(None, &format!("!/{}/", suffix)); + } + } + } let gitignore = builder.build().ok()?; Some(Rc::new(gitignore)) }); @@ -122,7 +138,7 @@ mod test { "!file.txt\nignore.txt".into(), ), ]); - let mut ignore_tree = GitIgnoreTree::new(Arc::new(fs)); + let mut ignore_tree = GitIgnoreTree::new(Arc::new(fs), Vec::new()); let mut run_test = |path: &str, expected: bool| { let path = PathBuf::from(path); let gitignore = ignore_tree |