[PATCH V2] commit: pass mergestate into _filecommit() instead of re-reading it

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

[PATCH V2] commit: pass mergestate into _filecommit() instead of re-reading it

Pulkit Goyal
# HG changeset patch
# User Pulkit Goyal <[hidden email]>
# Date 1599122644 -19800
#      Thu Sep 03 14:14:04 2020 +0530
# Node ID c889e1fddc190ff73265939965706b2dd0bfec3b
# Parent  64de86fd0984ff1e2306de52849be7ebf7dcfd25
# EXP-Topic merge-newnode
commit: pass mergestate into _filecommit() instead of re-reading it

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()`.

Differential Revision: https://phab.mercurial-scm.org/D8984

diff --git a/mercurial/commit.py b/mercurial/commit.py
--- a/mercurial/commit.py
+++ b/mercurial/commit.py
@@ -157,6 +157,7 @@ def _process_files(tr, ctx, error=False)
     m = mctx.read()
     m1 = m1ctx.read()
     m2 = m2ctx.read()
+    ms = mergestate.mergestate.read(repo)
 
     files = metadata.ChangingFiles()
 
@@ -175,7 +176,7 @@ def _process_files(tr, ctx, error=False)
             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 +212,7 @@ def _process_files(tr, ctx, error=False)
 
 
 def _filecommit(
-    repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta,
+    repo, fctx, manifest1, manifest2, linkrev, tr, includecopymeta, ms,
 ):
     """
     commit an individual file as part of a larger transaction
@@ -226,6 +227,8 @@ def _filecommit(
         includecopymeta: 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 +327,7 @@ def _filecommit(
             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.active() and ms.extras(fname).get(b'filenode-source') == b'other':
                 fparent1, fparent2 = fparent2, nullid
 
     # is the file changed?
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 @@ and its ancestor by overriding "repo._fi
   > 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):
   >     fname = fctx.path()
   >     text = fctx.data()
   >     flog = repo.file(fname)
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 @@ and its ancestor by overriding "repo._fi
   > 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):
   >     fname = fctx.path()
   >     text = fctx.data()
   >     flog = repo.file(fname)
_______________________________________________
Mercurial-devel mailing list
[hidden email]
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel
Reply | Threaded
Open this post in threaded view
|

Re: [PATCH V2] commit: pass mergestate into _filecommit() instead of re-reading it

Yuya Nishihara
On Fri, 11 Sep 2020 12:34:46 +0530, Pulkit Goyal wrote:
> # HG changeset patch
> # User Pulkit Goyal <[hidden email]>
> # Date 1599122644 -19800
> #      Thu Sep 03 14:14:04 2020 +0530
> # Node ID c889e1fddc190ff73265939965706b2dd0bfec3b
> # Parent  64de86fd0984ff1e2306de52849be7ebf7dcfd25
> # EXP-Topic merge-newnode
> commit: pass mergestate into _filecommit() instead of re-reading it

Queued, thanks.

> @@ -226,6 +227,8 @@ def _filecommit(
>          includecopymeta: 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)

Removed "None if ...".
_______________________________________________
Mercurial-devel mailing list
[hidden email]
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel