diff options
author | Justin Worthe <justin@jemstep.com> | 2020-03-13 11:57:42 +0200 |
---|---|---|
committer | Justin Worthe <justin@jemstep.com> | 2020-03-13 11:57:42 +0200 |
commit | be5095c0595f4bd62602c9ac921ace783329436f (patch) | |
tree | 889b0a70219109dc6b7737511906f6b97f72e667 | |
parent | 31b583d30f9ac42ce8056cad96cee9b715ff8da5 (diff) |
PYKE-11910: Moved reference update and gave it some tests
-rw-r--r-- | src/lib.rs | 4 | ||||
-rw-r--r-- | src/policies.rs | 3 | ||||
-rw-r--r-- | src/policies/reference_update.rs | 70 | ||||
-rw-r--r-- | src/reference_update.rs | 146 | ||||
-rw-r--r-- | tests/policies_test.rs | 2 |
5 files changed, 151 insertions, 74 deletions
@@ -12,7 +12,8 @@ use crate::config::Config; use crate::fs::Fs; use crate::git::Git; use crate::gpg::Gpg; -use crate::policies::{policy_result::PolicyResult, reference_update::ReferenceUpdate, *}; +use crate::policies::{policy_result::PolicyResult, *}; +use crate::reference_update::ReferenceUpdate; pub mod config; pub mod error; @@ -22,6 +23,7 @@ pub mod gpg; pub mod keyring; pub mod logger; pub mod policies; +pub mod reference_update; #[derive(Debug, StructOpt)] pub struct PrepareCommitMsg { diff --git a/src/policies.rs b/src/policies.rs index b02f770..32673f3 100644 --- a/src/policies.rs +++ b/src/policies.rs @@ -1,14 +1,13 @@ pub mod policy_result; -pub mod reference_update; use crate::config::VerifyGitCommitsConfig; use crate::fs::*; use crate::git::*; use crate::gpg::*; use crate::keyring::*; +use crate::reference_update::ReferenceUpdate; use self::policy_result::PolicyResult; -use self::reference_update::ReferenceUpdate; use git2::Oid; use rayon::prelude::*; diff --git a/src/policies/reference_update.rs b/src/policies/reference_update.rs deleted file mode 100644 index deb7b8f..0000000 --- a/src/policies/reference_update.rs +++ /dev/null @@ -1,70 +0,0 @@ -use crate::error::CapnError; -use git2::Oid; -use std::error::Error; - -pub enum ReferenceUpdate { - New { - new_commit_id: Oid, - ref_name: String, - }, - Delete { - old_commit_id: Oid, - ref_name: String, - }, - Update { - old_commit_id: Oid, - new_commit_id: Oid, - ref_name: String, - }, -} - -impl ReferenceUpdate { - pub fn from_git_hook_format( - old_commit_id: &str, - new_commit_id: &str, - ref_name: &str, - ) -> Result<ReferenceUpdate, Box<dyn Error>> { - let old_commit_id = Oid::from_str(old_commit_id)?; - let new_commit_id = Oid::from_str(new_commit_id)?; - let ref_name = ref_name.to_owned(); - match (old_commit_id.is_zero(), new_commit_id.is_zero()) { - (false, false) => Ok(ReferenceUpdate::Update { - old_commit_id, - new_commit_id, - ref_name, - }), - (false, true) => Ok(ReferenceUpdate::Delete { - old_commit_id, - ref_name, - }), - (true, false) => Ok(ReferenceUpdate::New { - new_commit_id, - ref_name, - }), - (true, true) => Err(Box::new(CapnError::new("Invalid reference update specification, trying to update from a zero commit to another zero commit"))) - } - } - - pub fn old_commit_id(&self) -> Option<Oid> { - use self::ReferenceUpdate::*; - match self { - Delete { old_commit_id, .. } | Update { old_commit_id, .. } => Some(*old_commit_id), - _ => None, - } - } - - pub fn new_commit_id(&self) -> Option<Oid> { - use self::ReferenceUpdate::*; - match self { - New { new_commit_id, .. } | Update { new_commit_id, .. } => Some(*new_commit_id), - _ => None, - } - } - - pub fn ref_name(&self) -> &str { - use self::ReferenceUpdate::*; - match self { - New { ref_name, .. } | Delete { ref_name, .. } | Update { ref_name, .. } => ref_name, - } - } -} diff --git a/src/reference_update.rs b/src/reference_update.rs new file mode 100644 index 0000000..3f072b1 --- /dev/null +++ b/src/reference_update.rs @@ -0,0 +1,146 @@ +use crate::error::CapnError; +use git2::Oid; +use std::error::Error; + +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ReferenceUpdate { + New { + new_commit_id: Oid, + ref_name: String, + }, + Delete { + old_commit_id: Oid, + ref_name: String, + }, + Update { + old_commit_id: Oid, + new_commit_id: Oid, + ref_name: String, + }, +} + +impl ReferenceUpdate { + pub fn from_git_hook_format( + old_commit_id: &str, + new_commit_id: &str, + ref_name: &str, + ) -> Result<ReferenceUpdate, Box<dyn Error>> { + let old_commit_id = Oid::from_str(old_commit_id)?; + let new_commit_id = Oid::from_str(new_commit_id)?; + let ref_name = ref_name.to_owned(); + match (old_commit_id.is_zero(), new_commit_id.is_zero()) { + (false, false) => Ok(ReferenceUpdate::Update { + old_commit_id, + new_commit_id, + ref_name, + }), + (false, true) => Ok(ReferenceUpdate::Delete { + old_commit_id, + ref_name, + }), + (true, false) => Ok(ReferenceUpdate::New { + new_commit_id, + ref_name, + }), + (true, true) => Err(Box::new(CapnError::new("Invalid reference update specification, trying to update from a zero commit to another zero commit"))) + } + } + + pub fn old_commit_id(&self) -> Option<Oid> { + use self::ReferenceUpdate::*; + match self { + Delete { old_commit_id, .. } | Update { old_commit_id, .. } => Some(*old_commit_id), + _ => None, + } + } + + pub fn new_commit_id(&self) -> Option<Oid> { + use self::ReferenceUpdate::*; + match self { + New { new_commit_id, .. } | Update { new_commit_id, .. } => Some(*new_commit_id), + _ => None, + } + } + + pub fn ref_name(&self) -> &str { + use self::ReferenceUpdate::*; + match self { + New { ref_name, .. } | Delete { ref_name, .. } | Update { ref_name, .. } => ref_name, + } + } +} + +#[cfg(test)] +mod test { + use super::*; + use git2::Oid; + + #[test] + fn example_deleting_branch() { + let old_commit_id = Oid::from_str("eb5e0185546b0bb1a13feec6b9ee8b39985fea42").unwrap(); + let ref_name = "refs/heads/master"; + let ref_update = ReferenceUpdate::from_git_hook_format( + &format!("{}", old_commit_id), + "0000000000000000000000000000000000000000", + ref_name, + ) + .unwrap(); + assert_eq!( + ref_update, + ReferenceUpdate::Delete { + old_commit_id, + ref_name: ref_name.to_string() + } + ); + assert_eq!(ref_update.old_commit_id(), Some(old_commit_id)); + assert_eq!(ref_update.new_commit_id(), None); + assert_eq!(ref_update.ref_name(), ref_name); + } + + #[test] + fn example_creating_branch() { + let new_commit_id = Oid::from_str("eb5e0185546b0bb1a13feec6b9ee8b39985fea42").unwrap(); + let ref_name = "refs/heads/master"; + let ref_update = ReferenceUpdate::from_git_hook_format( + "0000000000000000000000000000000000000000", + &format!("{}", new_commit_id), + ref_name, + ) + .unwrap(); + assert_eq!( + ref_update, + ReferenceUpdate::New { + new_commit_id, + ref_name: ref_name.to_string() + } + ); + assert_eq!(ref_update.old_commit_id(), None); + assert_eq!(ref_update.new_commit_id(), Some(new_commit_id)); + assert_eq!(ref_update.ref_name(), ref_name); + } + + #[test] + fn example_updating_branch() { + let old_commit_id = Oid::from_str("eb5e0185546b0bb1a13feec6b9ee8b39985fea42").unwrap(); + let new_commit_id = Oid::from_str("6004dfdb071c71e5e76ad55b924b576487e1c485").unwrap(); + + let ref_name = "refs/heads/master"; + let ref_update = ReferenceUpdate::from_git_hook_format( + &format!("{}", old_commit_id), + &format!("{}", new_commit_id), + ref_name, + ) + .unwrap(); + assert_eq!( + ref_update, + ReferenceUpdate::Update { + old_commit_id, + new_commit_id, + ref_name: ref_name.to_string() + } + ); + assert_eq!(ref_update.old_commit_id(), Some(old_commit_id)); + assert_eq!(ref_update.new_commit_id(), Some(new_commit_id)); + assert_eq!(ref_update.ref_name(), ref_name); + } +} diff --git a/tests/policies_test.rs b/tests/policies_test.rs index 966e95c..f4299ba 100644 --- a/tests/policies_test.rs +++ b/tests/policies_test.rs @@ -1,7 +1,7 @@ use capn; use capn::config::{Config, GitConfig, VerifyGitCommitsConfig}; use capn::policies; -use capn::policies::reference_update::ReferenceUpdate; +use capn::reference_update::ReferenceUpdate; use capn::git::LiveGit; use capn::gpg::test::MockGpg; |