diff --git a/hgext/largefiles/lfcommands.py b/hgext/largefiles/lfcommands.py --- a/hgext/largefiles/lfcommands.py +++ b/hgext/largefiles/lfcommands.py @@ -163,7 +163,7 @@ # to the destination repository's requirements. if lfiles: rdst.requirements.add(b'largefiles') - rdst._writerequirements() + scmutil.writereporequirements(rdst) else: class lfsource(filemap.filemap_source): diff --git a/hgext/largefiles/reposetup.py b/hgext/largefiles/reposetup.py --- a/hgext/largefiles/reposetup.py +++ b/hgext/largefiles/reposetup.py @@ -448,7 +448,7 @@ lfutil.shortname + b'/' in f[0] for f in repo.store.datafiles() ): repo.requirements.add(b'largefiles') - repo._writerequirements() + scmutil.writereporequirements(repo) ui.setconfig( b'hooks', b'changegroup.lfiles', checkrequireslfiles, b'largefiles' diff --git a/hgext/lfs/__init__.py b/hgext/lfs/__init__.py --- a/hgext/lfs/__init__.py +++ b/hgext/lfs/__init__.py @@ -255,7 +255,7 @@ ): repo.requirements.add(b'lfs') repo.features.add(repository.REPO_FEATURE_LFS) - repo._writerequirements() + scmutil.writereporequirements(repo) repo.prepushoutgoinghooks.add(b'lfs', wrapper.prepush) break diff --git a/hgext/lfs/wrapper.py b/hgext/lfs/wrapper.py --- a/hgext/lfs/wrapper.py +++ b/hgext/lfs/wrapper.py @@ -312,7 +312,7 @@ # membership before assuming it is in the context. if any(f in ctx and ctx[f].islfs() for f, n in files): self.repo.requirements.add(b'lfs') - self.repo._writerequirements() + scmutil.writereporequirements(self.repo) return node diff --git a/hgext/narrow/narrowbundle2.py b/hgext/narrow/narrowbundle2.py --- a/hgext/narrow/narrowbundle2.py +++ b/hgext/narrow/narrowbundle2.py @@ -20,6 +20,7 @@ localrepo, narrowspec, repair, + scmutil, util, wireprototypes, ) @@ -179,7 +180,7 @@ if not repository.NARROW_REQUIREMENT in op.repo.requirements: op.repo.requirements.add(repository.NARROW_REQUIREMENT) - op.repo._writerequirements() + scmutil.writereporequirements(op.repo) op.repo.setnarrowpats(includepats, excludepats) narrowspec.copytoworkingcopy(op.repo) @@ -195,7 +196,7 @@ if repository.NARROW_REQUIREMENT not in op.repo.requirements: op.repo.requirements.add(repository.NARROW_REQUIREMENT) - op.repo._writerequirements() + scmutil.writereporequirements(op.repo) op.repo.setnarrowpats(includepats, excludepats) narrowspec.copytoworkingcopy(op.repo) diff --git a/hgext/remotefilelog/__init__.py b/hgext/remotefilelog/__init__.py --- a/hgext/remotefilelog/__init__.py +++ b/hgext/remotefilelog/__init__.py @@ -361,7 +361,7 @@ self.unfiltered().__class__, ) self.requirements.add(constants.SHALLOWREPO_REQUIREMENT) - self._writerequirements() + scmutil.writereporequirements(self) # Since setupclient hadn't been called, exchange.pull was not # wrapped. So we need to manually invoke our version of it. diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -166,6 +166,7 @@ phases, pushkey, pycompat, + scmutil, streamclone, tags, url, @@ -1977,7 +1978,7 @@ op.repo.svfs.options = localrepo.resolvestorevfsoptions( op.repo.ui, op.repo.requirements, op.repo.features ) - op.repo._writerequirements() + scmutil.writereporequirements(op.repo) bundlesidedata = bool(b'exp-sidedata' in inpart.params) reposidedata = bool(b'exp-sidedata-flag' in op.repo.requirements) diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -356,7 +356,7 @@ repo.requirements.discard(b'shared') repo.requirements.discard(b'relshared') - repo._writerequirements() + scmutil.writereporequirements(repo) # Removing share changes some fundamental properties of the repo instance. # So we instantiate a new repo object and operate on it rather than diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -1298,9 +1298,6 @@ caps.add(b'bundle2=' + urlreq.quote(capsblob)) return caps - def _writerequirements(self): - scmutil.writerequires(self.vfs, self.requirements) - # Don't cache auditor/nofsauditor, or you'll end up with reference cycle: # self -> auditor -> self._checknested -> self diff --git a/mercurial/scmutil.py b/mercurial/scmutil.py --- a/mercurial/scmutil.py +++ b/mercurial/scmutil.py @@ -1470,6 +1470,13 @@ repo._quick_access_changeid_invalidate() +def writereporequirements(repo, requirements=None): + """ writes requirements for the repo to .hg/requires """ + if requirements: + repo.requirements = requirements + writerequires(repo.vfs, repo.requirements) + + def writerequires(opener, requirements): with opener(b'requires', b'w', atomictemp=True) as fp: for r in sorted(requirements): diff --git a/mercurial/sparse.py b/mercurial/sparse.py --- a/mercurial/sparse.py +++ b/mercurial/sparse.py @@ -601,10 +601,10 @@ if b'exp-sparse' in oldrequires and removing: repo.requirements.discard(b'exp-sparse') - scmutil.writerequires(repo.vfs, repo.requirements) + scmutil.writereporequirements(repo) elif b'exp-sparse' not in oldrequires: repo.requirements.add(b'exp-sparse') - scmutil.writerequires(repo.vfs, repo.requirements) + scmutil.writereporequirements(repo) try: writeconfig(repo, includes, excludes, profiles) @@ -613,7 +613,7 @@ if repo.requirements != oldrequires: repo.requirements.clear() repo.requirements |= oldrequires - scmutil.writerequires(repo.vfs, repo.requirements) + scmutil.writereporequirements(repo) writeconfig(repo, oldincludes, oldexcludes, oldprofiles) raise diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py --- a/mercurial/streamclone.py +++ b/mercurial/streamclone.py @@ -20,6 +20,7 @@ narrowspec, phases, pycompat, + scmutil, store, util, ) @@ -187,7 +188,7 @@ repo.svfs.options = localrepo.resolvestorevfsoptions( repo.ui, repo.requirements, repo.features ) - repo._writerequirements() + scmutil.writereporequirements(repo) if rbranchmap: repo._branchcaches.replace(repo, rbranchmap) @@ -730,4 +731,4 @@ repo.svfs.options = localrepo.resolvestorevfsoptions( repo.ui, repo.requirements, repo.features ) - repo._writerequirements() + scmutil.writereporequirements(repo) diff --git a/mercurial/upgrade.py b/mercurial/upgrade.py --- a/mercurial/upgrade.py +++ b/mercurial/upgrade.py @@ -1091,8 +1091,8 @@ b'unable to read from repository\n' ) ) - scmutil.writerequires( - srcrepo.vfs, srcrepo.requirements | {b'upgradeinprogress'} + scmutil.writereporequirements( + srcrepo, srcrepo.requirements | {b'upgradeinprogress'} ) ui.status(_(b'starting in-place swap of repository data\n')) @@ -1122,7 +1122,7 @@ b'again\n' ) ) - scmutil.writerequires(srcrepo.vfs, requirements) + scmutil.writereporequirements(srcrepo, requirements) # The lock file from the old store won't be removed because nothing has a # reference to its new location. So clean it up manually. Alternatively, we