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