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![];