# HG changeset patch # User Gregory Szorc # Date 1502063245 25200 # Node ID a0aad86b3b6af9ca878857368f7ac55fdbe1e09c # Parent 558f5b2ee10e65d6120948d0c6836c61c8787089 repository: implement generic capability methods on peer class These methods are part of the peer interface, are generic, and can be implemented in terms of other members of the peer interface. So we implement them on the peer base class as a convenience. The implementation is essentially copied from peer.py. The code in peer.py will eventually be deleted. Differential Revision: https://phab.mercurial-scm.org/D334 diff -r 558f5b2ee10e -r a0aad86b3b6a mercurial/repository.py --- a/mercurial/repository.py Sun Aug 13 11:04:42 2017 -0700 +++ b/mercurial/repository.py Sun Aug 06 16:47:25 2017 -0700 @@ -9,6 +9,11 @@ import abc +from .i18n import _ +from . import ( + error, +) + class _basepeer(object): """Represents a "connection" to a repository. @@ -228,5 +233,36 @@ calls. However, they must all support this API. """ + def capable(self, name): + """Determine support for a named capability. + + Returns ``False`` if capability not supported. + + Returns ``True`` if boolean capability is supported. Returns a string + if capability support is non-boolean. + """ + caps = self.capabilities() + if name in caps: + return True + + name = '%s=' % name + for cap in caps: + if cap.startswith(name): + return cap[len(name):] + + return False + + def requirecap(self, name, purpose): + """Require a capability to be present. + + Raises a ``CapabilityError`` if the capability isn't present. + """ + if self.capable(name): + return + + raise error.CapabilityError( + _('cannot %s; remote repository does not support the %r ' + 'capability') % (purpose, name)) + class legacypeer(peer, _baselegacywirecommands): """peer but with support for legacy wire protocol commands."""