mercurial/diffutil.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 26 Oct 2024 00:58:01 +0200
changeset 52100 19ae7730636a
parent 51863 f4733654f144
permissions -rw-r--r--
branching: merge stable into default
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
38562
c88d2c9b00dd diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents: 38493
diff changeset
     1
# diffutil.py - utility functions related to diff and patch
2861
0f08f2c042ec Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     2
#
2865
71e78f2ca5ae merge git patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2863
diff changeset
     3
# Copyright 2006 Brendan Cully <brendan@kublai.com>
4897
4574925db5c0 Add Chris Mason's mpatch library.
Bryan O'Sullivan <bos@serpentine.com>
parents: 4778
diff changeset
     4
# Copyright 2007 Chris Mason <chris.mason@oracle.com>
38562
c88d2c9b00dd diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents: 38493
diff changeset
     5
# Copyright 2018 Octobus <octobus@octobus.net>
2865
71e78f2ca5ae merge git patch code.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2863
diff changeset
     6
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     7
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10203
diff changeset
     8
# GNU General Public License version 2 or any later version.
2861
0f08f2c042ec Move patch-related code into its own module.
Brendan Cully <brendan@kublai.com>
parents:
diff changeset
     9
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51143
diff changeset
    10
from __future__ import annotations
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51143
diff changeset
    11
50247
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    12
import typing
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    13
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    14
from typing import (
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    15
    Any,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    16
    Dict,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    17
    Optional,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    18
)
14370
17cea10c343e patch: add a workingbackend dirstate layer on top of fsbackend
Patrick Mezard <pmezard@gmail.com>
parents: 14369
diff changeset
    19
38588
1c93e0237a24 diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents: 38587
diff changeset
    20
from .i18n import _
51143
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
    21
from .node import nullrev
24269
9a745ced79a9 record: move filterpatch from record to patch
Laurent Charignon <lcharignon@fb.com>
parents: 24268
diff changeset
    22
38588
1c93e0237a24 diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents: 38587
diff changeset
    23
from . import (
38562
c88d2c9b00dd diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents: 38493
diff changeset
    24
    mdiff,
c88d2c9b00dd diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents: 38493
diff changeset
    25
    pycompat,
c88d2c9b00dd diffutil: extract diff options code into a dedicated util-module
Boris Feld <boris.feld@octobus.net>
parents: 38493
diff changeset
    26
)
7198
df79ee9b6278 patch: extract local function addmodehdr
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7186
diff changeset
    27
