D5792: uncommit: added interactive mode(issue6062)

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Thu Feb 21 12:18:23 EST 2019

martinvonz added a comment.

  I'll drop this patch from the queue because I think there's a lot that can be cleaned up. I tried to re-unify `_fixdirstate()` and `_uncommitdirstate()` myself. This is my first step:
    diff --git a/hgext/uncommit.py b/hgext/uncommit.py
    --- a/hgext/uncommit.py
    +++ b/hgext/uncommit.py
    @@ -138,7 +138,7 @@ def _fixdirstate(repo, oldctx, newctx, m
             ds.copy(src, dst)
    -def _uncommitdirstate(repo, oldctx, match, interactive):
    +def _uncommitdirstate(repo, oldctx, newctx, match, interactive):
         """Fix the dirstate after switching the working directory from
         oldctx to a copy of oldctx not containing changed files matched by
    @@ -217,21 +217,13 @@ def _uncommitdirstate(repo, oldctx, matc
         # Merge old parent and old working dir copies
    -    oldcopies = {}
    -    if interactive:
    -        # Interactive had different meaning of the variables so restoring the
    -        # original meaning to use them
    -        m, a, r = repo.status(oldctx.p1(), oldctx, match=match)[:3]
    -    for f in (m + a):
    -        src = oldctx[f].renamed()
    -        if src:
    -            oldcopies[f] = src[0]
    +    oldcopies = copiesmod.pathcopies(newctx, oldctx, match)
         copies = dict((dst, oldcopies.get(src, src))
                       for dst, src in oldcopies.iteritems())
         # Adjust the dirstate copies
         for dst, src in copies.iteritems():
    -        if (src not in ctx or dst in ctx or ds[dst] != 'a'):
    +        if (src not in newctx or dst in newctx or ds[dst] != 'a'):
                 src = None
             ds.copy(src, dst)
    @@ -285,11 +277,11 @@ def uncommit(ui, repo, *pats, **opts):
                     # Fully removed the old commit
                     mapping[old.node()] = ()
    -            scmutil.cleanupnodes(repo, mapping, 'uncommit', fixphase=True)
                 with repo.dirstate.parentchange():
                     repo.dirstate.setparents(newid, node.nullid)
    -                _uncommitdirstate(repo, old, match, interactive)
    +                _uncommitdirstate(repo, old, repo[newid], match, interactive)
    +            scmutil.cleanupnodes(repo, mapping, 'uncommit', fixphase=True)
     def _interactiveuncommit(ui, repo, old, match):
         """ The function which contains all the logic for interactively uncommiting
  Is there a reason that's broken? Tests seem to pass (test-uncommit.t passes). If not, could you try to continue in the direction of unifying the two method again?


> uncommit.py:141
> +
> +def _uncommitdirstate(repo, oldctx, match, interactive):
> +    """Fix the dirstate after switching the working directory from

Much of this duplicates `_fixdirstate()`. We must be able to share some of this code.

> uncommit.py:273
> +            if interactive:
> +                match = scmutil.match(old, pats, opts)
> +                newid = _interactiveuncommit(ui, repo, old, match)

Unnecessary (done on line 269)

> uncommit.py:288
> +            scmutil.cleanupnodes(repo, mapping, 'uncommit', fixphase=True)
> +            

Why did this moved here? I just moved it down in https://phab.mercurial-scm.org/D5660. I really should have written a better commit message explaining what the problem was. But it's also unclear why it should be moved back.

  rHG Mercurial


To: taapas1128, #hg-reviewers, durin42
Cc: martinvonz, durin42, pulkit, lothiraldan, mercurial-devel

More information about the Mercurial-devel mailing list