From: Nathan Kinsinger <[email protected]>
---
PBGitRepository.h | 10 +++++
PBGitRepository.m | 99 +++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 109 insertions(+), 0 deletions(-)
diff --git a/PBGitRepository.h b/PBGitRepository.h
index f6218df..5b49359 100644
--- a/PBGitRepository.h
+++ b/PBGitRepository.h
@@ -14,6 +14,7 @@
extern NSString* PBGitRepositoryErrorDomain;
@class PBGitWindowController;
+...@class PBGitCommit;
@interface PBGitRepository : NSDocument {
PBGitRevList* revisionList;
@@ -51,6 +52,15 @@ extern NSString* PBGitRepositoryErrorDomain;
- (void) addRef:(PBGitRef *)ref fromParameters:(NSArray *)params;
- (void) lazyReload;
- (PBGitRevSpecifier*) headRef;
+- (NSString *)headSHA;
+- (PBGitCommit *)headCommit;
+- (NSString *)shaForRef:(PBGitRef *)ref;
+- (PBGitCommit *)commitForRef:(PBGitRef *)ref;
+- (PBGitCommit *)commitForSHA:(NSString *)sha;
+- (BOOL)isSHAOnHeadBranch:(NSString *)testSHA;
+- (BOOL)isRefOnHeadBranch:(PBGitRef *)testRef;
+- (BOOL)checkRefFormat:(NSString *)refName;
+- (BOOL)refExists:(PBGitRef *)ref;
- (void) readCurrentBranch;
- (PBGitRevSpecifier*) addBranch: (PBGitRevSpecifier*) rev;
diff --git a/PBGitRepository.m b/PBGitRepository.m
index 23a3fb6..6af010b 100644
--- a/PBGitRepository.m
+++ b/PBGitRepository.m
@@ -291,6 +291,105 @@ - (PBGitRevSpecifier *)headRef
return _headRef;
}
+
+- (NSString *)headSHA
+{
+ return [self shaForRef:[[self headRef] ref]];
+}
+
+- (PBGitCommit *)headCommit
+{
+ return [self commitForSHA:[self headSHA]];
+}
+
+- (NSString *)shaForRef:(PBGitRef *)ref
+{
+ if (!ref)
+ return nil;
+
+ for (NSString *sha in refs)
+ for (PBGitRef *existingRef in [refs objectForKey:sha])
+ if ([existingRef isEqual:ref])
+ return sha;
+
+ int retValue = 1;
+ NSArray *args = [NSArray arrayWithObjects:@"rev-list", @"-1", [ref
ref], nil];
+ NSString *shaForRef = [self outputInWorkdirForArguments:args
retValue:&retValue];
+ if (retValue || [shaForRef isEqualToString:@""])
+ return nil;
+
+ return shaForRef;
+}
+
+- (PBGitCommit *)commitForRef:(PBGitRef *)ref
+{
+ if (!ref)
+ return nil;
+
+ return [self commitForSHA:[self shaForRef:ref]];
+}
+
+- (PBGitCommit *)commitForSHA:(NSString *)sha
+{
+ if (!sha)
+ return nil;
+ NSArray *revList = [self.revisionList.commits copy];
+
+ for (PBGitCommit *commit in revList)
+ if ([[commit realSha] isEqualToString:sha])
+ return commit;
+
+ return nil;
+}
+
+- (BOOL)isSHAOnHeadBranch:(NSString *)testSHA
+{
+ if (!testSHA)
+ return NO;
+
+ NSString *headSHA = [self headSHA];
+
+ if ([testSHA isEqualToString:headSHA])
+ return YES;
+
+ NSString *commitRange = [NSString stringWithFormat:@"%...@..%@",
testSHA, headSHA];
+ NSString *parentsOutput = [self outputForArguments:[NSArray
arrayWithObjects:@"rev-list", @"--parents", @"-1", commitRange, nil]];
+ if ([parentsOutput isEqualToString:@""]) {
+ return NO;
+ }
+
+ NSString *mergeSHA = [self outputForArguments:[NSArray
arrayWithObjects:@"merge-base", testSHA, headSHA, nil]];
+ if ([mergeSHA isEqualToString:testSHA] || [mergeSHA
isEqualToString:headSHA])
+ return YES;
+
+ return NO;
+}
+
+- (BOOL)isRefOnHeadBranch:(PBGitRef *)testRef
+{
+ if (!testRef)
+ return NO;
+
+ return [self isSHAOnHeadBranch:[self shaForRef:testRef]];
+}
+
+- (BOOL)checkRefFormat:(NSString *)refName
+{
+ int retValue = 1;
+ [self outputInWorkdirForArguments:[NSArray
arrayWithObjects:@"check-ref-format", refName, nil] retValue:&retValue];
+ if (retValue)
+ return NO;
+ return YES;
+}
+
+- (BOOL)refExists:(PBGitRef *)ref
+{
+ int retValue = 1;
+ NSString *output = [self outputInWorkdirForArguments:[NSArray
arrayWithObjects:@"for-each-ref", [ref ref], nil] retValue:&retValue];
+ if (retValue || [output isEqualToString:@""])
+ return NO;
+ return YES;
+}
// Returns either this object, or an existing, equal object
- (PBGitRevSpecifier*) addBranch: (PBGitRevSpecifier*) rev
--
1.7.0.3
To unsubscribe from this group, send email to gitx+unsubscribegooglegroups.com
or reply to this email with the words "REMOVE ME" as the subject.