wayver's git archive


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

src/git/tag.rs@3aec1a1bb245ce255f59532eba2bdfe1d2879510

raw
Date Commit Message Author Files + -
2026-02-19 17:51 large refactoring wayverd 53 2153 1683
...

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