~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/graph.py

  • Committer: Aaron Bentley
  • Date: 2008-11-22 16:24:28 UTC
  • mto: This revision was merged to the branch mainline in revision 3892.
  • Revision ID: aaron@aaronbentley.com-20081122162428-o9vik1937s3p8fmy
Move CachingExtraParentsProvider to Graph

Show diffs side-by-side

added added

removed removed

Lines of Context:
137
137
        return parent_map
138
138
 
139
139
 
 
140
class CachingExtraParentsProvider(object):
 
141
    """ParentsProvider that allows extra parents.
 
142
 
 
143
    This class takes a callback that acts like get_parent_map, except that it
 
144
    may return un-asked-for parents.  These extras are cached, but filtered
 
145
    out of get_parent_map.
 
146
    """
 
147
    def __init__(self, get_parent_map, debug=False):
 
148
        self._get_parent_map = get_parent_map
 
149
        self._parents_map = None
 
150
        self._debug = debug
 
151
        if self._debug:
 
152
            self._requested_parents = None
 
153
 
 
154
    def enable_cache(self):
 
155
        """Enable cache."""
 
156
        self._parents_map = {}
 
157
        if self._debug:
 
158
            self._requested_parents = set()
 
159
 
 
160
    def disable_cache(self):
 
161
        """Disable cache."""
 
162
        self._parents_map = None
 
163
        if self._debug:
 
164
            self._requested_parents = None
 
165
 
 
166
    def get_cached_map(self):
 
167
        """Return any cached get_parent_map values."""
 
168
        return self._parents_map
 
169
 
 
170
    def get_parent_map(self, keys):
 
171
        """See RemoteRepository.get_parent_map."""
 
172
        # Hack to build up the caching logic.
 
173
        ancestry = self._parents_map
 
174
        if ancestry is None:
 
175
            # Caching is disabled.
 
176
            missing_revisions = set(keys)
 
177
            ancestry = {}
 
178
        else:
 
179
            missing_revisions = set(key for key in keys if key not in ancestry)
 
180
        if missing_revisions:
 
181
            parent_map = self._get_parent_map(missing_revisions)
 
182
            if self._debug:
 
183
                mutter('re-retrieved revisions: %d of %d',
 
184
                        len(set(ancestry).intersection(parent_map)),
 
185
                        len(parent_map))
 
186
            ancestry.update(parent_map)
 
187
        present_keys = [k for k in keys if k in ancestry]
 
188
        if self._debug:
 
189
            if self._requested_parents is not None and len(ancestry) != 0:
 
190
                self._requested_parents.update(present_keys)
 
191
                mutter('Current hit rate: %d%%',
 
192
                    100.0 * len(self._requested_parents) / len(ancestry))
 
193
        return dict((k, ancestry[k]) for k in present_keys)
 
194
 
 
195
 
140
196
class Graph(object):
141
197
    """Provide incremental access to revision graphs.
142
198