|
19 | 19 | #import "GTIndexEntry.h"
|
20 | 20 | #import "GTOdbObject.h"
|
21 | 21 | #import "GTObjectDatabase.h"
|
| 22 | +#import "GTMerge.h" |
22 | 23 |
|
23 | 24 | typedef void (^GTRemoteFetchTransferProgressBlock)(const git_transfer_progress *stats, BOOL *stop);
|
24 | 25 |
|
@@ -173,78 +174,19 @@ - (BOOL)mergeBranchIntoCurrentBranch:(GTBranch *)branch withError:(NSError **)er
|
173 | 174 | }
|
174 | 175 |
|
175 | 176 | - (NSString * _Nullable)contentsOfDiffWithAncestor:(GTIndexEntry *)ancestor ourSide:(GTIndexEntry *)ourSide theirSide:(GTIndexEntry *)theirSide error:(NSError **)error {
|
| 177 | + NSParameterAssert(ancestor && ourSide && theirSide); |
176 | 178 |
|
177 |
| - GTObjectDatabase *database = [self objectDatabaseWithError:error]; |
178 |
| - if (database == nil) { |
| 179 | + GTIndex *index = [self indexWithError:error]; |
| 180 | + if (index == nil) { |
179 | 181 | return nil;
|
180 | 182 | }
|
181 | 183 |
|
182 |
| - // initialize the ancestor's merge file input |
183 |
| - git_merge_file_input ancestorInput; |
184 |
| - int gitError = git_merge_file_init_input(&ancestorInput, GIT_MERGE_FILE_INPUT_VERSION); |
185 |
| - if (gitError != GIT_OK) { |
186 |
| - if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to create merge file input for ancestor"]; |
187 |
| - return nil; |
188 |
| - } |
189 |
| - |
190 |
| - git_oid ancestorId = ancestor.git_index_entry->id; |
191 |
| - GTOID *ancestorOID = [[GTOID alloc] initWithGitOid:&ancestorId]; |
192 |
| - NSData *ancestorData = [[database objectWithOID:ancestorOID error: error] data]; |
193 |
| - if (ancestorData == nil) { |
194 |
| - return nil; |
195 |
| - } |
196 |
| - ancestorInput.ptr = ancestorData.bytes; |
197 |
| - ancestorInput.size = ancestorData.length; |
198 |
| - |
199 |
| - |
200 |
| - // initialize our merge file input |
201 |
| - git_merge_file_input ourInput; |
202 |
| - gitError = git_merge_file_init_input(&ourInput, GIT_MERGE_FILE_INPUT_VERSION); |
203 |
| - if (gitError != GIT_OK) { |
204 |
| - if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to create merge file input for our side"]; |
| 184 | + GTMergeResult *result = [index resultOfMergingAncestorEntry:ancestor ourEntry:ourSide theirEntry:theirSide options:nil error:error]; |
| 185 | + if (result == nil) { |
205 | 186 | return nil;
|
206 | 187 | }
|
207 | 188 |
|
208 |
| - git_oid ourId = ourSide.git_index_entry->id; |
209 |
| - GTOID *ourOID = [[GTOID alloc] initWithGitOid:&ourId]; |
210 |
| - NSData *ourData = [[database objectWithOID:ourOID error: error] data]; |
211 |
| - if (ourData == nil) { |
212 |
| - return nil; |
213 |
| - } |
214 |
| - ourInput.ptr = ourData.bytes; |
215 |
| - ourInput.size = ourData.length; |
216 |
| - |
217 |
| - |
218 |
| - // initialize their merge file input |
219 |
| - git_merge_file_input theirInput; |
220 |
| - gitError = git_merge_file_init_input(&theirInput, GIT_MERGE_FILE_INPUT_VERSION); |
221 |
| - if (gitError != GIT_OK) { |
222 |
| - if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to create merge file input other side"]; |
223 |
| - return nil; |
224 |
| - } |
225 |
| - |
226 |
| - git_oid theirId = theirSide.git_index_entry->id; |
227 |
| - GTOID *theirOID = [[GTOID alloc] initWithGitOid:&theirId]; |
228 |
| - NSData *theirData = [[database objectWithOID:theirOID error: error] data]; |
229 |
| - if (theirData == nil) { |
230 |
| - return nil; |
231 |
| - } |
232 |
| - theirInput.ptr = theirData.bytes; |
233 |
| - theirInput.size = theirData.length; |
234 |
| - |
235 |
| - |
236 |
| - git_merge_file_result result; |
237 |
| - gitError = git_merge_file(&result, &ancestorInput, &ourInput, &theirInput, nil); |
238 |
| - if (gitError != GIT_OK) { |
239 |
| - if (error != NULL) *error = [NSError git_errorFor:gitError description:@"Failed to create merge file"]; |
240 |
| - return nil; |
241 |
| - } |
242 |
| - |
243 |
| - NSString *mergedContent = [[NSString alloc] initWithBytes:result.ptr length:result.len encoding:NSUTF8StringEncoding]; |
244 |
| - |
245 |
| - git_merge_file_result_free(&result); |
246 |
| - |
247 |
| - return mergedContent; |
| 189 | + return [[NSString alloc] initWithData:result.data encoding:NSUTF8StringEncoding]; |
248 | 190 | }
|
249 | 191 |
|
250 | 192 | - (BOOL)annotatedCommit:(git_annotated_commit **)annotatedCommit fromCommit:(GTCommit *)fromCommit error:(NSError **)error {
|
|
0 commit comments