diff --git a/PBGitHistoryView.xib b/PBGitHistoryView.xib index 582b57f..4ba3274 100644 --- a/PBGitHistoryView.xib +++ b/PBGitHistoryView.xib @@ -8,8 +8,8 @@ 352.00 YES - + YES @@ -1847,39 +1847,6 @@ 198 - - - contentValues: arrangedObjects.description - - - - - - contentValues: arrangedObjects.description - contentValues - arrangedObjects.description - 2 - - - 199 - - - - selectedIndex: selectionIndex - - - - - - selectedIndex: selectionIndex - selectedIndex - selectionIndex - - 2 - - - 203 - predicate: filterPredicate @@ -2109,8 +2076,8 @@ YES - - + + 2 @@ -2118,6 +2085,14 @@ 266 + + + branchPopUp + + + + 268 + @@ -2895,7 +2870,7 @@ {{521, 707}, {346, 133}} com.apple.InterfaceBuilder.CocoaPlugin {{521, 707}, {346, 133}} - + {3.40282e+38, 3.40282e+38} com.apple.InterfaceBuilder.CocoaPlugin com.apple.InterfaceBuilder.CocoaPlugin @@ -2978,7 +2953,7 @@ - 266 + 268 @@ -3131,6 +3106,7 @@ YES YES + branchPopUp commitController commitList historyController @@ -3139,6 +3115,7 @@ YES + NSPopUpButton NSArrayController PBCommitList PBGitHistoryController diff --git a/PBGitRepository.m b/PBGitRepository.m index fb8079b..1a12135 100644 --- a/PBGitRepository.m +++ b/PBGitRepository.m @@ -210,9 +210,8 @@ NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain"; // First do the ref matching. If this ref is new, add it to our ref list PBGitRef *newRef = [PBGitRef refFromString:[components objectAtIndex:0]]; PBGitRevSpecifier* revSpec = [[PBGitRevSpecifier alloc] initWithRef:newRef]; - if ([[newRef type] isEqualToString:@"head"] || [[newRef type] isEqualToString:@"remote"]) - if ([self addBranch:revSpec] != revSpec) - ret = YES; + if ([self addBranch:revSpec] != revSpec) + ret = YES; // Also add this ref to the refs list [self addRef:newRef fromParameters:components]; diff --git a/PBRefController.h b/PBRefController.h index 3b844a3..880ad19 100644 --- a/PBRefController.h +++ b/PBRefController.h @@ -20,6 +20,8 @@ IBOutlet NSWindow *newBranchSheet; IBOutlet NSTextField *newBranchName; + + IBOutlet NSPopUpButton *branchPopUp; } - (IBAction)addRef:(id)sender; diff --git a/PBRefController.m b/PBRefController.m index 41e9857..14930d3 100644 --- a/PBRefController.m +++ b/PBRefController.m @@ -15,8 +15,20 @@ - (void)awakeFromNib { [commitList registerForDraggedTypes:[NSArray arrayWithObject:@"PBGitRef"]]; + [self observeValueForKeyPath:@"repository.branches" ofObject:historyController change:NULL context:@"branchChange"]; } +- (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(id)context +{ + if ([context isEqualToString: @"branchChange"]) { + [self updateBranchMenu]; + } + else { + [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; + } +} + + - (void) removeRef:(PBRefMenuItem *) sender { int ret = 1; @@ -170,4 +182,110 @@ [newBranchSheet orderOut:self]; } +# pragma mark Branches menu + +- (void) updateBranchMenu +{ + NSLog(@"Updating branch"); + if (!branchPopUp) + return; + + NSMutableArray *localBranches = [NSMutableArray array]; + NSMutableArray *remoteBranches = [NSMutableArray array]; + NSMutableArray *tags = [NSMutableArray array]; + NSMutableArray *other = [NSMutableArray array]; + + NSMenu *menu = [[NSMenu alloc] initWithTitle:@"Branch menu"]; + for (PBGitRevSpecifier *rev in historyController.repository.branches) + { + if (![rev isSimpleRef]) + { + [other addObject:rev]; + continue; + } + + NSString *ref = [rev simpleRef]; + + if ([ref hasPrefix:@"refs/heads"]) + [localBranches addObject:rev]; + else if ([ref hasPrefix:@"refs/tags"]) + [tags addObject:rev]; + else if ([ref hasPrefix:@"refs/remote"]) + [remoteBranches addObject:rev]; + } + + for (PBGitRevSpecifier *rev in localBranches) + { + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[rev description] action:@selector(changeBranch:) keyEquivalent:@""]; + [item setRepresentedObject:rev]; + [item setTarget:self]; + [menu addItem:item]; + } + + [menu addItem:[NSMenuItem separatorItem]]; + + // Remotes + NSMenu *remoteMenu = [[NSMenu alloc] initWithTitle:@"Remotes"]; + NSMenu *currentMenu = NULL; + for (PBGitRevSpecifier *rev in remoteBranches) + { + NSString *ref = [rev simpleRef]; + NSArray *components = [ref componentsSeparatedByString:@"/"]; + + NSString *remoteName = [components objectAtIndex:2]; + NSString *branchName = [[components subarrayWithRange:NSMakeRange(3, [components count] - 3)] componentsJoinedByString:@"/"]; + + if (![[currentMenu title] isEqualToString:remoteName]) + { + currentMenu = [[NSMenu alloc] initWithTitle:remoteName]; + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:remoteName action:NULL keyEquivalent:@""]; + [item setSubmenu:currentMenu]; + [remoteMenu addItem:item]; + } + + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:branchName action:@selector(changeBranch:) keyEquivalent:@""]; + [item setTarget:self]; + [item setRepresentedObject:rev]; + [currentMenu addItem:item]; + } + + NSMenuItem *remoteItem = [[NSMenuItem alloc] initWithTitle:@"Remotes" action:NULL keyEquivalent:@""]; + [remoteItem setSubmenu:remoteMenu]; + [menu addItem:remoteItem]; + + // Tags + NSMenu *tagMenu = [[NSMenu alloc] initWithTitle:@"Tags"]; + for (PBGitRevSpecifier *rev in tags) + { + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[rev description] action:@selector(changeBranch:) keyEquivalent:@""]; + [item setTarget:self]; + [item setRepresentedObject:rev]; + [tagMenu addItem:item]; + } + + NSMenuItem *tagItem = [[NSMenuItem alloc] initWithTitle:@"Tags" action:NULL keyEquivalent:@""]; + [tagItem setSubmenu:tagMenu]; + [menu addItem:tagItem]; + + + // Others + [menu addItem:[NSMenuItem separatorItem]]; + + for (PBGitRevSpecifier *rev in other) + { + NSMenuItem *item = [[NSMenuItem alloc] initWithTitle:[rev description] action:@selector(changeBranch:) keyEquivalent:@""]; + [item setRepresentedObject:rev]; + [item setTarget:self]; + [menu addItem:item]; + } + + [[branchPopUp cell] setMenu: menu]; +} + +- (void) changeBranch:(NSMenuItem *)sender +{ + PBGitRevSpecifier *rev = [sender representedObject]; + [historyController.repository selectBranch:rev]; + [branchPopUp selectItem:nil]; +} @end