comparison mercurial/subrepoutil.py @ 51287:f15cb5111a1e

pytype: move some type comment to proper annotation We support direct type annotations now, while pytype is starting to complains about them.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 19 Dec 2023 21:29:34 +0100
parents 9d3721552b6c
children 7bd7fcc711f2
comparison
equal deleted inserted replaced
51286:81224afd938d 51287:f15cb5111a1e
67 ] 67 ]
68 68
69 Substate = Dict[bytes, Tuple[bytes, bytes, bytes]] 69 Substate = Dict[bytes, Tuple[bytes, bytes, bytes]]
70 70
71 71
72 def state(ctx, ui): 72 def state(ctx: "context.changectx", ui: "uimod.ui") -> Substate:
73 # type: (context.changectx, uimod.ui) -> Substate
74 """return a state dict, mapping subrepo paths configured in .hgsub 73 """return a state dict, mapping subrepo paths configured in .hgsub
75 to tuple: (source from .hgsub, revision from .hgsubstate, kind 74 to tuple: (source from .hgsub, revision from .hgsubstate, kind
76 (key in types dict)) 75 (key in types dict))
77 """ 76 """
78 p = config.config() 77 p = config.config()
120 ) 119 )
121 rev[path] = revision 120 rev[path] = revision
122 except FileNotFoundError: 121 except FileNotFoundError:
123 pass 122 pass
124 123
125 def remap(src): 124 def remap(src: bytes) -> bytes:
126 # type: (bytes) -> bytes
127 for pattern, repl in p.items(b'subpaths'): 125 for pattern, repl in p.items(b'subpaths'):
128 # Turn r'C:\foo\bar' into r'C:\\foo\\bar' since re.sub 126 # Turn r'C:\foo\bar' into r'C:\\foo\\bar' since re.sub
129 # does a string decode. 127 # does a string decode.
130 repl = stringutil.escapestr(repl) 128 repl = stringutil.escapestr(repl)
131 # However, we still want to allow back references to go 129 # However, we still want to allow back references to go
173 state[util.pconvert(path)] = (src.strip(), rev.get(path, b''), kind) 171 state[util.pconvert(path)] = (src.strip(), rev.get(path, b''), kind)
174 172
175 return state 173 return state
176 174
177 175
178 def writestate(repo, state): 176 def writestate(repo: "localrepo.localrepository", state: Substate) -> None:
179 # type: (localrepo.localrepository, Substate) -> None
180 """rewrite .hgsubstate in (outer) repo with these subrepo states""" 177 """rewrite .hgsubstate in (outer) repo with these subrepo states"""
181 lines = [ 178 lines = [
182 b'%s %s\n' % (state[s][1], s) 179 b'%s %s\n' % (state[s][1], s)
183 for s in sorted(state) 180 for s in sorted(state)
184 if state[s][1] != nullstate[1] 181 if state[s][1] != nullstate[1]
185 ] 182 ]
186 repo.wwrite(b'.hgsubstate', b''.join(lines), b'') 183 repo.wwrite(b'.hgsubstate', b''.join(lines), b'')
187 184
188 185
189 def submerge(repo, wctx, mctx, actx, overwrite, labels=None): 186 def submerge(
190 # type: (localrepo.localrepository, context.workingctx, context.changectx, context.changectx, bool, Optional[Any]) -> Substate 187 repo: "localrepo.localrepository",
188 wctx: "context.workingctx",
189 mctx: "context.changectx",
190 actx: "context.changectx",
191 overwrite: bool,
192 labels: Optional[Any] = None,
193 ) -> Substate:
191 # TODO: type the `labels` arg 194 # TODO: type the `labels` arg
192 """delegated from merge.applyupdates: merging of .hgsubstate file 195 """delegated from merge.applyupdates: merging of .hgsubstate file
193 in working context, merging context and ancestor context""" 196 in working context, merging context and ancestor context"""
194 if mctx == actx: # backwards? 197 if mctx == actx: # backwards?
195 actx = wctx.p1() 198 actx = wctx.p1()
325 # record merged .hgsubstate 328 # record merged .hgsubstate
326 writestate(repo, sm) 329 writestate(repo, sm)
327 return sm 330 return sm
328 331
329 332
330 def precommit(ui, wctx, status, match, force=False): 333 def precommit(
331 # type: (uimod.ui, context.workingcommitctx, scmutil.status, matchmod.basematcher, bool) -> Tuple[List[bytes], Set[bytes], Substate] 334 ui: "uimod.ui",
335 wctx: "context.workingcommitctx",
336 status: "scmutil.status",
337 match: "matchmod.basematcher",
338 force: bool = False,
339 ) -> Tuple[List[bytes], Set[bytes], Substate]:
332 """Calculate .hgsubstate changes that should be applied before committing 340 """Calculate .hgsubstate changes that should be applied before committing
333 341
334 Returns (subs, commitsubs, newstate) where 342 Returns (subs, commitsubs, newstate) where
335 - subs: changed subrepos (including dirty ones) 343 - subs: changed subrepos (including dirty ones)
336 - commitsubs: dirty subrepos which the caller needs to commit recursively 344 - commitsubs: dirty subrepos which the caller needs to commit recursively
414 chunks.reverse() 422 chunks.reverse()
415 path = posixpath.join(*chunks) 423 path = posixpath.join(*chunks)
416 return posixpath.normpath(path) 424 return posixpath.normpath(path)
417 425
418 426
419 def reporelpath(repo): 427 def reporelpath(repo: "localrepo.localrepository") -> bytes:
420 # type: (localrepo.localrepository) -> bytes
421 """return path to this (sub)repo as seen from outermost repo""" 428 """return path to this (sub)repo as seen from outermost repo"""
422 parent = repo 429 parent = repo
423 while hasattr(parent, '_subparent'): 430 while hasattr(parent, '_subparent'):
424 parent = parent._subparent 431 parent = parent._subparent
425 return repo.root[len(pathutil.normasprefix(parent.root)) :] 432 return repo.root[len(pathutil.normasprefix(parent.root)) :]
426 433
427 434
428 def subrelpath(sub): 435 def subrelpath(sub: "subrepo.abstractsubrepo") -> bytes:
429 # type: (subrepo.abstractsubrepo) -> bytes
430 """return path to this subrepo as seen from outermost repo""" 436 """return path to this subrepo as seen from outermost repo"""
431 return sub._relpath 437 return sub._relpath
432 438
433 439
434 def _abssource(repo, push=False, abort=True): 440 def _abssource(
435 # type: (localrepo.localrepository, bool, bool) -> Optional[bytes] 441 repo: "localrepo.localrepository",
442 push: bool = False,
443 abort: bool = True,
444 ) -> Optional[bytes]:
436 """return pull/push path of repo - either based on parent repo .hgsub info 445 """return pull/push path of repo - either based on parent repo .hgsub info
437 or on the top repo config. Abort or return None if no source found.""" 446 or on the top repo config. Abort or return None if no source found."""
438 if hasattr(repo, '_subparent'): 447 if hasattr(repo, '_subparent'):
439 source = urlutil.url(repo._subsource) 448 source = urlutil.url(repo._subsource)
440 if source.isabs(): 449 if source.isabs():
478 487
479 if abort: 488 if abort:
480 raise error.Abort(_(b"default path for subrepository not found")) 489 raise error.Abort(_(b"default path for subrepository not found"))
481 490
482 491
483 def newcommitphase(ui, ctx): 492 def newcommitphase(ui: "uimod.ui", ctx: "context.changectx") -> int:
484 # type: (uimod.ui, context.changectx) -> int
485 commitphase = phases.newcommitphase(ui) 493 commitphase = phases.newcommitphase(ui)
486 substate = getattr(ctx, "substate", None) 494 substate = getattr(ctx, "substate", None)
487 if not substate: 495 if not substate:
488 return commitphase 496 return commitphase
489 check = ui.config(b'phases', b'checksubrepos') 497 check = ui.config(b'phases', b'checksubrepos')