typing: lock in correct changes from pytype 2023.04.11 -> 2023.06.16
There were a handful of other changes to the pyi files generated when updating
pytype locally (and jumping from python 3.8.0 to python 3.10.11), but they were
not as clear (e.g. the embedded type in a list changing from `nothing` to `Any`
or similar). These looked obviously correct, and agreed with PyCharm's thoughts
on the signatures.
Oddly, even though pytype starting inferring `obsutil._getfilteredreason()` as
returning bytes, it (correctly) complained about the None path when it was typed
that way. Instead, raise a ProgrammingError if an unhandled fate is calculated.
(Currently, all possibilities are handled, so this isn't reachable unless
another fate is added in the future.)
--- a/hgext/convert/monotone.py Tue Aug 20 17:46:17 2024 -0400
+++ b/hgext/convert/monotone.py Tue Aug 20 18:30:47 2024 -0400
@@ -8,6 +8,9 @@
import os
import re
+from typing import (
+ Tuple,
+)
from mercurial.i18n import _
from mercurial.pycompat import open
@@ -121,7 +124,7 @@
return self.mtnstdioreadcommandoutput(command)
- def mtnstdioreadpacket(self):
+ def mtnstdioreadpacket(self) -> Tuple[bytes, bytes, int, bytes]:
read = None
commandnbr = b''
while read != b':':
@@ -167,7 +170,7 @@
return (commandnbr, stream, length, read)
- def mtnstdioreadcommandoutput(self, command):
+ def mtnstdioreadcommandoutput(self, command) -> bytes:
retval = []
while True:
commandnbr, stream, length, output = self.mtnstdioreadpacket()
--- a/hgext/remotefilelog/debugcommands.py Tue Aug 20 17:46:17 2024 -0400
+++ b/hgext/remotefilelog/debugcommands.py Tue Aug 20 18:30:47 2024 -0400
@@ -34,7 +34,7 @@
)
-def debugremotefilelog(ui, path, **opts):
+def debugremotefilelog(ui, path, **opts) -> None:
decompress = opts.get('decompress')
size, firstnode, mapping = parsefileblob(path, decompress)
--- a/mercurial/dagop.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/dagop.py Tue Aug 20 18:30:47 2024 -0400
@@ -8,6 +8,9 @@
import heapq
import typing
+from typing import (
+ List,
+)
from .thirdparty import attr
@@ -754,7 +757,7 @@
return child
-def annotate(base, parents, skiprevs=None, diffopts=None):
+def annotate(base, parents, skiprevs=None, diffopts=None) -> List[annotateline]:
"""Core algorithm for filectx.annotate()
`parents(fctx)` is a function returning a list of parent filectxs.
--- a/mercurial/dispatch.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/dispatch.py Tue Aug 20 18:30:47 2024 -0400
@@ -85,7 +85,7 @@
# store the parsed and canonical command
self.canonical_command = None
- def _runexithandlers(self):
+ def _runexithandlers(self) -> None:
exc = None
handlers = self.ui._exithandlers
try:
@@ -239,7 +239,7 @@
return status
-def _rundispatch(req):
+def _rundispatch(req) -> int:
with tracing.log('dispatch._rundispatch'):
if req.ferr:
ferr = req.ferr
--- a/mercurial/lock.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/lock.py Tue Aug 20 18:30:47 2024 -0400
@@ -110,7 +110,7 @@
raiseinterrupt(assertedsigs[0])
-def trylock(ui, vfs, lockname, timeout, warntimeout, *args, **kwargs):
+def trylock(ui, vfs, lockname, timeout, warntimeout, *args, **kwargs) -> "lock":
"""return an acquired lock or raise an a LockHeld exception
This function is responsible to issue warnings and or debug messages about
@@ -256,7 +256,7 @@
# wrapper around procutil.getpid() to make testing easier
return procutil.getpid()
- def lock(self):
+ def lock(self) -> int:
timeout = self.timeout
while True:
try:
@@ -272,7 +272,7 @@
errno.ETIMEDOUT, inst.filename, self.desc, inst.locker
)
- def _trylock(self):
+ def _trylock(self) -> None:
if self.held:
self.held += 1
return
--- a/mercurial/logcmdutil.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/logcmdutil.py Tue Aug 20 18:30:47 2024 -0400
@@ -575,6 +575,10 @@
functions that use changesest_templater.
"""
+ _tresources: formatter.templateresources
+ lastheader: Optional[bytes]
+ t: templater.templater
+
# Arguments before "buffered" used to be positional. Consider not
# adding/removing arguments before "buffered" to not break callers.
def __init__(
@@ -665,7 +669,7 @@
self.footer = self.t.render(self._parts[b'footer'], props)
-def templatespec(tmpl, mapfile):
+def templatespec(tmpl, mapfile) -> formatter.templatespec:
assert not (tmpl and mapfile)
if mapfile:
return formatter.mapfile_templatespec(b'changeset', mapfile)
@@ -673,7 +677,7 @@
return formatter.literal_templatespec(tmpl)
-def _lookuptemplate(ui, tmpl, style):
+def _lookuptemplate(ui, tmpl, style) -> formatter.templatespec:
"""Find the template matching the given template spec or style
See formatter.lookuptemplate() for details.
--- a/mercurial/obsutil.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/obsutil.py Tue Aug 20 18:30:47 2024 -0400
@@ -947,7 +947,7 @@
}
-def _getfilteredreason(repo, changeid, ctx):
+def _getfilteredreason(repo, changeid, ctx) -> bytes:
"""return a human-friendly string on why a obsolete changeset is hidden"""
successors = successorssets(repo, ctx.node())
fate = _getobsfate(successors)
@@ -974,6 +974,8 @@
args = (changeid, firstsuccessors, remainingnumber)
return filteredmsgtable[b'superseded_split_several'] % args
+ else:
+ raise error.ProgrammingError("unhandled fate: %r" % fate)
def divergentsets(repo, ctx):
--- a/mercurial/statprof.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/statprof.py Tue Aug 20 18:30:47 2024 -0400
@@ -113,6 +113,10 @@
import threading
import time
+from typing import (
+ List,
+)
+
from .pycompat import open
from . import (
encoding,
@@ -155,6 +159,8 @@
class ProfileState:
+ samples: List["Sample"]
+
def __init__(self, frequency=None):
self.reset(frequency)
self.track = b'cpu'
--- a/mercurial/templatekw.py Tue Aug 20 17:46:17 2024 -0400
+++ b/mercurial/templatekw.py Tue Aug 20 18:30:47 2024 -0400
@@ -482,7 +482,7 @@
return showlatesttags(context, mapping, None)
-def showlatesttags(context, mapping, pattern):
+def showlatesttags(context, mapping, pattern) -> _hybrid:
"""helper method for the latesttag keyword and function"""
latesttags = getlatesttags(context, mapping, pattern)