468 tr.addfinalize('write-revbranchcache', self.write) |
468 tr.addfinalize('write-revbranchcache', self.write) |
469 |
469 |
470 def write(self, tr=None): |
470 def write(self, tr=None): |
471 """Save branch cache if it is dirty.""" |
471 """Save branch cache if it is dirty.""" |
472 repo = self._repo |
472 repo = self._repo |
473 if self._rbcnamescount < len(self._names): |
473 if True: |
474 try: |
474 if self._rbcnamescount < len(self._names): |
475 if self._rbcnamescount != 0: |
475 try: |
476 f = repo.vfs.open(_rbcnames, 'ab') |
476 if self._rbcnamescount != 0: |
477 if f.tell() == self._rbcsnameslen: |
477 f = repo.vfs.open(_rbcnames, 'ab') |
478 f.write('\0') |
478 if f.tell() == self._rbcsnameslen: |
479 else: |
479 f.write('\0') |
480 f.close() |
480 else: |
481 repo.ui.debug("%s changed - rewriting it\n" % _rbcnames) |
481 f.close() |
482 self._rbcnamescount = 0 |
482 repo.ui.debug("%s changed - rewriting it\n" |
483 self._rbcrevslen = 0 |
483 % _rbcnames) |
484 if self._rbcnamescount == 0: |
484 self._rbcnamescount = 0 |
485 # before rewriting names, make sure references are removed |
485 self._rbcrevslen = 0 |
486 repo.vfs.unlinkpath(_rbcrevs, ignoremissing=True) |
486 if self._rbcnamescount == 0: |
487 f = repo.vfs.open(_rbcnames, 'wb') |
487 # before rewriting names, make sure references are |
488 f.write('\0'.join(encoding.fromlocal(b) |
488 # removed |
489 for b in self._names[self._rbcnamescount:])) |
489 repo.vfs.unlinkpath(_rbcrevs, ignoremissing=True) |
490 self._rbcsnameslen = f.tell() |
490 f = repo.vfs.open(_rbcnames, 'wb') |
491 f.close() |
491 f.write('\0'.join(encoding.fromlocal(b) |
492 except (IOError, OSError, error.Abort) as inst: |
492 for b in self._names[self._rbcnamescount:] |
493 repo.ui.debug("couldn't write revision branch cache names: " |
493 )) |
494 "%s\n" % inst) |
494 self._rbcsnameslen = f.tell() |
495 return |
495 f.close() |
496 self._rbcnamescount = len(self._names) |
496 except (IOError, OSError, error.Abort) as inst: |
497 |
497 repo.ui.debug("couldn't write revision branch cache names: " |
498 start = self._rbcrevslen * _rbcrecsize |
498 "%s\n" % inst) |
499 if start != len(self._rbcrevs): |
499 return |
500 revs = min(len(repo.changelog), len(self._rbcrevs) // _rbcrecsize) |
500 self._rbcnamescount = len(self._names) |
501 try: |
501 |
502 f = repo.vfs.open(_rbcrevs, 'ab') |
502 start = self._rbcrevslen * _rbcrecsize |
503 if f.tell() != start: |
503 if start != len(self._rbcrevs): |
504 repo.ui.debug("truncating %s to %s\n" % (_rbcrevs, start)) |
504 revs = min(len(repo.changelog), |
505 f.seek(start) |
505 len(self._rbcrevs) // _rbcrecsize) |
|
506 try: |
|
507 f = repo.vfs.open(_rbcrevs, 'ab') |
506 if f.tell() != start: |
508 if f.tell() != start: |
507 start = 0 |
509 repo.ui.debug("truncating %s to %s\n" |
|
510 % (_rbcrevs, start)) |
508 f.seek(start) |
511 f.seek(start) |
509 f.truncate() |
512 if f.tell() != start: |
510 end = revs * _rbcrecsize |
513 start = 0 |
511 f.write(self._rbcrevs[start:end]) |
514 f.seek(start) |
512 f.close() |
515 f.truncate() |
513 except (IOError, OSError, error.Abort) as inst: |
516 end = revs * _rbcrecsize |
514 repo.ui.debug("couldn't write revision branch cache: %s\n" % |
517 f.write(self._rbcrevs[start:end]) |
515 inst) |
518 f.close() |
516 return |
519 except (IOError, OSError, error.Abort) as inst: |
517 self._rbcrevslen = revs |
520 repo.ui.debug("couldn't write revision branch cache: %s\n" % |
|
521 inst) |
|
522 return |
|
523 self._rbcrevslen = revs |