hgext/graphlog.py
changeset 14130 5e4ec4119485
parent 14086 2d7cb340a53f
child 14132 7d3bd0640262
equal deleted inserted replaced
14129:81e6d42b3228 14130:5e4ec4119485
    19 from mercurial import cmdutil, commands, extensions
    19 from mercurial import cmdutil, commands, extensions
    20 from mercurial import hg, scmutil, util, graphmod
    20 from mercurial import hg, scmutil, util, graphmod
    21 
    21 
    22 ASCIIDATA = 'ASC'
    22 ASCIIDATA = 'ASC'
    23 
    23 
    24 def asciiedges(seen, rev, parents):
    24 def asciiedges(type, char, lines, seen, rev, parents):
    25     """adds edge info to changelog DAG walk suitable for ascii()"""
    25     """adds edge info to changelog DAG walk suitable for ascii()"""
    26     if rev not in seen:
    26     if rev not in seen:
    27         seen.append(rev)
    27         seen.append(rev)
    28     nodeidx = seen.index(rev)
    28     nodeidx = seen.index(rev)
    29 
    29 
    34             knownparents.append(parent)
    34             knownparents.append(parent)
    35         else:
    35         else:
    36             newparents.append(parent)
    36             newparents.append(parent)
    37 
    37 
    38     ncols = len(seen)
    38     ncols = len(seen)
    39     seen[nodeidx:nodeidx + 1] = newparents
    39     nextseen = seen[:]
    40     edges = [(nodeidx, seen.index(p)) for p in knownparents]
    40     nextseen[nodeidx:nodeidx + 1] = newparents
       
    41     edges = [(nodeidx, nextseen.index(p)) for p in knownparents]
       
    42 
       
    43     while len(newparents) > 2:
       
    44         # ascii() only knows how to add or remove a single column between two
       
    45         # calls. Nodes with more than two parents break this constraint so we
       
    46         # introduce intermediate expansion lines to grow the active node list
       
    47         # slowly.
       
    48         edges.append((nodeidx, nodeidx))
       
    49         edges.append((nodeidx, nodeidx + 1))
       
    50         nmorecols = 1
       
    51         yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
       
    52         char = '\\'
       
    53         lines = []
       
    54         nodeidx += 1
       
    55         ncols += 1
       
    56         edges = []
       
    57         del newparents[0]
    41 
    58 
    42     if len(newparents) > 0:
    59     if len(newparents) > 0:
    43         edges.append((nodeidx, nodeidx))
    60         edges.append((nodeidx, nodeidx))
    44     if len(newparents) > 1:
    61     if len(newparents) > 1:
    45         edges.append((nodeidx, nodeidx + 1))
    62         edges.append((nodeidx, nodeidx + 1))
    46 
    63     nmorecols = len(nextseen) - ncols
    47     nmorecols = len(seen) - ncols
    64     seen[:] = nextseen
    48     return nodeidx, edges, ncols, nmorecols
    65     yield (type, char, lines, (nodeidx, edges, ncols, nmorecols))
    49 
    66 
    50 def fix_long_right_edges(edges):
    67 def fix_long_right_edges(edges):
    51     for (i, (start, end)) in enumerate(edges):
    68     for (i, (start, end)) in enumerate(edges):
    52         if end > start:
    69         if end > start:
    53             edges[i] = (start, end + 1)
    70             edges[i] = (start, end + 1)
   274     for rev, type, ctx, parents in dag:
   291     for rev, type, ctx, parents in dag:
   275         char = ctx.node() in showparents and '@' or 'o'
   292         char = ctx.node() in showparents and '@' or 'o'
   276         displayer.show(ctx)
   293         displayer.show(ctx)
   277         lines = displayer.hunk.pop(rev).split('\n')[:-1]
   294         lines = displayer.hunk.pop(rev).split('\n')[:-1]
   278         displayer.flush(rev)
   295         displayer.flush(rev)
   279         ascii(ui, state, type, char, lines, edgefn(seen, rev, parents))
   296         edges = edgefn(type, char, lines, seen, rev, parents)
       
   297         for type, char, lines, coldata in edges:
       
   298             ascii(ui, state, type, char, lines, coldata)
   280     displayer.close()
   299     displayer.close()
   281 
   300 
   282 def graphlog(ui, repo, *pats, **opts):
   301 def graphlog(ui, repo, *pats, **opts):
   283     """show revision history alongside an ASCII revision graph
   302     """show revision history alongside an ASCII revision graph
   284 
   303