# HG changeset patch # User Martin von Zweigbergk # Date 1576879392 28800 # 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 -r a69c08cdb2a8 -r 2bd3b95fdce0 mercurial/cmdutil.py --- a/mercurial/cmdutil.py Thu Feb 13 10:12:12 2020 -0800 +++ b/mercurial/cmdutil.py Fri Dec 20 14:03:12 2019 -0800 @@ -1419,32 +1419,35 @@ 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))