~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/graph.py

bugfix revision.MultipleRevisionSources.get_revision_graph to integrate ghosts between sources. [slow on weaves, fast on knits.

Show diffs side-by-side

added added

removed removed

Lines of Context:
102
102
                new_lines.add(descendant)
103
103
        lines = new_lines
104
104
    return result
 
105
 
 
106
 
 
107
class Graph(object):
 
108
    """A graph object which can memoise and cache results for performance."""
 
109
 
 
110
    def __init__(self):
 
111
        super(Graph, self).__init__()
 
112
        self.roots = set([])
 
113
        self.ghosts = set([])
 
114
        self._graph_ancestors = {}
 
115
        self._graph_descendants = {}
 
116
 
 
117
    def add_ghost(self, node_id):
 
118
        """Add a ghost to the graph."""
 
119
        self.ghosts.add(node_id)
 
120
        self._ensure_descendant(node_id)
 
121
 
 
122
    def add_node(self, node_id, parent_ids):
 
123
        """Add node_id to the graph with parent_ids as its parents."""
 
124
        if parent_ids == []:
 
125
            self.roots.add(node_id)
 
126
        self._graph_ancestors[node_id] = list(parent_ids)
 
127
        self._ensure_descendant(node_id)
 
128
        for parent in parent_ids:
 
129
            self._ensure_descendant(parent)
 
130
            self._graph_descendants[parent][node_id] = 1
 
131
        
 
132
    def _ensure_descendant(self, node_id):
 
133
        """Ensure that a descendant lookup for node_id will work."""
 
134
        if not node_id in self._graph_descendants:
 
135
            self._graph_descendants[node_id] = {}
 
136
 
 
137
    def get_ancestors(self):
 
138
        """Return a dictionary of graph node:ancestor_list entries."""
 
139
        return dict(self._graph_ancestors.items())
 
140
 
 
141
    def get_descendants(self):
 
142
        """Return a dictionary of graph node:child_node:distance entries."""
 
143
        return dict(self._graph_descendants.items())