wayver's git archive


a simple self-hosted git server
git clone https://git.wayver.dev/bile

src/utils/git/tag.rs@f3f2b40f0ffae5de2e6d3f661e32b582274bae49

raw
Date Commit Message Author Files + -
2026-02-17 21:07 initial mvp wayverd 74 10800 0
...

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            // remove prefix "ref/tags/"
15            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                // lightweight tag
26                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