|
19 | 19 | #import "GTIndexEntry.h"
|
20 | 20 | #import "GTOdbObject.h"
|
21 | 21 | #import "GTObjectDatabase.h"
|
| 22 | +#import "GTAnnotatedCommit.h" |
| 23 | +#import "EXTScope.h" |
22 | 24 |
|
23 | 25 | typedef void (^GTRemoteFetchTransferProgressBlock)(const git_transfer_progress *stats, BOOL *stop);
|
24 | 26 |
|
@@ -73,6 +75,34 @@ - (NSArray *)mergeHeadEntriesWithError:(NSError **)error {
|
73 | 75 | return entries;
|
74 | 76 | }
|
75 | 77 |
|
| 78 | +- (BOOL)analyzeMerge:(GTMergeAnalysis *)analysis preference:(GTMergePreference *)preference fromAnnotatedCommits:(NSArray <GTAnnotatedCommit *> *)annotatedCommits error:(NSError * _Nullable __autoreleasing *)error { |
| 79 | + NSParameterAssert(annotatedCommits != nil); |
| 80 | + |
| 81 | + const git_annotated_commit **annotatedHeads = NULL; |
| 82 | + if (annotatedCommits.count > 0) { |
| 83 | + annotatedHeads = calloc(annotatedCommits.count, sizeof(git_annotated_commit *)); |
| 84 | + for (NSUInteger i = 0; i < annotatedCommits.count; i++){ |
| 85 | + annotatedHeads[i] = [annotatedCommits[i] git_annotated_commit]; |
| 86 | + } |
| 87 | + } |
| 88 | + @onExit { |
| 89 | + free(annotatedHeads); |
| 90 | + }; |
| 91 | + |
| 92 | + git_merge_analysis_t merge_analysis; |
| 93 | + git_merge_preference_t merge_preference; |
| 94 | + int gitError = git_merge_analysis(&merge_analysis, &merge_preference, self.git_repository, annotatedHeads, annotatedCommits.count); |
| 95 | + if (gitError != 0) { |
| 96 | + if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to analyze merge"]; |
| 97 | + return NO; |
| 98 | + } |
| 99 | + |
| 100 | + *analysis = (GTMergeAnalysis)merge_analysis; |
| 101 | + if (preference != NULL) *preference = (GTMergePreference)merge_preference; |
| 102 | + |
| 103 | + return YES; |
| 104 | +} |
| 105 | + |
76 | 106 | - (BOOL)mergeBranchIntoCurrentBranch:(GTBranch *)branch withError:(NSError **)error {
|
77 | 107 | // Check if merge is necessary
|
78 | 108 | GTBranch *localBranch = [self currentBranchWithError:error];
|
@@ -266,23 +296,12 @@ - (BOOL)analyzeMerge:(GTMergeAnalysis *)analysis fromBranch:(GTBranch *)fromBran
|
266 | 296 | return NO;
|
267 | 297 | }
|
268 | 298 |
|
269 |
| - git_annotated_commit *annotatedCommit; |
270 |
| - [self annotatedCommit:&annotatedCommit fromCommit:fromCommit error:error]; |
271 |
| - |
272 |
| - // Allow fast-forward or normal merge |
273 |
| - git_merge_preference_t preference = GIT_MERGE_PREFERENCE_NONE; |
274 |
| - |
275 |
| - // Merge analysis |
276 |
| - int gitError = git_merge_analysis((git_merge_analysis_t *)analysis, &preference, self.git_repository, (const git_annotated_commit **) &annotatedCommit, 1); |
277 |
| - if (gitError != GIT_OK) { |
278 |
| - if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to analyze merge"]; |
| 299 | + GTAnnotatedCommit *annotatedCommit = [GTAnnotatedCommit annotatedCommitFromReference:fromBranch.reference error:error]; |
| 300 | + if (!annotatedCommit) { |
279 | 301 | return NO;
|
280 | 302 | }
|
281 | 303 |
|
282 |
| - // Cleanup |
283 |
| - git_annotated_commit_free(annotatedCommit); |
284 |
| - |
285 |
| - return YES; |
| 304 | + return [self analyzeMerge:analysis preference:NULL fromAnnotatedCommits:@[annotatedCommit] error:error]; |
286 | 305 | }
|
287 | 306 |
|
288 | 307 | @end
|
0 commit comments