Mercurial > hg
comparison rust/hg-core/src/config/config.rs @ 48451:4a983b69e519
rhg: Add support for ui.ignore and ui.ignore.* config
This fixes some but not all failures in `tests/test-hgignore.t` when running
with `rhg status` enabled.
Differential Revision: https://phab.mercurial-scm.org/D11907
author | Simon Sapin <simon.sapin@octobus.net> |
---|---|
date | Fri, 10 Dec 2021 14:27:00 +0100 |
parents | 1d940d76571b |
children | 1aaf11e35aec |
comparison
equal
deleted
inserted
replaced
48450:b5f8d9e55d42 | 48451:4a983b69e519 |
---|---|
417 self.layers | 417 self.layers |
418 .iter() | 418 .iter() |
419 .any(|layer| layer.has_non_empty_section(section)) | 419 .any(|layer| layer.has_non_empty_section(section)) |
420 } | 420 } |
421 | 421 |
422 /// Yields (key, value) pairs for everything in the given section | |
423 pub fn iter_section<'a>( | |
424 &'a self, | |
425 section: &'a [u8], | |
426 ) -> impl Iterator<Item = (&[u8], &[u8])> + 'a { | |
427 // TODO: Use `Iterator`’s `.peekable()` when its `peek_mut` is | |
428 // available: | |
429 // https://doc.rust-lang.org/nightly/std/iter/struct.Peekable.html#method.peek_mut | |
430 struct Peekable<I: Iterator> { | |
431 iter: I, | |
432 /// Remember a peeked value, even if it was None. | |
433 peeked: Option<Option<I::Item>>, | |
434 } | |
435 | |
436 impl<I: Iterator> Peekable<I> { | |
437 fn new(iter: I) -> Self { | |
438 Self { iter, peeked: None } | |
439 } | |
440 | |
441 fn next(&mut self) { | |
442 self.peeked = None | |
443 } | |
444 | |
445 fn peek_mut(&mut self) -> Option<&mut I::Item> { | |
446 let iter = &mut self.iter; | |
447 self.peeked.get_or_insert_with(|| iter.next()).as_mut() | |
448 } | |
449 } | |
450 | |
451 // Deduplicate keys redefined in multiple layers | |
452 let mut keys_already_seen = HashSet::new(); | |
453 let mut key_is_new = | |
454 move |&(key, _value): &(&'a [u8], &'a [u8])| -> bool { | |
455 keys_already_seen.insert(key) | |
456 }; | |
457 // This is similar to `flat_map` + `filter_map`, except with a single | |
458 // closure that owns `key_is_new` (and therefore the | |
459 // `keys_already_seen` set): | |
460 let mut layer_iters = Peekable::new( | |
461 self.layers | |
462 .iter() | |
463 .rev() | |
464 .map(move |layer| layer.iter_section(section)), | |
465 ); | |
466 std::iter::from_fn(move || loop { | |
467 if let Some(pair) = layer_iters.peek_mut()?.find(&mut key_is_new) { | |
468 return Some(pair); | |
469 } else { | |
470 layer_iters.next(); | |
471 } | |
472 }) | |
473 } | |
474 | |
422 /// Get raw values bytes from all layers (even untrusted ones) in order | 475 /// Get raw values bytes from all layers (even untrusted ones) in order |
423 /// of precedence. | 476 /// of precedence. |
424 #[cfg(test)] | 477 #[cfg(test)] |
425 fn get_all(&self, section: &[u8], item: &[u8]) -> Vec<&[u8]> { | 478 fn get_all(&self, section: &[u8], item: &[u8]) -> Vec<&[u8]> { |
426 let mut res = vec![]; | 479 let mut res = vec![]; |