149 list_copies, |
149 list_copies, |
150 collect_traversed_dirs, |
150 collect_traversed_dirs, |
151 }, |
151 }, |
152 after_status, |
152 after_status, |
153 ) |
153 ) |
|
154 } |
|
155 |
|
156 fn collect_kindpats( |
|
157 py: Python, |
|
158 matcher: PyObject, |
|
159 ) -> PyResult<Vec<IgnorePattern>> { |
|
160 matcher |
|
161 .getattr(py, "_kindpats")? |
|
162 .iter(py)? |
|
163 .map(|k| { |
|
164 let k = k?; |
|
165 let syntax = parse_pattern_syntax( |
|
166 &[ |
|
167 k.get_item(py, 0)?.extract::<PyBytes>(py)?.data(py), |
|
168 &b":"[..], |
|
169 ] |
|
170 .concat(), |
|
171 ) |
|
172 .map_err(|e| handle_fallback(py, StatusError::Pattern(e)))?; |
|
173 let pattern = k.get_item(py, 1)?.extract::<PyBytes>(py)?; |
|
174 let pattern = pattern.data(py); |
|
175 let source = k.get_item(py, 2)?.extract::<PyBytes>(py)?; |
|
176 let source = get_path_from_bytes(source.data(py)); |
|
177 let new = IgnorePattern::new(syntax, pattern, source); |
|
178 Ok(new) |
|
179 }) |
|
180 .collect() |
154 } |
181 } |
155 |
182 |
156 /// Transform a Python matcher into a Rust matcher. |
183 /// Transform a Python matcher into a Rust matcher. |
157 fn extract_matcher( |
184 fn extract_matcher( |
158 py: Python, |
185 py: Python, |
197 } |
224 } |
198 "includematcher" => { |
225 "includematcher" => { |
199 // Get the patterns from Python even though most of them are |
226 // Get the patterns from Python even though most of them are |
200 // redundant with those we will parse later on, as they include |
227 // redundant with those we will parse later on, as they include |
201 // those passed from the command line. |
228 // those passed from the command line. |
202 let ignore_patterns: PyResult<Vec<_>> = matcher |
229 let ignore_patterns = collect_kindpats(py, matcher)?; |
203 .getattr(py, "_kindpats")? |
|
204 .iter(py)? |
|
205 .map(|k| { |
|
206 let k = k?; |
|
207 let syntax = parse_pattern_syntax( |
|
208 &[ |
|
209 k.get_item(py, 0)? |
|
210 .extract::<PyBytes>(py)? |
|
211 .data(py), |
|
212 &b":"[..], |
|
213 ] |
|
214 .concat(), |
|
215 ) |
|
216 .map_err(|e| { |
|
217 handle_fallback(py, StatusError::Pattern(e)) |
|
218 })?; |
|
219 let pattern = k.get_item(py, 1)?.extract::<PyBytes>(py)?; |
|
220 let pattern = pattern.data(py); |
|
221 let source = k.get_item(py, 2)?.extract::<PyBytes>(py)?; |
|
222 let source = get_path_from_bytes(source.data(py)); |
|
223 let new = IgnorePattern::new(syntax, pattern, source); |
|
224 Ok(new) |
|
225 }) |
|
226 .collect(); |
|
227 |
|
228 let ignore_patterns = ignore_patterns?; |
|
229 |
230 |
230 let matcher = IncludeMatcher::new(ignore_patterns) |
231 let matcher = IncludeMatcher::new(ignore_patterns) |
231 .map_err(|e| handle_fallback(py, e.into()))?; |
232 .map_err(|e| handle_fallback(py, e.into()))?; |
232 |
233 |
233 Ok(Box::new(matcher)) |
234 Ok(Box::new(matcher)) |
252 let m2 = extract_matcher(py, matcher.getattr(py, "_m2")?)?; |
253 let m2 = extract_matcher(py, matcher.getattr(py, "_m2")?)?; |
253 |
254 |
254 Ok(Box::new(DifferenceMatcher::new(m1, m2))) |
255 Ok(Box::new(DifferenceMatcher::new(m1, m2))) |
255 } |
256 } |
256 "patternmatcher" => { |
257 "patternmatcher" => { |
257 let ignore_patterns = matcher |
258 let patterns = collect_kindpats(py, matcher)?; |
258 .getattr(py, "_kindpats")? |
259 |
259 .iter(py)? |
260 let matcher = PatternMatcher::new(patterns) |
260 .map(|k| { |
|
261 let k = k?; |
|
262 let syntax = parse_pattern_syntax( |
|
263 &[ |
|
264 k.get_item(py, 0)? |
|
265 .extract::<PyBytes>(py)? |
|
266 .data(py), |
|
267 &b":"[..], |
|
268 ] |
|
269 .concat(), |
|
270 ) |
|
271 .map_err(|e| { |
|
272 handle_fallback(py, StatusError::Pattern(e)) |
|
273 })?; |
|
274 let pattern = k.get_item(py, 1)?.extract::<PyBytes>(py)?; |
|
275 let pattern = pattern.data(py); |
|
276 let source = k.get_item(py, 2)?.extract::<PyBytes>(py)?; |
|
277 let source = get_path_from_bytes(source.data(py)); |
|
278 let new = IgnorePattern::new(syntax, pattern, source); |
|
279 Ok(new) |
|
280 }) |
|
281 .collect::<PyResult<Vec<_>>>()?; |
|
282 |
|
283 let matcher = PatternMatcher::new(ignore_patterns) |
|
284 .map_err(|e| handle_fallback(py, e.into()))?; |
261 .map_err(|e| handle_fallback(py, e.into()))?; |
285 |
262 |
286 Ok(Box::new(matcher)) |
263 Ok(Box::new(matcher)) |
287 } |
264 } |
288 e => Err(PyErr::new::<FallbackError, _>( |
265 e => Err(PyErr::new::<FallbackError, _>( |