diff --git a/Classes/Controllers/PBDiffWindowController.m b/Classes/Controllers/PBDiffWindowController.m index 8b525bd8a..2028363ee 100644 --- a/Classes/Controllers/PBDiffWindowController.m +++ b/Classes/Controllers/PBDiffWindowController.m @@ -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]) diff --git a/Classes/Controllers/PBGitHistoryController.m b/Classes/Controllers/PBGitHistoryController.m index ef37d2c23..722af6aca 100644 --- a/Classes/Controllers/PBGitHistoryController.m +++ b/Classes/Controllers/PBGitHistoryController.m @@ -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; } @@ -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 @@ -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]; @@ -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]; @@ -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]) @@ -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]; @@ -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]; @@ -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:@""]; @@ -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]; } diff --git a/Classes/Controllers/PBGitIndexController.m b/Classes/Controllers/PBGitIndexController.m index ec7f575d9..9f1226d19 100644 --- a/Classes/Controllers/PBGitIndexController.m +++ b/Classes/Controllers/PBGitIndexController.m @@ -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 @@ -99,20 +101,17 @@ - (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 @@ -120,14 +119,12 @@ - (NSMenu *) menuForTable:(NSTableView *)table 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]; } @@ -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]]; @@ -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]; @@ -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; @@ -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; } diff --git a/Classes/Controllers/PBGitWindowController.m b/Classes/Controllers/PBGitWindowController.m index b3c9b82bc..e01a13873 100644 --- a/Classes/Controllers/PBGitWindowController.m +++ b/Classes/Controllers/PBGitWindowController.m @@ -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 @@ -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]; diff --git a/Classes/Controllers/PBHistorySearchController.m b/Classes/Controllers/PBHistorySearchController.m index 19606c4a7..d17a91429 100644 --- a/Classes/Controllers/PBHistorySearchController.m +++ b/Classes/Controllers/PBHistorySearchController.m @@ -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]; } } @@ -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; diff --git a/Classes/Controllers/PBRefController.m b/Classes/Controllers/PBRefController.m index ec27403a4..1395f17c5 100644 --- a/Classes/Controllers/PBRefController.m +++ b/Classes/Controllers/PBRefController.m @@ -189,7 +189,7 @@ - (void) copySHA:(PBRefMenuItem *)sender NSPasteboard *pasteboard = [NSPasteboard generalPasteboard]; [pasteboard declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:nil]; - [pasteboard setString:[commit realSha] forType:NSStringPboardType]; + [pasteboard setString:commit.SHA forType:NSStringPboardType]; } @@ -389,7 +389,7 @@ - (void) dropRef:(NSDictionary *)dropInfo return; int retValue = 1; - [historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-mUpdate from GitX", [ref ref], [dropCommit realSha], NULL] retValue:&retValue]; + [historyController.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-mUpdate from GitX", ref.ref, dropCommit.SHA, NULL] retValue:&retValue]; if (retValue) return; diff --git a/Classes/Controllers/PBWebHistoryController.h b/Classes/Controllers/PBWebHistoryController.h index 9ddaad40c..495c58b58 100644 --- a/Classes/Controllers/PBWebHistoryController.h +++ b/Classes/Controllers/PBWebHistoryController.h @@ -21,7 +21,7 @@ IBOutlet PBGitHistoryController* historyController; IBOutlet id contextMenuDelegate; - GTOID* currentSha; + GTOID *currentOID; NSString* diff; } diff --git a/Classes/Controllers/PBWebHistoryController.m b/Classes/Controllers/PBWebHistoryController.m index ce95b9432..407c6df8d 100644 --- a/Classes/Controllers/PBWebHistoryController.m +++ b/Classes/Controllers/PBWebHistoryController.m @@ -34,7 +34,7 @@ - (void)closeView - (void) didLoad { - currentSha = nil; + currentOID = nil; [self changeContentTo: historyController.webCommit]; } @@ -52,7 +52,7 @@ - (void) changeContentTo: (PBGitCommit *) content return; // The sha is the same, but refs may have changed.. reload it lazy - if ([currentSha isEqual:[content sha]]) + if ([currentOID isEqual:content.OID]) { [[self script] callWebScriptMethod:@"reload" withArguments: nil]; return; @@ -65,13 +65,13 @@ - (void) changeContentTo: (PBGitCommit *) content [self performSelector:_cmd withObject:content afterDelay:0.05]; return; } - currentSha = [content sha]; + currentOID = content.OID; // Now we load the extended details. We used to do this in a separate thread, // but this caused some funny behaviour because NSTask's and NSThread's don't really // like each other. Instead, just do it async. - NSMutableArray *taskArguments = [NSMutableArray arrayWithObjects:@"show", @"--pretty=raw", @"-M", @"--no-color", [currentSha SHA], nil]; + NSMutableArray *taskArguments = [NSMutableArray arrayWithObjects:@"show", @"--pretty=raw", @"-M", @"--no-color", currentOID.SHA, nil]; if (![PBGitDefaults showWhitespaceDifferences]) [taskArguments insertObject:@"-w" atIndex:1]; diff --git a/Classes/Views/PBGitRevisionCell.m b/Classes/Views/PBGitRevisionCell.m index acf4fc2d8..dce8f7dc2 100644 --- a/Classes/Views/PBGitRevisionCell.m +++ b/Classes/Views/PBGitRevisionCell.m @@ -106,12 +106,12 @@ - (void) drawLineFromColumn: (int) from toColumn: (int) to inRect: (NSRect) r of - (BOOL) isCurrentCommit { - GTOID *thisSha = [self.objectValue sha]; + GTOID *thisOID = self.objectValue.OID; PBGitRepository* repository = [self.objectValue repository]; - GTOID *currentSha = [repository headSHA]; + GTOID *currentOID = [repository headOID]; - return [currentSha isEqual:thisSha]; + return [currentOID isEqual:thisOID]; } - (void) drawCircleInRect: (NSRect) r diff --git a/Classes/Views/PBRefMenuItem.m b/Classes/Views/PBRefMenuItem.m index 4eefea30a..7bb991794 100644 --- a/Classes/Views/PBRefMenuItem.m +++ b/Classes/Views/PBRefMenuItem.m @@ -158,7 +158,7 @@ + (NSArray *) defaultMenuItemsForCommit:(PBGitCommit *)commit target:(id)target NSString *headBranchName = [[[commit.repository headRef] ref] shortName]; BOOL isOnHeadBranch = [commit isOnHeadBranch]; - BOOL isHead = [[commit sha] isEqual:[commit.repository headSHA]]; + BOOL isHead = [commit.OID isEqual:commit.repository.headOID]; [items addObject:[PBRefMenuItem itemWithTitle:@"Checkout Commit" action:@selector(checkout:) enabled:YES]]; [items addObject:[PBRefMenuItem separatorItem]]; diff --git a/Classes/Views/PBRemoteProgressSheet.m b/Classes/Views/PBRemoteProgressSheet.m index f8d656a94..166ee2f69 100644 --- a/Classes/Views/PBRemoteProgressSheet.m +++ b/Classes/Views/PBRemoteProgressSheet.m @@ -97,7 +97,7 @@ + (void) beginRemoteProgressSheetForArguments:(NSArray *)args [PBRemoteProgressSheet beginRemoteProgressSheetForArguments:args title:theTitle description:theDescription - inDir:[repo workingDirectory] + inDir:repo.workingDirectoryURL.path windowController:repo.windowController]; } @@ -110,7 +110,7 @@ + (void) beginRemoteProgressSheetForArguments:(NSArray *)args [PBRemoteProgressSheet beginRemoteProgressSheetForArguments:args title:theTitle description:theDescription - inDir:[repo workingDirectory] + inDir:repo.workingDirectoryURL.path windowController:repo.windowController hideSuccessScreen:hideSucc]; } @@ -162,8 +162,6 @@ - (void) beginRemoteProgressSheetForArguments:(NSArray *)args [gitTask launch]; } - - #pragma mark Notifications - (void) taskCompleted:(NSNotification *)notification diff --git a/Classes/git/PBGitCommit.h b/Classes/git/PBGitCommit.h index 1ae528207..a6c619ab2 100644 --- a/Classes/git/PBGitCommit.h +++ b/Classes/git/PBGitCommit.h @@ -21,7 +21,7 @@ extern NSString * const kGitXCommitType; @property (nonatomic, weak, readonly) PBGitRepository* repository; -@property (nonatomic, strong, readonly) GTOID *sha; +@property (nonatomic, strong, readonly) GTOID *OID; @property (nonatomic, strong, readonly) NSDate *date; @property (nonatomic, strong, readonly) NSString *subject; @@ -29,7 +29,7 @@ extern NSString * const kGitXCommitType; @property (nonatomic, strong, readonly) NSString *committer; @property (nonatomic, strong, readonly) NSString *details; @property (nonatomic, strong, readonly) NSString *patch; -@property (nonatomic, strong, readonly) NSString *realSHA; +@property (nonatomic, strong, readonly) NSString *SHA; @property (nonatomic, strong, readonly) NSString *SVNRevision; @property (nonatomic, strong, readonly) NSArray *parents; @@ -48,7 +48,7 @@ extern NSString * const kGitXCommitType; - (void) removeRef:(id)ref; - (BOOL) hasRef:(PBGitRef *)ref; -- (NSString *)realSha; +- (NSString *)SHA; - (BOOL) isOnSameBranchAs:(PBGitCommit *)other; - (BOOL) isOnHeadBranch; diff --git a/Classes/git/PBGitCommit.m b/Classes/git/PBGitCommit.m index c0b59aeb5..35c3e1e27 100644 --- a/Classes/git/PBGitCommit.m +++ b/Classes/git/PBGitCommit.m @@ -21,7 +21,7 @@ @interface PBGitCommit () @property (nonatomic, strong) NSArray *parents; @property (nonatomic, strong) NSString *patch; -@property (nonatomic, strong) GTOID *sha; +@property (nonatomic, strong) GTOID *oid; @end @@ -113,20 +113,17 @@ - (NSString *)SVNRevision return result; } -- (GTOID *)sha +- (GTOID *)OID { - GTOID *result = _sha; - if (result) { - return result; + if (!_oid) { + _oid = self.gtCommit.OID; } - result = self.gtCommit.OID; - _sha = result; - return result; + return _oid; } -- (NSString *)realSha +- (NSString *)SHA { - return self.gtCommit.SHA; + return self.OID.SHA; } - (BOOL) isOnSameBranchAs:(PBGitCommit *)otherCommit @@ -137,7 +134,7 @@ - (BOOL) isOnSameBranchAs:(PBGitCommit *)otherCommit if ([self isEqual:otherCommit]) return YES; - return [self.repository isOnSameBranch:otherCommit.sha asSHA:self.sha]; + return [self.repository isOIDOnSameBranch:otherCommit.OID asOID:self.OID]; } - (BOOL) isOnHeadBranch @@ -155,7 +152,7 @@ - (BOOL)isEqual:(id)otherCommit - (NSUInteger)hash { - return [self.sha hash]; + return self.OID.hash; } // FIXME: Remove this method once it's unused. @@ -169,7 +166,7 @@ - (NSString *) patch if (self->_patch != nil) return _patch; - NSString *p = [self.repository outputForArguments:[NSArray arrayWithObjects:@"format-patch", @"-1", @"--stdout", [self realSha], nil]]; + NSString *p = [self.repository outputForArguments:[NSArray arrayWithObjects:@"format-patch", @"-1", @"--stdout", self.SHA, nil]]; // Add a GitX identifier to the patch ;) self.patch = [[p substringToIndex:[p length] -1] stringByAppendingString:@"+GitX"]; return self->_patch; @@ -210,12 +207,12 @@ - (BOOL) hasRef:(PBGitRef *)ref - (NSMutableArray *)refs { - return self.repository.refs[self.sha]; + return self.repository.refs[self.OID]; } - (void) setRefs:(NSMutableArray *)refs { - self.repository.refs[self.sha] = [NSMutableArray arrayWithArray:refs]; + self.repository.refs[self.OID] = [NSMutableArray arrayWithArray:refs]; } @@ -233,7 +230,7 @@ + (BOOL)isKeyExcludedFromWebScript:(const char *)name { - (NSString *) refishName { - return [self realSha]; + return self.SHA; } - (NSString *) shortName diff --git a/Classes/git/PBGitGrapher.mm b/Classes/git/PBGitGrapher.mm index d2319e20b..5e254fdf1 100644 --- a/Classes/git/PBGitGrapher.mm +++ b/Classes/git/PBGitGrapher.mm @@ -67,7 +67,7 @@ - (void) decorateCommit: (PBGitCommit *) commit PBGitLane *currentLane = NULL; BOOL didFirst = NO; - const git_oid *commit_oid = [[commit sha] git_oid]; + const git_oid *commit_oid = commit.OID.git_oid; // First, iterate over earlier columns and pass through any that don't want this commit if (self.previous != nil) { diff --git a/Classes/git/PBGitHistoryGrapher.h b/Classes/git/PBGitHistoryGrapher.h index 0e02e6a3e..02aa931cd 100644 --- a/Classes/git/PBGitHistoryGrapher.h +++ b/Classes/git/PBGitHistoryGrapher.h @@ -20,7 +20,7 @@ id delegate; NSOperationQueue *currentQueue; - NSMutableSet *searchSHAs; + NSMutableSet *searchOIDs; PBGitGrapher *grapher; BOOL viewAllBranches; } diff --git a/Classes/git/PBGitHistoryGrapher.m b/Classes/git/PBGitHistoryGrapher.m index 7fea53cd7..f79f75b44 100644 --- a/Classes/git/PBGitHistoryGrapher.m +++ b/Classes/git/PBGitHistoryGrapher.m @@ -19,7 +19,7 @@ - (id) initWithBaseCommits:(NSSet *)commits viewAllBranches:(BOOL)viewAll queue: delegate = theDelegate; currentQueue = queue; - searchSHAs = [NSMutableSet setWithSet:commits]; + searchOIDs = [NSMutableSet setWithSet:commits]; grapher = [[PBGitGrapher alloc] initWithRepository:nil]; viewAllBranches = viewAll; @@ -48,13 +48,13 @@ - (void) graphCommits:(NSArray *)revList for (PBGitCommit *commit in revList) { if ([currentThread isCancelled]) return; - GTOID *commitSHA = [commit sha]; - if (viewAllBranches || [searchSHAs containsObject:commitSHA]) { + GTOID *commitOID = commit.OID; + if (viewAllBranches || [searchOIDs containsObject:commitOID]) { [grapher decorateCommit:commit]; [commits addObject:commit]; if (!viewAllBranches) { - [searchSHAs removeObject:commitSHA]; - [searchSHAs addObjectsFromArray:[commit parents]]; + [searchOIDs removeObject:commitOID]; + [searchOIDs addObjectsFromArray:[commit parents]]; } } if (++counter % 100 == 0) { diff --git a/Classes/git/PBGitHistoryList.h b/Classes/git/PBGitHistoryList.h index 9166051bf..66e21f1fd 100644 --- a/Classes/git/PBGitHistoryList.h +++ b/Classes/git/PBGitHistoryList.h @@ -22,8 +22,8 @@ PBGitRevList *projectRevList; PBGitRevList *currentRevList; - GTOID *lastSHA; - NSSet *lastRefSHAs; + GTOID *lastOID; + NSSet *lastRefOIDs; NSInteger lastBranchFilter; PBGitRef *lastRemoteRef; BOOL resetCommits; diff --git a/Classes/git/PBGitHistoryList.m b/Classes/git/PBGitHistoryList.m index 72387f301..41cfee2ac 100644 --- a/Classes/git/PBGitHistoryList.m +++ b/Classes/git/PBGitHistoryList.m @@ -171,47 +171,47 @@ - (NSInvocationOperation *) operationForCommits:(NSArray *)newCommits - (NSSet *) baseCommitsForLocalRefs { - NSMutableSet *baseCommitSHAs = [NSMutableSet set]; + NSMutableSet *baseCommitOIDs = [NSMutableSet set]; NSDictionary *refs = repository.refs; - for (GTOID *sha in refs) - for (PBGitRef *ref in [refs objectForKey:sha]) + for (GTOID *OID in refs) + for (PBGitRef *ref in [refs objectForKey:OID]) if ([ref isBranch] || [ref isTag]) - [baseCommitSHAs addObject:sha]; + [baseCommitOIDs addObject:OID]; if (![[PBGitRef refFromString:[[repository headRef] simpleRef]] type]) - [baseCommitSHAs addObject:[repository headSHA]]; + [baseCommitOIDs addObject:repository.headOID]; - return baseCommitSHAs; + return baseCommitOIDs; } - (NSSet *) baseCommitsForRemoteRefs { - NSMutableSet *baseCommitSHAs = [NSMutableSet set]; + NSMutableSet *baseCommitOIDs = [NSMutableSet set]; NSDictionary *refs = repository.refs; PBGitRef *remoteRef = [[repository.currentBranch ref] remoteRef]; - for (GTOID *sha in refs) - for (PBGitRef *ref in [refs objectForKey:sha]) + for (GTOID *OID in refs) + for (PBGitRef *ref in [refs objectForKey:OID]) if ([remoteRef isEqualToRef:[ref remoteRef]]) - [baseCommitSHAs addObject:sha]; + [baseCommitOIDs addObject:OID]; - return baseCommitSHAs; + return baseCommitOIDs; } - (NSSet *) baseCommits { if ((repository.currentBranchFilter == kGitXSelectedBranchFilter) || (repository.currentBranchFilter == kGitXAllBranchesFilter)) { - if (lastSHA) - return [NSMutableSet setWithObject:lastSHA]; + if (lastOID) + return [NSMutableSet setWithObject:lastOID]; else if ([repository.currentBranch isSimpleRef]) { PBGitRef *currentRef = [repository.currentBranch ref]; - GTOID *sha = [repository shaForRef:currentRef]; - if (sha) - return [NSMutableSet setWithObject:sha]; + GTOID *OID = [repository OIDForRef:currentRef]; + if (OID) + return [NSMutableSet setWithObject:OID]; } } else if (repository.currentBranchFilter == kGitXLocalRemoteBranchesFilter) { @@ -274,18 +274,18 @@ - (BOOL) selectedBranchNeedsNewGraph:(PBGitRevSpecifier *)rev if ([self isAllBranchesOnlyUpdate] || [self isLocalRemoteOnlyUpdate:rev]) { lastRemoteRef = [[rev ref] remoteRef]; - lastSHA = nil; + lastOID = nil; self.isUpdating = NO; return NO; } - GTOID *revSHA = [repository shaForRef:[rev ref]]; - if ([revSHA isEqual:lastSHA] && (lastBranchFilter == repository.currentBranchFilter)) + GTOID *revOID = [repository OIDForRef:[rev ref]]; + if ([revOID isEqual:lastOID] && (lastBranchFilter == repository.currentBranchFilter)) return NO; lastBranchFilter = repository.currentBranchFilter; lastRemoteRef = [[rev ref] remoteRef]; - lastSHA = revSHA; + lastOID = revOID; return YES; } @@ -295,11 +295,11 @@ - (BOOL) haveRefsBeenModified { [repository reloadRefs]; - NSMutableSet *currentRefSHAs = [NSMutableSet setWithArray:[repository.refs allKeys]]; - [currentRefSHAs minusSet:lastRefSHAs]; - lastRefSHAs = [NSSet setWithArray:[repository.refs allKeys]]; + NSMutableSet *currentRefOIDs = [NSMutableSet setWithArray:[repository.refs allKeys]]; + [currentRefOIDs minusSet:lastRefOIDs]; + lastRefOIDs = [NSSet setWithArray:[repository.refs allKeys]]; - return [currentRefSHAs count] != 0; + return [currentRefOIDs count] != 0; } @@ -321,7 +321,7 @@ - (void) updateProjectHistoryForRev:(PBGitRevSpecifier *)rev shouldReloadProjectHistory = NO; lastBranchFilter = -1; lastRemoteRef = nil; - lastSHA = nil; + lastOID = nil; self.commits = [NSMutableArray array]; [projectRevList loadRevisons]; return; @@ -339,7 +339,7 @@ - (void) updateHistoryForRev:(PBGitRevSpecifier *)rev [self resetGraphing]; lastBranchFilter = -1; lastRemoteRef = nil; - lastSHA = nil; + lastOID = nil; self.commits = [NSMutableArray array]; [otherRevListParser loadRevisons]; diff --git a/Classes/git/PBGitIndex.h b/Classes/git/PBGitIndex.h index 2a068fb37..e7edd6c93 100644 --- a/Classes/git/PBGitIndex.h +++ b/Classes/git/PBGitIndex.h @@ -41,21 +41,12 @@ extern NSString *PBGitIndexOperationFailed; // As a single git repository can have multiple trees, // the tree has to be given explicitly, even though // multiple trees is not yet supported in GitX -@interface PBGitIndex : NSObject { - -@private - __weak PBGitRepository *repository; - NSURL *workingDirectory; - NSMutableArray *files; - - NSUInteger refreshStatus; - NSDictionary *amendEnvironment; - BOOL amend; -} +@interface PBGitIndex : NSObject // Whether we want the changes for amending, -// or for -@property BOOL amend; +// or for making a new commit. +@property (assign, readonly, getter=isAmend) BOOL amend; +@property (weak, readonly) PBGitRepository *repository; - (id)initWithRepository:(PBGitRepository *)repository; diff --git a/Classes/git/PBGitIndex.m b/Classes/git/PBGitIndex.m index 70726946e..4290c73bb 100644 --- a/Classes/git/PBGitIndex.m +++ b/Classes/git/PBGitIndex.m @@ -52,10 +52,17 @@ - (void)postCommitFailure:(NSString *)reason; - (void)postCommitHookFailure:(NSString *)reason; - (void)postIndexChange; - (void)postOperationFailed:(NSString *)description; + +@property (retain) NSDictionary *amendEnvironment; +@property (retain) NSMutableArray *files; +@property (assign) NSUInteger refreshStatus; + @end @implementation PBGitIndex +@synthesize amend=_amend; + - (id)initWithRepository:(PBGitRepository *)theRepository { if (!(self = [super init])) @@ -63,29 +70,25 @@ - (id)initWithRepository:(PBGitRepository *)theRepository NSAssert(theRepository, @"PBGitIndex requires a repository"); - repository = theRepository; - NSString* workingPath = theRepository.workingDirectory; - if (workingPath) - { - workingDirectory = [NSURL fileURLWithPath:workingPath]; - } - files = [NSMutableArray array]; + _repository = theRepository; + + _files = [NSMutableArray array]; return self; } - (NSArray *)indexChanges { - return files; + return self.files; } - (void)setAmend:(BOOL)newAmend { - if (newAmend == amend) + if (newAmend == _amend) return; - amend = newAmend; - amendEnvironment = nil; + _amend = newAmend; + self.amendEnvironment = nil; [self refresh]; @@ -95,13 +98,13 @@ - (void)setAmend:(BOOL)newAmend // If we amend, we want to keep the author information for the previous commit // We do this by reading in the previous commit, and storing the information // in a dictionary. This dictionary will then later be read by [self commit:] - NSString *message = [repository outputForCommand:@"cat-file commit HEAD"]; + NSString *message = [self.repository outputForCommand:@"cat-file commit HEAD"]; NSArray *match = [message substringsMatchingRegularExpression:@"\nauthor ([^\n]*) <([^\n>]*)> ([0-9]+[^\n]*)\n" count:3 options:0 ranges:nil error:nil]; if (match) - amendEnvironment = [NSDictionary dictionaryWithObjectsAndKeys:[match objectAtIndex:1], @"GIT_AUTHOR_NAME", - [match objectAtIndex:2], @"GIT_AUTHOR_EMAIL", - [match objectAtIndex:3], @"GIT_AUTHOR_DATE", - nil]; + self.amendEnvironment = [NSDictionary dictionaryWithObjectsAndKeys:[match objectAtIndex:1], @"GIT_AUTHOR_NAME", + [match objectAtIndex:2], @"GIT_AUTHOR_EMAIL", + [match objectAtIndex:3], @"GIT_AUTHOR_DATE", + nil]; // Find the commit message NSRange r = [message rangeOfString:@"\n\n"]; @@ -114,9 +117,9 @@ - (void)setAmend:(BOOL)newAmend } -- (BOOL) amend +- (BOOL)isAmend { - return amend; + return _amend; } - (void)refresh @@ -124,14 +127,14 @@ - (void)refresh // If we were already refreshing the index, we don't want // double notifications. As we can't stop the tasks anymore, // just cancel the notifications - refreshStatus = 0; + self.refreshStatus = 0; NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; [nc removeObserver:self]; // Ask Git to refresh the index NSFileHandle *updateHandle = [PBEasyPipe handleForCommand:[PBGitBinary path] withArgs:[NSArray arrayWithObjects:@"update-index", @"-q", @"--unmerged", @"--ignore-missing", @"--refresh", nil] - inDir:[workingDirectory path]]; + inDir:self.repository.workingDirectoryURL.path]; [nc addObserver:self selector:@selector(indexRefreshFinished:) @@ -143,9 +146,9 @@ - (void)refresh - (NSString *) parentTree { - NSString *parent = amend ? @"HEAD^" : @"HEAD"; + NSString *parent = self.amend ? @"HEAD^" : @"HEAD"; - if (![repository parseReference:parent]) + if (![self.repository parseReference:parent]) // We don't have a head ref. Return the empty tree. return @"4b825dc642cb6eb9a060e54bf8d69288fbee4904"; @@ -163,20 +166,20 @@ - (void)commitWithMessage:(NSString *)commitMessage andVerify:(BOOL) doVerify [commitSubject appendString:[commitMessage substringToIndex:newLine.location]]; NSString *commitMessageFile; - commitMessageFile = [repository.gitURL.path stringByAppendingPathComponent:@"COMMIT_EDITMSG"]; + commitMessageFile = [self.repository.gitURL.path stringByAppendingPathComponent:@"COMMIT_EDITMSG"]; [commitMessage writeToFile:commitMessageFile atomically:YES encoding:NSUTF8StringEncoding error:nil]; [self postCommitUpdate:@"Creating tree"]; - NSString *tree = [repository outputForCommand:@"write-tree"]; + NSString *tree = [self.repository outputForCommand:@"write-tree"]; if ([tree length] != 40) return [self postCommitFailure:@"Creating tree failed"]; NSMutableArray *arguments = [NSMutableArray arrayWithObjects:@"commit-tree", tree, nil]; - NSString *parent = amend ? @"HEAD^" : @"HEAD"; - if ([repository parseReference:parent]) { + NSString *parent = self.amend ? @"HEAD^" : @"HEAD"; + if ([self.repository parseReference:parent]) { [arguments addObject:@"-p"]; [arguments addObject:parent]; } @@ -188,13 +191,13 @@ - (void)commitWithMessage:(NSString *)commitMessage andVerify:(BOOL) doVerify [self postCommitUpdate:@"Running hooks"]; NSString *hookFailureMessage = nil; NSString *hookOutput = nil; - if (![repository executeHook:@"pre-commit" output:&hookOutput]) { + if (![self.repository executeHook:@"pre-commit" output:&hookOutput]) { hookFailureMessage = [NSString stringWithFormat:@"Pre-commit hook failed%@%@", [hookOutput length] > 0 ? @":\n" : @"", hookOutput]; } - if (![repository executeHook:@"commit-msg" withArgs:[NSArray arrayWithObject:commitMessageFile] output:nil]) { + if (![self.repository executeHook:@"commit-msg" withArgs:[NSArray arrayWithObject:commitMessageFile] output:nil]) { hookFailureMessage = [NSString stringWithFormat:@"Commit-msg hook failed%@%@", [hookOutput length] > 0 ? @":\n" : @"", hookOutput]; @@ -207,23 +210,23 @@ - (void)commitWithMessage:(NSString *)commitMessage andVerify:(BOOL) doVerify commitMessage = [NSString stringWithContentsOfFile:commitMessageFile encoding:NSUTF8StringEncoding error:nil]; - NSString *commit = [repository outputForArguments:arguments + NSString *commit = [self.repository outputForArguments:arguments inputString:commitMessage - byExtendingEnvironment:amendEnvironment + byExtendingEnvironment:self.amendEnvironment retValue: &ret]; if (ret || [commit length] != 40) return [self postCommitFailure:@"Could not create a commit object"]; [self postCommitUpdate:@"Updating HEAD"]; - [repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-m", commitSubject, @"HEAD", commit, nil] - retValue: &ret]; + [self.repository outputForArguments:[NSArray arrayWithObjects:@"update-ref", @"-m", commitSubject, @"HEAD", commit, nil] + retValue: &ret]; if (ret) return [self postCommitFailure:@"Could not update HEAD"]; [self postCommitUpdate:@"Running post-commit hook"]; - BOOL success = [repository executeHook:@"post-commit" output:nil]; + BOOL success = [self.repository executeHook:@"post-commit" output:nil]; NSMutableDictionary *userInfo = [NSMutableDictionary dictionaryWithObject:[NSNumber numberWithBool:success] forKey:@"success"]; NSString *description; if (success) @@ -240,10 +243,10 @@ - (void)commitWithMessage:(NSString *)commitMessage andVerify:(BOOL) doVerify if (!success) return; - repository.hasChanged = YES; + self.repository.hasChanged = YES; - amendEnvironment = nil; - if (amend) + self.amendEnvironment = nil; + if (self.amend) self.amend = NO; else [self refresh]; @@ -310,9 +313,9 @@ - (BOOL)stageFiles:(NSArray *)stageFiles int ret = 1; - [repository outputForArguments:[NSArray arrayWithObjects:@"update-index", @"--add", @"--remove", @"-z", @"--stdin", nil] - inputString:input - retValue:&ret]; + [self.repository outputForArguments:[NSArray arrayWithObjects:@"update-index", @"--add", @"--remove", @"-z", @"--stdin", nil] + inputString:input + retValue:&ret]; if (ret) { [self postOperationFailed:[NSString stringWithFormat:@"Error in staging files. Return value: %i", ret]]; @@ -365,10 +368,10 @@ - (BOOL)unstageFiles:(NSArray *)unstageFiles } int ret = 1; - [repository outputForArguments:[NSArray arrayWithObjects:@"update-index", @"-z", @"--index-info", nil] - inputString:input - retValue:&ret]; - + [self.repository outputForArguments:[NSArray arrayWithObjects:@"update-index", @"-z", @"--index-info", nil] + inputString:input + retValue:&ret]; + if (ret) { [self postOperationFailed:[NSString stringWithFormat:@"Error in unstaging files. Return value: %i", ret]]; @@ -401,7 +404,7 @@ - (void)discardChangesForFiles:(NSArray *)discardFiles NSArray *arguments = [NSArray arrayWithObjects:@"checkout-index", @"--index", @"--quiet", @"--force", @"-z", @"--stdin", nil]; int ret = 1; - [PBEasyPipe outputForCommand:[PBGitBinary path] withArgs:arguments inDir:[workingDirectory path] inputString:input retValue:&ret]; + [PBEasyPipe outputForCommand:[PBGitBinary path] withArgs:arguments inDir:self.repository.workingDirectoryURL.path inputString:input retValue:&ret]; if (ret) { [self postOperationFailed:[NSString stringWithFormat:@"Discarding changes failed with return value %i", ret]]; @@ -424,9 +427,9 @@ - (BOOL)applyPatch:(NSString *)hunk stage:(BOOL)stage reverse:(BOOL)reverse; [array addObject:@"--reverse"]; int ret = 1; - NSString *error = [repository outputForArguments:array - inputString:hunk - retValue:&ret]; + NSString *error = [self.repository outputForArguments:array + inputString:hunk + retValue:&ret]; if (ret) { [self postOperationFailed:[NSString stringWithFormat:@"Applying patch failed with return value %i. Error: %@", ret, error]]; @@ -446,26 +449,26 @@ - (NSString *)diffForFile:(PBChangedFile *)file staged:(BOOL)staged contextLines NSString *indexPath = [@":0:" stringByAppendingString:file.path]; if (file.status == NEW) - return [repository outputForArguments:[NSArray arrayWithObjects:@"show", indexPath, nil]]; + return [self.repository outputForArguments:[NSArray arrayWithObjects:@"show", indexPath, nil]]; - return [repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"diff-index", parameter, @"--cached", [self parentTree], @"--", file.path, nil]]; + return [self.repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"diff-index", parameter, @"--cached", [self parentTree], @"--", file.path, nil]]; } // unstaged if (file.status == NEW) { NSStringEncoding encoding; NSError *error = nil; - NSString *path = [[repository workingDirectory] stringByAppendingPathComponent:file.path]; - NSString *contents = [NSString stringWithContentsOfFile:path - usedEncoding:&encoding - error:&error]; + NSURL *fileURL = [self.repository.workingDirectoryURL URLByAppendingPathComponent:file.path]; + NSString *contents = [NSString stringWithContentsOfURL:fileURL + usedEncoding:&encoding + error:&error]; if (error) return nil; return contents; } - return [repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"diff-files", parameter, @"--", file.path, nil]]; + return [self.repository outputInWorkdirForArguments:[NSArray arrayWithObjects:@"diff-files", parameter, @"--", file.path, nil]]; } - (void)postIndexChange @@ -502,32 +505,32 @@ - (void)indexRefreshFinished:(NSNotification *)notification // Now that the index is refreshed, we need to read the information from the index NSNotificationCenter *nc = [NSNotificationCenter defaultCenter]; - if ([repository isBareRepository]) + if ([self.repository isBareRepository]) { return; } // Other files (not tracked, not ignored) - refreshStatus++; + self.refreshStatus++; NSFileHandle *handle = [PBEasyPipe handleForCommand:[PBGitBinary path] withArgs:[NSArray arrayWithObjects:@"ls-files", @"--others", @"--exclude-standard", @"-z", nil] - inDir:[workingDirectory path]]; + inDir:self.repository.workingDirectoryURL.path]; [nc addObserver:self selector:@selector(readOtherFiles:) name:NSFileHandleReadToEndOfFileCompletionNotification object:handle]; [handle readToEndOfFileInBackgroundAndNotify]; // Unstaged files - refreshStatus++; + self.refreshStatus++; handle = [PBEasyPipe handleForCommand:[PBGitBinary path] withArgs:[NSArray arrayWithObjects:@"diff-files", @"-z", nil] - inDir:[workingDirectory path]]; + inDir:self.repository.workingDirectoryURL.path]; [nc addObserver:self selector:@selector(readUnstagedFiles:) name:NSFileHandleReadToEndOfFileCompletionNotification object:handle]; [handle readToEndOfFileInBackgroundAndNotify]; // Staged files - refreshStatus++; + self.refreshStatus++; handle = [PBEasyPipe handleForCommand:[PBGitBinary path] withArgs:[NSArray arrayWithObjects:@"diff-index", @"--cached", @"-z", [self parentTree], nil] - inDir:[workingDirectory path]]; + inDir:self.repository.workingDirectoryURL.path]; [nc addObserver:self selector:@selector(readStagedFiles:) name:NSFileHandleReadToEndOfFileCompletionNotification object:handle]; [handle readToEndOfFileInBackgroundAndNotify]; } @@ -568,7 +571,7 @@ - (void) readUnstagedFiles:(NSNotification *)notification - (void) addFilesFromDictionary:(NSMutableDictionary *)dictionary staged:(BOOL)staged tracked:(BOOL)tracked { // Iterate over all existing files - for (PBChangedFile *file in files) { + for (PBChangedFile *file in self.files) { NSArray *fileStatus = [dictionary objectForKey:file.path]; // Object found, this is still a cached / uncached thing if (fileStatus) { @@ -639,7 +642,7 @@ - (void) addFilesFromDictionary:(NSMutableDictionary *)dictionary staged:(BOOL)s file.hasStagedChanges = staged; file.hasUnstagedChanges = !staged; - [files addObject:file]; + [self.files addObject:file]; } [self didChangeValueForKey:@"indexChanges"]; } @@ -692,7 +695,7 @@ - (NSMutableDictionary *)dictionaryForLines:(NSArray *)lines - (void)indexStepComplete { // if we're still busy, do nothing :) - if (--refreshStatus) { + if (--self.refreshStatus) { [self postIndexChange]; return; } @@ -702,7 +705,7 @@ - (void)indexStepComplete // staged or unstaged files, and delete them NSMutableArray *deleteFiles = [NSMutableArray array]; - for (PBChangedFile *file in files) { + for (PBChangedFile *file in self.files) { if (!file.hasStagedChanges && !file.hasUnstagedChanges) [deleteFiles addObject:file]; } @@ -710,7 +713,7 @@ - (void)indexStepComplete if ([deleteFiles count]) { [self willChangeValueForKey:@"indexChanges"]; for (PBChangedFile *file in deleteFiles) - [files removeObject:file]; + [self.files removeObject:file]; [self didChangeValueForKey:@"indexChanges"]; } diff --git a/Classes/git/PBGitRepository.h b/Classes/git/PBGitRepository.h index 5664984c9..8cfb99971 100644 --- a/Classes/git/PBGitRepository.h +++ b/Classes/git/PBGitRepository.h @@ -49,7 +49,7 @@ static NSString * PBStringFromBranchFilterType(PBGitXBranchFilterType type) { @interface PBGitRepository : NSDocument { __strong PBGitRepositoryWatcher *watcher; __strong PBGitRevSpecifier *_headRef; // Caching - __strong GTOID* _headSha; + __strong GTOID* _headOID; __strong GTRepository* _gtRepo; } @@ -102,8 +102,9 @@ static NSString * PBStringFromBranchFilterType(PBGitXBranchFilterType type) { - (BOOL)executeHook:(NSString *)name output:(NSString **)output GITX_DEPRECATED; - (BOOL)executeHook:(NSString *)name withArgs:(NSArray*) arguments output:(NSString **)output GITX_DEPRECATED; -- (NSString *)workingDirectory; -- (NSString *) projectName; +- (NSString *)workingDirectory GITX_DEPRECATED; +- (NSURL *)workingDirectoryURL; +- (NSString *)projectName; - (NSString *)gitIgnoreFilename; - (BOOL)isBareRepository; @@ -112,13 +113,13 @@ static NSString * PBStringFromBranchFilterType(PBGitXBranchFilterType type) { - (void) reloadRefs; - (void) lazyReload; - (PBGitRevSpecifier*)headRef; -- (GTOID *)headSHA; +- (GTOID *)headOID; - (PBGitCommit *)headCommit; -- (GTOID *)shaForRef:(PBGitRef *)ref; +- (GTOID *)OIDForRef:(PBGitRef *)ref; - (PBGitCommit *)commitForRef:(PBGitRef *)ref; -- (PBGitCommit *)commitForSHA:(GTOID *)sha; -- (BOOL)isOnSameBranch:(GTOID *)baseSHA asSHA:(GTOID *)testSHA; -- (BOOL)isSHAOnHeadBranch:(GTOID *)testSHA; +- (PBGitCommit *)commitForOID:(GTOID *)sha; +- (BOOL)isOIDOnSameBranch:(GTOID *)baseOID asOID:(GTOID *)testOID; +- (BOOL)isOIDOnHeadBranch:(GTOID *)testOID; - (BOOL)isRefOnHeadBranch:(PBGitRef *)testRef; - (BOOL)checkRefFormat:(NSString *)refName; - (BOOL)refExists:(PBGitRef *)ref; @@ -142,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 diff --git a/Classes/git/PBGitRepository.m b/Classes/git/PBGitRepository.m index 2ad0a6418..2a066b739 100644 --- a/Classes/git/PBGitRepository.m +++ b/Classes/git/PBGitRepository.m @@ -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 @@ -281,11 +328,16 @@ - (void) reloadRefs { // clear out ref caches _headRef = nil; - _headSha = nil; + _headOID = nil; self->refs = [NSMutableDictionary dictionary]; NSError* error = nil; NSArray* allRefs = [self.gtRepo referenceNamesWithError:&error]; + + if ([self.gtRepo isHEADDetached]) { + // Add HEAD when we're detached + allRefs = [allRefs arrayByAddingObject:@"HEAD"]; + } // load all named refs NSMutableOrderedSet *oldBranches = [self.branchesSet mutableCopy]; @@ -349,25 +401,25 @@ - (PBGitRevSpecifier *)headRef else _headRef = [[PBGitRevSpecifier alloc] initWithRef:[PBGitRef refFromString:@"HEAD"]]; - _headSha = [self shaForRef:[_headRef ref]]; + _headOID = [self OIDForRef:[_headRef ref]]; return _headRef; } -- (GTOID *)headSHA +- (GTOID *)headOID { - if (! _headSha) + if (! _headOID) [self headRef]; - return _headSha; + return _headOID; } - (PBGitCommit *)headCommit { - return [self commitForSHA:[self headSHA]]; + return [self commitForOID:self.headOID]; } -- (GTOID *)shaForRef:(PBGitRef *)ref +- (GTOID *)OIDForRef:(PBGitRef *)ref { if (!ref) return nil; @@ -394,18 +446,7 @@ - (GTOID *)shaForRef:(PBGitRef *)ref NSLog(@"Error looking up ref for %@", ref.ref); return nil; } - const git_oid* refOid = gtRef.git_oid; - - if (refOid) - { - char buffer[41]; - buffer[40] = '\0'; - git_oid_fmt(buffer, refOid); - NSString* shaForRef = [NSString stringWithUTF8String:buffer]; - GTOID* result = [GTOID oidWithSHA: shaForRef]; - return result; - } - return nil; + return gtRef.OID; } - (PBGitCommit *)commitForRef:(PBGitRef *)ref @@ -413,10 +454,10 @@ - (PBGitCommit *)commitForRef:(PBGitRef *)ref if (!ref) return nil; - return [self commitForSHA:[self shaForRef:ref]]; + return [self commitForOID:[self OIDForRef:ref]]; } -- (PBGitCommit *)commitForSHA:(GTOID *)sha +- (PBGitCommit *)commitForOID:(GTOID *)sha { if (!sha) return nil; @@ -427,50 +468,50 @@ - (PBGitCommit *)commitForSHA:(GTOID *)sha revList = revisionList.projectCommits; } for (PBGitCommit *commit in revList) - if ([[commit sha] isEqual:sha]) + if ([commit.OID isEqual:sha]) return commit; return nil; } -- (BOOL)isOnSameBranch:(GTOID *)branchSHA asSHA:(GTOID *)testSHA +- (BOOL)isOIDOnSameBranch:(GTOID *)branchOID asOID:(GTOID *)testOID { - if (!branchSHA || !testSHA) + if (!branchOID || !testOID) return NO; - if ([testSHA isEqual:branchSHA]) + if ([testOID isEqual:branchOID]) return YES; NSArray *revList = revisionList.projectCommits; - NSMutableSet *searchSHAs = [NSMutableSet setWithObject:branchSHA]; + NSMutableSet *searchOIDs = [NSMutableSet setWithObject:branchOID]; for (PBGitCommit *commit in revList) { - GTOID *commitSHA = [commit sha]; - if ([searchSHAs containsObject:commitSHA]) { - if ([testSHA isEqual:commitSHA]) + GTOID *commitOID = commit.OID; + if ([searchOIDs containsObject:commitOID]) { + if ([testOID isEqual:commitOID]) return YES; - [searchSHAs removeObject:commitSHA]; - [searchSHAs addObjectsFromArray:commit.parents]; + [searchOIDs removeObject:commitOID]; + [searchOIDs addObjectsFromArray:commit.parents]; } - else if ([testSHA isEqual:commitSHA]) + else if ([testOID isEqual:commitOID]) return NO; } return NO; } -- (BOOL)isSHAOnHeadBranch:(GTOID *)testSHA +- (BOOL)isOIDOnHeadBranch:(GTOID *)testOID { - if (!testSHA) + if (!testOID) return NO; - GTOID *headSHA = [self headSHA]; + GTOID *headOID = self.headOID; - if ([testSHA isEqual:headSHA]) + if ([testOID isEqual:headOID]) return YES; - return [self isOnSameBranch:headSHA asSHA:testSHA]; + return [self isOIDOnSameBranch:headOID asOID:testOID]; } - (BOOL)isRefOnHeadBranch:(PBGitRef *)testRef @@ -478,7 +519,7 @@ - (BOOL)isRefOnHeadBranch:(PBGitRef *)testRef if (!testRef) return NO; - return [self isSHAOnHeadBranch:[self shaForRef:testRef]]; + return [self isOIDOnHeadBranch:[self OIDForRef:testRef]]; } - (BOOL) checkRefFormat:(NSString *)refName @@ -566,18 +607,13 @@ - (void) readCurrentBranch self.currentBranch = [self addBranch: [self headRef]]; } -- (NSString *) workingDirectory +- (NSURL *)workingDirectoryURL { + return self.gtRepo.fileURL; +} + +- (NSString *)workingDirectory { - const char* workdir = git_repository_workdir(self.gtRepo.git_repository); - if (workdir) - { - NSString* result = [[NSString stringWithUTF8String:workdir] stringByStandardizingPath]; - return result; - } - else - { - return self.fileURL.path; - } + return [self.workingDirectoryURL path]; } #pragma mark Remotes diff --git a/Classes/git/PBGitTree.m b/Classes/git/PBGitTree.m index bf782aa1e..df857bc41 100644 --- a/Classes/git/PBGitTree.m +++ b/Classes/git/PBGitTree.m @@ -23,7 +23,7 @@ + (PBGitTree*) rootForCommit:(id) commit PBGitTree* tree = [[self alloc] init]; tree.parent = nil; tree.leaf = NO; - tree.sha = [c realSha]; + tree.sha = c.SHA; tree.repository = c.repository; tree.path = @""; return tree; diff --git a/html/views/history/history.js b/html/views/history/history.js index 4fdf88495..3acbc1c59 100644 --- a/html/views/history/history.js +++ b/html/views/history/history.js @@ -8,7 +8,7 @@ var Commit = function(obj) { this.refs = obj.refs(); this.author_name = obj.author(); this.committer_name = obj.committer(); - this.sha = obj.realSha(); + this.sha = obj.SHA(); this.parents = obj.parents(); this.subject = obj.subject(); this.notificationID = null;