diff --git a/mercurial/httppeer.py b/mercurial/httppeer.py --- a/mercurial/httppeer.py +++ b/mercurial/httppeer.py @@ -517,7 +517,7 @@ raise exception # TODO implement interface for version 2 peers -@zi.implementer(repository.ipeerconnection) +@zi.implementer(repository.ipeerconnection, repository.ipeercapabilities) class httpv2peer(object): def __init__(self, ui, repourl, apipath, opener, requestbuilder, apidescriptor): @@ -552,6 +552,33 @@ # End of ipeerconnection. + # Start of ipeercapabilities. + + def capable(self, name): + # The capabilities used internally historically map to capabilities + # advertised from the "capabilities" wire protocol command. However, + # version 2 of that command works differently. + + # Maps to commands that are available. + if name in ('branchmap', 'getbundle', 'known', 'lookup', 'pushkey'): + return True + + # Other concepts. + if name in ('bundle2',): + return True + + return False + + def requirecap(self, name, purpose): + if self.capable(name): + return + + raise error.CapabilityError( + _('cannot %s; client or remote repository does not support the %r ' + 'capability') % (purpose, name)) + + # End of ipeercapabilities. + # TODO require to be part of a batched primitive, use futures. def _call(self, name, **args): """Call a wire protocol command with arguments.""" diff --git a/tests/test-check-interfaces.py b/tests/test-check-interfaces.py --- a/tests/test-check-interfaces.py +++ b/tests/test-check-interfaces.py @@ -94,6 +94,8 @@ ziverify.verifyClass(repository.ipeerconnection, httppeer.httpv2peer) + ziverify.verifyClass(repository.ipeercapabilities, + httppeer.httpv2peer) checkzobject(httppeer.httpv2peer(None, '', None, None, None, None)) ziverify.verifyClass(repository.ipeerbase,