mercurial/diffutil.py
author Matt Harbison <matt_harbison@yahoo.com>
Sat, 05 Oct 2024 15:00:37 -0400
changeset 51940 54d9f496f07a
parent 51863 f4733654f144
permissions -rw-r--r--
interfaces: introduce and use a protocol class for the `charencoding` module See f2832de2a46c for details when this was done for the `bdiff` module. This lets us dump the hack where the `pure` implementation was imported during the type checking phase to provide signatures for the module methods it provides. Now the protocol classes are starting to shine, because these methods are provided by `pure.charencoding` and `cext.parsers`, and references to `cffi.charencoding` and `cext.charencoding` are forwarded to them as appropriate by the `policy` module. But none of that matters, as long as the module returned provides the listed methods. The interface was copy/pasted from the `pure` module, but `jsonescapeu8fallback` is omitted because it is accessed from the `pure` module directly when the escaping fails in the primary module's `jsonescapeu8()`.
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()