50247
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    28
if typing.TYPE_CHECKING:
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    29
    from . import ui as uimod
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    30
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    31
# TODO: narrow the value after the config module is typed
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    32
_Opts = Dict[bytes, Any]
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    33
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    34
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    35
def diffallopts(
50247
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    36
    ui: "uimod.ui",
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    37
    opts: Optional[_Opts] = None,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    38
    untrusted: bool = False,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    39
    section: bytes = b'diff',
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    40
    configprefix: bytes = b'',
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    41
) -> mdiff.diffopts:
23430
3821be85fd4d patch: add a new function to initialize diffopts by feature
Siddharth Agarwal <sid0@fb.com>
parents: 23429
diff changeset
    42
    '''return diffopts with all features supported and parsed'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    43
    return difffeatureopts(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    44
        ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    45
        opts=opts,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    46
        untrusted=untrusted,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    47
        section=section,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    48
        git=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    49
        whitespace=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    50
        formatchanging=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    51
        configprefix=configprefix,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    52
    )
23430
3821be85fd4d patch: add a new function to initialize diffopts by feature
Siddharth Agarwal <sid0@fb.com>
parents: 23429
diff changeset
    53
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    54
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    55
def difffeatureopts(
50247
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    56
    ui: "uimod.ui",
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    57
    opts: Optional[_Opts] = None,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    58
    untrusted: bool = False,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    59
    section: bytes = b'diff',
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    60
    git: bool = False,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    61
    whitespace: bool = False,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    62
    formatchanging: bool = False,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    63
    configprefix: bytes = b'',
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    64
) -> mdiff.diffopts:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43077
diff changeset
    65
    """return diffopts with only opted-in features parsed
23432
27af986a332b patch.difffeatureopts: add a feature for diff.git
Siddharth Agarwal <sid0@fb.com>
parents: 23431
diff changeset
    66
27af986a332b patch.difffeatureopts: add a feature for diff.git
Siddharth Agarwal <sid0@fb.com>
parents: 23431
diff changeset
    67
    Features:
27af986a332b patch.difffeatureopts: add a feature for diff.git
Siddharth Agarwal <sid0@fb.com>
parents: 23431
diff changeset
    68
    - git: git-style diffs
23433
41dd76b3facb patch.difffeatureopts: add a feature for whitespace diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23432
diff changeset
    69
    - whitespace: whitespace options like ignoreblanklines and ignorews
23434
60300a4c0ae5 patch.difffeatureopts: add a feature for format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23433
diff changeset
    70
    - formatchanging: options that will likely break or cause correctness issues
60300a4c0ae5 patch.difffeatureopts: add a feature for format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23433
diff changeset
    71
      with most diff parsers
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 43077
diff changeset
    72
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    73
50247
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    74
    def get(
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    75
        key: bytes,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    76
        name: Optional[bytes] = None,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    77
        getter=ui.configbool,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    78
        forceplain: Optional[bool] = None,
b8cac4e37100 typing: add typehints to mercurial/diffutil.py
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
    79
    ) -> Any:
23295
ac072c79bd9d patch.diffopts: break get function into if statements
Siddharth Agarwal <sid0@fb.com>
parents: 22460
diff changeset
    80
        if opts:
ac072c79bd9d patch.diffopts: break get function into if statements
Siddharth Agarwal <sid0@fb.com>
parents: 22460
diff changeset
    81
            v = opts.get(key)
29948
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    82
            # diffopts flags are either None-default (which is passed
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    83
            # through unchanged, so we can identify unset values), or
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    84
            # some other falsey default (eg --unified, which defaults
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    85
            # to an empty string). We only want to override the config
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    86
            # entries from hgrc with command line values if they
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    87
            # appear to have been set, which is any truthy value,
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    88
            # True, or False.
e40343ce9c4c diffopts: notice a negated boolean flag in diffopts
Augie Fackler <augie@google.com>
parents: 29900
diff changeset
    89
            if v or isinstance(v, bool):
23295
ac072c79bd9d patch.diffopts: break get function into if statements
Siddharth Agarwal <sid0@fb.com>
parents: 22460
diff changeset
    90
                return v
23296
922fcfb02e77 patch.diffopts: allow a setting to be forced in plain mode
Siddharth Agarwal <sid0@fb.com>
parents: 23295
diff changeset
    91
        if forceplain is not None and ui.plain():
922fcfb02e77 patch.diffopts: allow a setting to be forced in plain mode
Siddharth Agarwal <sid0@fb.com>
parents: 23295
diff changeset
    92
            return forceplain
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    93
        return getter(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    94
            section, configprefix + (name or key), untrusted=untrusted
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
    95
        )
23295
ac072c79bd9d patch.diffopts: break get function into if statements
Siddharth Agarwal <sid0@fb.com>
parents: 22460
diff changeset
    96
23434
60300a4c0ae5 patch.difffeatureopts: add a feature for format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23433
diff changeset
    97
    # core options, expected to be understood by every diff parser
23429
f35526b999f4 patch.diffopts: use a dict for initialization
Siddharth Agarwal <sid0@fb.com>
parents: 23300
diff changeset
    98
    buildopts = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    99
        b'nodates': get(b'nodates'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   100
        b'showfunc': get(b'show_function', b'showfunc'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   101
        b'context': get(b'unified', getter=ui.config),
23429
f35526b999f4 patch.diffopts: use a dict for initialization
Siddharth Agarwal <sid0@fb.com>
parents: 23300
diff changeset
   102
    }
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   103
    buildopts[b'xdiff'] = ui.configbool(b'experimental', b'xdiff')
23429
f35526b999f4 patch.diffopts: use a dict for initialization
Siddharth Agarwal <sid0@fb.com>
parents: 23300
diff changeset
   104
23432
27af986a332b patch.difffeatureopts: add a feature for diff.git
Siddharth Agarwal <sid0@fb.com>
parents: 23431
diff changeset
   105
    if git:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   106
        buildopts[b'git'] = get(b'git')
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   107
30806
e2796f193f06 patch: add similarity config knob in experimental section
Sean Farley <sean@farley.io>
parents: 30790
diff changeset
   108
        # since this is in the experimental section, we need to call
e2796f193f06 patch: add similarity config knob in experimental section
Sean Farley <sean@farley.io>
parents: 30790
diff changeset
   109
        # ui.configbool directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   110
        buildopts[b'showsimilarity'] = ui.configbool(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   111
            b'experimental', b'extendedheader.similarity'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
   112
        )
30806
e2796f193f06 patch: add similarity config knob in experimental section
Sean Farley <sean@farley.io>
parents: 30790
diff changeset
   113
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   114
        # need to inspect the ui object instead of using get() since we want to
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   115
        # test for an int
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   116
        hconf = ui.config(b'experimental', b'extendedheader.index')
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   117
        if hconf is not None:
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   118
            hlen = None
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   119
            try:
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   120
                # the hash config could be an integer (for length of hash) or a
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   121
                # word (e.g. short, full, none)
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   122
                hlen = int(hconf)
30819
897726622877 patch: check length of git index header only if integer is specified
Yuya Nishihara <yuya@tcha.org>
parents: 30808
diff changeset
   123
                if hlen < 0 or hlen > 40:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   124
                    msg = _(b"invalid length for extendedheader.index: '%d'\n")
30819
897726622877 patch: check length of git index header only if integer is specified
Yuya Nishihara <yuya@tcha.org>
parents: 30808
diff changeset
   125
                    ui.warn(msg % hlen)
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   126
            except ValueError:
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   127
                # default value
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   128
                if hconf == b'short' or hconf == b'':
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   129
                    hlen = 12
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
                elif hconf == b'full':
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   131
                    hlen = 40
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   132
                elif hconf != b'none':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
                    msg = _(b"invalid value for extendedheader.index: '%s'\n")
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   134
                    ui.warn(msg % hconf)
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   135
            finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   136
                buildopts[b'index'] = hlen
30788
d1901c4c8ec0 patch: add config knob for displaying the index header
Sean Farley <sean@farley.io>
parents: 30407
diff changeset
   137
23433
41dd76b3facb patch.difffeatureopts: add a feature for whitespace diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23432
diff changeset
   138
    if whitespace:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   139
        buildopts[b'ignorews'] = get(b'ignore_all_space', b'ignorews')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
        buildopts[b'ignorewsamount'] = get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   141
            b'ignore_space_change', b'ignorewsamount'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
   142
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   143
        buildopts[b'ignoreblanklines'] = get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   144
            b'ignore_blank_lines', b'ignoreblanklines'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
   145
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   146
        buildopts[b'ignorewseol'] = get(b'ignore_space_at_eol', b'ignorewseol')
23434
60300a4c0ae5 patch.difffeatureopts: add a feature for format-changing diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23433
diff changeset
   147
    if formatchanging:
49898
024e0580b853 diffutil: rewrite an ersatz ternary operator for building diffopts.text
Matt Harbison <matt_harbison@yahoo.com>
parents: 48875
diff changeset
   148
        buildopts[b'text'] = None if opts is None else opts.get(b'text')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   149
        binary = None if opts is None else opts.get(b'binary')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   150
        buildopts[b'nobinary'] = (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
   151
            not binary
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
   152
            if binary is not None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   153
            else get(b'nobinary', forceplain=False)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41559
diff changeset
   154
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   155
        buildopts[b'noprefix'] = get(b'noprefix', forceplain=False)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   156
        buildopts[b'worddiff'] = get(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   157
            b'word_diff', b'word-diff', forceplain=False
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   158
        )
23432
27af986a332b patch.difffeatureopts: add a feature for diff.git
Siddharth Agarwal <sid0@fb.com>
parents: 23431
diff changeset
   159
31631
a7acda2de4b8 diff: use pycompat.{byteskwargs, strkwargs} to switch opts b/w bytes and str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 31630
diff changeset
   160
    return mdiff.diffopts(**pycompat.strkwargs(buildopts))
51143
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   161
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   162
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   163
def diff_parent(ctx):
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   164
    """get the context object to use as parent when diffing
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   165
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   166
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   167
    If diff.merge is enabled, an overlayworkingctx of the auto-merged parents will be returned.
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   168
    """
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   169
    repo = ctx.repo()
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   170
    if repo.ui.configbool(b"diff", b"merge") and ctx.p2().rev() != nullrev:
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   171
        # avoid circular import
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   172
        from . import (
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   173
            context,
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   174
            merge,
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   175
        )
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   176
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   177
        wctx = context.overlayworkingctx(repo)
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   178
        wctx.setbase(ctx.p1())
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   179
        with repo.ui.configoverride(
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   180
            {
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   181
                (
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   182
                    b"ui",
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   183
                    b"forcemerge",
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   184
                ): b"internal:merge3-lie-about-conflicts",
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   185
            },
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   186
            b"merge-diff",
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   187
        ):
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   188
            with repo.ui.silent():
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   189
                merge.merge(ctx.p2(), wc=wctx)
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   190
        return wctx
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   191
    else:
d6e5bec550f1 util: move diff_parent from logcmdutil to diffutil
pacien <pacien.trangirard@pacien.net>
parents: 50252
diff changeset
   192
        return ctx.p1()