Patchwork D7901: merge: introduce a revert_to() for that use-case

login
register
mail settings
Submitter phabricator
Date Feb. 6, 2020, 10:21 p.m.
Message ID <c239806349f6607c5f442fe5022d6534@localhost.localdomain>
Download mbox | patch
Permalink /patch/45007/
State Not Applicable
Headers show

Comments

phabricator - Feb. 6, 2020, 10:21 p.m.
Closed by commit rHGc791ed6a2154: merge: introduce a revert_to() for that use-case (authored by martinvonz).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D7901?vs=19930&id=19971

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7901/new/

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

AFFECTED FILES
  hgext/fix.py
  mercurial/cmdutil.py
  mercurial/merge.py

CHANGE DETAILS




To: martinvonz, #hg-reviewers, marmoute
Cc: mercurial-devel

Patch

diff --git a/mercurial/merge.py b/mercurial/merge.py
--- a/mercurial/merge.py
+++ b/mercurial/merge.py
@@ -2225,6 +2225,7 @@ 
     labels=None,
     matcher=None,
     mergeforce=False,
+    updatedirstate=True,
     updatecheck=None,
     wc=None,
 ):
@@ -2523,7 +2524,7 @@ 
         # If we're doing a partial update, we need to skip updating
         # the dirstate.
         always = matcher is None or matcher.always()
-        updatedirstate = always and not wc.isinmemory()
+        updatedirstate = updatedirstate and always and not wc.isinmemory()
         if updatedirstate:
             repo.hook(b'preupdate', throw=True, parent1=xp1, parent2=xp2)
             # note that we're in the middle of an update
@@ -2606,6 +2607,24 @@ 
     return update(ctx.repo(), ctx.rev(), branchmerge=False, force=True, wc=wc)
 
 
+def revert_to(ctx, matcher=None, wc=None):
+    """Revert the working copy to the given commit.
+
+    The working copy will keep its current parent(s) but its content will
+    be the same as in the given commit.
+    """
+
+    return update(
+        ctx.repo(),
+        ctx.rev(),
+        branchmerge=False,
+        force=True,
+        updatedirstate=False,
+        matcher=matcher,
+        wc=wc,
+    )
+
+
 def graft(
     repo,
     ctx,
diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py
--- a/mercurial/cmdutil.py
+++ b/mercurial/cmdutil.py
@@ -584,15 +584,8 @@ 
             [os.unlink(repo.wjoin(c)) for c in newlyaddedandmodifiedfiles]
             # 3a. apply filtered patch to clean repo  (clean)
             if backups:
-                # Equivalent to hg.revert
                 m = scmutil.matchfiles(repo, set(backups.keys()) | alsorestore)
-                mergemod.update(
-                    repo,
-                    repo.dirstate.p1(),
-                    branchmerge=False,
-                    force=True,
-                    matcher=m,
-                )
+                mergemod.revert_to(repo[b'.'], matcher=m)
 
             # 3b. (apply)
             if dopatch:
diff --git a/hgext/fix.py b/hgext/fix.py
--- a/hgext/fix.py
+++ b/hgext/fix.py
@@ -735,15 +735,7 @@ 
 
     wctx = context.overlayworkingctx(repo)
     wctx.setbase(repo[newp1node])
-    merge.update(
-        repo,
-        ctx.rev(),
-        branchmerge=False,
-        force=True,
-        ancestor=p1rev,
-        mergeancestor=False,
-        wc=wctx,
-    )
+    merge.revert_to(ctx, wc=wctx)
     copies.graftcopies(wctx, ctx, ctx.p1())
 
     for path in filedata.keys():