History

Handle pgp signature parsing

Sebastian Thiel committed 8 years ago

Commit b8817b81 parent b83ec892 files · +35 −5Browse files

Unified · Split

2 files
  1. lib/git-odb/src/object.rs +10 −5
  2. lib/git-odb/tests/loose.rs +25 −0
lib/git-odb/src/object.rs+10−5
@@ -60,6 +60,7 @@ pub mod parsed { · 59 unmodified lines
6060 pub name_raw: &'data [u8],
6161 pub target_kind: Kind,
6262 pub message: Option<&'data [u8]>,
63+ pub pgp_signature: Option<&'data [u8]>,
6364 pub signature: Signature<'data>,
6465 }
6566
@@ -173,29 +174,32 @@ pub mod parsed { · 107 unmodified lines
173174 _ => bail!("Expected four lines: target, type, tag and tagger"),
174175 };
175176
176− let message = match lines.next() {
177+ let (message, pgp_signature) = match lines.next() {
177178 Some(l) if l.len() == 0 => {
178179 let msg_begin = (l.as_ptr().wrapping_offset_from(d.as_ptr()) + 1) as usize;
179180 if msg_begin >= d.len() {
180181 bail!("Message separator was not followed by message")
181182 }
182183 let mut msg_end = d.len();
183− if let Some(pgp_begin_line) = lines.find(|l| l.starts_with(PGP_SIGNATURE_BEGIN)) {
184+ let mut pgp_signature = None;
185+ if let Some(pgp_begin_line) = lines.find(|l| l.starts_with(PGP_SIGNATURE_BEGIN))
186+ {
184187 match lines.find(|l| l.starts_with(PGP_SIGNATURE_END)) {
185188 None => bail!("Didn't find end of signature marker"),
186− Some(pgp_end_line) => {
189+ Some(_) => {
187190 msg_end = pgp_begin_line.as_ptr().wrapping_offset_from(d.as_ptr())
188191 as usize;
192+ pgp_signature = Some(&d[msg_end..])
189193 }
190194 }
191195 }
192− Some(&d[msg_begin..msg_end])
196+ (Some(&d[msg_begin..msg_end]), pgp_signature)
193197 }
194198 Some(l) => bail!(
195199 "Expected empty newline to separate message, got {:?}",
196200 str::from_utf8(l),
197201 ),
198− None => None,
202+ None => (None, None),
199203 };
200204
201205 Ok(Tag {
@@ -204,6 +208,7 @@ pub mod parsed { · 2 unmodified lines
204208 target_kind,
205209 message,
206210 signature,
211+ pgp_signature,
207212 })
208213 }
209214 }
lib/git-odb/tests/loose.rs+25−0
@@ -29,6 +29,10 @@ fn fixture_bytes(path: &str) -> Vec<u8> { · 28 unmodified lines
2929 fn bin(hex: &str) -> [u8; 20] {
3030 <[u8; 20]>::from_hex(hex).unwrap()
3131 }
32+fn as_str(d: &[u8]) -> &str {
33+ ::std::str::from_utf8(d).unwrap()
34+}
35+
3236 fn ldb() -> Db {
3337 odb::loose::at(fixture("objects"))
3438 }
@@ -64,6 +68,7 @@ fn loose_find() { · 29 unmodified lines
6468 fn loose_tag_parse() {
6569 let fixture = fixture_bytes("objects/tag.txt");
6670 let actual = parsed::Tag::from_bytes(&fixture).unwrap();
71+ println!("{}", as_str(actual.pgp_signature.unwrap()));
6772 assert_eq!(actual, tag_fixture(9000));
6873 assert_eq!(
6974 actual.target(),
@@ -78,6 +83,26 @@ fn tag_fixture(offset: i32) -> parsed::Tag<'static> { · 8 unmodified lines
7883 name_raw: b"1.0.0",
7984 target_kind: Kind::Commit,
8085 message: Some(b"for the signature\n"),
86+ pgp_signature: Some(
87+ b"-----BEGIN PGP SIGNATURE-----
88+Comment: GPGTools - https://gpgtools.org
89+
90+iQIzBAABCgAdFiEEw7xSvXbiwjusbsBqZl+Z+p2ZlmwFAlsapyYACgkQZl+Z+p2Z
91+lmy6Ug/+KzvzqiNpzz1bMVVAzp8NCbiEO3QGYPyeQc521lBwpaTrRYR+oHJY15r3
92+OdL5WDysTpjN8N5FNyfmvzkuPdTkK3JlYmO7VRjdA2xu/B6vIZLaOfAowFrhMvKo
93+8eoqwGcAP3rC5TuWEgzq2qhbjS4JXFLd4NLjWEFqT2Y2UKm+g8TeGOsa/0pF4Nq5
94+xeW4qCYR0WcQLFedbpkKHxag2GfaXKvzNNJdqYhVQssNa6BeSmsfDvlWYNe617wV
95+NvsR/zJT0wHb5SSH+h6QmwA7LQIQF//83Vc3aF7kv9D54r3ibXW5TjZ3WoeTUZO7
96+kefkzJ12EYDCFLPhHvXPog518nO8Ot46dX+okrF0/B4N3RFTvjKr7VAGTzv2D/Dg
97+DrD531S2F71b+JIRh641eeP7bjWFQi3tWLtrEOtjjsKPJfYRMKpYFnAO4UUJ6Rck
98+Z5fFXEUCO8d5WT56jzKDjmVoY01lA87O1YsP/J+zQAlc9v1k6jqeQ53LZNgTN+ue
99+5fJuSPT3T43pSOD1VQSr3aZ2Anc4Qu7K8uX9lkpxF9Sc0tDbeCosFLZMWNVp6m+e
100+cjHJZXWmV4CcRfmLsXzU8s2cR9A0DBvOxhPD1TlKC2JhBFXigjuL9U4Rbq9tdegB
101+2n8f2douw6624Tn/6Lm4a7AoxmU+CMiYagDxDL3RuZ8CAfh3bn0=
102+=aIns
103+-----END PGP SIGNATURE-----
104+",
105+ ),
81106 signature: parsed::Signature {
82107 name: b"Sebastian Thiel",
83108 email: b"byronimo@gmail.com",