##// END OF EJS Templates
copies: add config option for writing copy metadata to file and/or changset...
copies: add config option for writing copy metadata to file and/or changset This introduces a config option that lets you choose to write copy metadata to the changeset extras instead of to filelog. There's also an option to write it to both places. I imagine that may possibly be useful when transitioning an existing repo. The copy metadata is stored as two fields in extras: one for copies since p1 and one for copies since p2. I may need to add more information later in order to make copy tracing faster. Specifically, I'm thinking out recording which files were added or removed so that copies._chaincopies() doesn't have to look at the manifest for that. But that would just be an optimization and that can be added once we know if it's necessary. I have also considered saving space by using replacing the destination file path by an index into the "files" list, but that can also be changed later (but before the feature is ready to release). Differential Revision: https://phab.mercurial-scm.org/D6183

File last commit:

r41194:23d5e03d default
r42317:0e41f40b default
Show More
test-check-interfaces.py
233 lines | 7.5 KiB | text/x-python | PythonLexer
/ tests / test-check-interfaces.py
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 # Test that certain objects conform to well-defined interfaces.
from __future__ import absolute_import, print_function
Gregory Szorc
interfaceutil: module to stub out zope.interface...
r37828 from mercurial import encoding
encoding.environ[b'HGREALINTERFACES'] = b'1'
Gregory Szorc
repository: define interface for local repositories...
r37198 import os
Martin von Zweigbergk
tests: mark test-check-interfaces.py as requiring a repo...
r37832 import subprocess
import sys
# Only run if tests are run in a repo
if subprocess.call(['python', '%s/hghave' % os.environ['TESTDIR'],
'test-repo']):
sys.exit(80)
Gregory Szorc
repository: define interface for local repositories...
r37198
from mercurial.thirdparty.zope import (
interface as zi,
)
from mercurial.thirdparty.zope.interface import (
verify as ziverify,
)
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 from mercurial import (
Gregory Szorc
tests: add interface checks for bundle, statichttp, and union peers...
r34308 bundlerepo,
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 filelog,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 httppeer,
localrepo,
Gregory Szorc
repository: define manifest interfaces...
r38549 manifest,
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 pycompat,
Gregory Szorc
repository: define interface for local repositories...
r37198 repository,
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 revlog,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 sshpeer,
Gregory Szorc
tests: add interface checks for bundle, statichttp, and union peers...
r34308 statichttprepo,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 ui as uimod,
Gregory Szorc
tests: add interface checks for bundle, statichttp, and union peers...
r34308 unionrepo,
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 vfs as vfsmod,
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312 wireprotoserver,
wireprototypes,
Gregory Szorc
wireproto: implement command executor interface for version 1 peers...
r37648 wireprotov1peer,
Gregory Szorc
wireproto: extract HTTP version 2 code to own module...
r37563 wireprotov2server,
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 )
Augie Fackler
tests: add simplestorerepo to test-check-interfaces.py...
r41194 testdir = os.path.dirname(__file__)
rootdir = pycompat.fsencode(os.path.normpath(os.path.join(testdir, '..')))
sys.path[0:0] = [testdir]
import simplestorerepo
del sys.path[0]
Gregory Szorc
repository: define interface for local repositories...
r37198
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 def checkzobject(o, allowextra=False):
Gregory Szorc
repository: define interface for local repositories...
r37198 """Verify an object with a zope interface."""
ifaces = zi.providedBy(o)
if not ifaces:
print('%r does not provide any zope interfaces' % o)
return
# Run zope.interface's built-in verification routine. This verifies that
# everything that is supposed to be present is present.
for iface in ifaces:
ziverify.verifyObject(iface, o)
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 if allowextra:
return
Gregory Szorc
repository: define interface for local repositories...
r37198 # Now verify that the object provides no extra public attributes that
# aren't declared as part of interfaces.
allowed = set()
for iface in ifaces:
allowed |= set(iface.names(all=True))
public = {a for a in dir(o) if not a.startswith('_')}
for attr in sorted(public - allowed):
print('public attribute not declared in interfaces: %s.%s' % (
o.__class__.__name__, attr))
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 # Facilitates testing localpeer.
class dummyrepo(object):
def __init__(self):
self.ui = uimod.ui()
def filtered(self, name):
pass
def _restrictcapabilities(self, caps):
pass
Gregory Szorc
httppeer: refactor how httppeer is created (API)...
r37024 class dummyopener(object):
handlers = []
Gregory Szorc
httppeer: perform capabilities request in makepeer()...
r37570 # Facilitates testing sshpeer without requiring a server.
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 class badpeer(httppeer.httppeer):
def __init__(self):
Gregory Szorc
httppeer: perform capabilities request in makepeer()...
r37570 super(badpeer, self).__init__(None, None, None, dummyopener(), None,
None)
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 self.badattribute = True
def badmethod(self):
pass
Gregory Szorc
sshpeer: defer pipe buffering and stderr sidechannel binding...
r36388 class dummypipe(object):
def close(self):
pass
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 def main():
ui = uimod.ui()
Gregory Szorc
repository: define interface for local repositories...
r37198 # Needed so we can open a local repo with obsstore without a warning.
Gregory Szorc
py3: use b'' in test-check-interfaces.py...
r40189 ui.setconfig(b'experimental', b'evolution.createmarkers', True)
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 checkzobject(badpeer())
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653 ziverify.verifyClass(repository.ipeerbase, httppeer.httppeer)
Gregory Szorc
httppeer: perform capabilities request in makepeer()...
r37570 checkzobject(httppeer.httppeer(None, None, None, dummyopener(), None, None))
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336
Gregory Szorc
httppeer: expose API descriptor on httpv2peer...
r40207 ziverify.verifyClass(repository.ipeerv2, httppeer.httpv2peer)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 checkzobject(httppeer.httpv2peer(None, b'', b'', None, None, None))
Gregory Szorc
httppeer: implement ipeerconnection...
r37627
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 ziverify.verifyClass(repository.ipeerbase,
localrepo.localpeer)
checkzobject(localrepo.localpeer(dummyrepo()))
Gregory Szorc
wireproto: implement command executor interface for version 1 peers...
r37648 ziverify.verifyClass(repository.ipeercommandexecutor,
localrepo.localcommandexecutor)
checkzobject(localrepo.localcommandexecutor(None))
ziverify.verifyClass(repository.ipeercommandexecutor,
wireprotov1peer.peerexecutor)
checkzobject(wireprotov1peer.peerexecutor(None))
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653 ziverify.verifyClass(repository.ipeerbase, sshpeer.sshv1peer)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 checkzobject(sshpeer.sshv1peer(ui, b'ssh://localhost/foo', b'', dummypipe(),
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 dummypipe(), None, None))
Gregory Szorc
wireproto: convert legacy commands to command executor...
r37653 ziverify.verifyClass(repository.ipeerbase, sshpeer.sshv2peer)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 checkzobject(sshpeer.sshv2peer(ui, b'ssh://localhost/foo', b'', dummypipe(),
Gregory Szorc
repository: port peer interfaces to zope.interface...
r37336 dummypipe(), None, None))
ziverify.verifyClass(repository.ipeerbase, bundlerepo.bundlepeer)
checkzobject(bundlerepo.bundlepeer(dummyrepo()))
ziverify.verifyClass(repository.ipeerbase, statichttprepo.statichttppeer)
checkzobject(statichttprepo.statichttppeer(dummyrepo()))
ziverify.verifyClass(repository.ipeerbase, unionrepo.unionpeer)
checkzobject(unionrepo.unionpeer(dummyrepo()))
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806
Gregory Szorc
localrepo: iteratively derive local repository type...
r39800 ziverify.verifyClass(repository.ilocalrepositorymain,
Gregory Szorc
repository: define interface for local repositories...
r37198 localrepo.localrepository)
Gregory Szorc
localrepo: iteratively derive local repository type...
r39800 ziverify.verifyClass(repository.ilocalrepositoryfilestorage,
localrepo.revlogfilestorage)
Gregory Szorc
localrepo: create new function for instantiating a local repo object...
r39723 repo = localrepo.makelocalrepository(ui, rootdir)
Gregory Szorc
repository: define interface for local repositories...
r37198 checkzobject(repo)
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312 ziverify.verifyClass(wireprototypes.baseprotocolhandler,
wireprotoserver.sshv1protocolhandler)
ziverify.verifyClass(wireprototypes.baseprotocolhandler,
wireprotoserver.sshv2protocolhandler)
ziverify.verifyClass(wireprototypes.baseprotocolhandler,
wireprotoserver.httpv1protocolhandler)
ziverify.verifyClass(wireprototypes.baseprotocolhandler,
Gregory Szorc
wireproto: extract HTTP version 2 code to own module...
r37563 wireprotov2server.httpv2protocolhandler)
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312
sshv1 = wireprotoserver.sshv1protocolhandler(None, None, None)
checkzobject(sshv1)
sshv2 = wireprotoserver.sshv2protocolhandler(None, None, None)
checkzobject(sshv2)
httpv1 = wireprotoserver.httpv1protocolhandler(None, None, None)
checkzobject(httpv1)
Gregory Szorc
wireproto: extract HTTP version 2 code to own module...
r37563 httpv2 = wireprotov2server.httpv2protocolhandler(None, None)
Gregory Szorc
wireproto: port protocol handler to zope.interface...
r37312 checkzobject(httpv2)
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 ziverify.verifyClass(repository.ifilestorage, filelog.filelog)
Gregory Szorc
repository: define manifest interfaces...
r38549 ziverify.verifyClass(repository.imanifestdict, manifest.manifestdict)
ziverify.verifyClass(repository.imanifestrevisionstored,
manifest.manifestctx)
ziverify.verifyClass(repository.imanifestrevisionwritable,
manifest.memmanifestctx)
ziverify.verifyClass(repository.imanifestrevisionstored,
manifest.treemanifestctx)
ziverify.verifyClass(repository.imanifestrevisionwritable,
manifest.memtreemanifestctx)
ziverify.verifyClass(repository.imanifestlog, manifest.manifestlog)
Gregory Szorc
manifest: proxy to revlog instance instead of inheriting...
r39350 ziverify.verifyClass(repository.imanifeststorage, manifest.manifestrevlog)
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459
Augie Fackler
tests: add simplestorerepo to test-check-interfaces.py...
r41194 ziverify.verifyClass(repository.irevisiondelta,
simplestorerepo.simplestorerevisiondelta)
ziverify.verifyClass(repository.ifilestorage, simplestorerepo.filestorage)
ziverify.verifyClass(repository.iverifyproblem,
simplestorerepo.simplefilestoreproblem)
Augie Fackler
tests: make test-check-interfaces.py work on Python 3...
r37887 vfs = vfsmod.vfs(b'.')
fl = filelog.filelog(vfs, b'dummy.i')
Gregory Szorc
filelog: declare that filelog implements a storage interface...
r37459 checkzobject(fl, allowextra=True)
Gregory Szorc
repository: define manifest interfaces...
r38549 # Conforms to imanifestlog.
Martin von Zweigbergk
manifest: accept narrowmatch into constructor instead of getting from repo...
r41067 ml = manifest.manifestlog(vfs, repo, manifest.manifestrevlog(repo.svfs),
repo.narrowmatch())
Gregory Szorc
repository: define manifest interfaces...
r38549 checkzobject(ml)
checkzobject(repo.manifestlog)
# Conforms to imanifestrevision.
mctx = ml[repo[0].manifestnode()]
checkzobject(mctx)
# Conforms to imanifestrevisionwritable.
checkzobject(mctx.new())
checkzobject(mctx.copy())
# Conforms to imanifestdict.
checkzobject(mctx.read())
Gregory Szorc
manifest: proxy to revlog instance instead of inheriting...
r39350 mrl = manifest.manifestrevlog(vfs)
checkzobject(mrl)
Gregory Szorc
repository: formalize interfaces for revision deltas and requests...
r39266 ziverify.verifyClass(repository.irevisiondelta,
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 revlog.revlogrevisiondelta)
Gregory Szorc
repository: formalize interfaces for revision deltas and requests...
r39266
Gregory Szorc
repository: establish API for emitting revision deltas...
r39267 rd = revlog.revlogrevisiondelta(
Gregory Szorc
repository: formalize interfaces for revision deltas and requests...
r39266 node=b'',
p1node=b'',
p2node=b'',
basenode=b'',
linknode=b'',
flags=b'',
baserevisionsize=None,
revision=b'',
delta=None)
checkzobject(rd)
Gregory Szorc
verify: start to abstract file verification...
r39878 ziverify.verifyClass(repository.iverifyproblem,
revlog.revlogproblem)
checkzobject(revlog.revlogproblem())
Gregory Szorc
tests: verify that peer instances only expose interface members...
r33806 main()