diff --git a/PBGitRepository.h b/PBGitRepository.h index d60fca4..8433ff7 100644 --- a/PBGitRepository.h +++ b/PBGitRepository.h @@ -29,6 +29,7 @@ extern NSString* PBGitRepositoryErrorDomain; PBGitRevSpecifier *_headRef; // Caching } +- (void) beginFetchFromRemoteForRef:(PBGitRef *)ref; - (BOOL) checkoutRefish:(id )ref; - (BOOL) checkoutFiles:(NSArray *)files fromRefish:(id )ref; - (BOOL) mergeWithRefish:(id )ref; diff --git a/PBGitRepository.m b/PBGitRepository.m index 13f8a06..821b855 100644 --- a/PBGitRepository.m +++ b/PBGitRepository.m @@ -15,6 +15,7 @@ #import "PBEasyPipe.h" #import "PBGitRef.h" #import "PBGitRevSpecifier.h" +#import "PBRemoteProgressSheet.h" NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain"; @@ -482,6 +483,27 @@ NSString* PBGitRepositoryErrorDomain = @"GitXErrorDomain"; #pragma mark Repository commands +- (void) beginFetchFromRemoteForRef:(PBGitRef *)ref +{ + NSMutableArray *arguments = [NSMutableArray arrayWithObject:@"fetch"]; + + if (![ref isRemote]) { + NSError *error = nil; + ref = [self remoteRefForBranch:ref error:&error]; + if (!ref) { + if (error) + [self.windowController showErrorSheet:error]; + return; + } + } + NSString *remoteName = [ref remoteName]; + [arguments addObject:remoteName]; + + NSString *description = [NSString stringWithFormat:@"Fetching all tracking branches from %@", remoteName]; + NSString *title = @"Fetching from remote"; + [PBRemoteProgressSheet beginRemoteProgressSheetForArguments:arguments title:title description:description inRepository:self]; +} + - (BOOL) checkoutRefish:(id )ref { NSString *refName = nil; diff --git a/PBRefController.h b/PBRefController.h index 21aab77..c4eee08 100644 --- a/PBRefController.h +++ b/PBRefController.h @@ -23,6 +23,8 @@ IBOutlet NSPopUpButton *branchPopUp; } +- (void) fetchRemote:(PBRefMenuItem *)sender; + - (void) checkout:(PBRefMenuItem *)sender; - (void) merge:(PBRefMenuItem *)sender; - (void) cherryPick:(PBRefMenuItem *)sender; diff --git a/PBRefController.m b/PBRefController.m index d4cd50e..cb25cb1 100644 --- a/PBRefController.m +++ b/PBRefController.m @@ -39,6 +39,18 @@ } +#pragma mark Fetch + +- (void) fetchRemote:(PBRefMenuItem *)sender +{ + id refish = [sender refish]; + if ([refish refishType] == kGitXCommitType) + return; + + [historyController.repository beginFetchFromRemoteForRef:refish]; +} + + #pragma mark Merge - (void) merge:(PBRefMenuItem *)sender diff --git a/PBRefMenuItem.m b/PBRefMenuItem.m index 6d27972..ef3d6b1 100644 --- a/PBRefMenuItem.m +++ b/PBRefMenuItem.m @@ -75,8 +75,14 @@ // rebase NSString *rebaseTitle = isOnHeadBranch ? @"Rebase" : [NSString stringWithFormat:@"Rebase %@ on %@", headRefName, targetRefName]; [items addObject:[PBRefMenuItem itemWithTitle:rebaseTitle action:@selector(rebaseHeadBranch:) enabled:!isOnHeadBranch]]; + + [items addObject:[PBRefMenuItem separatorItem]]; } + // fetch + NSString *fetchTitle = hasRemote ? [NSString stringWithFormat:@"Fetch %@", remoteName] : @"Fetch"; + [items addObject:[PBRefMenuItem itemWithTitle:fetchTitle action:@selector(fetchRemote:) enabled:hasRemote]]; + // delete ref [items addObject:[PBRefMenuItem separatorItem]]; NSString *deleteTitle = [NSString stringWithFormat:@"Delete %@…", targetRefName];