diff --git a/PBGitCommit.m b/PBGitCommit.m index 28abcda..a9b3b15 100644 --- a/PBGitCommit.m +++ b/PBGitCommit.m @@ -89,17 +89,7 @@ NSString * const kGitXCommitType = @"commit"; if ([otherSHA isEqualToString:mySHA]) return YES; - NSString *commitRange = [NSString stringWithFormat:@"%@..%@", mySHA, otherSHA]; - NSString *parentsOutput = [repository outputForArguments:[NSArray arrayWithObjects:@"rev-list", @"--parents", @"-1", commitRange, nil]]; - if ([parentsOutput isEqualToString:@""]) { - return NO; - } - - NSString *mergeSHA = [repository outputForArguments:[NSArray arrayWithObjects:@"merge-base", mySHA, otherSHA, nil]]; - if ([mergeSHA isEqualToString:mySHA] || [mergeSHA isEqualToString:otherSHA]) - return YES; - - return NO; + return [repository isOnSameBranch:otherSHA asSHA:mySHA]; } - (BOOL) isOnHeadBranch diff --git a/PBGitRepository.h b/PBGitRepository.h index 3bd61bf..4ef3dac 100644 --- a/PBGitRepository.h +++ b/PBGitRepository.h @@ -80,6 +80,7 @@ enum branchFilterTypes { - (NSString *) shaForRef:(PBGitRef *)ref; - (PBGitCommit *) commitForRef:(PBGitRef *)ref; - (PBGitCommit *) commitForSHA:(NSString *)sha; +- (BOOL) isOnSameBranch:(NSString *)baseSHA asSHA:(NSString *)testSHA; - (BOOL) isSHAOnHeadBranch:(NSString *)testSHA; - (BOOL) isRefOnHeadBranch:(PBGitRef *)testRef; - (BOOL) checkRefFormat:(NSString *)refName; diff --git a/PBGitRepository.m b/PBGitRepository.m index f7503de..efc5600 100644 --- a/PBGitRepository.m +++ b/PBGitRepository.m @@ -340,6 +340,33 @@ NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain"; return nil; } +- (BOOL) isOnSameBranch:(NSString *)branchSHA asSHA:(NSString *)testSHA +{ + if (!branchSHA || !testSHA) + return NO; + + if ([testSHA isEqualToString:branchSHA]) + return YES; + + NSArray *revList = revisionList.projectCommits; + + NSMutableSet *searchSHAs = [NSMutableSet setWithObject:branchSHA]; + + for (PBGitCommit *commit in revList) { + NSString *commitSHA = [commit realSha]; + if ([searchSHAs containsObject:commitSHA]) { + if ([testSHA isEqualToString:commitSHA]) + return YES; + [searchSHAs removeObject:commitSHA]; + [searchSHAs addObjectsFromArray:commit.parents]; + } + else if ([testSHA isEqualToString:commitSHA]) + return NO; + } + + return NO; +} + - (BOOL) isSHAOnHeadBranch:(NSString *)testSHA { if (!testSHA) @@ -350,17 +377,7 @@ NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain"; 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; + return [self isOnSameBranch:headSHA asSHA:testSHA]; } - (BOOL) isRefOnHeadBranch:(PBGitRef *)testRef