Patchwork D7271: linelog: be more careful about types before looking for _target attribute

login
register
mail settings
Submitter phabricator
Date Nov. 6, 2019, 10:57 p.m.
Message ID <differential-rev-PHID-DREV-u2wpcqhiksz6wbs7tpsm-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/42822/
State Superseded
Headers show

Comments

phabricator - Nov. 6, 2019, 10:57 p.m.
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
phabricator - Nov. 7, 2019, 8:09 a.m.
This revision is now accepted and ready to land.
indygreg added a comment.
indygreg accepted this revision.


  I can live with assertions to appease our static analysis bot overlords as well, too.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D7271/new/

REVISION DETAIL
  https://phab.mercurial-scm.org/D7271

To: durin42, #hg-reviewers, indygreg
Cc: indygreg, mercurial-devel

Patch

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(