# HG changeset patch # User Pierre-Yves David # Date 1670901766 -3600 # Node ID 16b78c0de5061476d3ce06c0711cc8983d0c70c6 # Parent 3c34a224c2321f21d2ac5d0873368fe2a8c3561d locking: take the `wlock` for the full `hg remove` duration Otherwise, there is a race condition window between the time we resolve the file to remove with the matcher and the time we lock the repo and modify the dirstate. For example, the working copy might have been updated away, or purged, and the matched files would no longer be correct. diff -r 3c34a224c232 -r 16b78c0de506 mercurial/commands.py --- a/mercurial/commands.py Tue Dec 13 04:21:27 2022 +0100 +++ b/mercurial/commands.py Tue Dec 13 04:22:46 2022 +0100 @@ -5945,12 +5945,13 @@ if not pats and not after: raise error.InputError(_(b'no files specified')) - m = scmutil.match(repo[None], pats, opts) - subrepos = opts.get(b'subrepos') - uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) - return cmdutil.remove( - ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun - ) + with repo.wlock(): + m = scmutil.match(repo[None], pats, opts) + subrepos = opts.get(b'subrepos') + uipathfn = scmutil.getuipathfn(repo, legacyrelativevalue=True) + return cmdutil.remove( + ui, repo, m, b"", uipathfn, after, force, subrepos, dryrun=dryrun + ) @command(