Mercurial > public > mercurial-scm > hg-stable
comparison mercurial/sparse.py @ 48687:a62ba3345534
sparse: take lock before writing requirements
with `share-safe`, we will also write file in the store. So we take the `lock`
before altering the requirements.
Differential Revision: https://phab.mercurial-scm.org/D11993
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 11 Jan 2022 06:40:44 +0100 |
parents | b74ee41addee |
children | 5dfaca4464d1 |
comparison
equal
deleted
inserted
replaced
48686:497c2655c71e | 48687:a62ba3345534 |
---|---|
598 | 598 |
599 def _updateconfigandrefreshwdir( | 599 def _updateconfigandrefreshwdir( |
600 repo, includes, excludes, profiles, force=False, removing=False | 600 repo, includes, excludes, profiles, force=False, removing=False |
601 ): | 601 ): |
602 """Update the sparse config and working directory state.""" | 602 """Update the sparse config and working directory state.""" |
603 raw = repo.vfs.tryread(b'sparse') | 603 with repo.lock(): |
604 oldincludes, oldexcludes, oldprofiles = parseconfig(repo.ui, raw, b'sparse') | 604 raw = repo.vfs.tryread(b'sparse') |
605 | 605 oldincludes, oldexcludes, oldprofiles = parseconfig( |
606 oldstatus = repo.status() | 606 repo.ui, raw, b'sparse' |
607 oldmatch = matcher(repo) | 607 ) |
608 oldrequires = set(repo.requirements) | 608 |
609 | 609 oldstatus = repo.status() |
610 # TODO remove this try..except once the matcher integrates better | 610 oldmatch = matcher(repo) |
611 # with dirstate. We currently have to write the updated config | 611 oldrequires = set(repo.requirements) |
612 # because that will invalidate the matcher cache and force a | 612 |
613 # re-read. We ideally want to update the cached matcher on the | 613 # TODO remove this try..except once the matcher integrates better |
614 # repo instance then flush the new config to disk once wdir is | 614 # with dirstate. We currently have to write the updated config |
615 # updated. But this requires massive rework to matcher() and its | 615 # because that will invalidate the matcher cache and force a |
616 # consumers. | 616 # re-read. We ideally want to update the cached matcher on the |
617 | 617 # repo instance then flush the new config to disk once wdir is |
618 if requirements.SPARSE_REQUIREMENT in oldrequires and removing: | 618 # updated. But this requires massive rework to matcher() and its |
619 repo.requirements.discard(requirements.SPARSE_REQUIREMENT) | 619 # consumers. |
620 scmutil.writereporequirements(repo) | 620 |
621 elif requirements.SPARSE_REQUIREMENT not in oldrequires: | 621 if requirements.SPARSE_REQUIREMENT in oldrequires and removing: |
622 repo.requirements.add(requirements.SPARSE_REQUIREMENT) | 622 repo.requirements.discard(requirements.SPARSE_REQUIREMENT) |
623 scmutil.writereporequirements(repo) | |
624 | |
625 try: | |
626 writeconfig(repo, includes, excludes, profiles) | |
627 return refreshwdir(repo, oldstatus, oldmatch, force=force) | |
628 except Exception: | |
629 if repo.requirements != oldrequires: | |
630 repo.requirements.clear() | |
631 repo.requirements |= oldrequires | |
632 scmutil.writereporequirements(repo) | 623 scmutil.writereporequirements(repo) |
633 writeconfig(repo, oldincludes, oldexcludes, oldprofiles) | 624 elif requirements.SPARSE_REQUIREMENT not in oldrequires: |
634 raise | 625 repo.requirements.add(requirements.SPARSE_REQUIREMENT) |
626 scmutil.writereporequirements(repo) | |
627 | |
628 try: | |
629 writeconfig(repo, includes, excludes, profiles) | |
630 return refreshwdir(repo, oldstatus, oldmatch, force=force) | |
631 except Exception: | |
632 if repo.requirements != oldrequires: | |
633 repo.requirements.clear() | |
634 repo.requirements |= oldrequires | |
635 scmutil.writereporequirements(repo) | |
636 writeconfig(repo, oldincludes, oldexcludes, oldprofiles) | |
637 raise | |
635 | 638 |
636 | 639 |
637 def clearrules(repo, force=False): | 640 def clearrules(repo, force=False): |
638 """Clears include/exclude rules from the sparse config. | 641 """Clears include/exclude rules from the sparse config. |
639 | 642 |