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):