@@ -1456,6 +1456,67 @@ def find_frontier_blocks(block):
14561456 )
14571457
14581458
1459+ def write_diagram_with_axes (f , diagram , tip1 , tip2 ):
1460+ """Write a diagram of one-space-wide characters to file-like object f.
1461+
1462+ Include integers along the top and left sides showing the indexes
1463+ corresponding to the rows and columns.
1464+
1465+ """
1466+
1467+ len1 = len (diagram )
1468+ len2 = len (diagram [0 ])
1469+
1470+ # Write the line of i1 numbers:
1471+ f .write (' ' )
1472+ for i1 in range (0 , len1 , 5 ):
1473+ f .write ('%5d' % (i1 ,))
1474+
1475+ if (len1 - 1 ) % 5 == 0 :
1476+ # The last multiple-of-five integer that we just wrote was
1477+ # the index of the last column. We're done.
1478+ f .write ('\n ' )
1479+ else :
1480+ if (len1 - 1 ) % 5 == 1 :
1481+ # Add an extra space so that the numbers don't run together:
1482+ f .write (' ' )
1483+ f .write ('%s%d\n ' % (' ' * ((len1 - 1 ) % 5 - 1 ), len1 - 1 ,))
1484+
1485+ # Write a line of '|' marks under the numbers emitted above:
1486+ f .write (' ' )
1487+ for i1 in range (0 , len1 , 5 ):
1488+ f .write ('%5s' % ('|' ,))
1489+
1490+ if (len1 - 1 ) % 5 == 0 :
1491+ # The last multiple-of-five integer was at the last
1492+ # column. We're done.
1493+ f .write ('\n ' )
1494+ elif (len1 - 1 ) % 5 == 1 :
1495+ # Tilt the tick mark to account for the extra space:
1496+ f .write (' /\n ' )
1497+ else :
1498+ f .write ('%s|\n ' % (' ' * ((len1 - 1 ) % 5 - 1 ),))
1499+
1500+ # Write the actual body of the diagram:
1501+ for i2 in range (len2 ):
1502+ if i2 % 5 == 0 or i2 == len2 - 1 :
1503+ f .write ('%4d - ' % (i2 ,))
1504+ else :
1505+ f .write (' ' )
1506+
1507+ for i1 in range (len1 ):
1508+ f .write (diagram [i1 ][i2 ])
1509+
1510+ if tip1 and i2 == 0 :
1511+ f .write (' - %s\n ' % (tip1 ,))
1512+ else :
1513+ f .write ('\n ' )
1514+
1515+ if tip2 :
1516+ f .write (' |\n ' )
1517+ f .write (' %s\n ' % (tip2 ,))
1518+
1519+
14591520class MergeFrontier (object ):
14601521 """Represents the merge frontier within a Block.
14611522
@@ -1696,13 +1757,10 @@ def format_diagram(self, formatter=None, diagram=None):
16961757 [formatter (diagram [i1 ][i2 ]) for i2 in range (self .block .len2 )]
16971758 for i1 in range (self .block .len1 )]
16981759
1699- def write (self , f ):
1760+ def write (self , f , tip1 = None , tip2 = None ):
17001761 """Write this frontier to file-like object f."""
1701- diagram = self .format_diagram ()
1702- for i2 in range (self .block .len2 ):
1703- for i1 in range (self .block .len1 ):
1704- f .write (diagram [i1 ][i2 ])
1705- f .write ('\n ' )
1762+
1763+ write_diagram_with_axes (f , self .format_diagram (), tip1 , tip2 )
17061764
17071765 def write_html (self , f , name , cssfile = 'imerge.css' , abbrev_sha1 = 7 ):
17081766 class_map = {
@@ -2279,16 +2337,17 @@ def format_diagram(self, legend=None, diagram=None):
22792337 [legend [diagram [i1 ][i2 ]] for i2 in range (self .len2 )]
22802338 for i1 in range (self .len1 )]
22812339
2282- def write (self , f , legend = None , sep = '' , linesep = '\n ' ):
2283- diagram = self .format_diagram (legend )
2284- for i2 in range (self .len2 ):
2285- f .write (sep .join (diagram [i1 ][i2 ] for i1 in range (self .len1 )) + linesep )
2340+ def write (self , f , tip1 = '' , tip2 = '' ):
2341+ write_diagram_with_axes (f , self .format_diagram (), tip1 , tip2 )
22862342
22872343 def writeppm (self , f ):
2344+ legend = ['127 127 0' , '0 255 0' , '0 127 0' , '255 0 0' , '127 0 0' ]
2345+ diagram = self .format_diagram (legend )
2346+
22882347 f .write ('P3\n ' )
22892348 f .write ('%d %d 255\n ' % (self .len1 , self .len2 ,))
2290- legend = [ '127 127 0' , '0 255 0' , '0 127 0' , '255 0 0' , '127 0 0' ]
2291- self .write (f , legend , sep = ' ' )
2349+ for i2 in range ( self . len2 ):
2350+ f .write (' ' . join ( diagram [ i1 ][ i2 ] for i1 in range ( self . len1 )) + ' \n ' )
22922351
22932352
22942353class SubBlock (Block ):
@@ -3702,11 +3761,11 @@ def cmd_diagram(parser, options):
37023761
37033762 merge_state = read_merge_state (git , options .name )
37043763 if options .commits :
3705- merge_state .write (sys .stdout )
3764+ merge_state .write (sys .stdout , merge_state . tip1 , merge_state . tip2 )
37063765 sys .stdout .write ('\n ' )
37073766 if options .frontier :
37083767 merge_frontier = MergeFrontier .map_known_frontier (merge_state )
3709- merge_frontier .write (sys .stdout )
3768+ merge_frontier .write (sys .stdout , merge_state . tip1 , merge_state . tip2 )
37103769 sys .stdout .write ('\n ' )
37113770 if options .html :
37123771 merge_frontier = MergeFrontier .map_known_frontier (merge_state )
0 commit comments