raw
1use git2::{ObjectType, Tag};
2
3use crate::utils::{
4 error::Result,
5 git::{Repository, TagEntry},
6};
7
8impl Repository {
9 #[tracing::instrument(skip_all)]
10 pub fn tag_entries(&self) -> Result<Vec<TagEntry>> {
11 let mut tags = Vec::new();
12
13 self.inner.tag_foreach(|oid, name_bytes| {
14 let Ok(name) = String::from_utf8(name_bytes[10..].to_vec()) else {
16 return true;
17 };
18
19 let Ok(obj) = self.inner.find_object(oid, None) else {
20 return true;
21 };
22
23 let tag = match obj.kind() {
24 Some(ObjectType::Tag) => TagEntry::try_from_tag(name, &obj),
25 Some(ObjectType::Commit) => TagEntry::try_from_commit(name, &obj),
27 _ => unreachable!("a tag was not a tag or lightweight tag"),
28 };
29
30 let Ok(tag) = tag else {
31 return true;
32 };
33
34 tags.push(tag);
35
36 true
37 })?;
38
39 Ok(tags)
40 }
41
42 #[tracing::instrument(skip_all)]
43 pub fn tag(&self, spec: &str) -> Result<Tag<'_>> {
44 let tag = self.inner.revparse_single(spec)?.peel_to_tag()?;
45
46 Ok(tag)
47 }
48}
49