Skip to content

Commit 7af30a7

Browse files
committed
Load commit summaries with ObjectiveGit
1 parent 98f685f commit 7af30a7

File tree

4 files changed

+139
-162
lines changed

4 files changed

+139
-162
lines changed

Classes/Controllers/PBWebHistoryController.m

Lines changed: 64 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,20 @@ - (void) changeContentToMultipleSelectionMessage {
6969
[[self script] callWebScriptMethod:@"showMultipleSelectionMessage" withArguments:arguments];
7070
}
7171

72+
static NSString *deltaTypeName(GTDiffDeltaType t) {
73+
switch (t) {
74+
case GTDiffFileDeltaUnmodified: return @"unmodified";
75+
case GTDiffFileDeltaAdded: return @"added";
76+
case GTDiffFileDeltaDeleted: return @"removed";
77+
case GTDiffFileDeltaModified: return @"modified";
78+
case GTDiffFileDeltaRenamed: return @"renamed";
79+
case GTDiffFileDeltaCopied: return @"copied";
80+
case GTDiffFileDeltaIgnored: return @"ignored";
81+
case GTDiffFileDeltaUntracked: return @"untracked";
82+
case GTDiffFileDeltaTypeChange: return @"type changed";
83+
}
84+
}
85+
7286
- (void) changeContentToCommit:(PBGitCommit *)commit
7387
{
7488
// The sha is the same, but refs may have changed. reload it lazy
@@ -78,7 +92,7 @@ - (void) changeContentToCommit:(PBGitCommit *)commit
7892
return;
7993
}
8094

81-
NSArray *arguments = [NSArray arrayWithObjects:commit, [[[historyController repository] headRef] simpleRef], nil];
95+
NSArray *arguments = @[commit, [[[historyController repository] headRef] simpleRef]];
8296
id scriptResult = [[self script] callWebScriptMethod:@"loadCommit" withArguments: arguments];
8397
if (!scriptResult) {
8498
// the web view is not really ready for scripting???
@@ -87,39 +101,60 @@ - (void) changeContentToCommit:(PBGitCommit *)commit
87101
}
88102
currentOID = commit.OID;
89103

