~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/graph.py

  • Committer: Aaron Bentley
  • Date: 2008-12-10 19:40:42 UTC
  • mto: This revision was merged to the branch mainline in revision 3892.
  • Revision ID: aaron@aaronbentley.com-20081210194042-3x07buw2h4g8x9hs
Updates from review

Show diffs side-by-side

added added

removed removed

Lines of Context:
106
106
    Either a ParentsProvider or a get_parent_map-like callback may be
107
107
    supplied.  If it provides extra un-asked-for parents, they will be cached,
108
108
    but filtered out of get_parent_map.
 
109
 
 
110
    The cache is enabled by default, but may be disabled and re-enabled.
109
111
    """
110
112
    def __init__(self, parent_provider=None, get_parent_map=None, debug=False):
111
113
        """Constructor.
121
123
            self._get_parent_map = self._real_provider.get_parent_map
122
124
        else:
123
125
            self._get_parent_map = get_parent_map
124
 
        self._parents_map = {}
 
126
        self._cache = {}
125
127
        self._cache_misses = True
126
128
        self._debug = debug
127
129
        if self._debug:
132
134
 
133
135
    def enable_cache(self, cache_misses=True):
134
136
        """Enable cache."""
135
 
        self._parents_map = {}
 
137
        self._cache = {}
136
138
        self._cache_misses = cache_misses
137
139
        if self._debug:
138
140
            self._requested_parents = set()
139
141
 
140
142
    def disable_cache(self):
141
 
        """Disable cache."""
142
 
        self._parents_map = None
 
143
        """Disable and clear the cache."""
 
144
        self._cache = None
143
145
        if self._debug:
144
146
            self._requested_parents = None
145
147
 
146
148
    def get_cached_map(self):
147
149
        """Return any cached get_parent_map values."""
148
 
        if self._parents_map is None:
 
150
        if self._cache is None:
149
151
            return None
150
 
        return dict((k, v) for k, v in self._parents_map.items()
 
152
        return dict((k, v) for k, v in self._cache.items()
151
153
                    if v is not None)
152
154
 
153
155
    def get_parent_map(self, keys):
154
 
        """See RemoteRepository.get_parent_map."""
 
156
        """See _StackedParentsProvider.get_parent_map."""
155
157
        # Hack to build up the caching logic.
156
 
        ancestry = self._parents_map
 
158
        ancestry = self._cache
157
159
        if ancestry is None:
158
160
            # Caching is disabled.
159
161
            missing_revisions = set(keys)
168
170
                        len(parent_map))
169
171
            ancestry.update(parent_map)
170
172
            if self._cache_misses:
 
173
                # None is never a valid parents list, so it can be used to
 
174
                # record misses.
171
175
                ancestry.update(dict((k, None) for k in missing_revisions
172
176
                                     if k not in parent_map))
173
177
        present_keys = [k for k in keys if ancestry.get(k) is not None]