crate_seq_git/
discover.rs1use crate::Error;
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct TagRef {
8 pub name: String,
10 pub semver: semver::Version,
12}
13
14fn pattern_prefix(pattern: &str) -> &str {
16 pattern.strip_suffix('*').unwrap_or(pattern)
17}
18
19fn short_tag_name(full_name: &gix::bstr::BStr) -> Option<&str> {
21 let stripped = full_name.strip_prefix(b"refs/tags/")?;
22 std::str::from_utf8(stripped).ok()
23}
24
25pub fn discover_tags(repo_path: &std::path::Path, pattern: &str) -> Result<Vec<TagRef>, Error> {
36 let repo = gix::discover(repo_path).map_err(|e| Error::OpenRepo {
37 path: repo_path.to_owned(),
38 source: Box::new(e),
39 })?;
40
41 let prefix = pattern_prefix(pattern);
42 let mut tags: Vec<TagRef> = repo
43 .references()?
44 .tags()?
45 .filter_map(|result| {
46 let reference = result.ok()?;
47 let full = reference.name().as_bstr();
48 let short = short_tag_name(full)?;
49 let version_str = short.strip_prefix(prefix)?;
50 let semver = semver::Version::parse(version_str).ok()?;
51 Some(TagRef {
52 name: short.to_owned(),
53 semver,
54 })
55 })
56 .collect();
57
58 tags.sort_by(|a, b| a.semver.cmp(&b.semver));
59 Ok(tags)
60}