/src/gitoxide/gix-object/src/commit/mod.rs
Line | Count | Source |
1 | | use std::ops::Range; |
2 | | |
3 | | use bstr::{BStr, BString, ByteSlice}; |
4 | | |
5 | | use crate::parse::parse_signature; |
6 | | use crate::{Commit, CommitRef, TagRef}; |
7 | | |
8 | | /// The well-known field name for gpg signatures. |
9 | | pub const SIGNATURE_FIELD_NAME: &str = "gpgsig"; |
10 | | |
11 | | mod decode; |
12 | | /// |
13 | | pub mod message; |
14 | | |
15 | | /// A parsed commit message that assumes a title separated from the body by two consecutive newlines. |
16 | | /// |
17 | | /// Titles can have any amount of whitespace |
18 | | #[derive(PartialEq, Eq, Debug, Hash, Ord, PartialOrd, Clone, Copy)] |
19 | | #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] |
20 | | pub struct MessageRef<'a> { |
21 | | /// The title of the commit, as separated from the body with two consecutive newlines. The newlines are not included. |
22 | | #[cfg_attr(feature = "serde", serde(borrow))] |
23 | | pub title: &'a BStr, |
24 | | /// All bytes not consumed by the title, excluding the separating newlines. |
25 | | /// |
26 | | /// The body is `None` if there was now title separation or the body was empty after the separator. |
27 | | pub body: Option<&'a BStr>, |
28 | | } |
29 | | |
30 | | /// The raw commit data, parseable by [`CommitRef`] or [`Commit`], which was fed into a program to produce a signature. |
31 | | /// |
32 | | /// See [`extract_signature()`](crate::CommitRefIter::signature()) for how to obtain it. |
33 | | // TODO: implement `std::io::Read` to avoid allocations |
34 | | #[derive(PartialEq, Eq, Debug, Hash, Clone)] |
35 | | #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] |
36 | | pub struct SignedData<'a> { |
37 | | /// The raw commit data that includes the signature. |
38 | | data: &'a [u8], |
39 | | /// The byte range at which we find the signature. All but the signature is the data that was signed. |
40 | | signature_range: Range<usize>, |
41 | | } |
42 | | |
43 | | impl SignedData<'_> { |
44 | | /// Convenience method to obtain a copy of the signed data. |
45 | 0 | pub fn to_bstring(&self) -> BString { |
46 | 0 | let mut buf = BString::from(&self.data[..self.signature_range.start]); |
47 | 0 | buf.extend_from_slice(&self.data[self.signature_range.end..]); |
48 | 0 | buf |
49 | 0 | } Unexecuted instantiation: <gix_object::commit::SignedData>::to_bstring Unexecuted instantiation: <gix_object::commit::SignedData>::to_bstring Unexecuted instantiation: <gix_object::commit::SignedData>::to_bstring Unexecuted instantiation: <gix_object::commit::SignedData>::to_bstring Unexecuted instantiation: <gix_object::commit::SignedData>::to_bstring Unexecuted instantiation: <gix_object::commit::SignedData>::to_bstring |
50 | | } |
51 | | |
52 | | impl From<SignedData<'_>> for BString { |
53 | 0 | fn from(value: SignedData<'_>) -> Self { |
54 | 0 | value.to_bstring() |
55 | 0 | } Unexecuted instantiation: <bstr::bstring::BString as core::convert::From<gix_object::commit::SignedData>>::from Unexecuted instantiation: <bstr::bstring::BString as core::convert::From<gix_object::commit::SignedData>>::from Unexecuted instantiation: <bstr::bstring::BString as core::convert::From<gix_object::commit::SignedData>>::from Unexecuted instantiation: <bstr::bstring::BString as core::convert::From<gix_object::commit::SignedData>>::from Unexecuted instantiation: <bstr::bstring::BString as core::convert::From<gix_object::commit::SignedData>>::from Unexecuted instantiation: <bstr::bstring::BString as core::convert::From<gix_object::commit::SignedData>>::from |
56 | | } |
57 | | |
58 | | /// |
59 | | pub mod ref_iter; |
60 | | |
61 | | mod write; |
62 | | |
63 | | /// Lifecycle |
64 | | impl<'a> CommitRef<'a> { |
65 | | /// Deserialize a commit from the given `data` bytes while avoiding most allocations, using `object_hash` to know |
66 | | /// what kind of hash to expect for validation. |
67 | 4.49k | pub fn from_bytes(mut data: &'a [u8], object_hash: gix_hash::Kind) -> Result<CommitRef<'a>, crate::decode::Error> { |
68 | 4.49k | let input = &mut data; |
69 | 4.49k | match decode::commit(input, object_hash) { |
70 | 256 | Ok(tag) => Ok(tag), |
71 | 4.23k | Err(err) => Err(err), |
72 | | } |
73 | 4.49k | } Unexecuted instantiation: <gix_object::CommitRef>::from_bytes Unexecuted instantiation: <gix_object::CommitRef>::from_bytes <gix_object::CommitRef>::from_bytes Line | Count | Source | 67 | 4.49k | pub fn from_bytes(mut data: &'a [u8], object_hash: gix_hash::Kind) -> Result<CommitRef<'a>, crate::decode::Error> { | 68 | 4.49k | let input = &mut data; | 69 | 4.49k | match decode::commit(input, object_hash) { | 70 | 256 | Ok(tag) => Ok(tag), | 71 | 4.23k | Err(err) => Err(err), | 72 | | } | 73 | 4.49k | } |
Unexecuted instantiation: <gix_object::CommitRef>::from_bytes Unexecuted instantiation: <gix_object::CommitRef>::from_bytes Unexecuted instantiation: <gix_object::CommitRef>::from_bytes |
74 | | } |
75 | | |
76 | | /// Access |
77 | | impl<'a> CommitRef<'a> { |
78 | | /// Return the `tree` fields hash digest. |
79 | 0 | pub fn tree(&self) -> gix_hash::ObjectId { |
80 | 0 | gix_hash::ObjectId::from_hex(self.tree).expect("prior validation of tree hash during parsing") |
81 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::tree Unexecuted instantiation: <gix_object::CommitRef>::tree Unexecuted instantiation: <gix_object::CommitRef>::tree Unexecuted instantiation: <gix_object::CommitRef>::tree Unexecuted instantiation: <gix_object::CommitRef>::tree Unexecuted instantiation: <gix_object::CommitRef>::tree |
82 | | |
83 | | /// Returns an iterator of parent object ids |
84 | 0 | pub fn parents(&self) -> impl Iterator<Item = gix_hash::ObjectId> + '_ { |
85 | 0 | self.parents |
86 | 0 | .iter() |
87 | 0 | .map(|hex_hash| gix_hash::ObjectId::from_hex(hex_hash).expect("prior validation of hashes during parsing"))Unexecuted instantiation: <gix_object::CommitRef>::parents::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::parents::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::parents::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::parents::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::parents::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::parents::{closure#0} |
88 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::parents Unexecuted instantiation: <gix_object::CommitRef>::parents Unexecuted instantiation: <gix_object::CommitRef>::parents Unexecuted instantiation: <gix_object::CommitRef>::parents Unexecuted instantiation: <gix_object::CommitRef>::parents Unexecuted instantiation: <gix_object::CommitRef>::parents |
89 | | |
90 | | /// Returns a convenient iterator over all extra headers. |
91 | 0 | pub fn extra_headers(&self) -> ExtraHeaders<impl Iterator<Item = (&BStr, &BStr)>> { |
92 | 0 | ExtraHeaders::new( |
93 | 0 | self.extra_headers.iter().map(|(k, v)| (*k, v.as_ref())), Unexecuted instantiation: <gix_object::CommitRef>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::extra_headers::{closure#0} |
94 | 0 | self.tree().kind(), |
95 | | ) |
96 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::extra_headers Unexecuted instantiation: <gix_object::CommitRef>::extra_headers Unexecuted instantiation: <gix_object::CommitRef>::extra_headers Unexecuted instantiation: <gix_object::CommitRef>::extra_headers Unexecuted instantiation: <gix_object::CommitRef>::extra_headers Unexecuted instantiation: <gix_object::CommitRef>::extra_headers |
97 | | |
98 | | /// Return the author, with whitespace trimmed. |
99 | | /// |
100 | | /// This is different from the `author` field which may contain whitespace. |
101 | 0 | pub fn author(&self) -> Result<gix_actor::SignatureRef<'a>, crate::decode::Error> { |
102 | 0 | parse_signature(self.author).map(|signature| signature.trim()) Unexecuted instantiation: <gix_object::CommitRef>::author::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::author::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::author::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::author::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::author::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::author::{closure#0} |
103 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::author Unexecuted instantiation: <gix_object::CommitRef>::author Unexecuted instantiation: <gix_object::CommitRef>::author Unexecuted instantiation: <gix_object::CommitRef>::author Unexecuted instantiation: <gix_object::CommitRef>::author Unexecuted instantiation: <gix_object::CommitRef>::author |
104 | | |
105 | | /// Return the committer, with whitespace trimmed. |
106 | | /// |
107 | | /// This is different from the `committer` field which may contain whitespace. |
108 | 0 | pub fn committer(&self) -> Result<gix_actor::SignatureRef<'a>, crate::decode::Error> { |
109 | 0 | parse_signature(self.committer).map(|signature| signature.trim()) Unexecuted instantiation: <gix_object::CommitRef>::committer::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::committer::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::committer::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::committer::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::committer::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::committer::{closure#0} |
110 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::committer Unexecuted instantiation: <gix_object::CommitRef>::committer Unexecuted instantiation: <gix_object::CommitRef>::committer Unexecuted instantiation: <gix_object::CommitRef>::committer Unexecuted instantiation: <gix_object::CommitRef>::committer Unexecuted instantiation: <gix_object::CommitRef>::committer |
111 | | |
112 | | /// Returns a partially parsed message from which more information can be derived. |
113 | 0 | pub fn message(&self) -> MessageRef<'a> { |
114 | 0 | MessageRef::from_bytes(self.message) |
115 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::message Unexecuted instantiation: <gix_object::CommitRef>::message Unexecuted instantiation: <gix_object::CommitRef>::message Unexecuted instantiation: <gix_object::CommitRef>::message Unexecuted instantiation: <gix_object::CommitRef>::message Unexecuted instantiation: <gix_object::CommitRef>::message |
116 | | |
117 | | /// Returns the time at which this commit was created, or a default time if it could not be parsed. |
118 | 0 | pub fn time(&self) -> Result<gix_date::Time, crate::decode::Error> { |
119 | 0 | parse_signature(self.committer).map(|signature| signature.time().unwrap_or_default()) Unexecuted instantiation: <gix_object::CommitRef>::time::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::time::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::time::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::time::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::time::{closure#0}Unexecuted instantiation: <gix_object::CommitRef>::time::{closure#0} |
120 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::time Unexecuted instantiation: <gix_object::CommitRef>::time Unexecuted instantiation: <gix_object::CommitRef>::time Unexecuted instantiation: <gix_object::CommitRef>::time Unexecuted instantiation: <gix_object::CommitRef>::time Unexecuted instantiation: <gix_object::CommitRef>::time |
121 | | } |
122 | | |
123 | | /// Conversion |
124 | | impl CommitRef<'_> { |
125 | | /// Copy all fields of this instance into a fully owned commit, consuming this instance. |
126 | 0 | pub fn into_owned(self) -> Result<Commit, crate::decode::Error> { |
127 | 0 | self.try_into() |
128 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::into_owned Unexecuted instantiation: <gix_object::CommitRef>::into_owned Unexecuted instantiation: <gix_object::CommitRef>::into_owned Unexecuted instantiation: <gix_object::CommitRef>::into_owned Unexecuted instantiation: <gix_object::CommitRef>::into_owned Unexecuted instantiation: <gix_object::CommitRef>::into_owned |
129 | | |
130 | | /// Copy all fields of this instance into a fully owned commit, internally cloning this instance. |
131 | 0 | pub fn to_owned(self) -> Result<Commit, crate::decode::Error> { |
132 | 0 | self.try_into() |
133 | 0 | } Unexecuted instantiation: <gix_object::CommitRef>::to_owned Unexecuted instantiation: <gix_object::CommitRef>::to_owned Unexecuted instantiation: <gix_object::CommitRef>::to_owned Unexecuted instantiation: <gix_object::CommitRef>::to_owned Unexecuted instantiation: <gix_object::CommitRef>::to_owned Unexecuted instantiation: <gix_object::CommitRef>::to_owned |
134 | | } |
135 | | |
136 | | impl Commit { |
137 | | /// Returns a convenient iterator over all extra headers. |
138 | 0 | pub fn extra_headers(&self) -> ExtraHeaders<impl Iterator<Item = (&BStr, &BStr)>> { |
139 | 0 | ExtraHeaders::new( |
140 | 0 | self.extra_headers.iter().map(|(k, v)| (k.as_bstr(), v.as_bstr())), Unexecuted instantiation: <gix_object::Commit>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::Commit>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::Commit>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::Commit>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::Commit>::extra_headers::{closure#0}Unexecuted instantiation: <gix_object::Commit>::extra_headers::{closure#0} |
141 | 0 | self.tree.kind(), |
142 | | ) |
143 | 0 | } Unexecuted instantiation: <gix_object::Commit>::extra_headers Unexecuted instantiation: <gix_object::Commit>::extra_headers Unexecuted instantiation: <gix_object::Commit>::extra_headers Unexecuted instantiation: <gix_object::Commit>::extra_headers Unexecuted instantiation: <gix_object::Commit>::extra_headers Unexecuted instantiation: <gix_object::Commit>::extra_headers |
144 | | } |
145 | | |
146 | | /// An iterator over extra headers in [owned][crate::Commit] and [borrowed][crate::CommitRef] commits. |
147 | | pub struct ExtraHeaders<I> { |
148 | | inner: I, |
149 | | hash_kind: gix_hash::Kind, |
150 | | } |
151 | | |
152 | | /// Instantiation and convenience. |
153 | | impl<'a, I> ExtraHeaders<I> |
154 | | where |
155 | | I: Iterator<Item = (&'a BStr, &'a BStr)>, |
156 | | { |
157 | | /// Create a new instance from an iterator over tuples of (name, value) pairs. |
158 | 0 | pub fn new(iter: I, hash_kind: gix_hash::Kind) -> Self { |
159 | 0 | ExtraHeaders { inner: iter, hash_kind } |
160 | 0 | } Unexecuted instantiation: <gix_object::commit::ExtraHeaders<core::iter::adapters::map::Map<core::slice::iter::Iter<(&bstr::bstr::BStr, alloc::borrow::Cow<bstr::bstr::BStr>)>, <gix_object::CommitRef>::extra_headers::{closure#0}>>>::newUnexecuted instantiation: <gix_object::commit::ExtraHeaders<core::iter::adapters::map::Map<core::slice::iter::Iter<(&bstr::bstr::BStr, alloc::borrow::Cow<bstr::bstr::BStr>)>, <gix_object::CommitRef>::extra_headers::{closure#0}>>>::newUnexecuted instantiation: <gix_object::commit::ExtraHeaders<core::iter::adapters::map::Map<core::slice::iter::Iter<(&bstr::bstr::BStr, alloc::borrow::Cow<bstr::bstr::BStr>)>, <gix_object::CommitRef>::extra_headers::{closure#0}>>>::newUnexecuted instantiation: <gix_object::commit::ExtraHeaders<core::iter::adapters::map::Map<core::slice::iter::Iter<(&bstr::bstr::BStr, alloc::borrow::Cow<bstr::bstr::BStr>)>, <gix_object::CommitRef>::extra_headers::{closure#0}>>>::newUnexecuted instantiation: <gix_object::commit::ExtraHeaders<core::iter::adapters::map::Map<core::slice::iter::Iter<(&bstr::bstr::BStr, alloc::borrow::Cow<bstr::bstr::BStr>)>, <gix_object::CommitRef>::extra_headers::{closure#0}>>>::newUnexecuted instantiation: <gix_object::commit::ExtraHeaders<core::iter::adapters::map::Map<core::slice::iter::Iter<(&bstr::bstr::BStr, alloc::borrow::Cow<bstr::bstr::BStr>)>, <gix_object::CommitRef>::extra_headers::{closure#0}>>>::new |
161 | | |
162 | | /// Find the _value_ of the _first_ header with the given `name`. |
163 | 0 | pub fn find(mut self, name: &str) -> Option<&'a BStr> { |
164 | 0 | self.inner |
165 | 0 | .find_map(move |(k, v)| if k == name.as_bytes().as_bstr() { Some(v) } else { None })Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find::{closure#0} |
166 | 0 | } Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find |
167 | | |
168 | | /// Find the entry index with the given name, or return `None` if unavailable. |
169 | 0 | pub fn find_pos(self, name: &str) -> Option<usize> { |
170 | 0 | self.inner |
171 | 0 | .enumerate() |
172 | 0 | .find_map(|(pos, (field, _value))| (field == name).then_some(pos)) Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos::{closure#0} |
173 | 0 | } Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_pos |
174 | | |
175 | | /// Return an iterator over all _values_ of headers with the given `name`. |
176 | 0 | pub fn find_all(self, name: &'a str) -> impl Iterator<Item = &'a BStr> { |
177 | 0 | self.inner |
178 | 0 | .filter_map(move |(k, v)| if k == name.as_bytes().as_bstr() { Some(v) } else { None })Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all::{closure#0} |
179 | 0 | } Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::find_all |
180 | | |
181 | | /// Return an iterator over all git mergetags. |
182 | | /// |
183 | | /// A merge tag is a tag object embedded within the respective header field of a commit, making |
184 | | /// it a child object of sorts. |
185 | 0 | pub fn mergetags(self) -> impl Iterator<Item = Result<TagRef<'a>, crate::decode::Error>> { |
186 | 0 | let hash_kind = self.hash_kind; |
187 | 0 | self.find_all("mergetag").map(move |b| TagRef::from_bytes(b, hash_kind))Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags::{closure#0}Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags::{closure#0} |
188 | 0 | } Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::mergetags |
189 | | |
190 | | /// Return the cryptographic signature provided by gpg/pgp verbatim. |
191 | 0 | pub fn pgp_signature(self) -> Option<&'a BStr> { |
192 | 0 | self.find(SIGNATURE_FIELD_NAME) |
193 | 0 | } Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::pgp_signature Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::pgp_signature Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::pgp_signature Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::pgp_signature Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::pgp_signature Unexecuted instantiation: <gix_object::commit::ExtraHeaders<_>>::pgp_signature |
194 | | } |