Start impl of StoreIdAccessor for CreateHook
This commit is contained in:
parent
830d170518
commit
4de051e1bb
1 changed files with 72 additions and 2 deletions
|
@ -1,16 +1,27 @@
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
use std::fmt::{Debug, Formatter, Error as FmtError};
|
use std::fmt::{Debug, Formatter, Error as FmtError};
|
||||||
|
use std::result::Result as RResult;
|
||||||
|
|
||||||
use toml::Value;
|
use toml::Value;
|
||||||
use git2::{Repository, Error as Git2Error};
|
use git2::{Reference as GitReference, Repository, Error as Git2Error};
|
||||||
|
|
||||||
use libimagstore::storeid::StoreId;
|
use libimagstore::storeid::StoreId;
|
||||||
use libimagstore::hook::Hook;
|
use libimagstore::hook::Hook;
|
||||||
|
use libimagstore::hook::error::HookError as HE;
|
||||||
|
use libimagstore::hook::error::HookErrorKind as HEK;
|
||||||
|
use libimagstore::hook::error::CustomData as HECD;
|
||||||
use libimagstore::hook::result::HookResult;
|
use libimagstore::hook::result::HookResult;
|
||||||
use libimagstore::hook::position::HookPosition;
|
use libimagstore::hook::position::HookPosition;
|
||||||
use libimagstore::hook::accessor::{HookDataAccessor, HookDataAccessorProvider};
|
use libimagstore::hook::accessor::{HookDataAccessor, HookDataAccessorProvider};
|
||||||
use libimagstore::hook::accessor::StoreIdAccessor;
|
use libimagstore::hook::accessor::StoreIdAccessor;
|
||||||
use libimagerror::trace::trace_error;
|
use libimagerror::trace::trace_error;
|
||||||
|
use libimagerror::into::IntoError;
|
||||||
|
|
||||||
|
use vcs::git::result::Result;
|
||||||
|
use vcs::git::error::MapErrInto;
|
||||||
|
use vcs::git::error::GitHookErrorKind as GHEK;
|
||||||
|
use vcs::git::error::GitHookError as GHE;
|
||||||
|
use vcs::git::config::ensure_branch;
|
||||||
|
|
||||||
pub struct CreateHook<'a> {
|
pub struct CreateHook<'a> {
|
||||||
storepath: &'a PathBuf,
|
storepath: &'a PathBuf,
|
||||||
|
@ -39,11 +50,26 @@ impl<'a> CreateHook<'a> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn repository(&self) -> HookResult<&Repository> {
|
||||||
|
use vcs::git::config::abort_on_repo_init_err;
|
||||||
|
|
||||||
|
match self.repository.as_ref() {
|
||||||
|
Some(r) => Ok(r),
|
||||||
|
None => {
|
||||||
|
debug!("Repository isn't initialized... creating error object now");
|
||||||
|
let he = GHEK::MkRepo.into_error();
|
||||||
|
let he = HE::new(HEK::HookExecutionError, Some(Box::new(he)));
|
||||||
|
let custom = HECD::default().aborting(abort_on_repo_init_err(self.config.as_ref()));
|
||||||
|
return Err(he.with_custom_data(custom));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'a> Debug for CreateHook<'a> {
|
impl<'a> Debug for CreateHook<'a> {
|
||||||
|
|
||||||
fn fmt(&self, fmt: &mut Formatter) -> Result<(), FmtError> {
|
fn fmt(&self, fmt: &mut Formatter) -> RResult<(), FmtError> {
|
||||||
write!(fmt, "CreateHook(storepath={:?}, repository={}, pos={:?}, cfg={:?}",
|
write!(fmt, "CreateHook(storepath={:?}, repository={}, pos={:?}, cfg={:?}",
|
||||||
self.storepath,
|
self.storepath,
|
||||||
(if self.repository.is_some() { "Some(_)" } else { "None" }),
|
(if self.repository.is_some() { "Some(_)" } else { "None" }),
|
||||||
|
@ -75,8 +101,52 @@ impl<'a> StoreIdAccessor for CreateHook<'a> {
|
||||||
|
|
||||||
fn access(&self, id: &StoreId) -> HookResult<()> {
|
fn access(&self, id: &StoreId) -> HookResult<()> {
|
||||||
debug!("[GIT CREATE HOOK]: {:?}", id);
|
debug!("[GIT CREATE HOOK]: {:?}", id);
|
||||||
|
let repository = try!(self.repository());
|
||||||
|
let head = try!(repository.head().map_err_into(GHEK::HeadFetchError)
|
||||||
|
.map_err(|e| HEK::HookExecutionError.into_error_with_cause(Box::new(e))));
|
||||||
|
|
||||||
|
if head.is_branch() {
|
||||||
|
return GHEK::NotOnBranch.into_error().inside_of(HEK::HookExecutionError)
|
||||||
|
}
|
||||||
|
|
||||||
|
try!(checkout_branch(self.config.as_ref(), &head)
|
||||||
|
.map_err(|e| HEK::HookExecutionError.into_error_with_cause(Box::new(e))));
|
||||||
|
|
||||||
|
// Now to the create() hook action
|
||||||
|
|
||||||
|
unimplemented!()
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn checkout_branch(config: Option<&Value>, head: &GitReference) -> Result<()> {
|
||||||
|
// Check out appropriate branch ... or fail
|
||||||
|
match ensure_branch(config) {
|
||||||
|
Ok(Some(s)) => {
|
||||||
|
match head.name().map(|name| name == s) {
|
||||||
|
Some(b) => {
|
||||||
|
if b {
|
||||||
|
debug!("Branch already checked out.");
|
||||||
|
Ok(())
|
||||||
|
} else {
|
||||||
|
debug!("Branch not checked out.");
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
None => Err(GHEK::RepositoryBranchNameFetchingError.into_error())
|
||||||
|
.map_err_into(GHEK::RepositoryBranchError)
|
||||||
|
.map_err_into(GHEK::RepositoryError),
|
||||||
|
}
|
||||||
|
},
|
||||||
|
Ok(None) => {
|
||||||
|
debug!("No branch to checkout");
|
||||||
|
Ok(())
|
||||||
|
},
|
||||||
|
|
||||||
|
Err(e) => Err(e).map_err_into(GHEK::RepositoryError),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue