diff --git a/PBGitHistoryView.xib b/PBGitHistoryView.xib
index 582b57f..4ba3274 100644
--- a/PBGitHistoryView.xib
+++ b/PBGitHistoryView.xib
@@ -8,8 +8,8 @@
352.00
198
-
-
-
- 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