/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to viz/graph.py

  • Committer: Mateusz Korniak
  • Date: 2007-09-02 15:42:18 UTC
  • mto: This revision was merged to the branch mainline in revision 274.
  • Revision ID: matkor@laptop-hp-20070902154218-nba0woaqjsn20f9n
Ignoring eric3 project files.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#!/usr/bin/python
2
1
# -*- coding: UTF-8 -*-
3
2
"""Directed graph production.
4
3
 
11
10
__author__    = "Scott James Remnant <scott@ubuntu.com>"
12
11
 
13
12
 
 
13
from bzrlib.revision import Revision
14
14
from bzrlib.tsort import merge_sort
15
15
 
16
16
 
17
 
class DummyRevision(object):
 
17
class DummyRevision(Revision):
18
18
    """Dummy bzr revision.
19
19
 
20
20
    Sometimes, especially in older bzr branches, a revision is referenced
22
22
    When this happens we use an instance of this class instead of the real
23
23
    Revision object (which we can't get).
24
24
    """
25
 
 
26
25
    def __init__(self, revid):
27
 
        self.revision_id = revid
28
 
        self.parent_ids = []
 
26
        super(DummyRevision, self).__init__(revid)
29
27
        self.committer = None
30
 
        self.message = self.revision_id
 
28
        self.timestamp = None
 
29
        self.timezone = None
 
30
        self.message = revid
31
31
 
32
32
 
33
33
class RevisionProxy(object):
64
64
 
65
65
class DistanceMethod(object):
66
66
 
67
 
    def __init__(self, branch, start):
68
 
        self.branch = branch
69
 
        self.start = start
 
67
    def __init__(self, repository, start_revid):
 
68
        self.repository = repository
 
69
        self.start_revid = start_revid
70
70
        self.revisions = {}
71
71
        self.children = {}
72
 
        self.children_of_id = {start: set()}
 
72
        self.children_of_id = {start_revid: set()}
73
73
        self.parent_ids_of = {}
74
 
        self.colours = { start: 0 }
 
74
        self.colours = { start_revid: 0 }
75
75
        self.last_colour = 0
76
76
        self.direct_parent_of = {}
77
77
        self.graph = {}
78
78
 
79
79
    def fill_caches(self):
80
 
        # FIXME: look at using repository.get_revision_graph_with_ghosts - RBC.
81
 
        graph = self.branch.repository.get_revision_graph_with_ghosts([self.start])
 
80
        graph = self.repository.get_revision_graph_with_ghosts([self.start_revid])
82
81
        for revid in graph.ghosts:
83
82
            self.cache_revision(DummyRevision(revid))
84
83
        for revid, parents in graph.get_ancestors().items():
85
 
            self.cache_revision(RevisionProxy(revid, parents, self.branch.repository))
 
84
            self.cache_revision(RevisionProxy(revid, parents, self.repository))
86
85
 
87
86
    def cache_revision(self, revision):
88
87
        "Set the caches for a newly retrieved revision."""
237
236
                self.colours[revid] = self.last_colour = self.last_colour + 1
238
237
 
239
238
 
240
 
def distances(branch, start):
 
239
def distances(repository, start_revid):
241
240
    """Sort the revisions.
242
241
 
243
242
    Traverses the branch revision tree starting at start and produces an
246
245
 
247
246
    Returns a tuple of (revids, revisions, colours, children)
248
247
    """
249
 
    distance = DistanceMethod(branch, start)
 
248
    distance = DistanceMethod(repository, start_revid)
250
249
    distance.fill_caches()
251
 
    distance.merge_sorted = merge_sort(distance.graph, distance.start)
 
250
    distance.merge_sorted = merge_sort(distance.graph, distance.start_revid)
252
251
    children = distance.make_children_map()
253
252
    
254
253
    for seq, revid, merge_depth, end_of_merge in distance.merge_sorted: