diff options
author | Jeff Chien <jeff@jemstep.com> | 2020-03-10 16:10:15 +0200 |
---|---|---|
committer | Jeff Chien <jeff@jemstep.com> | 2020-03-10 16:10:15 +0200 |
commit | 7cba91c13e4c14e9eff792addec4daad03899b4b (patch) | |
tree | 42d7e2cb680f2547f9701fd4a08a6b6539d6effe | |
parent | d33944d252c630e6db20ffcb8b5d4e85d5ffcf75 (diff) |
PYKE-11910: implemented edge-case for force-pushes
-rw-r--r-- | src/policies.rs | 8 | ||||
-rw-r--r-- | tests/policies_test.rs | 18 |
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); +} |