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.

Reply via email to