|
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