@@ -281,6 +281,105 @@ - (PBGitRevSpecifier *)headRef
281
281
282
282
return _headRef;
283
283
}
284
+
285
+ - (NSString *) headSHA
286
+ {
287
+ return [self shaForRef: [[self headRef ] ref ]];
288
+ }
289
+
290
+ - (PBGitCommit *) headCommit
291
+ {
292
+ return [self commitForSHA: [self headSHA ]];
293
+ }
294
+
295
+ - (NSString *) shaForRef : (PBGitRef *)ref
296
+ {
297
+ if (!ref)
298
+ return nil ;
299
+
300
+ for (NSString *sha in refs)
301
+ for (PBGitRef *existingRef in [refs objectForKey: sha])
302
+ if ([existingRef isEqualToRef: ref])
303
+ return sha;
304
+
305
+ int retValue = 1 ;
306
+ NSArray *args = [NSArray arrayWithObjects: @" rev-list" , @" -1" , [ref ref ], nil ];
307
+ NSString *shaForRef = [self outputInWorkdirForArguments: args retValue: &retValue];
308
+ if (retValue || [shaForRef isEqualToString: @" " ])
309
+ return nil ;
310
+
311
+ return shaForRef;
312
+ }
313
+
314
+ - (PBGitCommit *) commitForRef : (PBGitRef *)ref
315
+ {
316
+ if (!ref)
317
+ return nil ;
318
+
319
+ return [self commitForSHA: [self shaForRef: ref]];
320
+ }
321
+
322
+ - (PBGitCommit *) commitForSHA : (NSString *)sha
323
+ {
324
+ if (!sha)
325
+ return nil ;
326
+ NSArray *revList = [self .revisionList.commits copy ];
327
+
328
+ for (PBGitCommit *commit in revList)
329
+ if ([[commit realSha ] isEqualToString: sha])
330
+ return commit;
331
+
332
+ return nil ;
333
+ }
334
+
335
+ - (BOOL ) isSHAOnHeadBranch : (NSString *)testSHA
336
+ {
337
+ if (!testSHA)
338
+ return NO ;
339
+
340
+ NSString *headSHA = [self headSHA ];
341
+
342
+ if ([testSHA isEqualToString: headSHA])
343
+ return YES ;
344
+
345
+ NSString *commitRange = [NSString stringWithFormat: @" %@ ..%@ " , testSHA, headSHA];
346
+ NSString *parentsOutput = [self outputForArguments: [NSArray arrayWithObjects: @" rev-list" , @" --parents" , @" -1" , commitRange, nil ]];
347
+ if ([parentsOutput isEqualToString: @" " ]) {
348
+ return NO ;
349
+ }
350
+
351
+ NSString *mergeSHA = [self outputForArguments: [NSArray arrayWithObjects: @" merge-base" , testSHA, headSHA, nil ]];
352
+ if ([mergeSHA isEqualToString: testSHA] || [mergeSHA isEqualToString: headSHA])
353
+ return YES ;
354
+
355
+ return NO ;
356
+ }
357
+
358
+ - (BOOL ) isRefOnHeadBranch : (PBGitRef *)testRef
359
+ {
360
+ if (!testRef)
361
+ return NO ;
362
+
363
+ return [self isSHAOnHeadBranch: [self shaForRef: testRef]];
364
+ }
365
+
366
+ - (BOOL ) checkRefFormat : (NSString *)refName
367
+ {
368
+ int retValue = 1 ;
369
+ [self outputInWorkdirForArguments: [NSArray arrayWithObjects: @" check-ref-format" , refName, nil ] retValue: &retValue];
370
+ if (retValue)
371
+ return NO ;
372
+ return YES ;
373
+ }
374
+
375
+ - (BOOL ) refExists : (PBGitRef *)ref
376
+ {
377
+ int retValue = 1 ;
378
+ NSString *output = [self outputInWorkdirForArguments: [NSArray arrayWithObjects: @" for-each-ref" , [ref ref ], nil ] retValue: &retValue];
379
+ if (retValue || [output isEqualToString: @" " ])
380
+ return NO ;
381
+ return YES ;
382
+ }
284
383
285
384
// Returns either this object, or an existing, equal object
286
385
- (PBGitRevSpecifier*) addBranch : (PBGitRevSpecifier*) rev
0 commit comments