Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Closed
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
23 commits
Select commit Hold shift + click to select a range
dbd4ab8
Change inconsistent "SHA" uses to "OID"
tiennou Jul 12, 2014
86b0019
Just use the ref's OID directly.
tiennou Jul 12, 2014
56cd7a6
Use URLs for locating the working directory.
tiennou Jul 15, 2014
37db497
Private ivars go in class extensions.
tiennou Jul 15, 2014
af1c4b5
Property-fy PBGitIndex.
tiennou Jul 15, 2014
e05a628
Move some common actions up in the responder chain.
tiennou Jul 15, 2014
65ebec8
Show HEAD in the sidebar if it's detached
tiennou Feb 13, 2015
73cf163
added stashes property to PBGitRepository.
muhqu Aug 1, 2013
86801cf
add Stashes list to Sidebar.
muhqu Aug 1, 2013
5e950cb
keep stashes in sidebar updated when repository changes
muhqu Aug 6, 2013
650fbd9
wire-up stash actions: pop, apply, drop
muhqu Aug 6, 2013
3fdc4a3
added "Stash Changes" button and "Keep Index" checkbox to Commit View.
muhqu Aug 7, 2013
297d345
wire-up stash save, with keep index option
muhqu Aug 7, 2013
9d0767e
make "Stash Changes" button inactive if working copy is clean.
muhqu Aug 7, 2013
4402136
out-comment too verbose logging
muhqu Aug 11, 2013
3b38652
added App Menu items under "Repository"
muhqu Aug 11, 2013
88442a1
improve keyboard navigation in commit dialog
muhqu Aug 7, 2013
8e0615a
quick and dirty show stash error messages via showErrorSheet
muhqu Aug 21, 2013
381cc3d
Missing initialization
tiennou Feb 13, 2015
ba99cf3
Cosmetics
tiennou Feb 13, 2015
8440a3b
Silence the analyzer
tiennou Feb 13, 2015
1aa7aae
Prevents refs/stash from being deleted
tiennou Feb 13, 2015
90a07b1
Workaround because the commit controller isn't part of the responder …
tiennou Feb 13, 2015
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Move some common actions up in the responder chain.
  • Loading branch information
tiennou committed Feb 13, 2015
commit e05a628a960a8b18cce1f1b25fa62c13c981483a
29 changes: 5 additions & 24 deletions Classes/Controllers/PBGitHistoryController.m
Original file line number Diff line number Diff line change
Expand Up @@ -322,7 +322,11 @@ - (BOOL)validateMenuItem:(NSMenuItem *)menuItem
} else if ([menuItem action] == @selector(setTreeView:)) {
[menuItem setState:(self.selectedCommitDetailsIndex == kHistoryTreeViewIndex) ? NSOnState : NSOffState];
}
return YES;

if ([self respondsToSelector:[menuItem action]])
return YES;

return [[self nextResponder] validateMenuItem:menuItem];
}

- (IBAction) setDetailedView:(id)sender
Expand Down Expand Up @@ -564,28 +568,6 @@ - (void)showCommitsFromTree:(id)sender
[searchController setHistorySearch:searchString mode:kGitXPathSearchMode];
}

- (void)showInFinderAction:(id)sender
{
NSURL *workingDirectoryURL = self.repository.workingDirectoryURL;
NSMutableArray *URLs = [NSMutableArray array];

for (NSString *filePath in [sender representedObject]) {
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:filePath]];
}
[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:URLs];
}

- (void)openFilesAction:(id)sender
{
NSURL *workingDirectoryURL = self.repository.workingDirectoryURL;
NSMutableArray *URLs = [NSMutableArray array];

for (NSString *filePath in [sender representedObject]) {
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:filePath]];
}
[[NSWorkspace sharedWorkspace] openURLs:URLs withAppBundleIdentifier:nil options:0 additionalEventParamDescriptor:nil launchIdentifiers:NULL];
}

