Skip to content

Commit b38c6ed

Browse files
committed
Merge branch 'push-oqpkttmvqxvx'
2 parents 55cbc1b + acd46ea commit b38c6ed

File tree

3 files changed

+70
-26
lines changed

3 files changed

+70
-26
lines changed

gitoxide-core/src/repository/mailmap.rs

+1-4
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,7 @@ pub fn entries(
4545
}
4646

4747
#[cfg(feature = "serde")]
48-
serde_json::to_writer_pretty(
49-
out,
50-
&mailmap.entries().into_iter().map(JsonEntry::from).collect::<Vec<_>>(),
51-
)?;
48+
serde_json::to_writer_pretty(out, &mailmap.iter().map(JsonEntry::from).collect::<Vec<_>>())?;
5249

5350
Ok(())
5451
}

gix-mailmap/src/snapshot/mod.rs

+26-18
Original file line numberDiff line numberDiff line change
@@ -51,32 +51,40 @@ impl Snapshot {
5151
self
5252
}
5353

54-
/// Transform our acceleration structure into a list of entries.
54+
/// Transform our acceleration structure into an iterator of entries.
5555
///
5656
/// Note that the order is different from how they were obtained initially, and are explicitly ordered by
5757
/// (`old_email`, `old_name`).
58-
pub fn entries(&self) -> Vec<crate::Entry<'_>> {
59-
let mut out = Vec::with_capacity(self.entries_by_old_email.len());
60-
for entry in &self.entries_by_old_email {
61-
if entry.new_email.is_some() || entry.new_name.is_some() {
62-
out.push(crate::Entry {
58+
pub fn iter(&self) -> impl Iterator<Item = crate::Entry<'_>> {
59+
self.entries_by_old_email.iter().flat_map(|entry| {
60+
let initial = if entry.new_email.is_some() || entry.new_name.is_some() {
61+
Some(crate::Entry {
6362
new_name: entry.new_name.as_ref().map(|b| b.as_bstr()),
6463
new_email: entry.new_email.as_ref().map(|b| b.as_bstr()),
6564
old_name: None,
6665
old_email: entry.old_email.as_bstr(),
67-
});
68-
}
66+
})
67+
} else {
68+
None
69+
};
6970

70-
for name_entry in &entry.entries_by_old_name {
71-
out.push(crate::Entry {
72-
new_name: name_entry.new_name.as_ref().map(|b| b.as_bstr()),
73-
new_email: name_entry.new_email.as_ref().map(|b| b.as_bstr()),
74-
old_name: name_entry.old_name.as_bstr().into(),
75-
old_email: entry.old_email.as_bstr(),
76-
});
77-
}
78-
}
79-
out
71+
let rest = entry.entries_by_old_name.iter().map(|name_entry| crate::Entry {
72+
new_name: name_entry.new_name.as_ref().map(|b| b.as_bstr()),
73+
new_email: name_entry.new_email.as_ref().map(|b| b.as_bstr()),
74+
old_name: name_entry.old_name.as_bstr().into(),
75+
old_email: entry.old_email.as_bstr(),
76+
});
77+
78+
initial.into_iter().chain(rest)
79+
})
80+
}
81+
82+
/// Transform our acceleration structure into a list of entries.
83+
///
84+
/// Note that the order is different from how they were obtained initially, and are explicitly ordered by
85+
/// (`old_email`, `old_name`).
86+
pub fn entries(&self) -> Vec<crate::Entry<'_>> {
87+
self.iter().collect()
8088
}
8189

8290
/// Try to resolve `signature` by its contained email and name and provide resolved/mapped names as reference.

gix-mailmap/tests/snapshot/mod.rs

+43-4
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use gix_mailmap::Snapshot;
1+
use gix_mailmap::{Entry, Snapshot};
22
use gix_testtools::fixture_bytes;
33

44
#[test]
@@ -54,7 +54,22 @@ fn try_resolve() {
5454
);
5555
assert_eq!(snapshot.resolve(sig.to_ref()), sig);
5656

57-
assert_eq!(snapshot.entries().len(), 6);
57+
assert_eq!(
58+
snapshot.entries(),
59+
&[
60+
Entry::change_name_and_email_by_name_and_email("Jane Doe", "[email protected]", "Jane", "[email protected]"),
61+
Entry::change_name_and_email_by_name_and_email(
62+
"Joe R. Developer",
63+
64+
"Joe",
65+
66+
),
67+
Entry::change_name_and_email_by_email("Jane Doe", "[email protected]", "jane@desktop.(none)"),
68+
Entry::change_email_by_name_and_email("[email protected]", "Jane", "Jane@ipad.(none)"),
69+
Entry::change_name_and_email_by_email("Jane Doe", "[email protected]", "jane@laptop.(none)"),
70+
Entry::change_name_by_email("Joe R. Developer", "[email protected]"),
71+
]
72+
);
5873
}
5974

6075
#[test]
@@ -84,7 +99,18 @@ fn non_name_and_name_mappings_will_not_clash() {
8499
"it can match by email and name as well"
85100
);
86101

87-
assert_eq!(snapshot.entries().len(), 2);
102+
assert_eq!(
103+
snapshot.entries(),
104+
&[
105+
Entry::change_name_by_email("new-name", "old-email"),
106+
Entry::change_name_and_email_by_name_and_email(
107+
"other-new-name",
108+
"other-new-email",
109+
"old-name",
110+
"old-email"
111+
)
112+
]
113+
);
88114
}
89115
}
90116

@@ -115,7 +141,20 @@ fn overwrite_entries() {
115141
"email by email"
116142
);
117143

118-
assert_eq!(snapshot.entries().len(), 4);
144+
assert_eq!(
145+
snapshot.entries(),
146+
&[
147+
Entry::change_name_by_email("A-overwritten", "old-a-email"),
148+
Entry::change_name_and_email_by_email("B-overwritten", "new-b-email-overwritten", "old-b-email"),
149+
Entry::change_name_and_email_by_name_and_email(
150+
"C-overwritten",
151+
"new-c-email-overwritten",
152+
"old-C",
153+
"old-c-email"
154+
),
155+
Entry::change_email_by_email("new-d-email-overwritten", "old-d-email")
156+
]
157+
);
119158
}
120159

121160
fn signature(name: &str, email: &str) -> gix_actor::Signature {

0 commit comments

Comments
 (0)