mercurial/graphmod.py
changeset 29134 8d5584d8345b
parent 28998 f303b569134c
child 29184 09d0022cad83
equal deleted inserted replaced
29133:255274719dc1 29134:8d5584d8345b
    30 CHANGESET = 'C'
    30 CHANGESET = 'C'
    31 PARENT = 'P'
    31 PARENT = 'P'
    32 GRANDPARENT = 'G'
    32 GRANDPARENT = 'G'
    33 MISSINGPARENT = 'M'
    33 MISSINGPARENT = 'M'
    34 # Style of line to draw. None signals a line that ends and is removed at this
    34 # Style of line to draw. None signals a line that ends and is removed at this
    35 # point.
    35 # point. A number prefix means only the last N characters of the current block
       
    36 # will use that style, the rest will use the PARENT style. Add a - sign
       
    37 # (so making N negative) and all but the first N characters use that style.
    36 EDGES = {PARENT: '|', GRANDPARENT: ':', MISSINGPARENT: None}
    38 EDGES = {PARENT: '|', GRANDPARENT: ':', MISSINGPARENT: None}
    37 
    39 
    38 def groupbranchiter(revs, parentsfunc, firstbranch=()):
    40 def groupbranchiter(revs, parentsfunc, firstbranch=()):
    39     """Yield revisions from heads to roots one (topo) branch at a time.
    41     """Yield revisions from heads to roots one (topo) branch at a time.
    40 
    42 
   651     _drawendinglines(lines, extra_interline, edgemap, seen)
   653     _drawendinglines(lines, extra_interline, edgemap, seen)
   652 
   654 
   653     while len(text) < len(lines):
   655     while len(text) < len(lines):
   654         text.append("")
   656         text.append("")
   655 
   657 
       
   658     if any(len(char) > 1 for char in edgemap.values()):
       
   659         # limit drawing an edge to the first or last N lines of the current
       
   660         # section the rest of the edge is drawn like a parent line.
       
   661         parent = state['styles'][PARENT][-1]
       
   662         def _drawgp(char, i):
       
   663             # should a grandparent character be drawn for this line?
       
   664             if len(char) < 2:
       
   665                 return True
       
   666             num = int(char[:-1])
       
   667             # either skip first num lines or take last num lines, based on sign
       
   668             return -num <= i if num < 0 else (len(lines) - i) <= num
       
   669         for i, line in enumerate(lines):
       
   670             line[:] = [c[-1] if _drawgp(c, i) else parent for c in line]
       
   671         edgemap = dict(
       
   672             (e, c if len(c) < 2 else parent) for e, c in edgemap.items())
       
   673 
   656     # print lines
   674     # print lines
   657     indentation_level = max(ncols, ncols + coldiff)
   675     indentation_level = max(ncols, ncols + coldiff)
   658     for (line, logstr) in zip(lines, text):
   676     for (line, logstr) in zip(lines, text):
   659         ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
   677         ln = "%-*s %s" % (2 * indentation_level, "".join(line), logstr)
   660         ui.write(ln.rstrip() + '\n')
   678         ui.write(ln.rstrip() + '\n')