Add Runtime object for git hooks
This commit is contained in:
parent
4de051e1bb
commit
3b138d2add
2 changed files with 70 additions and 0 deletions
|
@ -4,6 +4,7 @@ pub mod create;
|
||||||
pub mod delete;
|
pub mod delete;
|
||||||
mod error;
|
mod error;
|
||||||
mod result;
|
mod result;
|
||||||
|
mod runtime;
|
||||||
pub mod retrieve;
|
pub mod retrieve;
|
||||||
pub mod update;
|
pub mod update;
|
||||||
pub mod util;
|
pub mod util;
|
||||||
|
|
69
libimagstorestdhook/src/vcs/git/runtime.rs
Normal file
69
libimagstorestdhook/src/vcs/git/runtime.rs
Normal file
|
@ -0,0 +1,69 @@
|
||||||
|
use std::path::PathBuf;
|
||||||
|
|
||||||
|
use git2::{Repository, Signature};
|
||||||
|
|
||||||
|
use libimagerror::into::IntoError;
|
||||||
|
use libimagerror::trace::trace_error;
|
||||||
|
|
||||||
|
use vcs::git::result::Result;
|
||||||
|
use vcs::git::error::GitHookErrorKind as GHEK;
|
||||||
|
use vcs::git::config::{author_name, author_mail, committer_name, committer_mail};
|
||||||
|
|
||||||
|
struct Person<'a> {
|
||||||
|
pub name: &'a str,
|
||||||
|
pub mail: &'a str,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Person<'a> {
|
||||||
|
fn new(name: &'a str, mail: &'a str) -> Person<'a> {
|
||||||
|
Person { name: name, mail: mail }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct Runtime<'a> {
|
||||||
|
pub repository: Option<Repository>,
|
||||||
|
pub author: Option<Person<'a>>,
|
||||||
|
pub committer: Option<Person<'a>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'a> Runtime<'a> {
|
||||||
|
|
||||||
|
pub fn new(storepath: &PathBuf) -> Runtime<'a> {
|
||||||
|
Runtime {
|
||||||
|
repository: match Repository::open(storepath) {
|
||||||
|
Ok(r) => Some(r),
|
||||||
|
Err(e) => {
|
||||||
|
trace_error(&e);
|
||||||
|
None
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
author: None,
|
||||||
|
committer: None,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn configure(&mut self, config: &Value) -> Result<()> {
|
||||||
|
author_name(cfg)
|
||||||
|
.and_then(|n| author_email(cfg).map(|m| Person::new(n, m)))
|
||||||
|
.and_then(|author| {
|
||||||
|
committer_name(cfg)
|
||||||
|
.and_then(|n| committer_email(cfg).map(|m| (author, Person::new(n, m))))
|
||||||
|
})
|
||||||
|
.map(|(author, committer)| {
|
||||||
|
self.author = Some(author);
|
||||||
|
self.committer = Some(committer);
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn new_committer_sig(&self) -> Option<Result<Signature>> {
|
||||||
|
self.committer
|
||||||
|
.as_ref()
|
||||||
|
.map(|c| {
|
||||||
|
Signature::now(c.name, c.mail)
|
||||||
|
.map_err(|e| GHEK::MkSignature.into_error_with_cause(Box::new(e)))
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue