# HG changeset patch # User Matt Harbison # Date 2022-11-02 20:43:01 # Node ID 8fa3f7c3a9adce67f0dedf0b26f3128bd9fbaaf8 # Parent 3a2b6158374a6723ff3aea3e43422037593ab49d typing: add basic type hints to localrepo.py There's a lot more that could be done, but this sticks to the obviously correct stuff that is either related to existing imports or primitives. Hopefully this helps smoke out more path related bytes vs str issues in TortoiseHg. I'm avoiding the interfaces for now, because they seem to confuse pytype and/or PyCharm. It might be worth typing the return of `makelocalrepository` to `localrepository`, but that leaks an implementation detail, so that can be revisited later. diff --git a/mercurial/localrepo.py b/mercurial/localrepo.py --- a/mercurial/localrepo.py +++ b/mercurial/localrepo.py @@ -15,6 +15,10 @@ import time import weakref from concurrent import futures +from typing import ( + Optional, +) + from .i18n import _ from .node import ( bin, @@ -526,7 +530,7 @@ def _readrequires(vfs, allowmissing): return set(read(b'requires').splitlines()) -def makelocalrepository(baseui, path, intents=None): +def makelocalrepository(baseui, path: bytes, intents=None): """Create a local repository object. Given arguments needed to construct a local repository, this function @@ -845,7 +849,13 @@ def makelocalrepository(baseui, path, in ) -def loadhgrc(ui, wdirvfs, hgvfs, requirements, sharedvfs=None): +def loadhgrc( + ui, + wdirvfs: vfsmod.vfs, + hgvfs: vfsmod.vfs, + requirements, + sharedvfs: Optional[vfsmod.vfs] = None, +): """Load hgrc files/content into a ui instance. This is called during repository opening to load any additional @@ -1323,15 +1333,15 @@ class localrepository: self, baseui, ui, - origroot, - wdirvfs, - hgvfs, + origroot: bytes, + wdirvfs: vfsmod.vfs, + hgvfs: vfsmod.vfs, requirements, supportedrequirements, - sharedpath, + sharedpath: bytes, store, - cachevfs, - wcachevfs, + cachevfs: vfsmod.vfs, + wcachevfs: vfsmod.vfs, features, intents=None, ): @@ -1977,7 +1987,7 @@ class localrepository: def __iter__(self): return iter(self.changelog) - def revs(self, expr, *args): + def revs(self, expr: bytes, *args): """Find revisions matching a revset. The revset is specified as a string ``expr`` that may contain @@ -1993,7 +2003,7 @@ class localrepository: tree = revsetlang.spectree(expr, *args) return revset.makematcher(tree)(self) - def set(self, expr, *args): + def set(self, expr: bytes, *args): """Find revisions matching a revset and emit changectx instances. This is a convenience wrapper around ``revs()`` that iterates the @@ -2005,7 +2015,7 @@ class localrepository: for r in self.revs(expr, *args): yield self[r] - def anyrevs(self, specs, user=False, localalias=None): + def anyrevs(self, specs: bytes, user=False, localalias=None): """Find revisions matching one of the given revsets. Revset aliases from the configuration are not expanded by default. To @@ -2030,7 +2040,7 @@ class localrepository: m = revset.matchany(None, specs, localalias=localalias) return m(self) - def url(self): + def url(self) -> bytes: return b'file:' + self.root def hook(self, name, throw=False, **args): @@ -2229,7 +2239,7 @@ class localrepository: return b'store' return None - def wjoin(self, f, *insidef): + def wjoin(self, f: bytes, *insidef: bytes) -> bytes: return self.vfs.reljoin(self.root, f, *insidef) def setparents(self, p1, p2=None): @@ -2238,17 +2248,17 @@ class localrepository: self[None].setparents(p1, p2) self._quick_access_changeid_invalidate() - def filectx(self, path, changeid=None, fileid=None, changectx=None): + def filectx(self, path: bytes, changeid=None, fileid=None, changectx=None): """changeid must be a changeset revision, if specified. fileid can be a file revision or node.""" return context.filectx( self, path, changeid, fileid, changectx=changectx ) - def getcwd(self): + def getcwd(self) -> bytes: return self.dirstate.getcwd() - def pathto(self, f, cwd=None): + def pathto(self, f: bytes, cwd: Optional[bytes] = None) -> bytes: return self.dirstate.pathto(f, cwd) def _loadfilter(self, filter): @@ -2300,14 +2310,21 @@ class localrepository: def adddatafilter(self, name, filter): self._datafilters[name] = filter - def wread(self, filename): + def wread(self, filename: bytes) -> bytes: if self.wvfs.islink(filename): data = self.wvfs.readlink(filename) else: data = self.wvfs.read(filename) return self._filter(self._encodefilterpats, filename, data) - def wwrite(self, filename, data, flags, backgroundclose=False, **kwargs): + def wwrite( + self, + filename: bytes, + data: bytes, + flags: bytes, + backgroundclose=False, + **kwargs + ) -> int: """write ``data`` into ``filename`` in the working directory This returns length of written (maybe decoded) data. @@ -2325,7 +2342,7 @@ class localrepository: self.wvfs.setflags(filename, False, False) return len(data) - def wwritedata(self, filename, data): + def wwritedata(self, filename: bytes, data: bytes) -> bytes: return self._filter(self._decodefilterpats, filename, data) def currenttransaction(self): @@ -3520,13 +3537,13 @@ def aftertrans(files): return a -def undoname(fn): +def undoname(fn: bytes) -> bytes: base, name = os.path.split(fn) assert name.startswith(b'journal') return os.path.join(base, name.replace(b'journal', b'undo', 1)) -def instance(ui, path, create, intents=None, createopts=None): +def instance(ui, path: bytes, create, intents=None, createopts=None): # prevent cyclic import localrepo -> upgrade -> localrepo from . import upgrade @@ -3543,7 +3560,7 @@ def instance(ui, path, create, intents=N return repo -def islocal(path): +def islocal(path: bytes) -> bool: return True @@ -3801,7 +3818,7 @@ def filterknowncreateopts(ui, createopts return {k: v for k, v in createopts.items() if k not in known} -def createrepository(ui, path, createopts=None, requirements=None): +def createrepository(ui, path: bytes, createopts=None, requirements=None): """Create a new repository in a vfs. ``path`` path to the new repo's working directory.