summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Worthe <justin@jemstep.com>2020-03-13 11:57:42 +0200
committerJustin Worthe <justin@jemstep.com>2020-03-13 11:57:42 +0200
commitbe5095c0595f4bd62602c9ac921ace783329436f (patch)
tree889b0a70219109dc6b7737511906f6b97f72e667
parent31b583d30f9ac42ce8056cad96cee9b715ff8da5 (diff)
PYKE-11910: Moved reference update and gave it some tests
-rw-r--r--src/lib.rs4
-rw-r--r--src/policies.rs3
-rw-r--r--src/policies/reference_update.rs70
-rw-r--r--src/reference_update.rs146
-rw-r--r--tests/policies_test.rs2
5 files changed, 151 insertions, 74 deletions
diff --git a/src/lib.rs b/src/lib.rs
index a80c2fa..57b9d41 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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;