view tests/autodiff.py @ 42154:f2fe7cf4ebb6

tests: split out separate test for issue5020 The test was added to the existing setup in 41f6af50c0d8 (merge: fix crash on criss cross merge with dir move and delete (issue5020), 2017-01-31). I'm about to make a change that affects that test and it's much easier to follow if the test case for issue5020 is a separate test case. The separate test case is based on what mpm provided in comment 12 on the issue. `hg diff -r 41f6af50c0d8^ tests/test-merge-criss-cross.t` after this patch is pretty small (besides the added test). It's probably easier for reviewers to look at that than to try to understand the diff itself (I don't understand it). Differential Revision: https://phab.mercurial-scm.org/D6243
author Martin von Zweigbergk <martinvonz@google.com>
date Sat, 13 Apr 2019 23:18:56 -0700
parents cdccfe20eed7
children 2372284d9457
line wrap: on
line source

# Extension dedicated to test patch.diff() upgrade modes

from __future__ import absolute_import

from mercurial import (
    error,
    patch,
    pycompat,
    registrar,
    scmutil,
)

cmdtable = {}
command = registrar.command(cmdtable)

@command(b'autodiff',
    [(b'', b'git', b'', b'git upgrade mode (yes/no/auto/warn/abort)')],
    b'[OPTION]... [FILE]...')
def autodiff(ui, repo, *pats, **opts):
    opts = pycompat.byteskwargs(opts)
    diffopts = patch.difffeatureopts(ui, opts)
    git = opts.get(b'git', b'no')
    brokenfiles = set()
    losedatafn = None
    if git in (b'yes', b'no'):
        diffopts.git = git == b'yes'
        diffopts.upgrade = False
    elif git == b'auto':
        diffopts.git = False
        diffopts.upgrade = True
    elif git == b'warn':
        diffopts.git = False
        diffopts.upgrade = True
        def losedatafn(fn=None, **kwargs):
            brokenfiles.add(fn)
            return True
    elif git == b'abort':
        diffopts.git = False
        diffopts.upgrade = True
        def losedatafn(fn=None, **kwargs):
            raise error.Abort(b'losing data for %s' % fn)
    else:
        raise error.Abort(b'--git must be yes, no or auto')

    ctx1, ctx2 = scmutil.revpair(repo, [])
    m = scmutil.match(ctx2, pats, opts)
    it = patch.diff(repo, ctx1.node(), ctx2.node(), match=m, opts=diffopts,
                    losedatafn=losedatafn)
    for chunk in it:
        ui.write(chunk)
    for fn in sorted(brokenfiles):
        ui.write((b'data lost for: %s\n' % fn))