tests/autodiff.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Fri, 01 Oct 2021 02:01:12 +0200
changeset 48141 42ab0bcb6ded
parent 48117 b74e128676d4
child 48875 6000f5b25c9b
permissions -rw-r--r--
dirstate: narrow gathering of parent data The parent data are only going to be useful is the file might be clean. And it might only be clean if it is tracked in both p1 and the working copy. Differential Revision: https://phab.mercurial-scm.org/D11584

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

from __future__ import absolute_import

from mercurial import (
    error,
    logcmdutil,
    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 = logcmdutil.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))