Factor vergen stuff to a build-info crate

This commit is contained in:
Louis Dureuil 2024-02-27 18:34:52 +01:00
parent 86ce843f3d
commit c608b3f9b5
No known key found for this signature in database
15 changed files with 396 additions and 159 deletions

View file

@ -1,58 +1,4 @@
use serde::{Deserialize, Serialize};
use time::OffsetDateTime;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Source {
pub repo_url: Option<String>,
pub branch_or_tag: String,
pub commit_id: String,
pub commit_msg: String,
pub author_name: String,
pub author_email: String,
pub committer_name: String,
pub committer_email: String,
}
impl Source {
pub fn from_repo(
path: impl AsRef<std::path::Path>,
) -> Result<(Self, OffsetDateTime), git2::Error> {
use git2::Repository;
let repo = Repository::open(path)?;
let remote = repo.remotes()?;
let remote = remote.get(0).expect("No remote associated to the repo");
let remote = repo.find_remote(remote)?;
let head = repo.head()?;
let commit = head.peel_to_commit()?;
let time = OffsetDateTime::from_unix_timestamp(commit.time().seconds()).unwrap();
let author = commit.author();
let committer = commit.committer();
Ok((
Self {
repo_url: remote.url().map(|s| s.to_string()),
branch_or_tag: head.name().unwrap().to_string(),
commit_id: commit.id().to_string(),
commit_msg: String::from_utf8_lossy(commit.message_bytes())
.to_string()
.lines()
.next()
.map_or(String::new(), |s| s.to_string()),
author_name: author.name().unwrap().to_string(),
author_email: author.email().unwrap().to_string(),
committer_name: committer.name().unwrap().to_string(),
committer_email: committer.email().unwrap().to_string(),
},
time,
))
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]