365 changelog = self._repo.changelog |
365 changelog = self._repo.changelog |
366 rbcrevidx = rev * _rbcrecsize |
366 rbcrevidx = rev * _rbcrecsize |
367 |
367 |
368 # if requested rev is missing, add and populate all missing revs |
368 # if requested rev is missing, add and populate all missing revs |
369 if len(self._rbcrevs) < rbcrevidx + _rbcrecsize: |
369 if len(self._rbcrevs) < rbcrevidx + _rbcrecsize: |
370 first = len(self._rbcrevs) // _rbcrecsize |
|
371 self._rbcrevs.extend('\0' * (len(changelog) * _rbcrecsize - |
370 self._rbcrevs.extend('\0' * (len(changelog) * _rbcrecsize - |
372 len(self._rbcrevs))) |
371 len(self._rbcrevs))) |
373 for r in xrange(first, len(changelog)): |
|
374 self._branchinfo(r) |
|
375 |
372 |
376 # fast path: extract data from cache, use it if node is matching |
373 # fast path: extract data from cache, use it if node is matching |
377 reponode = changelog.node(rev)[:_rbcnodelen] |
374 reponode = changelog.node(rev)[:_rbcnodelen] |
378 cachenode, branchidx = unpack( |
375 cachenode, branchidx = unpack( |
379 _rbcrecfmt, buffer(self._rbcrevs, rbcrevidx, _rbcrecsize)) |
376 _rbcrecfmt, buffer(self._rbcrevs, rbcrevidx, _rbcrecsize)) |
380 close = bool(branchidx & _rbccloseflag) |
377 close = bool(branchidx & _rbccloseflag) |
381 if close: |
378 if close: |
382 branchidx &= _rbcbranchidxmask |
379 branchidx &= _rbcbranchidxmask |
383 if cachenode == reponode: |
380 if cachenode == '\0\0\0\0': |
|
381 pass |
|
382 elif cachenode == reponode: |
384 return self._names[branchidx], close |
383 return self._names[branchidx], close |
|
384 else: |
|
385 # rev/node map has changed, invalidate the cache from here up |
|
386 truncate = rbcrevidx + _rbcrecsize |
|
387 del self._rbcrevs[truncate:] |
|
388 self._rbcrevslen = min(self._rbcrevslen, truncate) |
|
389 |
385 # fall back to slow path and make sure it will be written to disk |
390 # fall back to slow path and make sure it will be written to disk |
386 self._rbcrevslen = min(self._rbcrevslen, rev) |
|
387 return self._branchinfo(rev) |
391 return self._branchinfo(rev) |
388 |
392 |
389 def _branchinfo(self, rev): |
393 def _branchinfo(self, rev): |
390 """Retrieve branch info from changelog and update _rbcrevs""" |
394 """Retrieve branch info from changelog and update _rbcrevs""" |
391 changelog = self._repo.changelog |
395 changelog = self._repo.changelog |
406 """Writes the node's branch data to the in-memory cache data.""" |
410 """Writes the node's branch data to the in-memory cache data.""" |
407 rbcrevidx = rev * _rbcrecsize |
411 rbcrevidx = rev * _rbcrecsize |
408 rec = array('c') |
412 rec = array('c') |
409 rec.fromstring(pack(_rbcrecfmt, node, branchidx)) |
413 rec.fromstring(pack(_rbcrecfmt, node, branchidx)) |
410 self._rbcrevs[rbcrevidx:rbcrevidx + _rbcrecsize] = rec |
414 self._rbcrevs[rbcrevidx:rbcrevidx + _rbcrecsize] = rec |
|
415 self._rbcrevslen = min(self._rbcrevslen, rev) |
411 |
416 |
412 def write(self): |
417 def write(self): |
413 """Save branch cache if it is dirty.""" |
418 """Save branch cache if it is dirty.""" |
414 repo = self._repo |
419 repo = self._repo |
415 if self._rbcnamescount < len(self._names): |
420 if self._rbcnamescount < len(self._names): |