2 use crate::dirstate::status::IgnoreFnType; |
2 use crate::dirstate::status::IgnoreFnType; |
3 use crate::dirstate::status::StatusPath; |
3 use crate::dirstate::status::StatusPath; |
4 use crate::dirstate_tree::dirstate_map::BorrowedPath; |
4 use crate::dirstate_tree::dirstate_map::BorrowedPath; |
5 use crate::dirstate_tree::dirstate_map::ChildNodesRef; |
5 use crate::dirstate_tree::dirstate_map::ChildNodesRef; |
6 use crate::dirstate_tree::dirstate_map::DirstateMap; |
6 use crate::dirstate_tree::dirstate_map::DirstateMap; |
|
7 use crate::dirstate_tree::dirstate_map::DirstateVersion; |
7 use crate::dirstate_tree::dirstate_map::NodeData; |
8 use crate::dirstate_tree::dirstate_map::NodeData; |
8 use crate::dirstate_tree::dirstate_map::NodeRef; |
9 use crate::dirstate_tree::dirstate_map::NodeRef; |
9 use crate::dirstate_tree::on_disk::DirstateV2ParseError; |
10 use crate::dirstate_tree::on_disk::DirstateV2ParseError; |
10 use crate::matchers::get_ignore_function; |
11 use crate::matchers::get_ignore_function; |
11 use crate::matchers::Matcher; |
12 use crate::matchers::Matcher; |
59 .build_global() |
60 .build_global() |
60 .ok(); |
61 .ok(); |
61 |
62 |
62 let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) = |
63 let (ignore_fn, warnings, patterns_changed): (IgnoreFnType, _, _) = |
63 if options.list_ignored || options.list_unknown { |
64 if options.list_ignored || options.list_unknown { |
64 let mut hasher = Sha1::new(); |
65 let (ignore_fn, warnings, changed) = match dmap.dirstate_version { |
65 let (ignore_fn, warnings) = get_ignore_function( |
66 DirstateVersion::V1 => { |
66 ignore_files, |
67 let (ignore_fn, warnings) = get_ignore_function( |
67 &root_dir, |
68 ignore_files, |
68 &mut |pattern_bytes| hasher.update(pattern_bytes), |
69 &root_dir, |
69 )?; |
70 &mut |_pattern_bytes| {}, |
70 let new_hash = *hasher.finalize().as_ref(); |
71 )?; |
71 let changed = new_hash != dmap.ignore_patterns_hash; |
72 (ignore_fn, warnings, None) |
72 dmap.ignore_patterns_hash = new_hash; |
73 } |
73 (ignore_fn, warnings, Some(changed)) |
74 DirstateVersion::V2 => { |
|
75 let mut hasher = Sha1::new(); |
|
76 let (ignore_fn, warnings) = get_ignore_function( |
|
77 ignore_files, |
|
78 &root_dir, |
|
79 &mut |pattern_bytes| hasher.update(pattern_bytes), |
|
80 )?; |
|
81 let new_hash = *hasher.finalize().as_ref(); |
|
82 let changed = new_hash != dmap.ignore_patterns_hash; |
|
83 dmap.ignore_patterns_hash = new_hash; |
|
84 (ignore_fn, warnings, Some(changed)) |
|
85 } |
|
86 }; |
|
87 (ignore_fn, warnings, changed) |
74 } else { |
88 } else { |
75 (Box::new(|&_| true), vec![], None) |
89 (Box::new(|&_| true), vec![], None) |
76 }; |
90 }; |
77 |
91 |
78 let filesystem_time_at_status_start = |
92 let filesystem_time_at_status_start = |
133 let new_cachable = common.new_cachable_directories.into_inner().unwrap(); |
147 let new_cachable = common.new_cachable_directories.into_inner().unwrap(); |
134 let outdated = common.outated_cached_directories.into_inner().unwrap(); |
148 let outdated = common.outated_cached_directories.into_inner().unwrap(); |
135 |
149 |
136 outcome.dirty = common.ignore_patterns_have_changed == Some(true) |
150 outcome.dirty = common.ignore_patterns_have_changed == Some(true) |
137 || !outdated.is_empty() |
151 || !outdated.is_empty() |
138 || !new_cachable.is_empty(); |
152 || (!new_cachable.is_empty() |
|
153 && dmap.dirstate_version == DirstateVersion::V2); |
139 |
154 |
140 // Remove outdated mtimes before adding new mtimes, in case a given |
155 // Remove outdated mtimes before adding new mtimes, in case a given |
141 // directory is both |
156 // directory is both |
142 for path in &outdated { |
157 for path in &outdated { |
143 let node = dmap.get_or_insert(path)?; |
158 let node = dmap.get_or_insert(path)?; |