Mercurial > public > mercurial-scm > hg
comparison mercurial/changelog.py @ 47239:682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
This prevent external reader to see the transaction content before it is
commited. However this also prevent the hooks to see the transaction content.
We will fix this in later changesets.
We have to temporarily suppress the error output of the command ran during the
transaction as they sometimes get confused about unknown working directory and
sometimes issue message on std-err in unspecified order.
Differential Revision: https://phab.mercurial-scm.org/D10629
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Mon, 03 May 2021 12:35:02 +0200 |
parents | 616b8f412676 |
children | 4f38ada3fc26 |
comparison
equal
deleted
inserted
replaced
47238:6597255a4f94 | 47239:682f09857d69 |
---|---|
441 # Ensure all updates go through this function | 441 # Ensure all updates go through this function |
442 assert isinstance(val, frozenset) | 442 assert isinstance(val, frozenset) |
443 self._filteredrevs = val | 443 self._filteredrevs = val |
444 self._filteredrevs_hashcache = {} | 444 self._filteredrevs_hashcache = {} |
445 | 445 |
446 def _write_docket(self, tr): | |
447 if not self._delayed: | |
448 super(changelog, self)._write_docket(tr) | |
449 | |
446 def delayupdate(self, tr): | 450 def delayupdate(self, tr): |
447 """delay visibility of index updates to other readers""" | 451 """delay visibility of index updates to other readers""" |
448 if self._docket is not None: | 452 if self._docket is None and not self._delayed: |
449 return | |
450 | |
451 if not self._delayed: | |
452 if len(self) == 0: | 453 if len(self) == 0: |
453 self._divert = True | 454 self._divert = True |
454 if self._realopener.exists(self._indexfile + b'.a'): | 455 if self._realopener.exists(self._indexfile + b'.a'): |
455 self._realopener.unlink(self._indexfile + b'.a') | 456 self._realopener.unlink(self._indexfile + b'.a') |
456 self.opener = _divertopener(self._realopener, self._indexfile) | 457 self.opener = _divertopener(self._realopener, self._indexfile) |
466 def _finalize(self, tr): | 467 def _finalize(self, tr): |
467 """finalize index updates""" | 468 """finalize index updates""" |
468 self._delayed = False | 469 self._delayed = False |
469 self.opener = self._realopener | 470 self.opener = self._realopener |
470 # move redirected index data back into place | 471 # move redirected index data back into place |
471 if self._divert: | 472 if self._docket is not None: |
473 self._write_docket(tr) | |
474 elif self._divert: | |
472 assert not self._delaybuf | 475 assert not self._delaybuf |
473 tmpname = self._indexfile + b".a" | 476 tmpname = self._indexfile + b".a" |
474 nfile = self.opener.open(tmpname) | 477 nfile = self.opener.open(tmpname) |
475 nfile.close() | 478 nfile.close() |
476 self.opener.rename(tmpname, self._indexfile, checkambig=True) | 479 self.opener.rename(tmpname, self._indexfile, checkambig=True) |