equal
deleted
inserted
replaced
450 """delay visibility of index updates to other readers""" |
450 """delay visibility of index updates to other readers""" |
451 |
451 |
452 if not self._delayed: |
452 if not self._delayed: |
453 if len(self) == 0: |
453 if len(self) == 0: |
454 self._divert = True |
454 self._divert = True |
455 if self._realopener.exists(self.indexfile + b'.a'): |
455 if self._realopener.exists(self._indexfile + b'.a'): |
456 self._realopener.unlink(self.indexfile + b'.a') |
456 self._realopener.unlink(self._indexfile + b'.a') |
457 self.opener = _divertopener(self._realopener, self.indexfile) |
457 self.opener = _divertopener(self._realopener, self._indexfile) |
458 else: |
458 else: |
459 self._delaybuf = [] |
459 self._delaybuf = [] |
460 self.opener = _delayopener( |
460 self.opener = _delayopener( |
461 self._realopener, self.indexfile, self._delaybuf |
461 self._realopener, self._indexfile, self._delaybuf |
462 ) |
462 ) |
463 self._delayed = True |
463 self._delayed = True |
464 tr.addpending(b'cl-%i' % id(self), self._writepending) |
464 tr.addpending(b'cl-%i' % id(self), self._writepending) |
465 tr.addfinalize(b'cl-%i' % id(self), self._finalize) |
465 tr.addfinalize(b'cl-%i' % id(self), self._finalize) |
466 |
466 |
469 self._delayed = False |
469 self._delayed = False |
470 self.opener = self._realopener |
470 self.opener = self._realopener |
471 # move redirected index data back into place |
471 # move redirected index data back into place |
472 if self._divert: |
472 if self._divert: |
473 assert not self._delaybuf |
473 assert not self._delaybuf |
474 tmpname = self.indexfile + b".a" |
474 tmpname = self._indexfile + b".a" |
475 nfile = self.opener.open(tmpname) |
475 nfile = self.opener.open(tmpname) |
476 nfile.close() |
476 nfile.close() |
477 self.opener.rename(tmpname, self.indexfile, checkambig=True) |
477 self.opener.rename(tmpname, self._indexfile, checkambig=True) |
478 elif self._delaybuf: |
478 elif self._delaybuf: |
479 fp = self.opener(self.indexfile, b'a', checkambig=True) |
479 fp = self.opener(self._indexfile, b'a', checkambig=True) |
480 fp.write(b"".join(self._delaybuf)) |
480 fp.write(b"".join(self._delaybuf)) |
481 fp.close() |
481 fp.close() |
482 self._delaybuf = None |
482 self._delaybuf = None |
483 self._divert = False |
483 self._divert = False |
484 # split when we're done |
484 # split when we're done |
487 def _writepending(self, tr): |
487 def _writepending(self, tr): |
488 """create a file containing the unfinalized state for |
488 """create a file containing the unfinalized state for |
489 pretxnchangegroup""" |
489 pretxnchangegroup""" |
490 if self._delaybuf: |
490 if self._delaybuf: |
491 # make a temporary copy of the index |
491 # make a temporary copy of the index |
492 fp1 = self._realopener(self.indexfile) |
492 fp1 = self._realopener(self._indexfile) |
493 pendingfilename = self.indexfile + b".a" |
493 pendingfilename = self._indexfile + b".a" |
494 # register as a temp file to ensure cleanup on failure |
494 # register as a temp file to ensure cleanup on failure |
495 tr.registertmp(pendingfilename) |
495 tr.registertmp(pendingfilename) |
496 # write existing data |
496 # write existing data |
497 fp2 = self._realopener(pendingfilename, b"w") |
497 fp2 = self._realopener(pendingfilename, b"w") |
498 fp2.write(fp1.read()) |
498 fp2.write(fp1.read()) |
500 fp2.write(b"".join(self._delaybuf)) |
500 fp2.write(b"".join(self._delaybuf)) |
501 fp2.close() |
501 fp2.close() |
502 # switch modes so finalize can simply rename |
502 # switch modes so finalize can simply rename |
503 self._delaybuf = None |
503 self._delaybuf = None |
504 self._divert = True |
504 self._divert = True |
505 self.opener = _divertopener(self._realopener, self.indexfile) |
505 self.opener = _divertopener(self._realopener, self._indexfile) |
506 |
506 |
507 if self._divert: |
507 if self._divert: |
508 return True |
508 return True |
509 |
509 |
510 return False |
510 return False |