[Commented On] D11993: sparse: take lock before writing requirements
baymax (Baymax, Your Personal Patch-care Companion)
phabricator at mercurial-scm.org
Mon Jan 24 16:21:43 UTC 2022
baymax added a comment.
baymax updated this revision to Diff 31816.
✅ refresh by Heptapod after a successful CI run (🐙 💚)
REPOSITORY
rHG Mercurial
CHANGES SINCE LAST UPDATE
https://phab.mercurial-scm.org/D11993?vs=31802&id=31816
BRANCH
default
CHANGES SINCE LAST ACTION
https://phab.mercurial-scm.org/D11993/new/
REVISION DETAIL
https://phab.mercurial-scm.org/D11993
AFFECTED FILES
mercurial/sparse.py
CHANGE DETAILS
diff --git a/mercurial/sparse.py b/mercurial/sparse.py
--- a/mercurial/sparse.py
+++ b/mercurial/sparse.py
@@ -600,38 +600,41 @@
repo, includes, excludes, profiles, force=False, removing=False
):
"""Update the sparse config and working directory state."""
- raw = repo.vfs.tryread(b'sparse')
- oldincludes, oldexcludes, oldprofiles = parseconfig(repo.ui, raw, b'sparse')
-
- oldstatus = repo.status()
- oldmatch = matcher(repo)
- oldrequires = set(repo.requirements)
+ with repo.lock():
+ raw = repo.vfs.tryread(b'sparse')
+ oldincludes, oldexcludes, oldprofiles = parseconfig(
+ repo.ui, raw, b'sparse'
+ )
- # TODO remove this try..except once the matcher integrates better
- # with dirstate. We currently have to write the updated config
- # because that will invalidate the matcher cache and force a
- # re-read. We ideally want to update the cached matcher on the
- # repo instance then flush the new config to disk once wdir is
- # updated. But this requires massive rework to matcher() and its
- # consumers.
+ oldstatus = repo.status()
+ oldmatch = matcher(repo)
+ oldrequires = set(repo.requirements)
+
+ # TODO remove this try..except once the matcher integrates better
+ # with dirstate. We currently have to write the updated config
+ # because that will invalidate the matcher cache and force a
+ # re-read. We ideally want to update the cached matcher on the
+ # repo instance then flush the new config to disk once wdir is
+ # updated. But this requires massive rework to matcher() and its
+ # consumers.
- if requirements.SPARSE_REQUIREMENT in oldrequires and removing:
- repo.requirements.discard(requirements.SPARSE_REQUIREMENT)
- scmutil.writereporequirements(repo)
- elif requirements.SPARSE_REQUIREMENT not in oldrequires:
- repo.requirements.add(requirements.SPARSE_REQUIREMENT)
- scmutil.writereporequirements(repo)
+ if requirements.SPARSE_REQUIREMENT in oldrequires and removing:
+ repo.requirements.discard(requirements.SPARSE_REQUIREMENT)
+ scmutil.writereporequirements(repo)
+ elif requirements.SPARSE_REQUIREMENT not in oldrequires:
+ repo.requirements.add(requirements.SPARSE_REQUIREMENT)
+ scmutil.writereporequirements(repo)
- try:
- writeconfig(repo, includes, excludes, profiles)
- return refreshwdir(repo, oldstatus, oldmatch, force=force)
- except Exception:
- if repo.requirements != oldrequires:
- repo.requirements.clear()
- repo.requirements |= oldrequires
- scmutil.writereporequirements(repo)
- writeconfig(repo, oldincludes, oldexcludes, oldprofiles)
- raise
+ try:
+ writeconfig(repo, includes, excludes, profiles)
+ return refreshwdir(repo, oldstatus, oldmatch, force=force)
+ except Exception:
+ if repo.requirements != oldrequires:
+ repo.requirements.clear()
+ repo.requirements |= oldrequires
+ scmutil.writereporequirements(repo)
+ writeconfig(repo, oldincludes, oldexcludes, oldprofiles)
+ raise
def clearrules(repo, force=False):
To: marmoute, #hg-reviewers, Alphare
Cc: mercurial-patches
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mercurial-scm.org/pipermail/mercurial-patches/attachments/20220124/2c64d080/attachment-0002.html>
More information about the Mercurial-patches
mailing list