diff --git a/libimagstorestdhook/src/vcs/git/runtime.rs b/libimagstorestdhook/src/vcs/git/runtime.rs index 5a48d5be..3daf8bf8 100644 --- a/libimagstorestdhook/src/vcs/git/runtime.rs +++ b/libimagstorestdhook/src/vcs/git/runtime.rs @@ -1,6 +1,6 @@ use std::path::PathBuf; -use git2::Repository; +use git2::{Index, Repository}; use toml::Value; use libimagerror::into::IntoError; @@ -154,5 +154,25 @@ impl Runtime { .map_dbg_str("[GIT CREATE HOOK]: Branch checked out") } + /// Check whether the WD is "dirty" - whether there is a diff to the repository + /// This function returns false if there is no `Repository` object in the `Runtime` + pub fn repo_is_dirty(&self, index: &Index) -> bool { + match self.repository.as_ref() { + Some(repo) => { + repo.diff_index_to_workdir(Some(index), None) + .map_dbg_str("Fetched diff: Index <-> WD") + .map_dbg_err_str("Failed to fetch diff: Index <-> WD") + .map(|diff| diff.deltas().count() != 0) + .unwrap_or(false) + }, + + None => { + debug!("No repository: Cannot fetch diff: Index <-> WD"); + false + } + } + + } + } diff --git a/libimagstorestdhook/src/vcs/git/update.rs b/libimagstorestdhook/src/vcs/git/update.rs index 70b37b49..d13dd987 100644 --- a/libimagstorestdhook/src/vcs/git/update.rs +++ b/libimagstorestdhook/src/vcs/git/update.rs @@ -106,6 +106,13 @@ impl StoreIdAccessor for UpdateHook { let repo = try!(self.runtime.repository(&action)); let mut index = try!(fetch_index(repo, &action)); + if !self.runtime.repo_is_dirty(&index) { + debug!("[GIT UPDATE HOOK]: Repository seems to be clean. I'm done."); + return Ok(()) + } else { + debug!("[GIT UPDATE HOOK]: Repository seems to be dirty. Continuing."); + } + let signature = try!( repo.signature() .map_err_into(GHEK::MkSignature)