diff options
author | Nasser Grainawi <nasser.grainawi@linaro.org> | 2023-11-10 17:01:14 -0700 |
---|---|---|
committer | Nasser Grainawi <nasser.grainawi@linaro.org> | 2023-11-10 17:18:25 -0700 |
commit | 22ce9df0793d2be6eccf3a19cbda4bb33ae030d6 (patch) | |
tree | 66689f752d6da6030812e7d7f4ad4b19a034d679 | |
parent | f85560a5d385c8abfa4df740f31485288b67cdce (diff) |
MergeUtil: Create an optimized canFastForwardOrMerge
This method de-duplicates the potentially expensive
hasMissingDependencies() call for callers that needed to do
`canFastForward() || canMerge()`.
Change-Id: If4b5a1244b79d84103af8939e621b503ba587cc3
Release-Notes: Improved performance for conflicts: operator and other mergability checks when submit type is Merge-If-Necessary
-rw-r--r-- | java/com/google/gerrit/server/git/MergeUtil.java | 25 | ||||
-rw-r--r-- | java/com/google/gerrit/server/submit/MergeIfNecessary.java | 4 |
2 files changed, 25 insertions, 4 deletions
diff --git a/java/com/google/gerrit/server/git/MergeUtil.java b/java/com/google/gerrit/server/git/MergeUtil.java index c1333cb744..fac05d28ec 100644 --- a/java/com/google/gerrit/server/git/MergeUtil.java +++ b/java/com/google/gerrit/server/git/MergeUtil.java @@ -679,6 +679,10 @@ public class MergeUtil { return false; } + return canMerge(mergeTip, repo, toMerge); + } + + private boolean canMerge(CodeReviewCommit mergeTip, Repository repo, CodeReviewCommit toMerge) { try (ObjectInserter ins = new InMemoryInserter(repo)) { return newThreeWayMerger(ins, repo.getConfig()).merge(mergeTip, toMerge); } catch (LargeObjectException e) { @@ -700,6 +704,11 @@ public class MergeUtil { return false; } + return canFastForward(mergeTip, rw, toMerge); + } + + private boolean canFastForward( + CodeReviewCommit mergeTip, CodeReviewRevWalk rw, CodeReviewCommit toMerge) { try { return mergeTip == null || rw.isMergedInto(mergeTip, toMerge) @@ -709,6 +718,19 @@ public class MergeUtil { } } + public boolean canFastForwardOrMerge( + MergeSorter mergeSorter, + CodeReviewCommit mergeTip, + CodeReviewRevWalk rw, + Repository repo, + CodeReviewCommit toMerge) { + if (hasMissingDependencies(mergeSorter, toMerge)) { + return false; + } + + return canFastForward(mergeTip, rw, toMerge) || canMerge(mergeTip, repo, toMerge); + } + public boolean canCherryPick( MergeSorter mergeSorter, Repository repo, @@ -751,8 +773,7 @@ public class MergeUtil { // by an equivalent merge with a different first parent. So // instead behave as though MERGE_IF_NECESSARY was configured. // - return canFastForward(mergeSorter, mergeTip, rw, toMerge) - || canMerge(mergeSorter, repo, mergeTip, toMerge); + return canFastForwardOrMerge(mergeSorter, mergeTip, rw, repo, toMerge); } public boolean hasMissingDependencies(MergeSorter mergeSorter, CodeReviewCommit toMerge) { diff --git a/java/com/google/gerrit/server/submit/MergeIfNecessary.java b/java/com/google/gerrit/server/submit/MergeIfNecessary.java index 30f16616cf..c6877d26ac 100644 --- a/java/com/google/gerrit/server/submit/MergeIfNecessary.java +++ b/java/com/google/gerrit/server/submit/MergeIfNecessary.java @@ -48,7 +48,7 @@ public class MergeIfNecessary extends SubmitStrategy { static boolean dryRun( SubmitDryRun.Arguments args, CodeReviewCommit mergeTip, CodeReviewCommit toMerge) { - return args.mergeUtil.canFastForward(args.mergeSorter, mergeTip, args.rw, toMerge) - || args.mergeUtil.canMerge(args.mergeSorter, args.repo, mergeTip, toMerge); + return args.mergeUtil.canFastForwardOrMerge( + args.mergeSorter, mergeTip, args.rw, args.repo, toMerge); } } |