interfaces: move peer `capabilities()` to the `ipeercapabilities` interface
I'm not sure why this was on the `ipeercommands` interface. It appears to be
because these interfaces started out as `_basewirecommands` to hold wire
commands, back in 558f5b2ee10e. The capabilities interface wasn't split out
until 98861a2298b5, when it pulled the capability related methods off of the
`ipeerbase` interface. Perhaps it was an oversight to not look at the commands
interface because, while this is a wire command, both `sshpeer` and `httppeer`
now perform a handshake while instantiating the peer object, and cache a fixed
list of capabilities in that object. Likewise, `localpeer` is given a fixed set
of capabilities when instantiated. Back in 558f5b2ee10e, `httppeer` looks like
it issued a wire command when this method was called, but `sshpeer` obtained and
cached the capabilities when instantiated, and this method always returned a
fixed value.
There's a perfectly good interface with other capability related methods, and
having it here makes it easier to implement the base `peer` mixin class.
--- a/mercurial/httppeer.py Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/httppeer.py Mon Dec 16 02:41:24 2024 -0500
@@ -437,11 +437,13 @@
# End of ipeerconnection interface.
- # Begin of ipeercommands interface.
+ # Begin of ipeercapabilities interface.
def capabilities(self):
return self._caps
+ # End of ipeercapabilities interface.
+
def _finish_inline_clone_bundle(self, stream):
# HTTP streams must hit the end to process the last empty
# chunk of Chunked-Encoding so the connection can be reused.
@@ -449,8 +451,6 @@
if chunk:
self._abort(error.ResponseError(_(b"unexpected response:"), chunk))
- # End of ipeercommands interface.
-
def _callstream(self, cmd, _compressible=False, **args):
args = pycompat.byteskwargs(args)
--- a/mercurial/interfaces/repository.py Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/interfaces/repository.py Mon Dec 16 02:41:24 2024 -0500
@@ -205,6 +205,13 @@
"""
@abc.abstractmethod
+ def capabilities(self):
+ """Obtain capabilities of the peer.
+
+ Returns a set of string capabilities.
+ """
+
+ @abc.abstractmethod
def requirecap(self, name: bytes, purpose: bytes) -> None:
"""Require a capability to be present.
@@ -228,13 +235,6 @@
"""
@abc.abstractmethod
- def capabilities(self):
- """Obtain capabilities of the peer.
-
- Returns a set of string capabilities.
- """
-
- @abc.abstractmethod
def get_cached_bundle_inline(self, path):
"""Retrieve a clonebundle across the wire.
@@ -470,9 +470,7 @@
self.path = path
def capable(self, name: bytes) -> bool | bytes:
- # TODO: this class should maybe subclass ipeercommands too, otherwise it
- # is assuming whatever uses this as a mixin also has this interface.
- caps = self.capabilities() # pytype: disable=attribute-error
+ caps = self.capabilities()
if name in caps:
return True
--- a/mercurial/localrepo.py Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/localrepo.py Mon Dec 16 02:41:24 2024 -0500
@@ -339,14 +339,18 @@
# End of _basepeer interface.
+ # Begin of ipeercapabilities interface.
+
+ def capabilities(self):
+ return self._caps
+
+ # End of ipeercapabilities interface.
+
# Begin of _basewirecommands interface.
def branchmap(self):
return self._repo.branchmap()
- def capabilities(self):
- return self._caps
-
def get_cached_bundle_inline(self, path):
# not needed with local peer
raise NotImplementedError
--- a/mercurial/sshpeer.py Mon Dec 16 02:10:46 2024 -0500
+++ b/mercurial/sshpeer.py Mon Dec 16 02:41:24 2024 -0500
@@ -439,12 +439,12 @@
# End of ipeerconnection interface.
- # Begin of ipeercommands interface.
+ # Begin of ipeercapabilities interface.
def capabilities(self):
return self._caps
- # End of ipeercommands interface.
+ # End of ipeercapabilities interface.
def _readerr(self):
_forwardoutput(self.ui, self._pipee)