Mercurial > public > mercurial-scm > hg-stable
diff mercurial/changelog.py @ 7787:b8d750daadde
Introduce HG_PREPEND to solve pretxn races
- add writepending to flush delayed writes to separate file
- add support in hooks for lazy evaluation of callable parameters
- add HG_PENDING to pretxn hooks
- call writepending if hook is used
- pass repo root to hook environment
- if HG_PENDING = repo root, we're in pretxn hook
- read pending data to make pending changesets visible
- filter HG_PENDING in tests/printenv.py
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Mon, 16 Feb 2009 19:35:07 -0600 |
parents | 14a4337a9b9b |
children | bd8f44638847 |
line wrap: on
line diff
--- a/mercurial/changelog.py Sun Jan 18 19:59:51 2009 +0100 +++ b/mercurial/changelog.py Mon Feb 16 19:35:07 2009 -0600 @@ -96,7 +96,7 @@ fp = self.opener(self.indexfile, 'a') fp.write("".join(self._delaybuf)) fp.close() - del self._delaybuf + self._delaybuf = [] # split when we're done self.checkinlinesize(tr) @@ -115,6 +115,31 @@ # otherwise, divert to memory return appender(fp, self._delaybuf) + def readpending(self, file): + r = revlog.revlog(self.opener, file) + self.index = r.index + self.nodemap = r.nodemap + self._chunkcache = r._chunkcache + + def writepending(self): + "create a file containing the unfinalized state for pretxnchangegroup" + if self._delaybuf: + # make a temporary copy of the index + fp1 = self._realopener(self.indexfile) + fp2 = self._realopener(self.indexfile + ".a", "w") + fp2.write(fp1.read()) + # add pending data + fp2.write("".join(self._delaybuf)) + fp2.close() + # switch modes so finalize can simply rename + self._delaybuf = [] + self._delayname = fp1.name + + if self._delayname: + return True + + return False + def checkinlinesize(self, tr, fp=None): if self.opener == self._delayopener: return