- (void) checkoutFiles:(id)sender
{
NSMutableArray *files = [NSMutableArray array];
Expand Down Expand Up @@ -641,7 +623,6 @@ - (NSArray *)menuItemsForPaths:(NSArray *)paths

NSArray *menuItems = [NSArray arrayWithObjects:historyItem, diffItem, checkoutItem, finderItem, openFilesItem, nil];
for (NSMenuItem *item in menuItems) {
[item setTarget:self];
[item setRepresentedObject:filePaths];
}

Expand Down
119 changes: 54 additions & 65 deletions Classes/Controllers/PBGitIndexController.m
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@ @interface PBGitIndexController ()
- (void)discardChangesForFiles:(NSArray *)files force:(BOOL)force;
@end

// FIXME: This isn't a view/window/whatever controller, though it acts like one...
// See for example -menuForTable and its setTarget: calls.
@implementation PBGitIndexController

- (void)awakeFromNib
Expand Down Expand Up @@ -99,35 +101,30 @@ - (NSMenu *) menuForTable:(NSTableView *)table
if ([table tag] == 0) {
NSMenuItem *stageItem = [[NSMenuItem alloc] initWithTitle:@"Stage Changes" action:@selector(stageFilesAction:) keyEquivalent:@"s"];
[stageItem setTarget:self];
[stageItem setRepresentedObject:selectedFiles];
[menu addItem:stageItem];
}
else if ([table tag] == 1) {
NSMenuItem *unstageItem = [[NSMenuItem alloc] initWithTitle:@"Unstage Changes" action:@selector(unstageFilesAction:) keyEquivalent:@"u"];
[unstageItem setTarget:self];
[unstageItem setRepresentedObject:selectedFiles];
[menu addItem:unstageItem];
}

NSString *title = [selectedFiles count] == 1 ? @"Open file" : @"Open files";
NSMenuItem *openItem = [[NSMenuItem alloc] initWithTitle:title action:@selector(openFilesAction:) keyEquivalent:@""];
[openItem setTarget:self];
[openItem setRepresentedObject:selectedFiles];
[openItem setTarget:commitController.repository];
[menu addItem:openItem];

// Attempt to ignore
if ([self allSelectedCanBeIgnored:selectedFiles]) {
NSString *ignoreText = [selectedFiles count] == 1 ? @"Ignore File": @"Ignore Files";
NSMenuItem *ignoreItem = [[NSMenuItem alloc] initWithTitle:ignoreText action:@selector(ignoreFilesAction:) keyEquivalent:@""];
[ignoreItem setTarget:self];
[ignoreItem setRepresentedObject:selectedFiles];
[menu addItem:ignoreItem];
}

if ([selectedFiles count] == 1) {
NSMenuItem *showInFinderItem = [[NSMenuItem alloc] initWithTitle:@"Show in Finder" action:@selector(showInFinderAction:) keyEquivalent:@""];
[showInFinderItem setTarget:self];
[showInFinderItem setRepresentedObject:selectedFiles];
[showInFinderItem setTarget:commitController.repository];
[menu addItem:showInFinderItem];
}

Expand All @@ -140,52 +137,63 @@ - (NSMenu *) menuForTable:(NSTableView *)table
break;
}
}
if (!addDiscardMenu)
{
return menu;
}

NSMenuItem *discardItem = [[NSMenuItem alloc] initWithTitle:@"Discard changes…" action:@selector(discardFilesAction:) keyEquivalent:@""];
[discardItem setTarget:self];
[discardItem setAlternate:NO];
[discardItem setRepresentedObject:selectedFiles];
if (addDiscardMenu)
{
NSMenuItem *discardItem = [[NSMenuItem alloc] initWithTitle:@"Discard changes…" action:@selector(discardFilesAction:) keyEquivalent:@""];
[discardItem setAlternate:NO];
[discardItem setTarget:self];

[menu addItem:discardItem];
[menu addItem:discardItem];

NSMenuItem *discardForceItem = [[NSMenuItem alloc] initWithTitle:@"Discard changes" action:@selector(forceDiscardFilesAction:) keyEquivalent:@""];
[discardForceItem setTarget:self];
[discardForceItem setAlternate:YES];
[discardForceItem setRepresentedObject:selectedFiles];
[discardForceItem setKeyEquivalentModifierMask:NSAlternateKeyMask];
[menu addItem:discardForceItem];

BOOL trashInsteadOfDiscard = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_7;
if (trashInsteadOfDiscard)
{
for (PBChangedFile* file in selectedFiles)
{
if (file.status != NEW)
{
trashInsteadOfDiscard = NO;
break;
}
}
}

if (trashInsteadOfDiscard && [selectedFiles count] > 0)
{
NSMenuItem* moveToTrashItem = [[NSMenuItem alloc] initWithTitle:@"Move to Trash" action:@selector(moveToTrashAction:) keyEquivalent:@""];
[moveToTrashItem setTarget:self];
[moveToTrashItem setRepresentedObject:selectedFiles];
[menu addItem:moveToTrashItem];

[menu removeItem:discardItem];
[menu removeItem:discardForceItem];
}
NSMenuItem *discardForceItem = [[NSMenuItem alloc] initWithTitle:@"Discard changes" action:@selector(forceDiscardFilesAction:) keyEquivalent:@""];
[discardForceItem setAlternate:YES];
[discardForceItem setKeyEquivalentModifierMask:NSAlternateKeyMask];
[discardForceItem setTarget:self];
[menu addItem:discardForceItem];

BOOL trashInsteadOfDiscard = floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_7;
if (trashInsteadOfDiscard)
{
for (PBChangedFile* file in selectedFiles)
{
if (file.status != NEW)
{
trashInsteadOfDiscard = NO;
break;
}
}
}

if (trashInsteadOfDiscard && [selectedFiles count] > 0)
{
NSMenuItem* moveToTrashItem = [[NSMenuItem alloc] initWithTitle:@"Move to Trash" action:@selector(moveToTrashAction:) keyEquivalent:@""];
[moveToTrashItem setTarget:self];
[menu addItem:moveToTrashItem];

[menu removeItem:discardItem];
[menu removeItem:discardForceItem];
}
}

