interfaces: convert the repository zope interfaces to Protocol classes
This is the same transformation as 382d9629cede did for dirstate. The same
caveat applies- the code may not be valid, since the functions are missing the
`self` arg, and the attrs should be plain attrs, not zope `Attribute`. These
classes are pretty intertwined however, so making the same transformation to
everything makes it easier to change and review.
Additionally, there are some classes that subclass multiple protocol classes,
and should themselves subclass `typing.Protocol` to be a protocol class. But
defer that for now for clarity.
# util.py - Utilities for declaring interfaces.
#
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
# zope.interface imposes a run-time cost due to module import overhead and
# bookkeeping for declaring interfaces. So, we use stubs for various
# zope.interface primitives unless instructed otherwise.
from __future__ import annotations
from .. import encoding
if encoding.environ.get(b'HGREALINTERFACES'):
from ..thirdparty.zope import interface as zi
Attribute = zi.Attribute
Interface = zi.Interface
implementer = zi.implementer
else:
class Attribute:
def __init__(self, __name__, __doc__=b''):
pass
class Interface:
def __init__(
self, name, bases=(), attrs=None, __doc__=None, __module__=None
):
pass
def implementer(*ifaces):
def wrapper(cls):
return cls
return wrapper