From a67e25c426912912bae0c7d0cc122540af880e3b Mon Sep 17 00:00:00 2001 From: Uwe Hees Date: Fri, 6 May 2011 10:17:32 +0200 Subject: [PATCH 1/4] Parse merge diffs. These diffs begin with "diff --cc" and have "@@@" as block sepeartors. --- GLFileView.m | 35 ++++++++++++++++++++--------------- 1 file changed, 20 insertions(+), 15 deletions(-) diff --git a/GLFileView.m b/GLFileView.m index 7fbd4ae..46ab18b 100644 --- a/GLFileView.m +++ b/GLFileView.m @@ -305,12 +305,12 @@ NSScanner *scan=[NSScanner scannerWithString:txt]; NSString *block; - if(![txt hasPrefix:@"diff --git"]) - [scan scanUpToString:@"diff --git" intoString:&block]; //move to first diff + if(![txt hasPrefix:@"diff --"]) + [scan scanUpToString:@"diff --" intoString:&block]; //move to first diff - while([scan scanString:@"diff --git" intoString:NULL]){ // is a diff start? - [scan scanUpToString:@"\ndiff --git" intoString:&block]; - [res appendString:[GLFileView parseDiffBlock:[NSString stringWithFormat:@"diff --git %@",block]]]; + while([scan scanString:@"diff --" intoString:NULL]){ // is a diff start? + [scan scanUpToString:@"\ndiff --" intoString:&block]; + [res appendString:[GLFileView parseDiffBlock:[NSString stringWithFormat:@"diff --%@",block]]]; } return res; @@ -322,7 +322,7 @@ NSScanner *scan=[NSScanner scannerWithString:txt]; NSString *block; - [scan scanUpToString:@"\n@@ " intoString:&block]; + [scan scanUpToString:@"\n@@" intoString:&block]; [res appendString:@""]; [res appendString:[GLFileView parseDiffHeader:block]]; [res appendString:@""]; @@ -331,9 +331,9 @@ [res appendString:[GLFileView parseBinaryDiff:block]]; } - while([scan scanString:@"@@ " intoString:NULL]){ - [scan scanUpToString:@"\n@@ " intoString:&block]; - [res appendString:[GLFileView parseDiffChunk:[NSString stringWithFormat:@"@@ %@",block]]]; + while([scan scanString:@"@@" intoString:NULL]){ + [scan scanUpToString:@"\n@@" intoString:&block]; + [res appendString:[GLFileView parseDiffChunk:[NSString stringWithFormat:@"@@%@",block]]]; } [res appendString:@"
"]; @@ -433,11 +433,16 @@ +(NSString *)getFileName:(NSString *)line { - NSRange b = [line rangeOfString:@" b/"]; - NSString *file=[line substringFromIndex:b.location+3]; + NSRange b = [line rangeOfString:@"b/"]; + if (b.length == 0) + b = [line rangeOfString:@"--cc "]; + + NSString *file=[line substringFromIndex:b.location+b.length]; + DLog(@"line=%@",line); DLog(@"file=%@",file); - return file; + + return file; } +(NSArray *)getFilesNames:(NSString *)line @@ -492,17 +497,17 @@ +(BOOL)isBinaryFile:(NSString *)line { - return (([line length]>12) && [[line substringToIndex:12] isEqualToString:@"Binary files"]); + return [line hasPrefix:@"Binary files"]; } +(BOOL)isStartDiff:(NSString *)line { - return (([line length]>10) && [[line substringToIndex:10] isEqualToString:@"diff --git"]); + return [line hasPrefix:@"diff --"]; } +(BOOL)isStartBlock:(NSString *)line { - return (([line length]>3) && [[line substringToIndex:3] isEqualToString:@"@@ "]); + return [line hasPrefix:@"@@"]; } - (NSString *) parseBlame:(NSString *)txt From 62b6dba98302618872e2d587af8023697e094bc8 Mon Sep 17 00:00:00 2001 From: Uwe Hees Date: Sat, 7 May 2011 09:07:04 +0200 Subject: [PATCH 2/4] Parse diff hunks from merge diffs. For now only the differences to the first parent are shown. --- GLFileView.m | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/GLFileView.m b/GLFileView.m index 46ab18b..1cbee27 100644 --- a/GLFileView.m +++ b/GLFileView.m @@ -381,13 +381,17 @@ line=[lines nextObject]; DLog(@"-=%@=-",line); - NSString *header=[line substringFromIndex:3]; - NSRange hr = NSMakeRange(0, [header rangeOfString:@" @@"].location); - header=[header substringWithRange:hr]; + + int arity = 0; /* How many files are merged here? Count the '@'! */ + while ([line characterAtIndex:arity] == '@') + arity++; + + NSRange hr = NSMakeRange(arity+1, [line rangeOfString:@" @@"].location-arity-1); + NSString *header=[line substringWithRange:hr]; NSArray *pos=[header componentsSeparatedByString:@" "]; NSArray *pos_l=[[pos objectAtIndex:0] componentsSeparatedByString:@","]; - NSArray *pos_r=[[pos objectAtIndex:1] componentsSeparatedByString:@","]; + NSArray *pos_r=[[pos objectAtIndex:arity-1] componentsSeparatedByString:@","]; l_line=abs([[pos_l objectAtIndex:0]integerValue]); r_line=[[pos_r objectAtIndex:0]integerValue]; @@ -403,7 +407,7 @@ [res appendString:[NSString stringWithFormat:@"%d",r_line++]]; } if(![s isEqualToString:@"\\"]){ - [res appendString:[NSString stringWithFormat:@"%@",[line substringFromIndex:1]]]; + [res appendString:[NSString stringWithFormat:@"%@",[line substringFromIndex:arity-1]]]; } } return res; From d36f441e3845e95d4025bdbfca8c65486f3e7a3e Mon Sep 17 00:00:00 2001 From: Uwe Hees Date: Sat, 7 May 2011 11:29:31 +0200 Subject: [PATCH 3/4] Parse diff hunks from merge diffs, continued. Show differences from all anecstors. Each ancestor is represented by a seperate line numer column. --- GLFileView.m | 48 ++++++++++++++++++++++++---------- html/views/diff/diffWindow.css | 4 +-- 2 files changed, 36 insertions(+), 16 deletions(-) diff --git a/GLFileView.m b/GLFileView.m index 1cbee27..4227f09 100644 --- a/GLFileView.m +++ b/GLFileView.m @@ -376,7 +376,7 @@ NSMutableString *res=[NSMutableString string]; NSString *line; - int l_line; + int l_line[32]; // FIXME: make dynamic int r_line; line=[lines nextObject]; @@ -390,26 +390,46 @@ NSString *header=[line substringWithRange:hr]; NSArray *pos=[header componentsSeparatedByString:@" "]; - NSArray *pos_l=[[pos objectAtIndex:0] componentsSeparatedByString:@","]; NSArray *pos_r=[[pos objectAtIndex:arity-1] componentsSeparatedByString:@","]; - l_line=abs([[pos_l objectAtIndex:0]integerValue]); + for(int i=0; i%@",line]]; + [res appendString:[NSString stringWithFormat:@"%@",arity+1,line]]; while((line=[lines nextObject])){ - NSString *s=[line substringToIndex:1]; - if([s isEqualToString:@" "]){ - [res appendString:[NSString stringWithFormat:@"%d%d",l_line++,r_line++]]; - }else if([s isEqualToString:@"-"]){ - [res appendString:[NSString stringWithFormat:@"%d",l_line++]]; - }else if([s isEqualToString:@"+"]){ - [res appendString:[NSString stringWithFormat:@"%d",r_line++]]; - } - if(![s isEqualToString:@"\\"]){ + NSString *prefix=[line substringToIndex:arity-1]; + if([prefix rangeOfString:@"-"].location != NSNotFound){ + [res appendString:@""]; + for(int i=0; i%d",l_line[i]++]]; + }else{ + [res appendString:@""]; + } + } + [res appendString:@""]; + }else if([prefix rangeOfString:@"+"].location != NSNotFound){ + [res appendString:@""]; + for(int i=0; i"]; + } + [res appendString:[NSString stringWithFormat:@"%d",r_line++]]; + }else{ + [res appendString:@""]; + for(int i=0; i%d",l_line[i]++]]; + } + [res appendString:[NSString stringWithFormat:@"%d",r_line++]]; + } + if(![prefix hasPrefix:@"\\"]){ [res appendString:[NSString stringWithFormat:@"%@",[line substringFromIndex:arity-1]]]; } } + DLog(@"-=%@=-",res); + return res; } @@ -420,7 +440,7 @@ NSString *line=[lines nextObject]; NSString *fileName=[self getFileName:line]; - [res appendString:[NSString stringWithFormat:@"
",fileName]]; + [res appendString:[NSString stringWithFormat:@"
",fileName]]; do{ [res appendString:[NSString stringWithFormat:@"

%@

",line]]; }while((line=[lines nextObject])); diff --git a/html/views/diff/diffWindow.css b/html/views/diff/diffWindow.css index 932dbc1..bb91e3c 100644 --- a/html/views/diff/diffWindow.css +++ b/html/views/diff/diffWindow.css @@ -24,8 +24,8 @@ table.diff tr.header td { padding: 5px; } -table.diff tr td.r { - border-left: 1px solid #909090; +table.diff tr td.l { + border-right: 1px solid #909090; } table.diff tr.r { From 2e3cdd2e05f3e532f021728cd240e4e4b34b4d68 Mon Sep 17 00:00:00 2001 From: Uwe Hees Date: Sat, 7 May 2011 11:34:06 +0200 Subject: [PATCH 4/4] Remove debug output of the hunk html. --- GLFileView.m | 2 -- 1 file changed, 2 deletions(-) diff --git a/GLFileView.m b/GLFileView.m index 4227f09..7b90970 100644 --- a/GLFileView.m +++ b/GLFileView.m @@ -428,8 +428,6 @@ [res appendString:[NSString stringWithFormat:@"%@",[line substringFromIndex:arity-1]]]; } } - DLog(@"-=%@=-",res); - return res; }