# HG changeset patch # User Martin von Zweigbergk # Date 2019-12-20 22:03:12 # Node ID 2bd3b95fdce0cfe95880c26a160d3d32aa9a7bd4 # Parent a69c08cdb2a82079b2f18900570612a4996cf45b copy: rewrite walkpat() to depend less on dirstate I want to add a `hg cp/mv -r ` option to mark files as copied/moved in an existing commit (amending that commit). The code needs to not depend on the dirstate for that. Differential Revision: https://phab.mercurial-scm.org/D8031 diff --git a/mercurial/cmdutil.py b/mercurial/cmdutil.py --- a/mercurial/cmdutil.py +++ b/mercurial/cmdutil.py @@ -1419,32 +1419,35 @@ def copy(ui, repo, pats, opts, rename=Fa after = opts.get(b"after") dryrun = opts.get(b"dry_run") wctx = repo[None] + pctx = wctx.p1() uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) def walkpat(pat): srcs = [] - if after: - badstates = b'?' - else: - badstates = b'?r' m = scmutil.match(wctx, [pat], opts, globbed=True) for abs in wctx.walk(m): - state = repo.dirstate[abs] rel = uipathfn(abs) exact = m.exact(abs) - if state in badstates: - if exact and state == b'?': - ui.warn(_(b'%s: not copying - file is not managed\n') % rel) - if exact and state == b'r': - ui.warn( - _( - b'%s: not copying - file has been marked for' - b' remove\n' + if abs not in wctx: + if abs in pctx: + if not after: + if exact: + ui.warn( + _( + b'%s: not copying - file has been marked ' + b'for remove\n' + ) + % rel + ) + continue + else: + if exact: + ui.warn( + _(b'%s: not copying - file is not managed\n') % rel ) - % rel - ) - continue + continue + # abs: hgsep # rel: ossep srcs.append((abs, rel, exact))