mirror of
https://github.com/kennethreitz-archive/gitx.git
synced 2026-06-05 15:30:18 +00:00
a62e14ffe7
This wasn't used anyway. A good idea would be to create a new branchcontroller that takes care of all these revs, rather than letting PBGitRepository take care of that
292 lines
8.6 KiB
Objective-C
292 lines
8.6 KiB
Objective-C
//
|
|
// PBLabelController.m
|
|
// GitX
|
|
//
|
|
// Created by Pieter de Bie on 21-10-08.
|
|
// Copyright 2008 Pieter de Bie. All rights reserved.
|
|
//
|
|
|
|
#import "PBRefController.h"
|
|
#import "PBGitRevisionCell.h"
|
|
#import "PBRefMenuItem.h"
|
|
|
|
@implementation PBRefController
|
|
|
|
- (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;
|
|
[historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-d", [[sender ref] ref], nil] retValue: &ret];
|
|
if (ret) {
|
|
NSLog(@"Removing ref failed!");
|
|
return;
|
|
}
|
|
|
|
[[sender commit] removeRef:[sender ref]];
|
|
[commitController rearrangeObjects];
|
|
}
|
|
|
|
- (void) checkoutRef:(PBRefMenuItem *)sender
|
|
{
|
|
int ret = 1;
|
|
[historyController.repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"checkout", [[sender ref] shortName], nil] retValue: &ret];
|
|
if (ret) {
|
|
[[NSAlert alertWithMessageText:@"Checking out branch failed"
|
|
defaultButton:@"OK"
|
|
alternateButton:nil
|
|
otherButton:nil
|
|
informativeTextWithFormat:@"There was an error checking out the branch. Perhaps your working directory is not clean?"] runModal];
|
|
return;
|
|
}
|
|
[historyController.repository reloadRefs];
|
|
[commitController rearrangeObjects];
|
|
}
|
|
|
|
- (NSArray *) menuItemsForRef:(PBGitRef *)ref commit:(PBGitCommit *)commit
|
|
{
|
|
return [PBRefMenuItem defaultMenuItemsForRef:ref commit:commit target:self];
|
|
}
|
|
|
|
# pragma mark Tableview delegate methods
|
|
|
|
- (BOOL)tableView:(NSTableView *)tv writeRowsWithIndexes:(NSIndexSet *)rowIndexes toPasteboard:(NSPasteboard*)pboard
|
|
{
|
|
NSPoint location = [tv convertPointFromBase:[(PBCommitList *)tv mouseDownPoint]];
|
|
int row = [tv rowAtPoint:location];
|
|
int column = [tv columnAtPoint:location];
|
|
if (column != 0)
|
|
return NO;
|
|
|
|
PBGitRevisionCell *cell = (PBGitRevisionCell *)[tv preparedCellAtColumn:column row:row];
|
|
|
|
int index = [cell indexAtX:location.x];
|
|
|
|
if (index == -1)
|
|
return NO;
|
|
|
|
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[NSArray arrayWithObjects:[NSNumber numberWithInt:row], [NSNumber numberWithInt:index], NULL]];
|
|
[pboard declareTypes:[NSArray arrayWithObject:@"PBGitRef"] owner:self];
|
|
[pboard setData:data forType:@"PBGitRef"];
|
|
|
|
return YES;
|
|
}
|
|
|
|
- (NSDragOperation)tableView:(NSTableView*)tv
|
|
validateDrop:(id <NSDraggingInfo>)info
|
|
proposedRow:(int)row
|
|
proposedDropOperation:(NSTableViewDropOperation)operation
|
|
{
|
|
if (operation == NSTableViewDropAbove)
|
|
return NSDragOperationNone;
|
|
|
|
NSPasteboard *pboard = [info draggingPasteboard];
|
|
if ([pboard dataForType:@"PBGitRef"])
|
|
return NSDragOperationMove;
|
|
|
|
return NSDragOperationNone;
|
|
}
|
|
|
|
- (BOOL)tableView:(NSTableView *)aTableView
|
|
acceptDrop:(id <NSDraggingInfo>)info
|
|
row:(int)row
|
|
dropOperation:(NSTableViewDropOperation)operation
|
|
{
|
|
if (operation != NSTableViewDropOn)
|
|
return NO;
|
|
|
|
NSPasteboard *pboard = [info draggingPasteboard];
|
|
NSData *data = [pboard dataForType:@"PBGitRef"];
|
|
if (!data)
|
|
return NO;
|
|
|
|
NSArray *numbers = [NSKeyedUnarchiver unarchiveObjectWithData:data];
|
|
int oldRow = [[numbers objectAtIndex:0] intValue];
|
|
int oldRefIndex = [[numbers objectAtIndex:1] intValue];
|
|
PBGitCommit *oldCommit = [[commitController arrangedObjects] objectAtIndex: oldRow];
|
|
PBGitRef *ref = [[oldCommit refs] objectAtIndex:oldRefIndex];
|
|
|
|
PBGitCommit *dropCommit = [[commitController arrangedObjects] objectAtIndex:row];
|
|
|
|
int a = [[NSAlert alertWithMessageText:@"Change branch"
|
|
defaultButton:@"Change"
|
|
alternateButton:@"Cancel"
|
|
otherButton:nil
|
|
informativeTextWithFormat:@"Do you want to change branch\n\n\t'%@'\n\n to point to commit\n\n\t'%@'", [ref shortName], [dropCommit subject]] runModal];
|
|
if (a != NSAlertDefaultReturn)
|
|
return NO;
|
|
|
|
int retValue = 1;
|
|
[historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-mUpdate from GitX", [ref ref], [dropCommit sha], NULL] retValue:&retValue];
|
|
if (retValue)
|
|
return NO;
|
|
|
|
[dropCommit addRef:ref];
|
|
[oldCommit removeRef:ref];
|
|
|
|
[commitController rearrangeObjects];
|
|
[aTableView needsToDrawRect:[aTableView rectOfRow:oldRow]];
|
|
return YES;
|
|
}
|
|
|
|
# pragma mark Add ref methods
|
|
-(void)addRef:(id)sender
|
|
{
|
|
[NSApp beginSheet:newBranchSheet
|
|
modalForWindow:[[historyController view] window]
|
|
modalDelegate:NULL
|
|
didEndSelector:NULL
|
|
contextInfo:NULL];
|
|
}
|
|
|
|
-(void)saveSheet:(id) sender
|
|
{
|
|
NSString *branchName = [@"refs/heads/" stringByAppendingString:[newBranchName stringValue]];
|
|
[self closeSheet:sender];
|
|
|
|
if ([[commitController selectedObjects] count] == 0)
|
|
return;
|
|
|
|
PBGitCommit *commit = [[commitController selectedObjects] objectAtIndex:0];
|
|
int retValue = 1;
|
|
[historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-mCreate branch from GitX", branchName, [commit sha], NULL] retValue:&retValue];
|
|
if (retValue)
|
|
{
|
|
NSLog(@"Creating ref failed!");
|
|
return;
|
|
}
|
|
|
|
[commit addRef:[PBGitRef refFromString:branchName]];
|
|
[commitController rearrangeObjects];
|
|
}
|
|
|
|
-(void)closeSheet:(id) sender
|
|
{
|
|
[NSApp endSheet:newBranchSheet];
|
|
[newBranchName setStringValue:@""];
|
|
[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.currentBranch = rev;
|
|
[branchPopUp setTitle:[sender title]];
|
|
}
|
|
@end
|