Mercurial > public > mercurial-scm > hg
comparison mercurial/sparse.py @ 51802:95cdc01f313d
sparse: reliably avoid writing to store without a lock
With the code as written before this patch we can still end up writing to
store in `debugsparse`. Obviously we'll write to it if by accident a store
requirement is modified, but more importantly we write to it if another
concurrent transaction modifies the requirements file on disk.
We can't rule this out since we're not holding the store lock,
so it's better to explicitly pass a permission to write instead
of inferring it based on file contents.
author | Arseniy Alekseyev <aalekseyev@janestreet.com> |
---|---|
date | Fri, 16 Aug 2024 11:12:19 +0100 |
parents | 0d7ccb163b4f |
children | f4733654f144 |
comparison
equal
deleted
inserted
replaced
51801:0d7ccb163b4f | 51802:95cdc01f313d |
---|---|
630 # updated. But this requires massive rework to matcher() and its | 630 # updated. But this requires massive rework to matcher() and its |
631 # consumers. | 631 # consumers. |
632 | 632 |
633 if requirements.SPARSE_REQUIREMENT in oldrequires and removing: | 633 if requirements.SPARSE_REQUIREMENT in oldrequires and removing: |
634 repo.requirements.discard(requirements.SPARSE_REQUIREMENT) | 634 repo.requirements.discard(requirements.SPARSE_REQUIREMENT) |
635 scmutil.writereporequirements(repo) | 635 scmutil.writereporequirements(repo, maywritestore=False) |
636 elif requirements.SPARSE_REQUIREMENT not in oldrequires: | 636 elif requirements.SPARSE_REQUIREMENT not in oldrequires: |
637 repo.requirements.add(requirements.SPARSE_REQUIREMENT) | 637 repo.requirements.add(requirements.SPARSE_REQUIREMENT) |
638 scmutil.writereporequirements(repo) | 638 scmutil.writereporequirements(repo, maywritestore=False) |
639 | 639 |
640 try: | 640 try: |
641 writeconfig(repo, includes, excludes, profiles) | 641 writeconfig(repo, includes, excludes, profiles) |
642 return refreshwdir(repo, oldstatus, oldmatch, force=force) | 642 return refreshwdir(repo, oldstatus, oldmatch, force=force) |
643 except Exception: | 643 except Exception: |
644 if repo.requirements != oldrequires: | 644 if repo.requirements != oldrequires: |
645 repo.requirements.clear() | 645 repo.requirements.clear() |
646 repo.requirements |= oldrequires | 646 repo.requirements |= oldrequires |
647 scmutil.writereporequirements(repo) | 647 scmutil.writereporequirements(repo, maywritestore=False) |
648 writeconfig(repo, oldincludes, oldexcludes, oldprofiles) | 648 writeconfig(repo, oldincludes, oldexcludes, oldprofiles) |
649 raise | 649 raise |
650 | 650 |
651 | 651 |
652 def clearrules(repo, force=False): | 652 def clearrules(repo, force=False): |