Skip to content

Commit

Permalink
Merge branch 'revlist'
Browse files Browse the repository at this point in the history
  • Loading branch information
rowanj committed Jul 27, 2014
2 parents 8b77cde + d1fa3a0 commit 4059472
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 27 deletions.
73 changes: 48 additions & 25 deletions Classes/git/PBGitRevList.mm
Original file line number Diff line number Diff line change
Expand Up @@ -118,33 +118,56 @@ - (void) beginWalkWithSpecifier:(PBGitRevSpecifier*)rev
[self addCommitsFromEnumerator:enu inPBRepo:pbRepo];
}

- (void) addGitObject:(GTObject *)obj toCommitSet:(NSMutableSet *)set
{
GTCommit *commit = nil;
if ([obj isKindOfClass:[GTCommit class]]) {
commit = (GTCommit *)obj;
} else {
NSError *peelError = nil;
commit = [obj objectByPeelingToType:GTObjectTypeCommit error:&peelError];
}

NSAssert(commit, @"Can't add nil commit to set");

for (GTCommit *item in set) {
if ([item.OID isEqual:commit.OID]) {
return;
}
}

[set addObject:commit];
}

- (void) addGitBranches:(NSArray *)branches fromRepo:(GTRepository *)repo toCommitSet:(NSMutableSet *)set
{
for (GTBranch *branch in branches) {
NSError *objectLookupError = nil;
GTObject *gtObject = [repo lookUpObjectBySHA:branch.SHA error:&objectLookupError];
[self addGitObject:gtObject toCommitSet:set];
}
}

