Skip to content

Commit f5039d6

Browse files
committed
Merge branch 'refs/heads/fix_diff_parser'
2 parents 2541fb5 + 2e3cdd2 commit f5039d6

File tree

2 files changed

+63
-36
lines changed

2 files changed

+63
-36
lines changed

GLFileView.m

Lines changed: 61 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -305,12 +305,12 @@ + (NSString *)parseDiff:(NSString *)txt
305305
NSScanner *scan=[NSScanner scannerWithString:txt];
306306
NSString *block;
307307

308-
if(![txt hasPrefix:@"diff --git"])
309-
[scan scanUpToString:@"diff --git" intoString:&block]; //move to first diff
308+
if(![txt hasPrefix:@"diff --"])
309+
[scan scanUpToString:@"diff --" intoString:&block]; //move to first diff
310310

311-
while([scan scanString:@"diff --git" intoString:NULL]){ // is a diff start?
312-
[scan scanUpToString:@"\ndiff --git" intoString:&block];
313-
[res appendString:[GLFileView parseDiffBlock:[NSString stringWithFormat:@"diff --git %@",block]]];
311+
while([scan scanString:@"diff --" intoString:NULL]){ // is a diff start?
312+
[scan scanUpToString:@"\ndiff --" intoString:&block];
313+
[res appendString:[GLFileView parseDiffBlock:[NSString stringWithFormat:@"diff --%@",block]]];
314314
}
315315

316316
return res;
@@ -322,7 +322,7 @@ + (NSString *)parseDiffBlock:(NSString *)txt
322322
NSScanner *scan=[NSScanner scannerWithString:txt];
323323
NSString *block;
324324

325-
[scan scanUpToString:@"\n@@ " intoString:&block];
325+
[scan scanUpToString:@"\n@@" intoString:&block];
326326
[res appendString:@"<table class='diff'><thead>"];
327327
[res appendString:[GLFileView parseDiffHeader:block]];
328328
[res appendString:@"</td></tr></thead><tbody>"];
@@ -331,9 +331,9 @@ + (NSString *)parseDiffBlock:(NSString *)txt
331331
[res appendString:[GLFileView parseBinaryDiff:block]];
332332
}
333333

