Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/localrepo.py @ 26748:5ba0a99ff27f
dirstate: make dirstate.write() callers pass transaction object to it
Now, 'dirstate.write(tr)' delays writing in-memory changes out, if a
transaction is running.
This may cause treating this revision as "the first bad one" at
bisecting in some cases using external hook process inside transaction
scope, because some external hooks and editor process are still
invoked without HG_PENDING and pending changes aren't visible to them.
'dirstate.write()' callers below in localrepo.py explicitly use 'None'
as 'tr', because they can assume that no transaction is running:
- just before starting transaction
- at closing transaction, or
- at unlocking wlock
author | FUJIWARA Katsunori <foozy@lares.dti.ne.jp> |
---|---|
date | Sat, 17 Oct 2015 01:15:34 +0900 |
parents | e1568d5eb052 |
children | 520defbc0335 |
comparison
equal
deleted
inserted
replaced
26747:beff0b2481b3 | 26748:5ba0a99ff27f |
---|---|
975 raise error.RepoError( | 975 raise error.RepoError( |
976 _("abandoned transaction found"), | 976 _("abandoned transaction found"), |
977 hint=_("run 'hg recover' to clean up transaction")) | 977 hint=_("run 'hg recover' to clean up transaction")) |
978 | 978 |
979 # make journal.dirstate contain in-memory changes at this point | 979 # make journal.dirstate contain in-memory changes at this point |
980 self.dirstate.write() | 980 self.dirstate.write(None) |
981 | 981 |
982 idbase = "%.40f#%f" % (random.random(), time.time()) | 982 idbase = "%.40f#%f" % (random.random(), time.time()) |
983 txnid = 'TXN:' + util.sha1(idbase).hexdigest() | 983 txnid = 'TXN:' + util.sha1(idbase).hexdigest() |
984 self.hook('pretxnopen', throw=True, txnname=desc, txnid=txnid) | 984 self.hook('pretxnopen', throw=True, txnname=desc, txnid=txnid) |
985 | 985 |
1003 # this should be explicitly invoked here, because | 1003 # this should be explicitly invoked here, because |
1004 # in-memory changes aren't written out at closing | 1004 # in-memory changes aren't written out at closing |
1005 # transaction, if tr.addfilegenerator (via | 1005 # transaction, if tr.addfilegenerator (via |
1006 # dirstate.write or so) isn't invoked while | 1006 # dirstate.write or so) isn't invoked while |
1007 # transaction running | 1007 # transaction running |
1008 repo.dirstate.write() | 1008 repo.dirstate.write(None) |
1009 else: | 1009 else: |
1010 # prevent in-memory changes from being written out at | 1010 # prevent in-memory changes from being written out at |
1011 # the end of outer wlock scope or so | 1011 # the end of outer wlock scope or so |
1012 repo.dirstate.invalidate() | 1012 repo.dirstate.invalidate() |
1013 | 1013 |
1317 | 1317 |
1318 def unlock(): | 1318 def unlock(): |
1319 if self.dirstate.pendingparentchange(): | 1319 if self.dirstate.pendingparentchange(): |
1320 self.dirstate.invalidate() | 1320 self.dirstate.invalidate() |
1321 else: | 1321 else: |
1322 self.dirstate.write() | 1322 self.dirstate.write(None) |
1323 | 1323 |
1324 self._filecache['dirstate'].refresh() | 1324 self._filecache['dirstate'].refresh() |
1325 | 1325 |
1326 l = self._lock(self.vfs, "wlock", wait, unlock, | 1326 l = self._lock(self.vfs, "wlock", wait, unlock, |
1327 self.invalidatedirstate, _('working directory of %s') % | 1327 self.invalidatedirstate, _('working directory of %s') % |