# HG changeset patch # User Jun Wu # Date 2018-03-03 20:39:14 # Node ID c6a61298ac32f429ecd46cde2c52b1405d304849 # Parent 430fdb7175491b4f20a7bd1815fe52f6b31627a0 mdiff: add a config option to use xdiff algorithm The `experimental.xdiff` will affect the default diffopts and make mdiff use the xdiff algorithm for better diff quality. Differential Revision: https://phab.mercurial-scm.org/D2603 diff --git a/mercurial/configitems.py b/mercurial/configitems.py --- a/mercurial/configitems.py +++ b/mercurial/configitems.py @@ -577,6 +577,9 @@ coreconfigitem('experimental', 'update.a coreconfigitem('experimental', 'sshpeer.advertise-v2', default=False, ) +coreconfigitem('experimental', 'xdiff', + default=False, +) coreconfigitem('extensions', '.*', default=None, generic=True, diff --git a/mercurial/mdiff.py b/mercurial/mdiff.py --- a/mercurial/mdiff.py +++ b/mercurial/mdiff.py @@ -63,6 +63,7 @@ class diffopts(object): 'upgrade': False, 'showsimilarity': False, 'worddiff': False, + 'xdiff': False, } def __init__(self, **opts): @@ -188,6 +189,13 @@ def blocksinrange(blocks, rangeb): raise error.Abort(_('line range exceeds file size')) return filteredblocks, (lba, uba) +def chooseblocksfunc(opts=None): + if (opts is None or not opts.xdiff + or not util.safehasattr(bdiff, 'xdiffblocks')): + return bdiff.blocks + else: + return bdiff.xdiffblocks + def allblocks(text1, text2, opts=None, lines1=None, lines2=None): """Return (block, type) tuples, where block is an mdiff.blocks line entry. type is '=' for blocks matching exactly one another @@ -201,7 +209,7 @@ def allblocks(text1, text2, opts=None, l if opts.ignorews or opts.ignorewsamount or opts.ignorewseol: text1 = wsclean(opts, text1, False) text2 = wsclean(opts, text2, False) - diff = bdiff.blocks(text1, text2) + diff = chooseblocksfunc(opts)(text1, text2) for i, s1 in enumerate(diff): # The first match is special. # we've either found a match starting at line 0 or a match later diff --git a/mercurial/patch.py b/mercurial/patch.py --- a/mercurial/patch.py +++ b/mercurial/patch.py @@ -2256,6 +2256,7 @@ def difffeatureopts(ui, opts=None, untru 'context': get('unified', getter=ui.config), } buildopts['worddiff'] = ui.configbool('experimental', 'worddiff') + buildopts['xdiff'] = ui.configbool('experimental', 'xdiff') if git: buildopts['git'] = get('git')