334-
while([scan scanString:@"@@ " intoString:NULL]){
335-
[scan scanUpToString:@"\n@@ " intoString:&block];
336-
[res appendString:[GLFileView parseDiffChunk:[NSString stringWithFormat:@"@@ %@",block]]];
334+
while([scan scanString:@"@@" intoString:NULL]){
335+
[scan scanUpToString:@"\n@@" intoString:&block];
336+
[res appendString:[GLFileView parseDiffChunk:[NSString stringWithFormat:@"@@%@",block]]];
337337
}
338338

339339
[res appendString:@"</tbody></table>"];
@@ -376,34 +376,56 @@ + (NSString *)parseDiffChunk:(NSString *)txt
376376
NSMutableString *res=[NSMutableString string];
377377

378378
NSString *line;
379-
int l_line;
379+
int l_line[32]; // FIXME: make dynamic
380380
int r_line;
381381

382382
line=[lines nextObject];
383383
DLog(@"-=%@=-",line);
384-
NSString *header=[line substringFromIndex:3];
385-
NSRange hr = NSMakeRange(0, [header rangeOfString:@" @@"].location);
386-
header=[header substringWithRange:hr];
384+
385+
int arity = 0; /* How many files are merged here? Count the '@'! */
386+
while ([line characterAtIndex:arity] == '@')
387+
arity++;
388+
389+
NSRange hr = NSMakeRange(arity+1, [line rangeOfString:@" @@"].location-arity-1);
390+
NSString *header=[line substringWithRange:hr];
387391

388392
NSArray *pos=[header componentsSeparatedByString:@" "];
389-
NSArray *pos_l=[[pos objectAtIndex:0] componentsSeparatedByString:@","];
390-
NSArray *pos_r=[[pos objectAtIndex:1] componentsSeparatedByString:@","];
393+
NSArray *pos_r=[[pos objectAtIndex:arity-1] componentsSeparatedByString:@","];
391394

392-
l_line=abs([[pos_l objectAtIndex:0]integerValue]);
395+
for(int i=0; i<arity-1; i++){
396+
NSArray *pos_l=[[pos objectAtIndex:i] componentsSeparatedByString:@","];
397+
l_line[i]=abs([[pos_l objectAtIndex:0]integerValue]);
398+
}
393399
r_line=[[pos_r objectAtIndex:0]integerValue];
394400

395-
[res appendString:[NSString stringWithFormat:@"<tr class='header'><td colspan='3'>%@</td></tr>",line]];
401+
[res appendString:[NSString stringWithFormat:@"<tr class='header'><td colspan='%d'>%@</td></tr>",arity+1,line]];
396402
while((line=[lines nextObject])){
397-
NSString *s=[line substringToIndex:1];
398-
if([s isEqualToString:@" "]){
399-
[res appendString:[NSString stringWithFormat:@"<tr><td class='l'>%d</td><td class='r'>%d</td>",l_line++,r_line++]];
400-
}else if([s isEqualToString:@"-"]){
401-
[res appendString:[NSString stringWithFormat:@"<tr class='l'><td class='l'>%d</td><td class='r'></td>",l_line++]];
402-
}else if([s isEqualToString:@"+"]){
403-
[res appendString:[NSString stringWithFormat:@"<tr class='r'><td class='l'></td><td class='r'>%d</td>",r_line++]];
404-
}
405-
if(![s isEqualToString:@"\\"]){
406-
[res appendString:[NSString stringWithFormat:@"<td class='code'>%@</td></tr>",[line substringFromIndex:1]]];
403+
NSString *prefix=[line substringToIndex:arity-1];
404+
if([prefix rangeOfString:@"-"].location != NSNotFound){
405+
[res appendString:@"<tr class='l'>"];
406+
for(int i=0; i<arity-1; i++){
407+
if([prefix characterAtIndex:i] == '-'){
408+
[res appendString:[NSString stringWithFormat:@"<td class='l'>%d</td>",l_line[i]++]];
409+
}else{
410+
[res appendString:@"<td class='l'></td>"];
411+
}
412+
}
413+
[res appendString:@"<td class='r'></td>"];
414+
}else if([prefix rangeOfString:@"+"].location != NSNotFound){
415+
[res appendString:@"<tr class='r'>"];
416+
for(int i=0; i<arity-1; i++){
417+
[res appendString:@"<td class='l'></td>"];
418+
}
419+
[res appendString:[NSString stringWithFormat:@"<td class='r'>%d</td>",r_line++]];
420+
}else{
421+
[res appendString:@"<tr>"];
422+
for(int i=0; i<arity-1; i++){
423+
[res appendString:[NSString stringWithFormat:@"<td class='l'>%d</td>",l_line[i]++]];
424+
}
425+
[res appendString:[NSString stringWithFormat:@"<td class='r'>%d</td>",r_line++]];
426+
}
427+
if(![prefix hasPrefix:@"\\"]){
428+
[res appendString:[NSString stringWithFormat:@"<td class='code'>%@</td></tr>",[line substringFromIndex:arity-1]]];
407429
}
408430
}
409431
return res;
@@ -416,7 +438,7 @@ + (NSString *)parseDiffHeader:(NSString *)txt
416438

417439
NSString *line=[lines nextObject];
418440
NSString *fileName=[self getFileName:line];
419-
[res appendString:[NSString stringWithFormat:@"<tr id='%@'><td colspan='3'><div style='float:left;'>",fileName]];
441+
[res appendString:[NSString stringWithFormat:@"<tr id='%@'><td colspan='33'><div style='float:left;'>",fileName]];
420442
do{
421443
[res appendString:[NSString stringWithFormat:@"<p>%@</p>",line]];
422444
}while((line=[lines nextObject]));
@@ -433,11 +455,16 @@ + (NSString *)parseDiffHeader:(NSString *)txt
433455

434456
+(NSString *)getFileName:(NSString *)line
435457
{
436-
NSRange b = [line rangeOfString:@" b/"];
437-
NSString *file=[line substringFromIndex:b.location+3];
458+
NSRange b = [line rangeOfString:@"b/"];
459+
if (b.length == 0)
460+
b = [line rangeOfString:@"--cc "];
461+
462+
NSString *file=[line substringFromIndex:b.location+b.length];
463+
438464
DLog(@"line=%@",line);
439465
DLog(@"file=%@",file);
440-
return file;
466+
467+
return file;
441468
}
442469

443470
+(NSArray *)getFilesNames:(NSString *)line
@@ -492,17 +519,17 @@ +(BOOL)isImage:(NSString*)file
492519

493520
+(BOOL)isBinaryFile:(NSString *)line
494521
{
495-
return (([line length]>12) && [[line substringToIndex:12] isEqualToString:@"Binary files"]);
522+
return [line hasPrefix:@"Binary files"];
496523
}
497524

498525
+(BOOL)isStartDiff:(NSString *)line
499526
{
500-
return (([line length]>10) && [[line substringToIndex:10] isEqualToString:@"diff --git"]);
527+
return [line hasPrefix:@"diff --"];
501528
}
502529

503530
+(BOOL)isStartBlock:(NSString *)line
504531
{
505-
return (([line length]>3) && [[line substringToIndex:3] isEqualToString:@"@@ "]);
532+
return [line hasPrefix:@"@@"];
506533
}
507534

508535
- (NSString *) parseBlame:(NSString *)txt

html/views/diff/diffWindow.css

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,8 @@ table.diff tr.header td {
2424
padding: 5px;
2525
}
2626

27-
table.diff tr td.r {
28-
border-left: 1px solid #909090;
27+
table.diff tr td.l {
28+
border-right: 1px solid #909090;
2929
}
3030

3131
table.diff tr.r {

0 commit comments

Comments
 (0)