90-
// Now we load the extended details. We used to do this in a separate thread,
91-
// but this caused some funny behaviour because NSTask's and NSThread's don't really
92-
// like each other. Instead, just do it async.
93-
94-
NSMutableArray *taskArguments = [NSMutableArray arrayWithObjects:@"show", @"--numstat", @"-M", @"--summary", @"--pretty=raw", currentOID.SHA, nil];
104+
GTDiffFindOptionsFlags flags = GTDiffFindOptionsFlagsFindRenames;
95105
if (![PBGitDefaults showWhitespaceDifferences]) {
96-
[taskArguments insertObject:@"-w" atIndex:1];
106+
flags |= GTDiffFindOptionsFlagsIgnoreWhitespace;
97107
}
98-
99-
NSFileHandle *handle = [repository handleForArguments:taskArguments];
100-
NSNotificationCenter *nc = [NSNotificationCenter defaultCenter];
101-
// Remove notification, in case we have another one running
102-
[nc removeObserver:self name:NSFileHandleReadToEndOfFileCompletionNotification object:nil];
103-
[nc addObserver:self selector:@selector(commitSummaryLoaded:) name:NSFileHandleReadToEndOfFileCompletionNotification object:handle];
104-
[handle readToEndOfFileInBackgroundAndNotify];
105-
}
106-
107-
- (void)commitSummaryLoaded:(NSNotification *)notification
108-
{
109-
[[NSNotificationCenter defaultCenter] removeObserver:self name:NSFileHandleReadToEndOfFileCompletionNotification object:nil];
110-
111-
NSData *data = [[notification userInfo] valueForKey:NSFileHandleNotificationDataItem];
112-
if (!data)
108+
NSError *err = nil;
109+
GTDiff *d = // TODO async?
110+
[GTDiff diffOldTree:commit.gtCommit.parents.firstObject.tree
111+
withNewTree:commit.gtCommit.tree
112+
inRepository:[repository gtRepo]
113+
options:@{
114+
GTDiffFindOptionsFlagsKey : @(flags)
115+
}
116+
error:&err];
117+
if (!d) {
118+
NSLog(@"Commit summary diff error: %@", err);
113119
return;
114-
115-
NSString *summary = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
116-
if (!summary)
117-
summary = [[NSString alloc] initWithData:data encoding:NSISOLatin1StringEncoding];
118-
119-
if (!summary)
120+
}
121+
NSMutableArray *fileDeltas = [NSMutableArray array];
122+
[d enumerateDeltasUsingBlock:^(GTDiffDelta *_Nonnull delta, BOOL *_Nonnull stop) {
123+
NSUInteger numLinesAdded = 0;
124+
NSUInteger numLinesRemoved = 0;
125+
NSError *err = nil;
126+
GTDiffPatch *patch = [delta generatePatch:&err];
127+
if (patch) {
128+
numLinesAdded = patch.addedLinesCount;
129+
numLinesRemoved = patch.deletedLinesCount;
130+
} else {
131+
NSLog(@"generatePatch error: %@", err);
132+
}
133+
[fileDeltas addObject:@{
134+
@"filename" : delta.newFile.path,
135+
@"oldFilename" : delta.oldFile.path,
136+
@"newFilename" : delta.newFile.path,
137+
@"changeType" : deltaTypeName(delta.type),
138+
@"numLinesAdded" : @(numLinesAdded),
139+
@"numLinesRemoved" : @(numLinesRemoved),
140+
@"binary" :
141+
[NSNumber numberWithBool:(delta.flags & GTDiffFileFlagBinary) != 0],
142+
}];
143+
}];
144+
NSDictionary *summaryDict = @{
145+
@"filesInfo" : fileDeltas,
146+
};
147+
NSString *summary =
148+
[[NSString alloc] initWithData:[NSJSONSerialization dataWithJSONObject:summaryDict
149+
options:0
150+
error:&err]
151+
encoding:NSUTF8StringEncoding];
152+
if (!summary) {
153+
NSLog(@"Commit summary JSON error: %@", err);
120154
return;
155+
}
121156

122-
[self.view.windowScriptObject callWebScriptMethod:@"loadCommitSummary" withArguments:[NSArray arrayWithObject:summary]];
157+
[self.view.windowScriptObject callWebScriptMethod:@"loadCommitSummary" withArguments:@[summary]];
123158

124159
// Now load the full diff
125160
NSMutableArray *taskArguments = [NSMutableArray arrayWithObjects:@"show", @"--pretty=raw", @"-M", @"--no-color", currentOID.SHA, nil];

Classes/git/PBGitCommit.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,12 +21,18 @@ extern NSString * const kGitXCommitType;
2121

2222
@property (nonatomic, weak, readonly) PBGitRepository* repository;
2323

24+
@property (nonatomic, strong, readonly) GTCommit *gtCommit;
2425
@property (nonatomic, strong, readonly) GTOID *OID;
2526

2627
@property (nonatomic, strong, readonly) NSDate *date;
2728
@property (nonatomic, strong, readonly) NSString *subject;
29+
@property (nonatomic, strong, readonly) NSString *message;
2830
@property (nonatomic, strong, readonly) NSString *author;
31+
@property (nonatomic, strong, readonly) NSString *authorEmail;
32+
@property (nonatomic, strong, readonly) NSString *authorDate;
2933
@property (nonatomic, strong, readonly) NSString *committer;
34+
@property (nonatomic, strong, readonly) NSString *committerEmail;
35+
@property (nonatomic, strong, readonly) NSString *committerDate;
3036
@property (nonatomic, strong, readonly) NSString *details;
3137
@property (nonatomic, strong, readonly) NSString *patch;
3238
@property (nonatomic, strong, readonly) NSString *SHA;

Classes/git/PBGitCommit.m

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,18 @@ @interface PBGitCommit ()
2828

2929
@implementation PBGitCommit
3030

31+
+ (NSDateFormatter *)longDateFormatter {
32+
static NSDateFormatter *formatter = nil;
33+
static dispatch_once_t token;
34+
dispatch_once(&token, ^{
35+
NSDateFormatter *f = [[NSDateFormatter alloc] init];
36+
f.dateStyle = NSDateFormatterLongStyle;
37+
f.timeStyle = NSDateFormatterLongStyle;
38+
formatter = f;
39+
});
40+
return formatter;
41+
}
42+
3143
- (NSDate *) date
3244
{
3345
return self.gtCommit.commitDate;
@@ -76,18 +88,43 @@ - (NSString *)subject
7688
return self.gtCommit.messageSummary;
7789
}
7890

91+
- (NSString *)message
92+
{
93+
return self.gtCommit.message;
94+
}
95+
7996
- (NSString *)author
8097
{
8198
NSString *result = self.gtCommit.author.name;
8299
return result;
83100
}
84101

102+
- (NSString *)authorEmail
103+
{
104+
return self.gtCommit.author.email;
105+
}
106+
107+
- (NSString *)authorDate
108+
{
109+
return [[[self class] longDateFormatter] stringFromDate:self.gtCommit.author.time];
110+
}
111+
85112
- (NSString *)committer
86113
{
87114
GTSignature *sig = self.gtCommit.committer;
88115
return sig.name;
89116
}
90117

118+
- (NSString *)committerEmail
119+
{
120+
return self.gtCommit.committer.email;
121+
}
122+
123+
- (NSString *)committerDate
124+
{
125+
return [[[self class] longDateFormatter] stringFromDate:self.gtCommit.committer.time];
126+
}
127+
91128
- (NSString *)SVNRevision
92129
{
93130
NSString *result = nil;

0 commit comments

Comments
 (0)