- (void) setupEnumerator:(GTEnumerator*)enumerator
forRevspec:(PBGitRevSpecifier*)rev
{
NSError *error = nil;
GTRepository *repo = enumerator.repository;
// [enumerator resetWithOptions:GTEnumeratorOptionsTimeSort];
[enumerator resetWithOptions:GTEnumeratorOptionsTopologicalSort];
NSMutableArray *enumBranches = [NSMutableArray new];
NSMutableArray *enumTagCommits = [NSMutableArray new];
NSMutableSet *enumCommits = [NSMutableSet new];
if (rev.isSimpleRef) {
GTObject *object = [repo lookUpObjectByRevParse:rev.simpleRef error:&error];
if ([object isKindOfClass:[GTCommit class]]) {
[enumerator pushSHA:object.SHA error:&error];
}
[self addGitObject:object toCommitSet:enumCommits];
} else {
NSArray *allRefs = [repo referenceNamesWithError:&error];
for (NSString *param in rev.parameters) {
if ([param isEqualToString:@"--branches"]) {
NSArray *branches = [repo localBranchesWithError:&error];
for (GTBranch *branch in branches) {
[enumBranches addObject:branch];
}
[self addGitBranches:branches fromRepo:repo toCommitSet:enumCommits];
} else if ([param isEqualToString:@"--remotes"]) {
NSArray *branches = [repo remoteBranchesWithError:&error];
for (GTBranch *branch in branches) {
[enumBranches addObject:branch];
}
[self addGitBranches:branches fromRepo:repo toCommitSet:enumCommits];
} else if ([param isEqualToString:@"--tags"]) {
for (NSString *ref in allRefs) {
if ([ref hasPrefix:@"refs/tags/"]) {
Expand All @@ -159,27 +182,25 @@ - (void) setupEnumerator:(GTEnumerator*)enumerator

if ([commit isKindOfClass:[GTCommit class]])
{
[enumTagCommits addObject:commit];
[self addGitObject:commit toCommitSet:enumCommits];
}
}
}
} else if ([param hasPrefix:@"--glob="]) {
[enumerator pushGlob:[param substringFromIndex:@"--glob=".length] error:&error];
} else {
[enumerator pushGlob:param error:&error];
NSError *lookupError = nil;
GTObject *obj = [repo lookUpObjectByRevParse:param error:&lookupError];
if (obj && !lookupError) {
[self addGitObject:obj toCommitSet:enumCommits];
} else {
[enumerator pushGlob:param error:&error];
}
}
}
}

NSMutableArray *branchAndTagCommits = [NSMutableArray arrayWithArray:enumTagCommits];
for (GTBranch *branch in enumBranches) {
NSError *objectLookupError = nil;
GTObject *gtObject = [repo lookUpObjectBySHA:branch.SHA error:&objectLookupError];
if ([gtObject isKindOfClass:[GTCommit class]]) {
[branchAndTagCommits addObject:gtObject];
}
}
NSArray *sortedBranchesAndTags = [branchAndTagCommits sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
NSArray *sortedBranchesAndTags = [[enumCommits allObjects] sortedArrayWithOptions:NSSortStable usingComparator:^NSComparisonResult(id obj1, id obj2) {
GTCommit *branchCommit1 = obj1;
GTCommit *branchCommit2 = obj2;

Expand All @@ -197,10 +218,9 @@ - (void) setupEnumerator:(GTEnumerator*)enumerator
- (void) addCommitsFromEnumerator:(GTEnumerator *)enumerator
inPBRepo:(PBGitRepository*)pbRepo;
{
NSError *error = nil;
PBGitGrapher *g = [[PBGitGrapher alloc] initWithRepository:pbRepo];
__block NSDate *lastUpdate = [NSDate date];

dispatch_queue_t loadQueue = dispatch_queue_create("net.phere.gitx.loadQueue", 0);
dispatch_queue_t decorateQueue = dispatch_queue_create("net.phere.gitx.decorateQueue", 0);
dispatch_group_t loadGroup = dispatch_group_create();
Expand All @@ -210,7 +230,8 @@ - (void) addCommitsFromEnumerator:(GTEnumerator *)enumerator
GTCommit *commit = nil;
__block int num = 0;
__block NSMutableArray *revisions = [NSMutableArray array];
while ((commit = [enumerator nextObjectWithSuccess:&enumSuccess error:&error]) && enumSuccess) {
NSError *enumError = nil;
while ((commit = [enumerator nextObjectWithSuccess:&enumSuccess error:&enumError]) && enumSuccess) {
//GTOID *oid = [[GTOID alloc] initWithSHA:commit.sha];

dispatch_group_async(loadGroup, loadQueue, ^{
Expand Down Expand Up @@ -242,6 +263,8 @@ - (void) addCommitsFromEnumerator:(GTEnumerator *)enumerator
}
});
}

NSAssert(!enumError, @"Error enumerating commits");

dispatch_group_wait(loadGroup, DISPATCH_TIME_FOREVER);
dispatch_group_wait(decorateGroup, DISPATCH_TIME_FOREVER);
Expand Down
4 changes: 2 additions & 2 deletions Classes/git/PBGitRevSpecifier.m
Original file line number Diff line number Diff line change
Expand Up @@ -56,12 +56,12 @@ - (id) initWithCoder:(NSCoder *)coder
+ (PBGitRevSpecifier *)allBranchesRevSpec
{
// Using --all here would include refs like refs/notes/commits, which probably isn't what we want.
return [[PBGitRevSpecifier alloc] initWithParameters:[NSArray arrayWithObjects:@"--branches", @"--remotes", @"--tags", @"--glob=refs/stash*", nil] description:@"All branches"];
return [[PBGitRevSpecifier alloc] initWithParameters:@[@"--branches", @"--remotes", @"--tags", @"--glob=refs/stash*", @"HEAD"] description:@"All branches"];
}

+ (PBGitRevSpecifier *)localBranchesRevSpec
{
return [[PBGitRevSpecifier alloc] initWithParameters:[NSArray arrayWithObject:@"--branches"] description:@"Local branches"];
return [[PBGitRevSpecifier alloc] initWithParameters:@[@"--branches", @"HEAD"] description:@"Local branches"];
}

- (NSString*) simpleRef
Expand Down

0 comments on commit 4059472

Please sign in to comment.