Mercurial > hg
view doc/docchecker @ 51872:5e79783d4bc7
revlog: make `clearcaches()` signature consistent with ManifestRevlog
I'm not sure if this a newly added bug, because of using a different version of
pytype, or if the recent work around avoiding the zope interface types in the
type checking phase (see 5eb98ea78fd7 and friends)... but pytype 2023.11.21
started flagging this series since it was last pushed ~6 weeks ago:
File "/mnt/c/Users/Matt/hg/mercurial/bundlerepo.py", line 204, in <module>:
Overriding method signature mismatch [signature-mismatch]
Base signature: 'def mercurial.manifest.ManifestRevlog.clearcaches(self, clear_persisted_data: Any = ...) -> None'.
Subclass signature: 'def mercurial.revlog.revlog.clearcaches(self) -> None'.
Not enough positional parameters in overriding method.
Maybe the multiple inheritance in `bundlerepo.bundlemanifest` is bad, but it
seems like a `ManifestRevlog` is-a `revlog`, even though the class hierarchy
isn't coded that way. Additionally, it looks like `revlog.clearcaches()` is
dealing with some persistent data, so maybe this is useful to have there anyway.
Also sprinkle some trivial type hints on the method, because there are other
`clearcaches()` definitions in the codebase with these hints, and I don't feel
like waiting for another pytype run to see if it cares that specifically about
the signature matching.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 18 Sep 2024 17:46:46 -0400 |
parents | 6000f5b25c9b |
children |
line wrap: on
line source
#!/usr/bin/env python3 # # docchecker - look for problematic markup # # Copyright 2016 timeless <timeless@mozdev.org> and others # # This software may be used and distributed according to the terms of the # GNU General Public License version 2 or any later version. import os import re import sys try: import msvcrt msvcrt.setmode(sys.stdout.fileno(), os.O_BINARY) msvcrt.setmode(sys.stderr.fileno(), os.O_BINARY) except ImportError: pass stdout = getattr(sys.stdout, 'buffer', sys.stdout) leadingline = re.compile(br'(^\s*)(\S.*)$') checks = [ ( br""":hg:`[^`]*'[^`]*`""", b"""warning: please avoid nesting ' in :hg:`...`""", ), (br'\w:hg:`', b'warning: please have a space before :hg:'), ( br"""(?:[^a-z][^'.])hg ([^,;"`]*'(?!hg)){2}""", b'''warning: please use " instead of ' for hg ... "..."''', ), ] def check(line): messages = [] for match, msg in checks: if re.search(match, line): messages.append(msg) if messages: stdout.write(b'%s\n' % line) for msg in messages: stdout.write(b'%s\n' % msg) def work(file): (llead, lline) = (b'', b'') for line in file: # this section unwraps lines match = leadingline.match(line) if not match: check(lline) (llead, lline) = (b'', b'') continue lead, line = match.group(1), match.group(2) if lead == llead: if lline != b'': lline += b' ' + line else: lline = line else: check(lline) (llead, lline) = (lead, line) check(lline) def main(): for f in sys.argv[1:]: try: with open(f, 'rb') as file: work(file) except BaseException as e: sys.stdout.write(r"failed to process %s: %s\n" % (f, e)) main()