Skip to content

Work #301

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
wants to merge 7 commits into from
Closed

Work #301

Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion Classes/Controllers/PBDiffWindowController.m
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ + (void) showDiffWindowWithFiles:(NSArray *)filePaths fromCommit:(PBGitCommit *)
if (!diffCommit)
diffCommit = [startCommit.repository headCommit];

NSString *commitSelector = [NSString stringWithFormat:@"%@..%@", [startCommit realSha], [diffCommit realSha]];
NSString *commitSelector = [NSString stringWithFormat:@"%@..%@", startCommit.SHA, diffCommit.SHA];
NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"diff", @"--no-ext-diff", commitSelector, nil];

if (![PBGitDefaults showWhitespaceDifferences])
Expand Down
52 changes: 15 additions & 37 deletions Classes/Controllers/PBGitHistoryController.m
Original file line number Diff line number Diff line change
Expand Up @@ -296,9 +296,9 @@ - (void) observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(
[self updateStatus];

if ([repository.currentBranch isSimpleRef])
[self selectCommit:[repository shaForRef:[repository.currentBranch ref]]];
[self selectCommit:[repository OIDForRef:repository.currentBranch.ref]];
else
[self selectCommit:[[self firstCommit] sha]];
[self selectCommit:self.firstCommit.OID];
return;
}

Expand All @@ -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 @@ -382,7 +386,7 @@ - (void) copyCommitInfo
PBGitCommit *commit = [[commitController selectedObjects] objectAtIndex:0];
if (!commit)
return;
NSString *info = [NSString stringWithFormat:@"%@ (%@)", [[commit realSha] substringToIndex:10], [commit subject]];
NSString *info = [NSString stringWithFormat:@"%@ (%@)", [commit.SHA substringToIndex:10], commit.subject];

NSPasteboard *a =[NSPasteboard generalPasteboard];
[a declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
Expand All @@ -395,7 +399,7 @@ - (void) copyCommitSHA
PBGitCommit *commit = [[commitController selectedObjects] objectAtIndex:0];
if (!commit)
return;
NSString *info = [[commit realSha] substringWithRange:NSMakeRange(0, 7)];
NSString *info = [commit.SHA substringWithRange:NSMakeRange(0, 7)];

NSPasteboard *a =[NSPasteboard generalPasteboard];
[a declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:self];
Expand Down Expand Up @@ -487,9 +491,9 @@ - (void) scrollSelectionToTopOfViewFrom:(NSInteger)oldIndex
commitList.useAdjustScroll = NO;
}

- (NSArray *) selectedObjectsForSHA:(GTOID *)commitSHA
- (NSArray *) selectedObjectsForOID:(GTOID *)commitOID
{
NSPredicate *selection = [NSPredicate predicateWithFormat:@"sha == %@", commitSHA];
NSPredicate *selection = [NSPredicate predicateWithFormat:@"OID == %@", commitOID];
NSArray *selectedCommits = [[commitController content] filteredArrayUsingPredicate:selection];

if (([selectedCommits count] == 0) && [self firstCommit])
Expand All @@ -498,14 +502,14 @@ - (NSArray *) selectedObjectsForSHA:(GTOID *)commitSHA
return selectedCommits;
}

- (void)selectCommit:(GTOID *)commitSHA
- (void)selectCommit:(GTOID *)commitOID
{
if (!forceSelectionUpdate && [[[[commitController selectedObjects] lastObject] sha] isEqual:commitSHA])
if (!forceSelectionUpdate && [[[commitController.selectedObjects lastObject] OID] isEqual:commitOID])
return;

NSInteger oldIndex = [[commitController selectionIndexes] firstIndex];

NSArray *selectedCommits = [self selectedObjectsForSHA:commitSHA];
NSArray *selectedCommits = [self selectedObjectsForOID:commitOID];
[commitController setSelectedObjects:selectedCommits];

[self scrollSelectionToTopOfViewFrom:oldIndex];
Expand Down Expand Up @@ -564,31 +568,6 @@ - (void)showCommitsFromTree:(id)sender
[searchController setHistorySearch:searchString mode:kGitXPathSearchMode];
}

- (void)showInFinderAction:(id)sender
{
NSString *workingDirectory = [[repository workingDirectory] stringByAppendingString:@"/"];
NSString *path;
NSWorkspace *ws = [NSWorkspace sharedWorkspace];

for (NSString *filePath in [sender representedObject]) {
path = [workingDirectory stringByAppendingPathComponent:filePath];
[ws selectFile: path inFileViewerRootedAtPath:path];
}

}

- (void)openFilesAction:(id)sender
{
NSString *workingDirectory = [[repository workingDirectory] stringByAppendingString:@"/"];
NSString *path;
NSWorkspace *ws = [NSWorkspace sharedWorkspace];

for (NSString *filePath in [sender representedObject]) {
path = [workingDirectory stringByAppendingPathComponent:filePath];
[ws openFile:path];
}
}

- (void) checkoutFiles:(id)sender
{
NSMutableArray *files = [NSMutableArray array];
Expand Down Expand Up @@ -627,7 +606,7 @@ - (NSArray *)menuItemsForPaths:(NSArray *)paths
PBGitRef *headRef = [[repository headRef] ref];
NSString *headRefName = [headRef shortName];
NSString *diffTitle = [NSString stringWithFormat:@"Diff %@ with %@", multiple ? @"files" : @"file", headRefName];
BOOL isHead = [[selectedCommit sha] isEqual:[repository headSHA]];
BOOL isHead = [selectedCommit.OID isEqual:repository.headOID];
NSMenuItem *diffItem = [[NSMenuItem alloc] initWithTitle:diffTitle
action:isHead ? nil : @selector(diffFilesAction:)
keyEquivalent:@""];
Expand All @@ -644,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
136 changes: 62 additions & 74 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];
NSString *workingDirectory = [commitController.repository workingDirectory];
for (PBChangedFile *file in files)
[[NSWorkspace sharedWorkspace] openFile:[workingDirectory stringByAppendingPathComponent:[file path]]];
}

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

