Skip to content

Commit 2940c38

Browse files
committed
Provide a complete wrapper for the merge analysis function
1 parent 953f1e6 commit 2940c38

File tree

2 files changed

+43
-14
lines changed

2 files changed

+43
-14
lines changed

ObjectiveGit/GTRepository+Merging.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010
#import "GTIndexEntry.h"
1111
#import "git2/merge.h"
1212

13+
@class GTAnnotatedCommit;
14+
1315
NS_ASSUME_NONNULL_BEGIN
1416

1517
/// UserInfo key for conflicted files when pulling fails with a merge conflict
@@ -25,6 +27,14 @@ typedef NS_OPTIONS(NSInteger, GTMergeAnalysis) {
2527
GTMergeAnalysisFastForward = GIT_MERGE_ANALYSIS_FASTFORWARD,
2628
};
2729

30+
/// An enum describing the users' preference w.r.t fast-forward merges.
31+
/// See `git_merge_preference_t`.
32+
typedef NS_OPTIONS(NSInteger, GTMergePreference) {
33+
GTMergePreferenceNone = GIT_MERGE_PREFERENCE_NONE,
34+
GTMergePreferenceNoFastForward = GIT_MERGE_PREFERENCE_NO_FASTFORWARD,
35+
GTMergePreferenceFastForwardOnly = GIT_MERGE_PREFERENCE_FASTFORWARD_ONLY,
36+
};
37+
2838
@interface GTRepository (Merging)
2939

3040
/// Enumerate all available merge head entries.

ObjectiveGit/GTRepository+Merging.m

Lines changed: 33 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#import "GTIndexEntry.h"
2020
#import "GTOdbObject.h"
2121
#import "GTObjectDatabase.h"
22+
#import "GTAnnotatedCommit.h"
23+
#import "EXTScope.h"
2224

2325
typedef void (^GTRemoteFetchTransferProgressBlock)(const git_transfer_progress *stats, BOOL *stop);
2426

@@ -73,6 +75,34 @@ - (NSArray *)mergeHeadEntriesWithError:(NSError **)error {
7375
return entries;
7476
}
7577

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+
76106
- (BOOL)mergeBranchIntoCurrentBranch:(GTBranch *)branch withError:(NSError **)error {
77107
// Check if merge is necessary
78108
GTBranch *localBranch = [self currentBranchWithError:error];
@@ -266,23 +296,12 @@ - (BOOL)analyzeMerge:(GTMergeAnalysis *)analysis fromBranch:(GTBranch *)fromBran
266296
return NO;
267297
}
268298

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) {
279301
return NO;
280302
}
281303

282-
// Cleanup
283-
git_annotated_commit_free(annotatedCommit);
284-
285-
return YES;
304+
return [self analyzeMerge:analysis preference:NULL fromAnnotatedCommits:@[annotatedCommit] error:error];
286305
}
287306

288307
@end

0 commit comments

Comments
 (0)