Mercurial > hg
diff rust/hg-core/src/filepatterns.rs @ 47409:0ef8231e413f
dirstate-v2: Store a hash of ignore patterns (.hgignore)
Later, this help extend `read_dir` caching to directories that contain ignored
files (but no unknown files). Such cache must be invalidated when ignore patterns
change since a formerly-ignored file might become unknown.
This helps the default configuration of `hg status` where unknown files must
be listed, but ignored files are not.
Differential Revision: https://phab.mercurial-scm.org/D10836
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Wed, 02 Jun 2021 11:25:18 +0200 |
parents | f6bb181c75f8 |
children | 6d69e83e6b6e |
line wrap: on
line diff
--- a/rust/hg-core/src/filepatterns.rs Mon Jun 07 17:29:32 2021 +0530 +++ b/rust/hg-core/src/filepatterns.rs Wed Jun 02 11:25:18 2021 +0200 @@ -17,8 +17,6 @@ }; use lazy_static::lazy_static; use regex::bytes::{NoExpand, Regex}; -use std::fs::File; -use std::io::Read; use std::ops::Deref; use std::path::{Path, PathBuf}; use std::vec::Vec; @@ -410,24 +408,19 @@ pub fn read_pattern_file( file_path: &Path, warn: bool, + inspect_pattern_bytes: &mut impl FnMut(&[u8]), ) -> Result<(Vec<IgnorePattern>, Vec<PatternFileWarning>), PatternError> { - let mut f = match File::open(file_path) { - Ok(f) => Ok(f), - Err(e) => match e.kind() { - std::io::ErrorKind::NotFound => { - return Ok(( - vec![], - vec![PatternFileWarning::NoSuchFile(file_path.to_owned())], - )) - } - _ => Err(e), - }, - }?; - let mut contents = Vec::new(); - - f.read_to_end(&mut contents)?; - - Ok(parse_pattern_file_contents(&contents, file_path, warn)?) + match std::fs::read(file_path) { + Ok(contents) => { + inspect_pattern_bytes(&contents); + parse_pattern_file_contents(&contents, file_path, warn) + } + Err(e) if e.kind() == std::io::ErrorKind::NotFound => Ok(( + vec![], + vec![PatternFileWarning::NoSuchFile(file_path.to_owned())], + )), + Err(e) => Err(e.into()), + } } /// Represents an entry in an "ignore" file. @@ -458,8 +451,10 @@ pub fn get_patterns_from_file( pattern_file: &Path, root_dir: &Path, + inspect_pattern_bytes: &mut impl FnMut(&[u8]), ) -> PatternResult<(Vec<IgnorePattern>, Vec<PatternFileWarning>)> { - let (patterns, mut warnings) = read_pattern_file(pattern_file, true)?; + let (patterns, mut warnings) = + read_pattern_file(pattern_file, true, inspect_pattern_bytes)?; let patterns = patterns .into_iter() .flat_map(|entry| -> PatternResult<_> { @@ -467,8 +462,11 @@ PatternSyntax::Include => { let inner_include = root_dir.join(get_path_from_bytes(&entry.pattern)); - let (inner_pats, inner_warnings) = - get_patterns_from_file(&inner_include, root_dir)?; + let (inner_pats, inner_warnings) = get_patterns_from_file( + &inner_include, + root_dir, + inspect_pattern_bytes, + )?; warnings.extend(inner_warnings); inner_pats } @@ -482,6 +480,7 @@ get_patterns_from_file( &sub_include.path, &sub_include.root, + inspect_pattern_bytes, )?; sub_include.included_patterns = inner_patterns; warnings.extend(inner_warnings);