Rev 5: pre-smash the revision ids to their short form, so we don't have to deal with it later. in http://bzr.arbash-meinel.com/plugins/kndx_to_dot

John Arbash Meinel john at arbash-meinel.com
Wed Apr 11 03:46:21 BST 2007


At http://bzr.arbash-meinel.com/plugins/kndx_to_dot

------------------------------------------------------------
revno: 5
revision-id: john at arbash-meinel.com-20070411024617-d4w6xfqv46vm5zfr
parent: john at arbash-meinel.com-20070410213652-y9u56him1kmu8ksh
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: kndx_to_dot
timestamp: Tue 2007-04-10 21:46:17 -0500
message:
  pre-smash the revision ids to their short form, so we don't have to deal with it later.
modified:
  __init__.py                    __init__.py-20070410212739-0uwundx7uoho7f6n-1
-------------- next part --------------
=== modified file '__init__.py'
--- a/__init__.py	2007-04-10 21:36:52 +0000
+++ b/__init__.py	2007-04-11 02:46:17 +0000
@@ -56,7 +56,12 @@
         kndx = a_knit._index
 
         versions = kndx.get_versions()
-        version_idxs = dict((v, o) for o, v in enumerate(versions))
+        if short:
+            version_idxs = dict((v, o) for o, v in enumerate(versions))
+            name_map = dict((v, make_short_name(version_idxs, v))
+                            for v in versions)
+        parent_map = dict((v, kndx.get_parents(v)) for v in versions)
+
         if end is not None:
             try:
                 versions = versions[:int(end)+1]
@@ -68,7 +73,12 @@
             except ValueError:
                 versions = versions[versions.index(start):]
 
-        generate_dot(kndx, short, version_idxs, versions, self.outf)
+        if short:
+            versions = [name_map[v] for v in versions]
+            parent_map = dict((name_map[v], [name_map[p] for p in ps])
+                              for v,ps in parent_map.iteritems())
+
+        generate_dot(versions, parent_map, self.outf)
 
 
 _short_revision_id_re = lazy_regex.lazy_compile(
@@ -93,27 +103,45 @@
         return "%s %s" % (idx, version)
 
 
-def generate_dot(kndx, short, version_idxs, versions, output):
+def generate_dot(versions, parent_map, output):
+    """Create a dot graph for the given versions."""
     output.write('digraph T {\n'
                  '  node [shape=box]\n'
                 )
-    for version in versions:
-        if short:
-            sversion = make_short_name(version_idxs, version)
-        else:
-            sversion = version
-        parents = kndx.get_parents(version)
-        if short:
-            sparents = [make_short_name(version_idxs, p)
-                        for p in parents]
-        else:
-            sparents = parents
+    mainline = determine_mainline(versions, parent_map)
+    for version in versions:
+        for parent in parent_map[version]:
+            output.write('  "%s" -> "%s"' % (parent, version))
+            if parent in mainline and version in mainline:
+                output.write(' [weight=10, color=blue]')
+            else:
+                output.write(' [weight=1, color=black]')
+            output.write(';\n')
+
+    output.write('  subgraph cluster_mainline {\n'
+                 '    clusterrank=local;\n'
+                 '    label=mainline;\n'
+                 '    color=blue;\n'
+                )
+    for version in versions:
+        if version in mainline:
+            output.write('    "%s" [color=blue];\n' % (version,))
+    output.write('  }\n')
+
+    output.write('}\n')
+
+
+def determine_mainline(versions, parent_map):
+    """create a set of 'mainline' revisions for this graph."""
+    tip = versions[-1]
+    mainline = set()
+    while True:
+        mainline.add(tip)
+        parents = parent_map[tip]
         if not parents:
-            output.write('  "%s"\n' % (sversion,))
-        else:
-            for sparent in sparents:
-                output.write('  "%s" -> "%s"\n' % (sparent, sversion))
-    output.write('}\n')
+            break
+        tip = parents[0]
+    return mainline
 
 
 commands.register_command(cmd_kndx2dot)



More information about the bazaar-commits mailing list