Skip to content

Commit be80806

Browse files
committed
fix: assure that sections can be deleted properly with File::remove_section_filter() (#1826)
The underlying issue isn't fixed, as ids in the lookup table remain even after deletion. However, for now it was easiest to defensively access this data, while assuring that the API (still) does what it claims.
1 parent 9bec947 commit be80806

File tree

2 files changed

+38
-6
lines changed

2 files changed

+38
-6
lines changed

gix-config/src/file/access/mutate.rs

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -86,10 +86,8 @@ impl<'event> File<'event> {
8686
.section_ids_by_name_and_subname(name.as_ref(), subsection_name)
8787
.ok()
8888
.and_then(|it| {
89-
it.rev().find(|id| {
90-
let s = &self.sections[id];
91-
filter(s.meta())
92-
})
89+
it.rev()
90+
.find(|id| self.sections.get(id).is_some_and(|s| filter(s.meta())))
9391
}) {
9492
Some(id) => {
9593
let nl = self.detect_newline_style_smallvec();
@@ -305,7 +303,7 @@ impl<'event> File<'event> {
305303
.section_ids_by_name_and_subname(name, subsection_name)
306304
.ok()?
307305
.rev()
308-
.find(|id| filter(self.sections.get(id).expect("each id has a section").meta()))?;
306+
.find(|id| self.sections.get(id).is_some_and(|section| filter(section.meta())))?;
309307
self.section_order.remove(
310308
self.section_order
311309
.iter()

gix-config/tests/config/file/access/mutate.rs

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,25 +25,59 @@ mod remove_section {
2525
}
2626

2727
#[test]
28-
fn removal_is_complete_and_sections_can_be_readded() {
28+
fn removal_is_complete_and_sections_can_be_read() {
2929
let mut file = gix_config::File::try_from("[core] \na = b\nb=c\n\n[core \"name\"]\nd = 1\ne = 2").unwrap();
3030
assert_eq!(file.sections().count(), 2);
3131

3232
let removed = file.remove_section("core", None).expect("removed correct section");
3333
assert_eq!(removed.header().name(), "core");
3434
assert_eq!(removed.header().subsection_name(), None);
3535
assert_eq!(file.sections().count(), 1);
36+
assert_eq!(file.remove_section("core", None), None, "it's OK to try again");
3637

3738
let removed = file.remove_section("core", Some("name".into())).expect("found");
3839
assert_eq!(removed.header().name(), "core");
3940
assert_eq!(removed.header().subsection_name().expect("present"), "name");
4041
assert_eq!(file.sections().count(), 0);
42+
assert_eq!(file.remove_section("core", Some("name".into())), None);
4143

4244
file.section_mut_or_create_new("core", None).expect("creation succeeds");
4345
file.section_mut_or_create_new("core", Some("name".into()))
4446
.expect("creation succeeds");
4547
}
4648
}
49+
mod remove_section_filter {
50+
#[test]
51+
fn removal_of_section_is_complete() {
52+
let mut file = gix_config::File::try_from("[core] \na = b\nb=c\n\n[core \"name\"]\nd = 1\ne = 2").unwrap();
53+
assert_eq!(file.sections().count(), 2);
54+
55+
let removed = file
56+
.remove_section_filter("core", None, |_| true)
57+
.expect("removed correct section");
58+
assert_eq!(removed.header().name(), "core");
59+
assert_eq!(removed.header().subsection_name(), None);
60+
assert_eq!(file.sections().count(), 1);
61+
let removed = file
62+
.remove_section_filter("core", Some("name".into()), |_| true)
63+
.expect("found");
64+
assert_eq!(removed.header().name(), "core");
65+
assert_eq!(removed.header().subsection_name().expect("present"), "name");
66+
assert_eq!(file.sections().count(), 0);
67+
68+
assert_eq!(
69+
file.remove_section_filter("core", None, |_| true),
70+
None,
71+
"it's OK to try again"
72+
);
73+
assert_eq!(file.remove_section_filter("core", Some("name".into()), |_| true), None);
74+
75+
file.section_mut_or_create_new("core", None).expect("creation succeeds");
76+
file.section_mut_or_create_new("core", Some("name".into()))
77+
.expect("creation succeeds");
78+
}
79+
}
80+
4781
mod rename_section {
4882
use std::borrow::Cow;
4983

0 commit comments

Comments
 (0)