- (void) showInFinderAction:(id) sender
{
NSArray *selectedFiles = [sender representedObject];
if ([selectedFiles count] == 0)
return;
NSString *workingDirectory = [[commitController.repository workingDirectory] stringByAppendingString:@"/"];
NSString *path = [workingDirectory stringByAppendingPathComponent:[[selectedFiles objectAtIndex:0] path]];
NSWorkspace *ws = [NSWorkspace sharedWorkspace];
[ws selectFile: path inFileViewerRootedAtPath:nil];
}

- (void)moveToTrashAction:(id)sender
{
NSArray *selectedFiles = [sender representedObject];

NSString *workingDirectory = [commitController.repository workingDirectory];
NSURL* workDirURL = [NSURL fileURLWithPath:workingDirectory isDirectory:YES];
NSURL *workingDirectoryURL = commitController.repository.workingDirectoryURL;

BOOL anyTrashed = NO;
for (PBChangedFile* file in selectedFiles)
for (PBChangedFile *file in selectedFiles)
{
NSURL* fileURL = [workDirURL URLByAppendingPathComponent:[file path]];
NSURL* fileURL = [workingDirectoryURL URLByAppendingPathComponent:[file path]];

NSError* error = nil;
NSURL* resultURL = nil;
Expand Down Expand Up @@ -343,14 +331,14 @@ - (BOOL)tableView:(NSTableView *)tv

// External, to drag them to for example XCode or Textmate
NSArrayController *controller = [tv tag] == 0 ? unstagedFilesController : stagedFilesController;
NSArray *files = [[controller arrangedObjects] objectsAtIndexes:rowIndexes];
NSString *workingDirectory = [commitController.repository workingDirectory];
NSArray *files = [controller.arrangedObjects objectsAtIndexes:rowIndexes];
NSURL *workingDirectoryURL = commitController.repository.workingDirectoryURL;

NSMutableArray *filenames = [NSMutableArray arrayWithCapacity:[rowIndexes count]];
NSMutableArray *URLs = [NSMutableArray arrayWithCapacity:rowIndexes.count];
for (PBChangedFile *file in files)
[filenames addObject:[workingDirectory stringByAppendingPathComponent:[file path]]];
[URLs addObject:[workingDirectoryURL URLByAppendingPathComponent:file.path]];

[pboard setPropertyList:filenames forType:NSFilenamesPboardType];
[pboard setPropertyList:URLs forType:NSURLPboardType];
return YES;
}

Expand Down
11 changes: 3 additions & 8 deletions Classes/Controllers/PBGitWindowController.m
Original file line number Diff line number Diff line change
Expand Up @@ -41,12 +41,7 @@ - (void)synchronizeWindowTitleWithDocumentName
[super synchronizeWindowTitleWithDocumentName];

// Point window proxy icon at project directory, not internal .git dir
NSString *workingDirectory = [self.repository workingDirectory];
if (workingDirectory)
{
[[self window] setRepresentedURL:[NSURL fileURLWithPath:workingDirectory
isDirectory:YES]];
}
[[self window] setRepresentedURL:self.repository.workingDirectoryURL];
}

- (void)windowWillClose:(NSNotification *)notification
Expand Down Expand Up @@ -176,13 +171,13 @@ - (void)showErrorSheetTitle:(NSString *)title message:(NSString *)message argume

- (IBAction) revealInFinder:(id)sender
{
[[NSWorkspace sharedWorkspace] openFile:[repository workingDirectory]];
[[NSWorkspace sharedWorkspace] openURL:self.repository.workingDirectoryURL];
}

- (IBAction) openInTerminal:(id)sender
{
TerminalApplication *term = [SBApplication applicationWithBundleIdentifier: @"com.apple.Terminal"];
NSString *workingDirectory = [[repository workingDirectory] stringByAppendingString:@"/"];
NSString *workingDirectory = [self.repository.workingDirectoryURL.path stringByAppendingString:@"/"];
NSString *cmd = [NSString stringWithFormat: @"cd \"%@\"; clear; echo '# Opened by GitX:'; git status", workingDirectory];
[term doScript: cmd in: nil];
[NSThread sleepForTimeInterval: 0.1];
Expand Down
4 changes: 2 additions & 2 deletions Classes/Controllers/PBHistorySearchController.m
Original file line number Diff line number Diff line change
Expand Up @@ -152,7 +152,7 @@ - (void)selectIndex:(NSUInteger)index
{
if ([[commitController arrangedObjects] count] > index) {
PBGitCommit *commit = [[commitController arrangedObjects] objectAtIndex:index];
[historyController selectCommit:[commit sha]];
[historyController selectCommit:commit.OID];
}
}

Expand Down Expand Up @@ -454,7 +454,7 @@ - (void)parseBackgroundSearchResults:(NSNotification *)notification
NSArray *arrangedObjects = [commitController arrangedObjects];
NSIndexSet *indexes = [arrangedObjects indexesOfObjectsPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
PBGitCommit *commit = obj;
return [matches containsObject:commit.sha];
return [matches containsObject:commit.OID];
}];

results = indexes;
Expand Down
Loading