[PATCH 1 of 6] dirstate: make dirstate.write() callers pass repo object to it

FUJIWARA Katsunori foozy at lares.dti.ne.jp
Wed Oct 14 17:35:16 UTC 2015


# HG changeset patch
# User FUJIWARA Katsunori <foozy at lares.dti.ne.jp>
# Date 1444843899 -32400
#      Thu Oct 15 02:31:39 2015 +0900
# Node ID 59a9e52b17e1af3f69b6c9472c9c10a6b00d9b24
# Parent  79d86ab65c9def3fdd65ec972bc5fa89688a19ff
dirstate: make dirstate.write() callers pass repo object to it

Now, 'dirstate.write(repo)' delays writing in-memory changes out, if
any 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.

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)
     timer(d)
     fm.end()
 
diff --git a/hgext/rebase.py b/hgext/rebase.py
--- a/hgext/rebase.py
+++ b/hgext/rebase.py
@@ -612,7 +612,7 @@
         merge.update(repo, p1, False, True, False)
     else:
         repo.ui.debug(" already in target\n")
-    repo.dirstate.write()
+    repo.dirstate.write(repo)
     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)
 
         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)
 
             # 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)
 
 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)
                 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(self)
 
         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(repo)
             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(self)
 
             self._filecache['dirstate'].refresh()
 
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1213,7 +1213,7 @@
     # drop the second merge parent
     repo.dirstate.beginparentchange()
     repo.setparents(repo['.'].node(), nullid)
-    repo.dirstate.write()
+    repo.dirstate.write(repo)
     # fix up dirstate for copies and renames
     copies.duplicatecopies(repo, ctx.rev(), pctx.rev())
     repo.dirstate.endparentchange()


More information about the Mercurial-devel mailing list