summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Chien <jeff@jemstep.com>2020-03-10 16:10:15 +0200
committerJeff Chien <jeff@jemstep.com>2020-03-10 16:10:15 +0200
commit7cba91c13e4c14e9eff792addec4daad03899b4b (patch)
tree42d7e2cb680f2547f9701fd4a08a6b6539d6effe
parentd33944d252c630e6db20ffcb8b5d4e85d5ffcf75 (diff)
PYKE-11910: implemented edge-case for force-pushes
-rw-r--r--src/policies.rs8
-rw-r--r--tests/policies_test.rs18
2 files changed, 26 insertions, 0 deletions
diff --git a/src/policies.rs b/src/policies.rs
index 2662f10..990e141 100644
--- a/src/policies.rs
+++ b/src/policies.rs
@@ -380,6 +380,7 @@ fn verify_rebased<G: Git>(
let is_merge = git.is_merge_commit(new_commit_id);
let is_mainline = git.is_mainline(ref_name)?;
let new_commit = git.find_commit(new_commit_id, override_tag_pattern)?;
+ let is_not_fast_forward = !git.is_descendent_of(new_commit_id, old_commit_id)?;
if !is_mainline {
info!(
@@ -402,6 +403,13 @@ fn verify_rebased<G: Git>(
new_commit_id
);
Ok(PolicyResult::Ok)
+ } else if is_not_fast_forward {
+ info!(
+ "Rebase verification passed for {0}: Commit Id {0} is not a descendent of Commit Id {1}, it is most likely that a force-push has occurred",
+ new_commit_id,
+ old_commit_id
+ );
+ Ok(PolicyResult::Ok)
} else {
let new_commit_is_rebased = new_commit
.parents
diff --git a/tests/policies_test.rs b/tests/policies_test.rs
index e12faf8..0462297 100644
--- a/tests/policies_test.rs
+++ b/tests/policies_test.rs
@@ -437,3 +437,21 @@ fn verify_unrebased_branch_is_blocked_when_mainline_has_reverts() {
.unwrap();
assert!(result.is_err());
}
+
+#[test]
+fn verify_rebased_branch_is_allowed_when_a_force_push_has_occurred() {
+ before_all();
+ let result = policies::verify_git_commits::<LiveGit, MockGpg>(
+ &LiveGit::default("./").unwrap(),
+ MockGpg,
+ &VerifyGitCommitsConfig {
+ verify_rebased: true,
+ ..verify_commits_config()
+ },
+ "eb5e0185546b0bb1a13feec6b9ee8b39985fea42",
+ "02bb68e637bda7667428f8fb3b709be5720fe76a",
+ "refs/heads/master",
+ )
+ .unwrap();
+ assert!(result.is_ok(), "Error: {:?}", result);
+}