# HG changeset patch # User Denis Laxalde # Date 1491042299 -7200 # Node ID ca3b4a2b7e547ecce806bf85ce2933915bf75c39 # Parent e6eb86b154c55db7fc4ed8a35710e9c5db17747a mdiff: add a hunkinrange helper function This factors out hunk filtering logic by line range that is similar in mdiff.blocksinrange() and hgweb.webutil.diffs(). diff -r e6eb86b154c5 -r ca3b4a2b7e54 mercurial/hgweb/webutil.py --- a/mercurial/hgweb/webutil.py Fri Apr 22 21:46:33 2016 +0900 +++ b/mercurial/hgweb/webutil.py Sat Apr 01 12:24:59 2017 +0200 @@ -27,6 +27,7 @@ context, error, match, + mdiff, patch, pathutil, templatefilters, @@ -473,8 +474,7 @@ for hunkrange, hunklines in hunks: if linerange is not None and hunkrange is not None: s1, l1, s2, l2 = hunkrange - lb, ub = linerange - if not (lb < s2 + l2 and ub > s2): + if not mdiff.hunkinrange((s2, l2), linerange): continue lines.extend(hunklines) if lines: diff -r e6eb86b154c5 -r ca3b4a2b7e54 mercurial/mdiff.py --- a/mercurial/mdiff.py Fri Apr 22 21:46:33 2016 +0900 +++ b/mercurial/mdiff.py Sat Apr 01 12:24:59 2017 +0200 @@ -117,6 +117,31 @@ s1 = i1 s2 = i2 +def hunkinrange(hunk, linerange): + """Return True if `hunk` defined as (start, length) is in `linerange` + defined as (lowerbound, upperbound). + + >>> hunkinrange((5, 10), (2, 7)) + True + >>> hunkinrange((5, 10), (6, 12)) + True + >>> hunkinrange((5, 10), (13, 17)) + True + >>> hunkinrange((5, 10), (3, 17)) + True + >>> hunkinrange((5, 10), (1, 3)) + False + >>> hunkinrange((5, 10), (18, 20)) + False + >>> hunkinrange((5, 10), (1, 5)) + False + >>> hunkinrange((5, 10), (15, 27)) + False + """ + start, length = hunk + lowerbound, upperbound = linerange + return lowerbound < start + length and start < upperbound + def blocksinrange(blocks, rangeb): """filter `blocks` like (a1, a2, b1, b2) from items outside line range `rangeb` from ``(b1, b2)`` point of view. @@ -150,7 +175,7 @@ uba = a1 + (ubb - b1) else: uba = a2 - if lbb < b2 and b1 < ubb: + if hunkinrange((b1, (b2 - b1)), rangeb): filteredblocks.append(block) if lba is None or uba is None or uba < lba: raise error.Abort(_('line range exceeds file size')) diff -r e6eb86b154c5 -r ca3b4a2b7e54 tests/test-doctest.py --- a/tests/test-doctest.py Fri Apr 22 21:46:33 2016 +0900 +++ b/tests/test-doctest.py Sat Apr 01 12:24:59 2017 +0200 @@ -32,6 +32,7 @@ testmod('mercurial.hg') testmod('mercurial.hgweb.hgwebdir_mod') testmod('mercurial.match') +testmod('mercurial.mdiff') testmod('mercurial.minirst') testmod('mercurial.patch') testmod('mercurial.pathutil')