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.
This commit is contained in:
Nathan Kinsinger
2010-03-13 11:30:13 -07:00
parent 4a8c524692
commit 46b6057ce1
3 changed files with 30 additions and 22 deletions
+1 -11
View File
@@ -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
+1
View File
@@ -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;
+28 -11
View File
@@ -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