From 46b6057ce1434bc27a47b5f8da5859eeeefe7719 Mon Sep 17 00:00:00 2001 From: Nathan Kinsinger Date: Sat, 13 Mar 2010 11:30:13 -0700 Subject: [PATCH] Speed up commit's isOnSameBranch Use the cached commit list to avoid asking git for the info. This is used to update GUI buttons and when opening the contextual menu so making it fast is important. It wasn't possible before because we weren't storing all the commits. --- PBGitCommit.m | 12 +----------- PBGitRepository.h | 1 + PBGitRepository.m | 39 ++++++++++++++++++++++++++++----------- 3 files changed, 30 insertions(+), 22 deletions(-) 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