for (NSMenuItem *item in [menu itemArray]) {
[item setRepresentedObject:selectedFiles];
}

return menu;
}

- (BOOL)validateMenuItem:(NSMenuItem *)menuItem
{
if ([self respondsToSelector:[menuItem action]])
return YES;

if ([commitController respondsToSelector:[menuItem action]])
return YES;

return [[commitController nextResponder] validateMenuItem:menuItem];
}

- (void) stageSelectedFiles
{
[commitController.index stageFiles:[unstagedFilesController selectedObjects]];
Expand All @@ -207,14 +215,6 @@ - (void) unstageFilesAction:(id) sender
[commitController.index unstageFiles:[sender representedObject]];
}

- (void) openFilesAction:(id) sender
{
NSArray *files = [sender representedObject];
NSURL *workingDirectoryURL = commitController.repository.workingDirectoryURL;
for (PBChangedFile *file in files)
[[NSWorkspace sharedWorkspace] openURL:[workingDirectoryURL URLByAppendingPathComponent:[file path]]];
}

- (void) ignoreFilesAction:(id) sender
{
NSArray *selectedFiles = [sender representedObject];
Expand All @@ -239,17 +239,6 @@ - (void)forceDiscardFilesAction:(id) sender
[self discardChangesForFiles:selectedFiles force:TRUE];
}

- (void) showInFinderAction:(id) sender
{
NSArray *selectedFiles = [sender representedObject];
if ([selectedFiles count] == 0)
return;
NSURL *workingDirectoryURL = commitController.repository.workingDirectoryURL;
NSURL *filePath = [workingDirectoryURL URLByAppendingPathComponent:[[selectedFiles objectAtIndex:0] path]];

[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:@[filePath]];
}

- (void)moveToTrashAction:(id)sender
{
NSArray *selectedFiles = [sender representedObject];
Expand Down
3 changes: 3 additions & 0 deletions Classes/git/PBGitRepository.h
Original file line number Diff line number Diff line change
Expand Up @@ -143,4 +143,7 @@ static NSString * PBStringFromBranchFilterType(PBGitXBranchFilterType type) {
// for the scripting bridge
- (void)findInModeScriptCommand:(NSScriptCommand *)command;

- (IBAction)showInFinderAction:(id)sender;
- (IBAction)openFilesAction:(id)sender;

@end
47 changes: 47 additions & 0 deletions Classes/git/PBGitRepository.m
Original file line number Diff line number Diff line change
Expand Up @@ -170,6 +170,53 @@ - (void)showWindows
[super showWindows];
}

#pragma mark -
#pragma mark NSResponder methods

- (NSArray *)selectedURLsFromSender:(id)sender {
NSArray *selectedFiles = [sender representedObject];
if ([selectedFiles count] == 0)
return nil;

NSURL *workingDirectoryURL = self.workingDirectoryURL;
NSMutableArray *URLs = [NSMutableArray array];
for (id file in selectedFiles) {
NSString *path = file;
// Those can be PBChangedFiles sent by PBGitIndexController. Get their path.
if ([file respondsToSelector:@selector(path)]) {
path = [file path];
}

if (![path isKindOfClass:[NSString class]])
continue;
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:path]];
}

return URLs;
}

- (IBAction)showInFinderAction:(id)sender {
NSArray *URLs = [self selectedURLsFromSender:sender];
if ([URLs count] == 0)
return;

[[NSWorkspace sharedWorkspace] activateFileViewerSelectingURLs:URLs];
}

- (IBAction)openFilesAction:(id)sender {
NSArray *URLs = [self selectedURLsFromSender:sender];

if ([URLs count] == 0)
return;

[[NSWorkspace sharedWorkspace] openURLs:URLs
withAppBundleIdentifier:nil
options:0
additionalEventParamDescriptor:nil
launchIdentifiers:NULL];
}


#pragma mark -
#pragma mark Properties/General methods

Expand Down