From 7eec230959b6572bb72c0e5eb356fa1848a8c4e8 Mon Sep 17 00:00:00 2001 From: Nathan Kinsinger Date: Sat, 6 Feb 2010 12:55:51 -0700 Subject: [PATCH] Add Rebase to the contextual menu for commits and refs --- PBGitRepository.h | 1 + PBGitRepository.m | 26 ++++++++++++++++++++++++++ PBRefController.h | 1 + PBRefController.m | 11 +++++++++++ PBRefMenuItem.m | 8 ++++++++ 5 files changed, 47 insertions(+) diff --git a/PBGitRepository.h b/PBGitRepository.h index c4e25c4..7b8c9c5 100644 --- a/PBGitRepository.h +++ b/PBGitRepository.h @@ -33,6 +33,7 @@ extern NSString* PBGitRepositoryErrorDomain; - (BOOL) checkoutFiles:(NSArray *)files fromRefish:(id )ref; - (BOOL) mergeWithRefish:(id )ref; - (BOOL) cherryPickRefish:(id )ref; +- (BOOL) rebaseBranch:(id )branch onRefish:(id )upstream; - (BOOL) createBranch:(NSString *)branchName atRefish:(id )ref; - (BOOL) createTag:(NSString *)tagName message:(NSString *)message atRefish:(id )commitSHA; - (BOOL) deleteRef:(PBGitRef *)ref; diff --git a/PBGitRepository.m b/PBGitRepository.m index 675508b..ed95618 100644 --- a/PBGitRepository.m +++ b/PBGitRepository.m @@ -515,6 +515,32 @@ NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain"; return YES; } +- (BOOL) rebaseBranch:(id )branch onRefish:(id )upstream +{ + if (!upstream) + return NO; + + NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"rebase", [upstream refishName], nil]; + + if (branch) + [arguments addObject:[branch refishName]]; + + int retValue = 1; + NSString *output = [self outputInWorkdirForArguments:arguments retValue:&retValue]; + if (retValue) { + NSString *branchName = @"HEAD"; + if (branch) + branchName = [NSString stringWithFormat:@"%@ '%@'", [branch refishType], [branch shortName]]; + NSString *message = [NSString stringWithFormat:@"There was an error rebasing %@ with %@ '%@'.", branchName, [upstream refishType], [upstream shortName]]; + [self.windowController showErrorSheetTitle:@"Rebase failed!" message:message arguments:arguments output:output]; + return NO; + } + + [self reloadRefs]; + [self readCurrentBranch]; + return YES; +} + - (BOOL) createBranch:(NSString *)branchName atRefish:(id )ref { if (!branchName || !ref) diff --git a/PBRefController.h b/PBRefController.h index 0625759..21aab77 100644 --- a/PBRefController.h +++ b/PBRefController.h @@ -26,6 +26,7 @@ - (void) checkout:(PBRefMenuItem *)sender; - (void) merge:(PBRefMenuItem *)sender; - (void) cherryPick:(PBRefMenuItem *)sender; +- (void) rebaseHeadBranch:(PBRefMenuItem *)sender; - (void) createBranch:(PBRefMenuItem *)sender; - (void) copySHA:(PBRefMenuItem *)sender; - (void) copyPatch:(PBRefMenuItem *)sender; diff --git a/PBRefController.m b/PBRefController.m index f98e320..d4cd50e 100644 --- a/PBRefController.m +++ b/PBRefController.m @@ -66,6 +66,17 @@ } +#pragma mark Rebase + +- (void) rebaseHeadBranch:(PBRefMenuItem *)sender +{ + id refish = [sender refish]; + PBGitRef *headRef = [[historyController.repository headRef] ref]; + + [historyController.repository rebaseBranch:headRef onRefish:refish]; +} + + #pragma mark Create Branch - (void) createBranch:(PBRefMenuItem *)sender diff --git a/PBRefMenuItem.m b/PBRefMenuItem.m index cecba01..376a8cb 100644 --- a/PBRefMenuItem.m +++ b/PBRefMenuItem.m @@ -66,6 +66,10 @@ NSString *mergeTitle = isOnHeadBranch ? @"Merge" : [NSString stringWithFormat:@"Merge %@ into %@", targetRefName, headRefName]; [items addObject:[PBRefMenuItem itemWithTitle:mergeTitle action:@selector(merge:) enabled:!isOnHeadBranch]]; + // rebase + NSString *rebaseTitle = isOnHeadBranch ? @"Rebase" : [NSString stringWithFormat:@"Rebase %@ on %@", headRefName, targetRefName]; + [items addObject:[PBRefMenuItem itemWithTitle:rebaseTitle action:@selector(rebaseHeadBranch:) enabled:!isOnHeadBranch]]; + // delete ref [items addObject:[PBRefMenuItem separatorItem]]; NSString *deleteTitle = [NSString stringWithFormat:@"Delete %@…", targetRefName]; @@ -106,6 +110,10 @@ NSString *cherryPickTitle = isOnHeadBranch ? @"Cherry pick commit" : [NSString stringWithFormat:@"Cherry pick commit to %@", headBranchName]; [items addObject:[PBRefMenuItem itemWithTitle:cherryPickTitle action:@selector(cherryPick:) enabled:!isOnHeadBranch]]; + // rebase + NSString *rebaseTitle = isOnHeadBranch ? @"Rebase commit" : [NSString stringWithFormat:@"Rebase %@ on commit", headBranchName]; + [items addObject:[PBRefMenuItem itemWithTitle:rebaseTitle action:@selector(rebaseHeadBranch:) enabled:!isOnHeadBranch]]; + for (PBRefMenuItem *item in items) { [item setTarget:target]; [item setRefish:commit];