Skip to content

Commit b61028a

Browse files
committed
Add support methods needed for future commits.
PBGitCommit PBGitRevSpecifier PBGitRepository
1 parent 39def32 commit b61028a

6 files changed

+188
-4
lines changed

PBGitCommit.h

+5
Original file line numberDiff line numberDiff line change
@@ -26,19 +26,24 @@ extern NSString * const kGitXCommitType;
2626
NSString* details;
2727
NSString *_patch;
2828
NSArray* parents;
29+
NSString *realSHA;
2930

3031
int timestamp;
3132
char sign;
3233
id lineInfo;
3334
PBGitRepository* repository;
3435
}
3536

37+
+ commitWithRepository:(PBGitRepository*)repo andSha:(git_oid)newSha;
3638
- initWithRepository:(PBGitRepository *)repo andSha:(git_oid)sha;
3739

3840
- (void)addRef:(PBGitRef *)ref;
3941
- (void)removeRef:(id)ref;
42+
- (BOOL) hasRef:(PBGitRef *)ref;
4043

4144
- (NSString *)realSha;
45+
- (BOOL) isOnSameBranchAs:(PBGitCommit *)other;
46+
- (BOOL) isOnHeadBranch;
4247

4348
// <PBGitRefish>
4449
- (NSString *) refishName;

PBGitCommit.m

+53-4
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,11 @@ - (git_oid *)sha
5454
return &sha;
5555
}
5656

57+
+ commitWithRepository:(PBGitRepository*)repo andSha:(git_oid)newSha
58+
{
59+
return [[[self alloc] initWithRepository:repo andSha:newSha] autorelease];
60+
}
61+
5762
- initWithRepository:(PBGitRepository*) repo andSha:(git_oid)newSha
5863
{
5964
details = nil;
@@ -64,10 +69,42 @@ - (git_oid *)sha
6469

6570
- (NSString *)realSha
6671
{
67-
char *hex = git_oid_mkhex(&sha);
68-
NSString *str = [NSString stringWithUTF8String:hex];
69-
free(hex);
70-
return str;
72+
if (!realSHA) {
73+
char *hex = git_oid_mkhex(&sha);
74+
realSHA = [NSString stringWithUTF8String:hex];
75+
free(hex);
76+
}
77+
78+
return realSHA;
79+
}
80+
81+
- (BOOL) isOnSameBranchAs:(PBGitCommit *)other
82+
{
83+
if (!other)
84+
return NO;
85+
86+
NSString *mySHA = [self realSha];
87+
NSString *otherSHA = [other realSha];
88+
89+
if ([otherSHA isEqualToString:mySHA])
90+
return YES;
91+
92+
NSString *commitRange = [NSString stringWithFormat:@"%@..%@", mySHA, otherSHA];
93+
NSString *parentsOutput = [repository outputForArguments:[NSArray arrayWithObjects:@"rev-list", @"--parents", @"-1", commitRange, nil]];
94+
if ([parentsOutput isEqualToString:@""]) {
95+
return NO;
96+
}
97+
98+
NSString *mergeSHA = [repository outputForArguments:[NSArray arrayWithObjects:@"merge-base", mySHA, otherSHA, nil]];
99+
if ([mergeSHA isEqualToString:mySHA] || [mergeSHA isEqualToString:otherSHA])
100+
return YES;
101+
102+
return NO;
103+
}
104+
105+
- (BOOL) isOnHeadBranch
106+
{
107+
return [self isOnSameBranchAs:[repository headCommit]];
71108
}
72109

73110
// FIXME: Remove this method once it's unused.
@@ -108,6 +145,18 @@ - (void)removeRef:(id)ref
108145
[self.refs removeObject:ref];
109146
}
110147

148+
- (BOOL) hasRef:(PBGitRef *)ref
149+
{
150+
if (!self.refs)
151+
return NO;
152+
153+
for (PBGitRef *existingRef in self.refs)
154+
if ([existingRef isEqualToRef:ref])
155+
return YES;
156+
157+
return NO;
158+
}
159+
111160
- (NSMutableArray *)refs
112161
{
113162
return [[repository refs] objectForKey:[self realSha]];

PBGitRepository.h

+10
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
extern NSString* PBGitRepositoryErrorDomain;
1515

1616
@class PBGitWindowController;
17+
@class PBGitCommit;
1718

1819
@interface PBGitRepository : NSDocument {
1920
PBGitRevList* revisionList;
@@ -51,6 +52,15 @@ extern NSString* PBGitRepositoryErrorDomain;
5152
- (void) addRef:(PBGitRef *)ref fromParameters:(NSArray *)params;
5253
- (void) lazyReload;
5354
- (PBGitRevSpecifier*) headRef;
55+
- (NSString *) headSHA;
56+
- (PBGitCommit *) headCommit;
57+
- (NSString *) shaForRef:(PBGitRef *)ref;
58+
- (PBGitCommit *) commitForRef:(PBGitRef *)ref;
59+
- (PBGitCommit *) commitForSHA:(NSString *)sha;
60+
- (BOOL) isSHAOnHeadBranch:(NSString *)testSHA;
61+
- (BOOL) isRefOnHeadBranch:(PBGitRef *)testRef;
62+
- (BOOL) checkRefFormat:(NSString *)refName;
63+
- (BOOL) refExists:(PBGitRef *)ref;
5464

5565
- (void) readCurrentBranch;
5666
- (PBGitRevSpecifier*) addBranch: (PBGitRevSpecifier*) rev;

PBGitRepository.m

+99
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,105 @@ - (PBGitRevSpecifier *)headRef
281281

282282
return _headRef;
283283
}
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+
}
284383

285384
// Returns either this object, or an existing, equal object
286385
- (PBGitRevSpecifier*) addBranch: (PBGitRevSpecifier*) rev

PBGitRevSpecifier.h

+3
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,13 @@
2020

2121
- (BOOL) isSimpleRef;
2222
- (NSString*) simpleRef;
23+
- (PBGitRef *) ref;
2324
- (BOOL) hasPathLimiter;
2425
- (BOOL) hasLeftRight;
2526

2627
- (BOOL) isEqualTo: (PBGitRevSpecifier*) other;
28+
- (BOOL) isAllBranchesRev;
29+
- (BOOL) isLocalBranchesRev;
2730

2831
+ (PBGitRevSpecifier *)allBranchesRevSpec;
2932
+ (PBGitRevSpecifier *)localBranchesRevSpec;

PBGitRevSpecifier.m

+18
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,14 @@ - (NSString*) simpleRef
5959
return [parameters objectAtIndex:0];
6060
}
6161

62+
- (PBGitRef *) ref
63+
{
64+
if (![self isSimpleRef])
65+
return nil;
66+
67+
return [PBGitRef refFromString:[self simpleRef]];
68+
}
69+
6270
- (NSString*) description
6371
{
6472
if (description)
@@ -95,6 +103,16 @@ - (BOOL) isEqualTo: (PBGitRevSpecifier*) other
95103
(!description || [description isEqualToString:other.description]));
96104
}
97105

106+
- (BOOL) isAllBranchesRev
107+
{
108+
return [self isEqualTo:[PBGitRevSpecifier allBranchesRevSpec]];
109+
}
110+
111+
- (BOOL) isLocalBranchesRev
112+
{
113+
return [self isEqualTo:[PBGitRevSpecifier localBranchesRevSpec]];
114+
}
115+
98116
- (void) encodeWithCoder:(NSCoder *)coder
99117
{
100118
[coder encodeObject:description forKey:@"Description"];

0 commit comments

Comments
 (0)