From patchwork Wed Nov 6 22:57:40 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: D7271: linelog: be more careful about types before looking for _target attribute From: phabricator X-Patchwork-Id: 42822 Message-Id: To: Phabricator Cc: mercurial-devel@mercurial-scm.org Date: Wed, 6 Nov 2019 22:57:40 +0000 durin42 created this revision. Herald added a subscriber: mercurial-devel. Herald added a reviewer: hg-reviewers. REVISION SUMMARY Without this, pytype (correctly) complains that fakejge might not have a _cmprev attribute. We're operating on some constraints not expressible in the type system, so we detect the invalid case and raise a nicer exception now. Sadly, we also need an `assert` to give PyType a clue that we know what we're doing, but I can absolutely live with that. REPOSITORY rHG Mercurial REVISION DETAIL https://phab.mercurial-scm.org/D7271 AFFECTED FILES mercurial/linelog.py CHANGE DETAILS To: durin42, #hg-reviewers Cc: mercurial-devel diff --git a/mercurial/linelog.py b/mercurial/linelog.py --- a/mercurial/linelog.py +++ b/mercurial/linelog.py @@ -278,8 +278,14 @@ fakejge = _decodeone(buf, 0) if isinstance(fakejge, _jump): maxrev = 0 + elif isinstance(fakejge, (_jge, _jl)): + maxrev = fakejge._cmprev else: - maxrev = fakejge._cmprev + raise LineLogError( + 'Expected one of _jump, _jge, or _jl. Got %s.' + % type(fakejge).__name__ + ) + assert isinstance(fakejge, (_jump, _jge, _jl)) # help pytype numentries = fakejge._target if expected != numentries: raise LineLogError(