@@ -1144,6 +1144,17 @@ def IS_CHARACTER_JUNK(ch, ws=" \t"):
11441144 return ch in ws
11451145
11461146
1147+ def _format_range (start , stop ):
1148+ 'Convert range to the "ed" format'
1149+ # Per the diff spec at http://www.unix.org/single_unix_specification/
1150+ beginning = start + 1 # lines start numbering with one
1151+ length = stop - start
1152+ if length == 1 :
1153+ return '{}' .format (beginning )
1154+ if not length :
1155+ beginning -= 1 # empty ranges begin at line just before the range
1156+ return '{},{}' .format (beginning , length )
1157+
11471158def unified_diff (a , b , fromfile = '' , tofile = '' , fromfiledate = '' ,
11481159 tofiledate = '' , n = 3 , lineterm = '\n ' ):
11491160 r"""
@@ -1193,9 +1204,12 @@ def unified_diff(a, b, fromfile='', tofile='', fromfiledate='',
11931204 todate = '\t {}' .format (tofiledate ) if tofiledate else ''
11941205 yield '--- {}{}{}' .format (fromfile , fromdate , lineterm )
11951206 yield '+++ {}{}{}' .format (tofile , todate , lineterm )
1207+
11961208 first , last = group [0 ], group [- 1 ]
1197- i1 , i2 , j1 , j2 = first [1 ], last [2 ], first [3 ], last [4 ]
1198- yield '@@ -{},{} +{},{} @@{}' .format (i1 + 1 , i2 - i1 , j1 + 1 , j2 - j1 , lineterm )
1209+ file1_range = _format_range (first [1 ], last [2 ])
1210+ file2_range = _format_range (first [3 ], last [4 ])
1211+ yield '@@ -{} +{} @@{}' .format (file1_range , file2_range , lineterm )
1212+
11991213 for tag , i1 , i2 , j1 , j2 in group :
12001214 if tag == 'equal' :
12011215 for line in a [i1 :i2 ]:
@@ -1264,22 +1278,20 @@ def context_diff(a, b, fromfile='', tofile='',
12641278 yield '--- {}{}{}' .format (tofile , todate , lineterm )
12651279
12661280 first , last = group [0 ], group [- 1 ]
1267- yield '***************{}' .format (lineterm )
1281+ yield '***************' + lineterm
1282+
1283+ file1_range = _format_range (first [1 ], last [2 ])
1284+ yield '*** {} ****{}' .format (file1_range , lineterm )
12681285
1269- if last [2 ] - first [1 ] > 1 :
1270- yield '*** {},{} ****{}' .format (first [1 ]+ 1 , last [2 ], lineterm )
1271- else :
1272- yield '*** {} ****{}' .format (last [2 ], lineterm )
12731286 if any (tag in {'replace' , 'delete' } for tag , _ , _ , _ , _ in group ):
12741287 for tag , i1 , i2 , _ , _ in group :
12751288 if tag != 'insert' :
12761289 for line in a [i1 :i2 ]:
12771290 yield prefix [tag ] + line
12781291
1279- if last [4 ] - first [3 ] > 1 :
1280- yield '--- {},{} ----{}' .format (first [3 ]+ 1 , last [4 ], lineterm )
1281- else :
1282- yield '--- {} ----{}' .format (last [4 ], lineterm )
1292+ file2_range = _format_range (first [3 ], last [4 ])
1293+ yield '--- {} ----{}' .format (file2_range , lineterm )
1294+
12831295 if any (tag in {'replace' , 'insert' } for tag , _ , _ , _ , _ in group ):
12841296 for tag , _ , _ , j1 , j2 in group :
12851297 if tag != 'delete' :
0 commit comments