diff -r 2d965bfeb8f6 -r c2c8962a9465 tests/simplestorerepo.py --- a/tests/simplestorerepo.py Tue Feb 27 02:37:31 2018 +0100 +++ b/tests/simplestorerepo.py Wed Apr 04 14:09:02 2018 -0700 @@ -12,6 +12,8 @@ from __future__ import absolute_import +import stat + from mercurial.i18n import _ from mercurial.node import ( bin, @@ -26,10 +28,13 @@ ancestor, bundlerepo, error, + extensions, filelog, + localrepo, mdiff, pycompat, revlog, + store, ) # Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for @@ -38,6 +43,8 @@ # leave the attribute unspecified. testedwith = 'ships-with-hg-core' +REQUIREMENT = 'testonly-simplestore' + def validatenode(node): if isinstance(node, int): raise ValueError('expected node; got int') @@ -581,6 +588,36 @@ self._indexdata[rev:] = [] self._reflectindexupdate() +def issimplestorefile(f, kind, st): + if kind != stat.S_IFREG: + return False + + if store.isrevlog(f, kind, st): + return False + + # Ignore transaction undo files. + if f.startswith('undo.'): + return False + + # Otherwise assume it belongs to the simple store. + return True + +class simplestore(store.encodedstore): + def datafiles(self): + for x in super(simplestore, self).datafiles(): + yield x + + # Supplement with non-revlog files. + extrafiles = self._walk('data', True, filefilter=issimplestorefile) + + for unencoded, encoded, size in extrafiles: + try: + unencoded = store.decodefilename(unencoded) + except KeyError: + unencoded = None + + yield unencoded, encoded, size + def reposetup(ui, repo): if not repo.local(): return @@ -593,3 +630,35 @@ return filestorage(self.svfs, f) repo.__class__ = simplestorerepo + +def featuresetup(ui, supported): + supported.add(REQUIREMENT) + +def newreporequirements(orig, repo): + """Modifies default requirements for new repos to use the simple store.""" + requirements = orig(repo) + + # These requirements are only used to affect creation of the store + # object. We have our own store. So we can remove them. + # TODO do this once we feel like taking the test hit. + #if 'fncache' in requirements: + # requirements.remove('fncache') + #if 'dotencode' in requirements: + # requirements.remove('dotencode') + + requirements.add(REQUIREMENT) + + return requirements + +def makestore(orig, requirements, path, vfstype): + if REQUIREMENT not in requirements: + return orig(requirements, path, vfstype) + + return simplestore(path, vfstype) + +def extsetup(ui): + localrepo.featuresetupfuncs.add(featuresetup) + + extensions.wrapfunction(localrepo, 'newreporequirements', + newreporequirements) + extensions.wrapfunction(store, 'store', makestore)