From e18f01cab4e151bf3f9c404b1769e3835dddb02f Mon Sep 17 00:00:00 2001 From: Alexis Sellier Date: Thu, 25 May 2023 10:28:02 +0200 Subject: [PATCH] radicle: Be more lenient when applying merge ops Before this change, if a merge op referred to a commit that was not on the default branch, the merge op and all descendant ops would be pruned. This is a bad idea because the state of the default branch can change *after* the merge op is created, which is out of the control of the merge op author. Therefore, instead of exiting, we keep processing ops (but ignore the merge), in case the merge is invalid for this specific reason. --- radicle/src/cob/patch.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/radicle/src/cob/patch.rs b/radicle/src/cob/patch.rs index 7df52b7d..5bff47de 100644 --- a/radicle/src/cob/patch.rs +++ b/radicle/src/cob/patch.rs @@ -436,11 +436,18 @@ impl store::FromHistory for Patch { } let proj = doc.project()?; let branch = git::refs::branch(proj.default_branch()); + + // Nb. We don't return an error in case the merge commit is not an + // ancestor of the default branch. The default branch can change + // *after* the merge action is created, which is out of the control + // of the merge author. We simply skip it, which allows archiving in + // case of a rebase off the master branch, or a redaction of the + // merge. let Ok(head) = repo.reference_oid(&op.author, &branch) else { - return Err(ApplyError::InvalidMerge(op.id)); + continue; }; if commit != head && !repo.is_ancestor_of(commit, head)? { - return Err(ApplyError::InvalidMerge(op.id)); + continue; } } }