mercurial/graphmod.py
changeset 8842 acd03a6e2426
parent 8841 94ac080e7af9
child 9727 d00cee04a746
--- a/mercurial/graphmod.py	Sat May 16 07:12:12 2009 +0200
+++ b/mercurial/graphmod.py	Fri Jun 19 13:44:23 2009 +0200
@@ -29,7 +29,6 @@
     returns a tuple for each node. The node and parent ids are arbitrary
     integers which identify a node in the context of the graph returned.
     """
-    assert start >= stop
     cur = start
     while cur >= stop:
         ctx = repo[cur]
@@ -41,10 +40,8 @@
     """file cset DAG generator yielding (id, CHANGESET, ctx, [parentids]) tuples
 
     This generator function walks through the revision history of a single
-    file from revision start to revision stop (which must be less than or
-    equal to start).
+    file from revision start down to revision stop.
     """
-    assert start >= stop
     filerev = len(repo.file(path)) - 1
     while filerev >= 0:
         fctx = repo.filectx(path, fileid=filerev)
@@ -68,32 +65,24 @@
         parents = [p.rev() for p in ctx.parents() if p.node() in include]
         yield (ctx.rev(), CHANGESET, ctx, sorted(parents))
 
-def graph(repo, start_rev, stop_rev):
-    """incremental revision grapher
+def colored(dag):
+    """annotates a DAG with colored edge information
+
+    For each DAG node this function emits tuples::
 
-    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:
+      (id, type, data, (col, color), [(col, nextcol, color)])
 
-      - Context of the current node
+    with the following new elements:
+
       - Tuple (col, color) with column and color index for the current node
-      - Edges; a list of (col, next_col, color) indicating the edges between
-        the current node and its parents.
+      - A list of tuples indicating the edges between the current node and its
+        parents.
     """
-
-    if start_rev == nullrev and not stop_rev:
-        return
-
-    assert start_rev >= stop_rev
-    assert stop_rev >= 0
-    cur = start_rev
     seen = []
-    cl = repo.changelog
     colors = {}
     newcolor = 1
+    for (cur, type, data, parents) in dag:
 
-    while cur >= stop_rev:
         # Compute seen and next
         if cur not in seen:
             seen.append(cur) # new head
@@ -104,8 +93,7 @@
         color = colors.pop(cur)
         next = seen[:]
 
-        # Add parents to next_revs
-        parents = [x for x in cl.parentrevs(cur) if x != nullrev]
+        # Add parents to next
         addparents = [p for p in parents if p not in next]
         next[col:col + 1] = addparents
 
@@ -122,11 +110,10 @@
         for ecol, eid in enumerate(seen):
             if eid in next:
                 edges.append((ecol, next.index(eid), colors[eid]))
-            elif eid == id:
+            elif eid == cur:
                 for p in parents:
                     edges.append((ecol, next.index(p), colors[p]))
 
         # Yield and move on
-        yield (repo[cur], (col, color), edges)
+        yield (cur, type, data, (col, color), edges)
         seen = next
-        cur -= 1