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)