Skip to content

Commit ce68f6d

Browse files
fix!(gix-actor): Make email with spaces roundtrip
We see this situation in commits in the wild.
1 parent 420e730 commit ce68f6d

File tree

2 files changed

+16
-13
lines changed

2 files changed

+16
-13
lines changed

gix-actor/src/signature/decode.rs

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -79,22 +79,15 @@ pub(crate) mod function {
7979
StrContext::Label("Closing '>' not found"),
8080
)))?;
8181
let i_name_and_email = &i[..right_delim_idx];
82-
let skip_from_right = i_name_and_email
83-
.iter()
84-
.rev()
85-
.take_while(|b| b.is_ascii_whitespace() || **b == b'>')
86-
.count();
82+
let skip_from_right = i_name_and_email.iter().rev().take_while(|b| **b == b'>').count();
8783
let left_delim_idx = i_name_and_email
8884
.find_byte(b'<')
8985
.ok_or(ErrMode::Cut(E::from_input(i).add_context(
9086
&i_name_and_email,
9187
&start,
9288
StrContext::Label("Opening '<' not found"),
9389
)))?;
94-
let skip_from_left = i[left_delim_idx..]
95-
.iter()
96-
.take_while(|b| b.is_ascii_whitespace() || **b == b'<')
97-
.count();
90+
let skip_from_left = i[left_delim_idx..].iter().take_while(|b| **b == b'<').count();
9891
let mut name = i[..left_delim_idx].as_bstr();
9992
name = name.strip_suffix(b" ").unwrap_or(name).as_bstr();
10093

@@ -164,6 +157,17 @@ mod tests {
164157
);
165158
}
166159

160+
#[test]
161+
fn email_with_space() {
162+
assert_eq!(
163+
decode
164+
.parse_peek(b"Sebastian Thiel <\tbyronimo@gmail.com > 1528473343 +0230")
165+
.expect("parse to work")
166+
.1,
167+
signature("Sebastian Thiel", "\tbyronimo@gmail.com ", 1528473343, Sign::Plus, 9000)
168+
);
169+
}
170+
167171
#[test]
168172
fn negative_offset_0000() {
169173
assert_eq!(

gix-actor/tests/identity/mod.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@ use gix_actor::Identity;
55
fn round_trip() -> gix_testtools::Result {
66
static DEFAULTS: &[&[u8]] = &[
77
b"Sebastian Thiel <byronimo@gmail.com>",
8+
b"Sebastian Thiel < byronimo@gmail.com>",
9+
b"Sebastian Thiel <byronimo@gmail.com >",
10+
b"Sebastian Thiel <\tbyronimo@gmail.com \t >",
811
".. ☺️Sebastian 王知明 Thiel🙌 .. <byronimo@gmail.com>".as_bytes(),
912
b".. whitespace \t is explicitly allowed - unicode aware trimming must be done elsewhere <byronimo@gmail.com>"
1013
];
@@ -25,10 +28,6 @@ fn lenient_parsing() -> gix_testtools::Result {
2528
] {
2629
let identity = gix_actor::IdentityRef::from_bytes::<()>(input.as_bytes()).unwrap();
2730
assert_eq!(identity.name, "First Last");
28-
assert_eq!(
29-
identity.email, "fl <First Last<fl@openoffice.org",
30-
"extra trailing and leading angled parens are stripped"
31-
);
3231
let signature: Identity = identity.into();
3332
let mut output = Vec::new();
3433
let err = signature.write_to(&mut output).unwrap_err();

0 commit comments

Comments
 (0)