-
Notifications
You must be signed in to change notification settings - Fork 0
/
CommitsLog.m
170 lines (147 loc) · 5.48 KB
/
CommitsLog.m
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
//
// CommitsLog.m
// GitBuddy
//
// Created by Stanislav Yudin on 22/9/2010.
// Copyright 2010 Endless Insomnia Labs. All rights reserved.
//
#import "CommitsLog.h"
#import "Highlight.h"
#import "GitWrapper.h"
#import "GitBuddy.h"
@implementation CommitsLog
@synthesize projectRoot, currentPath, filesTableView;
@synthesize commitSource, folder, parentFolder, selectedFile;
- (void) dealloc
{
[filesTableView release];
[projectRoot release];
[currentPath release];
[filesTableView release];
[selectedFile release];
[super dealloc];
}
- (void) setCurrentPath:(NSString*)path
{
if (currentPath) {
[currentPath release];
}
currentPath = path;
[currentPath retain];
if ([currentPath isEqual:[NSString stringWithString:@"/"]]) {
[[self parentFolder] setEnabled:NO];
}
else {
[[self parentFolder] setEnabled:YES];
}
[folder setStringValue:[NSString stringWithFormat:@"Files at %@", [self currentPath]]];
}
- (IBAction) revertToRevision:(id)sender
{
NSArray *commit = [commitSource selectedCommit];
if (commit) {
int rc = NSRunInformationalAlertPanel([NSString stringWithFormat:@"Revert %@ to commit %@?", [self selectedFile], [commit objectAtIndex:0]], [NSString stringWithFormat:@"You are about to revert your current %@ to what it was %@", [self selectedFile], [commit objectAtIndex:1]], @"Yes", @"No", nil);
if (rc == 1) {
GitWrapper *wrapper = [GitWrapper sharedInstance];
NSString *repoArg = [NSString stringWithFormat:@"--repo=%@", [self projectRoot]];
NSString *resetArg = [NSString stringWithFormat:@"--reset=%@", [self selectedFile]];
NSString *idArg = [NSString stringWithFormat:@"--sha256=%@", [commit objectAtIndex:0]];
[wrapper executeGit:[NSArray arrayWithObjects:repoArg, resetArg, idArg, nil] withCompletionBlock:^(NSDictionary *dict){
[ (GitBuddy*)[NSApp delegate] rescanRepoAtPath:[self projectRoot]];
NSLog(@"File %@ was reset to %@", [self selectedFile], [commit objectAtIndex:0]);
[[[commitSource diffSource] tableView] reloadData];
}];
}
}
}
- (IBAction) goToParentFolder:(id)sender
{
if ([currentPath isEqual:[NSString stringWithString:@"/"]]) {
return;
}
NSArray *components = [currentPath pathComponents];
NSString *newCurrentPath = [[components subarrayWithRange:NSMakeRange(0, [components count] - 1)] componentsJoinedByString:@"/"];
NSLog(@"Change directory to %@", newCurrentPath);
[self setCurrentPath:newCurrentPath];
[[self filesTableView] reloadData];}
- (void) fileDoubleClicked
{
int index = [[self filesTableView] clickedRow];
NSArray *contents = [self currentFolderFiles];
NSString *clickedPath = [contents objectAtIndex:index];
NSString *currentFullPath = [[self projectRoot] stringByAppendingPathComponent:[self currentPath]];
NSString *cdToPath = [currentFullPath stringByAppendingPathComponent:clickedPath];
BOOL isDir = NO;
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr fileExistsAtPath:cdToPath isDirectory:&isDir];
if (isDir) {
[self setCurrentPath:[[self currentPath] stringByAppendingPathComponent:clickedPath]];
[[self filesTableView] reloadData];
}
}
- (void) initForProject:(NSString*)project
{
[[self filesTableView] setDoubleAction:@selector(fileDoubleClicked)];
[[self filesTableView] setTarget:self];
[self setProjectRoot:project];
[self setCurrentPath:@"/"];
}
- (void)tableView:(NSTableView *)aTableView willDisplayCell:(id)aCell forTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
if (aTableView == [[[self commitSource] diffSource] tableView]) {
//high light diff view
NSString *str = [[[self commitSource] diffSource] stringAtIndex:rowIndex];
[Highlight highLightCell:aCell forLine:str];
}
}
- (void)tableViewSelectionDidChange:(NSNotification *)aNotification
{
if ([aNotification object] != [[[self commitSource] diffSource] tableView]) {
int index = [[aNotification object] selectedRow];
if (index >= 0) {
NSString *listPath = [[self projectRoot] stringByAppendingPathComponent:[self currentPath]];
NSString *file = [[self currentFolderFiles] objectAtIndex:index];
BOOL isDir = NO;
NSFileManager *mgr = [NSFileManager defaultManager];
[mgr fileExistsAtPath:[listPath stringByAppendingPathComponent:file] isDirectory:&isDir];
if (!isDir) {
NSString *filePath = [[self currentPath] stringByAppendingPathComponent:file];
[self setSelectedFile:[filePath substringWithRange:NSMakeRange(1, [filePath length] -1)]];
[commitSource loadCommitsFor:[self selectedFile] inProject:[self projectRoot]];
}
}
}
}
- (NSInteger)numberOfRowsInTableView:(NSTableView *)aTableView
{
return [[self currentFolderFiles] count];
}
- (NSArray*) currentFolderFiles
{
NSFileManager *fm = [NSFileManager defaultManager];
NSError *err = nil;
NSString *fullPath = [[self projectRoot] stringByAppendingPathComponent:[self currentPath]];
NSArray *contents = [fm contentsOfDirectoryAtPath:fullPath error:&err];
if (err) {
[[NSApp delegate] presentError:err];
return 0;
}
return contents;
}
- (id)tableView:(NSTableView *)aTableView objectValueForTableColumn:(NSTableColumn *)aTableColumn row:(NSInteger)rowIndex
{
NSString *listPath = [[self projectRoot] stringByAppendingPathComponent:[self currentPath]];
NSArray *contents = [self currentFolderFiles];
NSString *file = [contents objectAtIndex:rowIndex];
NSString *col = [aTableColumn identifier];
if ([col isEqual:@"icon"]) {
return [[NSWorkspace sharedWorkspace] iconForFile:[listPath stringByAppendingPathComponent:file]];
}
else if ([col isEqual:@"file"]) {
return file;
}
else {
return nil;
}
}
@end