##// END OF EJS Templates
sparse: reliably avoid writing to store without a lock...
Arseniy Alekseyev -
r52699:95cdc01f default
parent child Browse files
Show More
@@ -1668,7 +1668,7 def istreemanifest(repo) -> bool:
1668 return requirementsmod.TREEMANIFEST_REQUIREMENT in repo.requirements
1668 return requirementsmod.TREEMANIFEST_REQUIREMENT in repo.requirements
1669
1669
1670
1670
1671 def writereporequirements(repo, requirements=None) -> None:
1671 def writereporequirements(repo, requirements=None, maywritestore=True) -> None:
1672 """writes requirements for the repo
1672 """writes requirements for the repo
1673
1673
1674 Requirements are written to .hg/requires and .hg/store/requires based
1674 Requirements are written to .hg/requires and .hg/store/requires based
@@ -1681,10 +1681,11 def writereporequirements(repo, requirem
1681 if wcreq is not None:
1681 if wcreq is not None:
1682 writerequires(repo.vfs, wcreq)
1682 writerequires(repo.vfs, wcreq)
1683 if storereq is not None:
1683 if storereq is not None:
1684 writerequires(repo.svfs, storereq)
1684 writerequires(repo.svfs, storereq, maywrite=maywritestore)
1685 elif repo.ui.configbool(b'format', b'usestore'):
1685 elif repo.ui.configbool(b'format', b'usestore'):
1686 # only remove store requires if we are using store
1686 # only remove store requires if we are using store
1687 repo.svfs.tryunlink(b'requires')
1687 if maywritestore:
1688 repo.svfs.tryunlink(b'requires')
1688
1689
1689
1690
1690 def readrequires(vfs, allowmissing):
1691 def readrequires(vfs, allowmissing):
@@ -1701,9 +1702,11 def readrequires(vfs, allowmissing):
1701 return set(read(b'requires').splitlines())
1702 return set(read(b'requires').splitlines())
1702
1703
1703
1704
1704 def writerequires(opener, requirements) -> None:
1705 def writerequires(opener, requirements, maywrite=True) -> None:
1705 on_disk = readrequires(opener, True)
1706 on_disk = readrequires(opener, True)
1706 if not (on_disk == set(requirements)):
1707 if not (on_disk == set(requirements)):
1708 if not maywrite:
1709 raise error.Abort(_(b"store requirements are not as expected"))
1707 with opener(b'requires', b'w', atomictemp=True) as fp:
1710 with opener(b'requires', b'w', atomictemp=True) as fp:
1708 for r in sorted(requirements):
1711 for r in sorted(requirements):
1709 fp.write(b"%s\n" % r)
1712 fp.write(b"%s\n" % r)
@@ -632,10 +632,10 def _updateconfigandrefreshwdir(
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)
@@ -644,7 +644,7 def _updateconfigandrefreshwdir(
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
General Comments 0
You need to be logged in to leave comments. Login now