Skip to content

Commit c605b74

Browse files
committed
Add a File Path search mode
Highlights any commit that touches a file. The "Show history of file" context menu item will now set the path search instead of creating a rev specifier.
1 parent d77d85b commit c605b74

File tree

4 files changed

+38
-13
lines changed

4 files changed

+38
-13
lines changed

PBGitHistoryController.m

+2-8
Original file line numberDiff line numberDiff line change
@@ -516,14 +516,8 @@ - (NSMenu *)tableColumnMenu
516516

517517
- (void)showCommitsFromTree:(id)sender
518518
{
519-
// TODO: Enable this from webview as well!
520-
521-
NSMutableArray *filePaths = [NSMutableArray arrayWithObjects:@"HEAD", @"--", NULL];
522-
[filePaths addObjectsFromArray:[sender representedObject]];
523-
524-
PBGitRevSpecifier *revSpec = [[PBGitRevSpecifier alloc] initWithParameters:filePaths];
525-
526-
repository.currentBranch = [repository addBranch:revSpec];
519+
NSString *searchString = [(NSArray *)[sender representedObject] componentsJoinedByString:@" "];
520+
[searchController setHistorySearch:searchString mode:kGitXPathSearchMode];
527521
}
528522

529523
- (void)showInFinderAction:(id)sender

PBHistorySearchController.h

+1
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ typedef enum historySearchModes {
1313
kGitXBasicSeachMode = 1,
1414
kGitXPickaxeSearchMode,
1515
kGitXRegexSearchMode,
16+
kGitXPathSearchMode,
1617
kGitXMaxSearchMode // always keep this item last
1718
} PBHistorySearchMode;
1819

PBHistorySearchController.m

+27-4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ - (void)showSearchRewindPanelReverse:(BOOL)isReversed;
3535
#define kGitXBasicSearchLabel @"Subject, Author, SHA"
3636
#define kGitXPickaxeSearchLabel @"Commit (pickaxe)"
3737
#define kGitXRegexSearchLabel @"Commit (pickaxe regex)"
38+
#define kGitXPathSearchLabel @"File path"
3839

3940
#define kGitXSearchArrangedObjectsContext @"GitXSearchArrangedObjectsContext"
4041

@@ -244,6 +245,11 @@ - (void)setupSearchMenuTemplate
244245
item = [[NSMenuItem alloc] initWithTitle:kGitXRegexSearchLabel action:@selector(selectSearchMode:) keyEquivalent:@""];
245246
[item setTarget:self];
246247
[item setTag:kGitXRegexSearchMode];
248+
[searchMenu addItem:item];
249+
250+
item = [[NSMenuItem alloc] initWithTitle:kGitXPathSearchLabel action:@selector(selectSearchMode:) keyEquivalent:@""];
251+
[item setTarget:self];
252+
[item setTag:kGitXPathSearchMode];
247253
[searchMenu addItem:item];
248254

249255
item = [NSMenuItem separatorItem];
@@ -289,6 +295,9 @@ - (void)updateSearchMenuState
289295
item = [searchMenu itemWithTag:kGitXRegexSearchMode];
290296
[item setState:(searchMode == kGitXRegexSearchMode) ? NSOnState : NSOffState];
291297

298+
item = [searchMenu itemWithTag:kGitXPathSearchMode];
299+
[item setState:(searchMode == kGitXPathSearchMode) ? NSOnState : NSOffState];
300+
292301
[[searchField cell] setSearchMenuTemplate:searchMenu];
293302

294303
[PBGitDefaults setHistorySearchMode:searchMode];
@@ -303,6 +312,9 @@ - (void)updateSearchPlaceholderString
303312
case kGitXRegexSearchMode:
304313
[[searchField cell] setPlaceholderString:kGitXRegexSearchLabel];
305314
break;
315+
case kGitXPathSearchMode:
316+
[[searchField cell] setPlaceholderString:kGitXPathSearchLabel];
317+
break;
306318
default:
307319
[[searchField cell] setPlaceholderString:kGitXBasicSearchLabel];
308320
break;
@@ -372,7 +384,7 @@ - (void)startBasicSearch
372384

373385

374386

375-
#pragma mark Pickaxe/Regex Search
387+
#pragma mark Background Search
376388

377389
- (void)startBackgroundSearch
378390
{
@@ -390,9 +402,20 @@ - (void)startBackgroundSearch
390402

391403
results = nil;
392404

393-
NSMutableArray *searchArguments = [NSMutableArray arrayWithObjects:@"log", @"--pretty=format:%H", [NSString stringWithFormat:@"-S%@", searchString], nil];
394-
if (self.searchMode == kGitXRegexSearchMode)
395-
[searchArguments insertObject:@"--pickaxe-regex" atIndex:1];
405+
NSMutableArray *searchArguments = [NSMutableArray arrayWithObjects:@"log", @"--pretty=format:%H", nil];
406+
switch (self.searchMode) {
407+
case kGitXRegexSearchMode:
408+
[searchArguments addObject:@"--pickaxe-regex"];
409+
case kGitXPickaxeSearchMode:
410+
[searchArguments addObject:[NSString stringWithFormat:@"-S%@", searchString]];
411+
break;
412+
case kGitXPathSearchMode:
413+
[searchArguments addObject:@"--"];
414+
[searchArguments addObjectsFromArray:[searchString componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]]];
415+
break;
416+
default:
417+
return;
418+
}
396419

397420
backgroundSearchTask = [PBEasyPipe taskForCommand:[PBGitBinary path] withArgs:searchArguments inDir:[[historyController.repository fileURL] path]];
398421
[backgroundSearchTask launch];

gitx.m

+8-1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,8 @@ void usage(char const *programName)
7171
printf(" commits that introduce or remove an instance of <string>\n");
7272
printf(" -r<regex>, --regex=<regex>\n");
7373
printf(" commits that introduce or remove strings that match <regex>\n");
74+
printf(" -p<file path>, --path=<file path>\n");
75+
printf(" commits that modify the file at file path\n");
7476
printf("\n");
7577
printf("Creating repositories\n");
7678
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)
214216
#define kPickaxeSearch @"--Search="
215217
#define kShortRegexSearch @"-r"
216218
#define kRegexSearch @"--regex="
219+
#define kShortPathSearch @"-p"
220+
#define kPathSearch @"--path="
217221

218222
NSArray *commandLineSearchPrefixes()
219223
{
220-
return [NSArray arrayWithObjects:kShortBasicSearch, kBasicSearch, kShortPickaxeSearch, kPickaxeSearch, kShortRegexSearch, kRegexSearch, nil];
224+
return [NSArray arrayWithObjects:kShortBasicSearch, kBasicSearch, kShortPickaxeSearch, kPickaxeSearch, kShortRegexSearch, kRegexSearch, kShortPathSearch, kPathSearch, nil];
221225
}
222226

223227
PBHistorySearchMode searchModeForCommandLineArgument(NSString *argument)
@@ -231,6 +235,9 @@ PBHistorySearchMode searchModeForCommandLineArgument(NSString *argument)
231235
if ([argument hasPrefix:kShortRegexSearch] || [argument hasPrefix:kRegexSearch])
232236
return kGitXRegexSearchMode;
233237

238+
if ([argument hasPrefix:kShortPathSearch] || [argument hasPrefix:kPathSearch])
239+
return kGitXPathSearchMode;
240+
234241
return 0;
235242
}
236243

0 commit comments

Comments
 (0)