diff --git a/PBGitHistoryController.m b/PBGitHistoryController.m index 1de0764..c61a464 100644 --- a/PBGitHistoryController.m +++ b/PBGitHistoryController.m @@ -516,14 +516,8 @@ - (void)showCommitsFromTree:(id)sender { - // TODO: Enable this from webview as well! - - NSMutableArray *filePaths = [NSMutableArray arrayWithObjects:@"HEAD", @"--", NULL]; - [filePaths addObjectsFromArray:[sender representedObject]]; - - PBGitRevSpecifier *revSpec = [[PBGitRevSpecifier alloc] initWithParameters:filePaths]; - - repository.currentBranch = [repository addBranch:revSpec]; + NSString *searchString = [(NSArray *)[sender representedObject] componentsJoinedByString:@" "]; + [searchController setHistorySearch:searchString mode:kGitXPathSearchMode]; } - (void)showInFinderAction:(id)sender diff --git a/PBHistorySearchController.h b/PBHistorySearchController.h index c3e6459..d439906 100644 --- a/PBHistorySearchController.h +++ b/PBHistorySearchController.h @@ -13,6 +13,7 @@ typedef enum historySearchModes { kGitXBasicSeachMode = 1, kGitXPickaxeSearchMode, kGitXRegexSearchMode, + kGitXPathSearchMode, kGitXMaxSearchMode // always keep this item last } PBHistorySearchMode; diff --git a/PBHistorySearchController.m b/PBHistorySearchController.m index 2281da9..d59db39 100644 --- a/PBHistorySearchController.m +++ b/PBHistorySearchController.m @@ -35,6 +35,7 @@ #define kGitXBasicSearchLabel @"Subject, Author, SHA" #define kGitXPickaxeSearchLabel @"Commit (pickaxe)" #define kGitXRegexSearchLabel @"Commit (pickaxe regex)" +#define kGitXPathSearchLabel @"File path" #define kGitXSearchArrangedObjectsContext @"GitXSearchArrangedObjectsContext" @@ -244,6 +245,11 @@ item = [[NSMenuItem alloc] initWithTitle:kGitXRegexSearchLabel action:@selector(selectSearchMode:) keyEquivalent:@""]; [item setTarget:self]; [item setTag:kGitXRegexSearchMode]; + [searchMenu addItem:item]; + + item = [[NSMenuItem alloc] initWithTitle:kGitXPathSearchLabel action:@selector(selectSearchMode:) keyEquivalent:@""]; + [item setTarget:self]; + [item setTag:kGitXPathSearchMode]; [searchMenu addItem:item]; item = [NSMenuItem separatorItem]; @@ -289,6 +295,9 @@ item = [searchMenu itemWithTag:kGitXRegexSearchMode]; [item setState:(searchMode == kGitXRegexSearchMode) ? NSOnState : NSOffState]; + item = [searchMenu itemWithTag:kGitXPathSearchMode]; + [item setState:(searchMode == kGitXPathSearchMode) ? NSOnState : NSOffState]; + [[searchField cell] setSearchMenuTemplate:searchMenu]; [PBGitDefaults setHistorySearchMode:searchMode]; @@ -303,6 +312,9 @@ case kGitXRegexSearchMode: [[searchField cell] setPlaceholderString:kGitXRegexSearchLabel]; break; + case kGitXPathSearchMode: + [[searchField cell] setPlaceholderString:kGitXPathSearchLabel]; + break; default: [[searchField cell] setPlaceholderString:kGitXBasicSearchLabel]; break; @@ -372,7 +384,7 @@ -#pragma mark Pickaxe/Regex Search +#pragma mark Background Search - (void)startBackgroundSearch { @@ -390,9 +402,20 @@ results = nil; - NSMutableArray *searchArguments = [NSMutableArray arrayWithObjects:@"log", @"--pretty=format:%H", [NSString stringWithFormat:@"-S%@", searchString], nil]; - if (self.searchMode == kGitXRegexSearchMode) - [searchArguments insertObject:@"--pickaxe-regex" atIndex:1]; + NSMutableArray *searchArguments = [NSMutableArray arrayWithObjects:@"log", @"--pretty=format:%H", nil]; + switch (self.searchMode) { + case kGitXRegexSearchMode: + [searchArguments addObject:@"--pickaxe-regex"]; + case kGitXPickaxeSearchMode: + [searchArguments addObject:[NSString stringWithFormat:@"-S%@", searchString]]; + break; + case kGitXPathSearchMode: + [searchArguments addObject:@"--"]; + [searchArguments addObjectsFromArray:[searchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]]; + break; + default: + return; + } backgroundSearchTask = [PBEasyPipe taskForCommand:[PBGitBinary path] withArgs:searchArguments inDir:[[historyController.repository fileURL] path]]; [backgroundSearchTask launch]; diff --git a/gitx.m b/gitx.m index f213977..05f2aa8 100644 --- a/gitx.m +++ b/gitx.m @@ -71,6 +71,8 @@ void usage(char const *programName) printf(" commits that introduce or remove an instance of \n"); printf(" -r, --regex=\n"); printf(" commits that introduce or remove strings that match \n"); + printf(" -p, --path=\n"); + printf(" commits that modify the file at file path\n"); printf("\n"); printf("Creating repositories\n"); printf(" These commands will create a git repository and then open it up in GitX\n"); @@ -214,10 +216,12 @@ void handleClone(NSURL *repositoryURL, NSMutableArray *arguments) #define kPickaxeSearch @"--Search=" #define kShortRegexSearch @"-r" #define kRegexSearch @"--regex=" +#define kShortPathSearch @"-p" +#define kPathSearch @"--path=" NSArray *commandLineSearchPrefixes() { - return [NSArray arrayWithObjects:kShortBasicSearch, kBasicSearch, kShortPickaxeSearch, kPickaxeSearch, kShortRegexSearch, kRegexSearch, nil]; + return [NSArray arrayWithObjects:kShortBasicSearch, kBasicSearch, kShortPickaxeSearch, kPickaxeSearch, kShortRegexSearch, kRegexSearch, kShortPathSearch, kPathSearch, nil]; } PBHistorySearchMode searchModeForCommandLineArgument(NSString *argument) @@ -231,6 +235,9 @@ PBHistorySearchMode searchModeForCommandLineArgument(NSString *argument) if ([argument hasPrefix:kShortRegexSearch] || [argument hasPrefix:kRegexSearch]) return kGitXRegexSearchMode; + if ([argument hasPrefix:kShortPathSearch] || [argument hasPrefix:kPathSearch]) + return kGitXPathSearchMode; + return 0; }