Patchwork D8984: commit: pass mergestate into _filecommit() instead of re-reading it

login
register
mail settings
Submitter phabricator
Date Sept. 5, 2020, 7:09 a.m.
Message ID <differential-rev-PHID-DREV-exlewja5jrcjz6wrwujz-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/47090/
State Superseded
Headers show

Comments

phabricator - Sept. 5, 2020, 7:09 a.m.
pulkit created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  mergestate reading although cheap is not free. Let's read mergestate once on top
  and pass it into `_filecommit()`.
  
  In upcoming patches, we will be reading mergestate more in `_filecommit()`.

REPOSITORY
  rHG Mercurial

BRANCH
  default

REVISION DETAIL
  https://phab.mercurial-scm.org/D8984

AFFECTED FILES
  mercurial/commit.py
  tests/test-annotate.t
  tests/test-fastannotate-hg.t

CHANGE DETAILS




To: pulkit, #hg-reviewers
Cc: mercurial-patches, mercurial-devel

Patch

diff --git a/tests/test-fastannotate-hg.t b/tests/test-fastannotate-hg.t
--- a/tests/test-fastannotate-hg.t
+++ b/tests/test-fastannotate-hg.t
@@ -484,7 +484,7 @@ 
   > from __future__ import absolute_import
   > from mercurial import commit, error, extensions, node
   > def _filecommit(orig, repo, fctx, manifest1, manifest2,
-  >                 linkrev, tr, includecopymeta):
+  >                 linkrev, tr, includecopymeta, ms=None):
   >     fname = fctx.path()
   >     text = fctx.data()
   >     flog = repo.file(fname)
diff --git a/tests/test-annotate.t b/tests/test-annotate.t
--- a/tests/test-annotate.t
+++ b/tests/test-annotate.t
@@ -481,7 +481,7 @@ 
   > from __future__ import absolute_import
   > from mercurial import commit, error, extensions, node
   > def _filecommit(orig, repo, fctx, manifest1, manifest2,
-  >                 linkrev, tr, includecopymeta):
+  >                 linkrev, tr, includecopymeta, ms=None):
   >     fname = fctx.path()
   >     text = fctx.data()
   >     flog = repo.file(fname)
diff --git a/mercurial/commit.py b/mercurial/commit.py
--- a/mercurial/commit.py
+++ b/mercurial/commit.py
@@ -157,6 +157,9 @@ 
     m = mctx.read()
     m1 = m1ctx.read()
     m2 = m2ctx.read()
+    ms = mergestate.mergestate.read(repo)
+    if not ms.active():
+        ms = None
 
     files = metadata.ChangingFiles()
 
@@ -175,7 +178,7 @@ 
             else:
                 added.append(f)
                 m[f], is_touched = _filecommit(
-                    repo, fctx, m1, m2, linkrev, tr, writefilecopymeta,
+                    repo, fctx, m1, m2, linkrev, tr, writefilecopymeta, ms
                 )
                 if is_touched:
                     if is_touched == 'added':
@@ -211,7 +214,7 @@ 
 
 
 def _filecommit(
-    repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta,
+    repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta, ms=None,
 ):
     """
     commit an individual file as part of a larger transaction
@@ -226,6 +229,8 @@ 
         individual: boolean, set to False to skip storing the copy data
                     (only used by the Google specific feature of using
                     changeset extra as copy source of truth).
+        ms:         mergestate object (None if no mergestate exists
+                    while committing)
 
     output: (filenode, touched)
 
@@ -324,8 +329,7 @@ 
             fparent2 = nullid
         elif not fparentancestors:
             # TODO: this whole if-else might be simplified much more
-            ms = mergestate.mergestate.read(repo)
-            if ms.extras(fname).get(b'filenode-source') == b'other':
+            if ms and ms.extras(fname).get(b'filenode-source') == b'other':
                 fparent1, fparent2 = fparent2, nullid
 
     # is the file changed?