changeset 52497:4ef6dbc27a99

revlog: subclass the new `repository.iverifyproblem` Protocol class This is the same transformation as 3a90a6fd710d did for dirstate, but the CamelCase naming was already cleaned up here. We shouldn't have to explicitly subclass, but I'm doing so to test the interplay of regular attributes and the `attrs` class. Also, PyCharm has a nifty feature that puts a jump point in the gutter to navigate back and forth between the base class and subclasses (and override functions and base class functions) when there's an explicit subclassing. Additionally, PyCharm will immediately flag signature mismatches without a 40m pytype run.
author Matt Harbison <matt_harbison@yahoo.com>
date Tue, 22 Oct 2024 17:18:26 -0400
parents f968926a4207
children 2aada52e80d6
files hgext/sqlitestore.py mercurial/filelog.py mercurial/revlog.py tests/simplestorerepo.py
diffstat 4 files changed, 19 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/hgext/sqlitestore.py	Tue Oct 22 17:07:23 2024 -0400
+++ b/hgext/sqlitestore.py	Tue Oct 22 17:18:26 2024 -0400
@@ -51,6 +51,10 @@
 import typing
 import zlib
 
+from typing import (
+    Optional,
+)
+
 from mercurial.i18n import _
 from mercurial.node import (
     nullrev,
@@ -300,12 +304,11 @@
     linknode = attr.ib(default=None)
 
 
-@interfaceutil.implementer(repository.iverifyproblem)
 @attr.s(frozen=True)
-class sqliteproblem:
-    warning = attr.ib(default=None)
-    error = attr.ib(default=None)
-    node = attr.ib(default=None)
+class sqliteproblem(repository.iverifyproblem):
+    warning = attr.ib(default=None, type=Optional[bytes])
+    error = attr.ib(default=None, type=Optional[bytes])
+    node = attr.ib(default=None, type=Optional[bytes])
 
 
 @interfaceutil.implementer(repository.ifilestorage)
--- a/mercurial/filelog.py	Tue Oct 22 17:07:23 2024 -0400
+++ b/mercurial/filelog.py	Tue Oct 22 17:18:26 2024 -0400
@@ -241,7 +241,7 @@
         """
         return not storageutil.filedataequivalent(self, node, text)
 
-    def verifyintegrity(self, state) -> Iterable[revlog.revlogproblem]:
+    def verifyintegrity(self, state) -> Iterable[repository.iverifyproblem]:
         return self._revlog.verifyintegrity(state)
 
     def storageinfo(
--- a/mercurial/revlog.py	Tue Oct 22 17:07:23 2024 -0400
+++ b/mercurial/revlog.py	Tue Oct 22 17:18:26 2024 -0400
@@ -204,7 +204,7 @@
 
 
 @attr.s(frozen=True)
-class revlogproblem:  # (repository.iverifyproblem)
+class revlogproblem(repository.iverifyproblem):
     warning = attr.ib(default=None, type=Optional[bytes])
     error = attr.ib(default=None, type=Optional[bytes])
     node = attr.ib(default=None, type=Optional[bytes])
@@ -4021,7 +4021,7 @@
         else:
             rewrite.v2_censor(self, tr, censor_nodes, tombstone)
 
-    def verifyintegrity(self, state) -> Iterable[revlogproblem]:
+    def verifyintegrity(self, state) -> Iterable[repository.iverifyproblem]:
         """Verifies the integrity of the revlog.
 
         Yields ``revlogproblem`` instances describing problems that are
--- a/tests/simplestorerepo.py	Tue Oct 22 17:07:23 2024 -0400
+++ b/tests/simplestorerepo.py	Tue Oct 22 17:18:26 2024 -0400
@@ -13,6 +13,10 @@
 
 import stat
 
+from typing import (
+    Optional,
+)
+
 from mercurial.i18n import _
 from mercurial.node import (
     bin,
@@ -82,12 +86,11 @@
     linknode = attr.ib(default=None)
 
 
-@interfaceutil.implementer(repository.iverifyproblem)
 @attr.s(frozen=True)
-class simplefilestoreproblem:
-    warning = attr.ib(default=None)
-    error = attr.ib(default=None)
-    node = attr.ib(default=None)
+class simplefilestoreproblem(repository.iverifyproblem):
+    warning = attr.ib(default=None, type=Optional[bytes])
+    error = attr.ib(default=None, type=Optional[bytes])
+    node = attr.ib(default=None, type=Optional[bytes])
 
 
 @interfaceutil.implementer(repository.ifilestorage)