Patchwork [3,of,7,V2] dirstate: make dirstate.write() callers pass transaction object to it

login
register
mail settings
Submitter Katsunori FUJIWARA
Date Oct. 16, 2015, 4:22 p.m.
Message ID <d97cdb39d69f1cb80589.1445012553@feefifofum>
Download mbox | patch
Permalink /patch/11143/
State Accepted
Headers show

Comments

Katsunori FUJIWARA - Oct. 16, 2015, 4:22 p.m.
# HG changeset patch
# User FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
# Date 1445012134 -32400
#      Sat Oct 17 01:15:34 2015 +0900
# Node ID d97cdb39d69f1cb80589c4d3a6974502b2e54527
# Parent  f4f6af8376490aa4d46996a9ad9ea4d9aaeefcad
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

Patch

diff --git a/contrib/perf.py b/contrib/perf.py
--- a/contrib/perf.py
+++ b/contrib/perf.py
@@ -222,7 +222,7 @@ 
     "a" in ds
     def d():
         ds._dirty = True
-        ds.write()
+        ds.write(repo.currenttransaction())
     timer(d)
     fm.end()
 
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -628,7 +628,7 @@ 
         merge.update(repo, p1, False, True, False)
     else:
         repo.ui.debug(" already in target\n")
-    repo.dirstate.write()
+    repo.dirstate.write(repo.currenttransaction())
     repo.ui.debug(" merge against %d:%s\n" % (rev, repo[rev]))
     if base is not None:
         repo.ui.debug("   detach base %d:%s\n" % (base, repo[base]))
diff --git a/hgext/strip.py b/hgext/strip.py
--- a/hgext/strip.py
+++ b/hgext/strip.py
@@ -58,7 +58,7 @@ 
                 and p2 in [x.node for x in repo.mq.applied]):
                 urev = p2
             hg.clean(repo, urev)
-            repo.dirstate.write()
+            repo.dirstate.write(repo.currenttransaction())
 
         repair.strip(ui, repo, revs, backup)
 
@@ -205,7 +205,7 @@ 
             changedfiles.extend(dirchanges)
 
             repo.dirstate.rebuild(urev, uctx.manifest(), changedfiles)
-            repo.dirstate.write()
+            repo.dirstate.write(repo.currenttransaction())
 
             # clear resolve state
             ms = merge.mergestate(repo)
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -1324,7 +1324,7 @@ 
         # write changes out explicitly, because nesting wlock at
         # runtime may prevent 'wlock.release()' in 'repo.commit()'
         # from immediately doing so for subsequent changing files
-        self._repo.dirstate.write()
+        self._repo.dirstate.write(self._repo.currenttransaction())
 
 class workingctx(committablectx):
     """A workingctx object makes access to data related to
@@ -1530,7 +1530,7 @@ 
                     # write changes out explicitly, because nesting
                     # wlock at runtime may prevent 'wlock.release()'
                     # below from doing so for subsequent changing files
-                    self._repo.dirstate.write()
+                    self._repo.dirstate.write(self._repo.currenttransaction())
                 finally:
                     wlock.release()
             except error.LockError:
diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py
--- a/mercurial/localrepo.py
+++ b/mercurial/localrepo.py
@@ -977,7 +977,7 @@ 
                 hint=_("run 'hg recover' to clean up transaction"))
 
         # make journal.dirstate contain in-memory changes at this point
-        self.dirstate.write()
+        self.dirstate.write(None)
 
         idbase = "%.40f#%f" % (random.random(), time.time())
         txnid = 'TXN:' + util.sha1(idbase).hexdigest()
@@ -1005,7 +1005,7 @@ 
                 # transaction, if tr.addfilegenerator (via
                 # dirstate.write or so) isn't invoked while
                 # transaction running
-                repo.dirstate.write()
+                repo.dirstate.write(None)
             else:
                 # prevent in-memory changes from being written out at
                 # the end of outer wlock scope or so
@@ -1319,7 +1319,7 @@ 
             if self.dirstate.pendingparentchange():
                 self.dirstate.invalidate()
             else:
-                self.dirstate.write()
+                self.dirstate.write(None)
 
             self._filecache['dirstate'].refresh()
 
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1270,7 +1270,7 @@ 
     # drop the second merge parent
     repo.dirstate.beginparentchange()
     repo.setparents(repo['.'].node(), nullid)
-    repo.dirstate.write()
+    repo.dirstate.write(repo.currenttransaction())
     # fix up dirstate for copies and renames
     copies.duplicatecopies(repo, ctx.rev(), pctx.rev())
     repo.dirstate.endparentchange()