94 revs.extend(r for r in extrarevs if r <= partial.tiprev) |
94 revs.extend(r for r in extrarevs if r <= partial.tiprev) |
95 revs.extend(cl.revs(start=partial.tiprev + 1)) |
95 revs.extend(cl.revs(start=partial.tiprev + 1)) |
96 if revs: |
96 if revs: |
97 partial.update(repo, revs) |
97 partial.update(repo, revs) |
98 partial.write(repo) |
98 partial.write(repo) |
|
99 |
|
100 if repo._revbranchcache is not None: |
|
101 repo._revbranchcache.write(repo) |
|
102 |
99 assert partial.validfor(repo), filtername |
103 assert partial.validfor(repo), filtername |
100 repo._branchcaches[repo.filtername] = partial |
104 repo._branchcaches[repo.filtername] = partial |
101 |
105 |
102 class branchcache(dict): |
106 class branchcache(dict): |
103 """A dict like object that hold branches heads cache. |
107 """A dict like object that hold branches heads cache. |
132 # heads. |
136 # heads. |
133 if closednodes is None: |
137 if closednodes is None: |
134 self._closednodes = set() |
138 self._closednodes = set() |
135 else: |
139 else: |
136 self._closednodes = closednodes |
140 self._closednodes = closednodes |
137 self._revbranchcache = None |
|
138 |
141 |
139 def _hashfiltered(self, repo): |
142 def _hashfiltered(self, repo): |
140 """build hash of revision filtered in the current cache |
143 """build hash of revision filtered in the current cache |
141 |
144 |
142 Tracking tipnode and tiprev is not enough to ensure validity of the |
145 Tracking tipnode and tiprev is not enough to ensure validity of the |
224 repo.filtername, len(self), nodecount) |
227 repo.filtername, len(self), nodecount) |
225 except (IOError, OSError, util.Abort), inst: |
228 except (IOError, OSError, util.Abort), inst: |
226 repo.ui.debug("couldn't write branch cache: %s\n" % inst) |
229 repo.ui.debug("couldn't write branch cache: %s\n" % inst) |
227 # Abort may be raise by read only opener |
230 # Abort may be raise by read only opener |
228 pass |
231 pass |
229 if self._revbranchcache: |
|
230 self._revbranchcache.write(repo.unfiltered()) |
|
231 self._revbranchcache = None |
|
232 |
232 |
233 def update(self, repo, revgen): |
233 def update(self, repo, revgen): |
234 """Given a branchhead cache, self, that may have extra nodes or be |
234 """Given a branchhead cache, self, that may have extra nodes or be |
235 missing heads, and a generator of nodes that are strictly a superset of |
235 missing heads, and a generator of nodes that are strictly a superset of |
236 heads missing, this function updates self to be correct. |
236 heads missing, this function updates self to be correct. |
238 starttime = time.time() |
238 starttime = time.time() |
239 cl = repo.changelog |
239 cl = repo.changelog |
240 # collect new branch entries |
240 # collect new branch entries |
241 newbranches = {} |
241 newbranches = {} |
242 urepo = repo.unfiltered() |
242 urepo = repo.unfiltered() |
243 self._revbranchcache = revbranchcache(urepo) |
|
244 getbranchinfo = self._revbranchcache.branchinfo |
|
245 ucl = urepo.changelog |
243 ucl = urepo.changelog |
|
244 getbranchinfo = repo.revbranchcache().branchinfo |
246 for r in revgen: |
245 for r in revgen: |
247 branch, closesbranch = getbranchinfo(ucl, r) |
246 branch, closesbranch = getbranchinfo(ucl, r) |
248 newbranches.setdefault(branch, []).append(r) |
247 newbranches.setdefault(branch, []).append(r) |
249 if closesbranch: |
248 if closesbranch: |
250 self._closednodes.add(cl.node(r)) |
249 self._closednodes.add(cl.node(r)) |