--- a/mercurial/interfaces/misc.py Sat Feb 08 18:15:18 2025 +0100
+++ b/mercurial/interfaces/misc.py Mon Feb 10 00:15:22 2025 +0100
@@ -9,7 +9,9 @@
Callable,
Iterator,
List,
+ Optional,
Protocol,
+ Tuple,
)
@@ -45,3 +47,64 @@
@abc.abstractmethod
def __contains__(self, d: bytes) -> bool:
...
+
+
+AuthInfoT = Tuple[
+ bytes,
+ Optional[
+ Tuple[
+ None,
+ Tuple[bytes, bytes],
+ bytes,
+ bytes,
+ ]
+ ],
+]
+
+
+class IUrl(Protocol):
+ r"""Reliable URL parser.
+
+ This parses URLs and provides attributes for the following
+ components:
+
+ <scheme>://<user>:<passwd>@<host>:<port>/<path>?<query>#<fragment>
+
+ Missing components are set to None. The only exception is
+ fragment, which is set to '' if present but empty.
+
+ If parsefragment is False, fragment is included in query. If
+ parsequery is False, query is included in path. If both are
+ False, both fragment and query are included in path.
+
+ See http://www.ietf.org/rfc/rfc2396.txt for more information.
+ """
+
+ path: Optional[bytes]
+ scheme: Optional[bytes]
+ user: Optional[bytes]
+ passwd: Optional[bytes]
+ host: Optional[bytes]
+ port: Optional[bytes]
+ query: Optional[bytes]
+ fragment: Optional[bytes]
+
+ @abc.abstractmethod
+ def copy(self) -> IUrl:
+ ...
+
+ @abc.abstractmethod
+ def authinfo(self) -> AuthInfoT:
+ ...
+
+ @abc.abstractmethod
+ def isabs(self) -> bool:
+ ...
+
+ @abc.abstractmethod
+ def localpath(self) -> bytes:
+ ...
+
+ @abc.abstractmethod
+ def islocal(self) -> bool:
+ ...