[Updated] D9040: merge: use in-memory mergestate when using in-memory context
martinvonz (Martin von Zweigbergk)
phabricator at mercurial-scm.org
Fri Sep 18 02:38:09 UTC 2020
Closed by commit rHG19590b126764: merge: use in-memory mergestate when using in-memory context (authored by martinvonz).
This revision was automatically updated to reflect the committed changes.
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D9040?vs=22688&id=22707
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D9040/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D9040
AFFECTED FILES
mercurial/context.py
mercurial/merge.py
mercurial/mergestate.py
CHANGE DETAILS
diff --git a/mercurial/mergestate.py b/mercurial/mergestate.py
--- a/mercurial/mergestate.py
+++ b/mercurial/mergestate.py
@@ -801,6 +801,32 @@
shutil.rmtree(self._repo.vfs.join(b'merge'), True)
+class memmergestate(_mergestate_base):
+ def __init__(self, repo):
+ super(memmergestate, self).__init__(repo)
+ self._backups = {}
+
+ def _make_backup(self, fctx, localkey):
+ self._backups[localkey] = fctx.data()
+
+ def _restore_backup(self, fctx, localkey, flags):
+ fctx.write(self._backups[localkey], flags)
+
+ @util.propertycache
+ def mergedriver(self):
+ configmergedriver = self._repo.ui.config(
+ b'experimental', b'mergedriver'
+ )
+ if configmergedriver:
+ raise error.InMemoryMergeConflictsError(
+ b"in-memory merge does not support mergedriver"
+ )
+ return None
+
+ def commit(self):
+ pass
+
+
def recordupdates(repo, actions, branchmerge, getfiledata):
"""record merge actions to the dirstate"""
# remove (must come first)
diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -1398,7 +1398,7 @@
_prefetchfiles(repo, mctx, mresult)
updated, merged, removed = 0, 0, 0
- ms = mergestatemod.mergestate.clean(repo)
+ ms = wctx.mergestate(clean=True)
ms.start(wctx.p1().node(), mctx.node(), labels)
for f, op in pycompat.iteritems(mresult.commitinfo):
@@ -1611,10 +1611,6 @@
usemergedriver = not overwrite and mergeactions and ms.mergedriver
if usemergedriver:
- if wctx.isinmemory():
- raise error.InMemoryMergeConflictsError(
- b"in-memory merge does not support mergedriver"
- )
ms.commit()
proceed = driverpreprocess(repo, ms, wctx, labels=labels)
# the driver might leave some files unresolved
@@ -1895,7 +1891,7 @@
if not overwrite:
if len(pl) > 1:
raise error.Abort(_(b"outstanding uncommitted merge"))
- ms = mergestatemod.mergestate.read(repo)
+ ms = wc.mergestate()
if list(ms.unresolved()):
raise error.Abort(
_(b"outstanding merge conflicts"),
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -2528,6 +2528,7 @@
return path in self._cache
def clean(self):
+ self._mergestate = None
self._cache = {}
def _compact(self):
@@ -2592,6 +2593,11 @@
self._repo, path, parent=self, filelog=filelog
)
+ def mergestate(self, clean=False):
+ if clean or self._mergestate is None:
+ self._mergestate = mergestatemod.memmergestate(self._repo)
+ return self._mergestate
+
class overlayworkingfilectx(committablefilectx):
"""Wrap a ``workingfilectx`` but intercepts all writes into an in-memory
To: martinvonz, #hg-reviewers, indygreg
Cc: mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20200918/0017de43/attachment-0002.html>
More information about the Mercurial-patches
mailing list