##// END OF EJS Templates
Merge with crew-stable
Merge with crew-stable

File last commit:

r7565:5f162f61 default
r7631:0b2ee57d merge default
Show More
graphmod.py
76 lines | 2.3 KiB | text/x-python | PythonLexer
Dirkjan Ochtman
add graph page to hgweb
r6691 # Revision graph generator for Mercurial
#
# Copyright 2008 Dirkjan Ochtman <dirkjan@ochtman.nl>
# Copyright 2007 Joel Rosdahl <joel@rosdahl.net>
#
# This software may be used and distributed according to the terms of
# the GNU General Public License, incorporated herein by reference.
from node import nullrev, short
import ui, hg, util, templatefilters
def graph(repo, start_rev, stop_rev):
"""incremental revision grapher
This generator function walks through the revision history from
revision start_rev to revision stop_rev (which must be less than
or equal to start_rev) and for each revision emits tuples with the
following elements:
- Current node
- Column and color for the current node
- Edges; a list of (col, next_col, color) indicating the edges between
the current node and its parents.
- First line of the changeset description
- The changeset author
- The changeset date/time
"""
Dirkjan Ochtman
hgweb: fix problems with empty repositories
r7565 if start_rev == nullrev and not stop_rev:
return
Dirkjan Ochtman
add graph page to hgweb
r6691 assert start_rev >= stop_rev
Dirkjan Ochtman
hgweb: let the web graph cope with low revisions/new repositories (issue1293)
r7030 assert stop_rev >= 0
Dirkjan Ochtman
add graph page to hgweb
r6691 curr_rev = start_rev
revs = []
cl = repo.changelog
colors = {}
new_color = 1
while curr_rev >= stop_rev:
# Compute revs and next_revs
if curr_rev not in revs:
revs.append(curr_rev) # new head
colors[curr_rev] = new_color
new_color += 1
idx = revs.index(curr_rev)
color = colors.pop(curr_rev)
next = revs[:]
# Add parents to next_revs
parents = [x for x in cl.parentrevs(curr_rev) if x != nullrev]
addparents = [p for p in parents if p not in next]
next[idx:idx + 1] = addparents
# Set colors for the parents
for i, p in enumerate(addparents):
if not i:
colors[p] = color
else:
colors[p] = new_color
new_color += 1
# Add edges to the graph
edges = []
for col, r in enumerate(revs):
if r in next:
edges.append((col, next.index(r), colors[r]))
elif r == curr_rev:
for p in parents:
edges.append((col, next.index(p), colors[p]))
# Yield and move on
Matt Mackall
use repo[changeid] to get a changectx
r6747 yield (repo[curr_rev], (idx, color), edges)
Dirkjan Ochtman
add graph page to hgweb
r6691 revs = next
curr_rev -= 1