use std::process::Command; use git2; use libpt::log::error; use crate::error::ConfigError; use crate::{config::Config, error::Result}; pub(crate) fn get_repo() -> Result { let repo = match git2::Repository::open_from_env() { Ok(repo) => repo, Err(_err) => { let err = ConfigError::GitRepoNotFound.into(); error!("{err}"); return Err(err); } }; Ok(repo) } pub async fn tag<'repo>(repo: &'repo mut git2::Repository, cfg: &Config) -> Result> { // TODO: error handling // TODO: allow force // TODO: allow setting a message // TODO: maybe using git as cmd is fancier? let target = repo .find_object( repo.head().unwrap().target().unwrap(), Some(git2::ObjectType::Commit), ) .unwrap(); let tagger = repo.signature().expect("could not get signature"); let message = String::new(); let force = true; let tag = repo .tag( &cfg.yaml.version.get_version(), // "importantversion", &target, &tagger, &message, force, ) .unwrap(); let tag: git2::Tag = repo.find_tag(tag).unwrap(); Ok(tag) } pub async fn push(_cfg: &Config) -> Result<()> { // TODO: error handling // TODO: maybe using git as lib is fancier? Command::new("git").arg("push").status().unwrap(); Ok(()) } pub async fn get_commit_sig<'repo>(repo: &'repo git2::Repository) -> Result { // TODO: error handling // TODO: maybe using git as cmd is fancier? let target = repo .find_commit(repo.head().unwrap().target().unwrap()) .unwrap(); Ok(target.id().to_string()) }