Skip to content

Commit e7a8603

Browse files
authored
Merge pull request #157 from mhagger/diagram-axes
Add "axes" to diagram output
2 parents 9d51192 + cdbbf59 commit e7a8603

File tree

1 file changed

+73
-14
lines changed

1 file changed

+73
-14
lines changed

gitimerge.py

Lines changed: 73 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
14591520
class 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

22942353
class 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

Comments
 (0)