hgext/extdiff.py
author Matt Harbison <matt_harbison@yahoo.com>
Sat, 05 Oct 2024 15:00:37 -0400
changeset 51940 54d9f496f07a
parent 51863 f4733654f144
child 52023 d1b54c152673
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:
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     1
# extdiff.py - external diff program support for mercurial
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     2
#
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     3
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8076
diff changeset
     5
# 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: 9956
diff changeset
     6
# GNU General Public License version 2 or any later version.
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
     7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8873
diff changeset
     8
'''command to allow external programs to compare revisions
8873
e872ef2e6758 help: add/fix docstrings for a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8866
diff changeset
     9
9286
a8fdcec4ab34 doc: fix quotes mismatches affecting rst
Cédric Duval <cedricduval@free.fr>
parents: 9257
diff changeset
    10
The extdiff Mercurial extension allows you to use external programs
9257
50ebe8845a1b extdiff: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9207
diff changeset
    11
to compare revisions, or revision with working directory. The external
50ebe8845a1b extdiff: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9207
diff changeset
    12
diff programs are called with a configurable set of options and two
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    13
non-option arguments: paths to directories containing snapshots of
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    14
files to compare.
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    15
37209
2208149c4b8e extdiff: document that it copies modified files back to working directory
Kyle Lippincott <spectral@google.com>
parents: 37120
diff changeset
    16
If there is more than one file being compared and the "child" revision
2208149c4b8e extdiff: document that it copies modified files back to working directory
Kyle Lippincott <spectral@google.com>
parents: 37120
diff changeset
    17
is the working directory, any modifications made in the external diff
2208149c4b8e extdiff: document that it copies modified files back to working directory
Kyle Lippincott <spectral@google.com>
parents: 37120
diff changeset
    18
program will be copied back to the working directory from the temporary
2208149c4b8e extdiff: document that it copies modified files back to working directory
Kyle Lippincott <spectral@google.com>
parents: 37120
diff changeset
    19
directory.
2208149c4b8e extdiff: document that it copies modified files back to working directory
Kyle Lippincott <spectral@google.com>
parents: 37120
diff changeset
    20
14327
d943412e2fba extdiff: grammar "allows to" -> "allows one to"
Javi Merino <cibervicho@gmail.com>
parents: 14322
diff changeset
    21
The extdiff extension also allows you to configure new diff commands, so
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    22
you do not need to type :hg:`extdiff -p kdiff3` always. ::
3127
8e8deb8035a4 Update [extdiff] configuration sample for vimdiff,
Mathieu Clabaut <mathieu.clabaut@systerel.fr>
parents: 3090
diff changeset
    23
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    24
  [extdiff]
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    25
  # add new command that runs GNU diff(1) in 'context diff' mode
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    26
  cdiff = gdiff -Nprc5
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    27
  ## or the old way:
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    28
  #cmd.cdiff = gdiff
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    29
  #opts.cdiff = -Nprc5
3127
8e8deb8035a4 Update [extdiff] configuration sample for vimdiff,
Mathieu Clabaut <mathieu.clabaut@systerel.fr>
parents: 3090
diff changeset
    30
23150
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
    31
  # add new command called meld, runs meld (no need to name twice).  If
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
    32
  # the meld executable is not available, the meld tool in [merge-tools]
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
    33
  # will be used, if available
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    34
  meld =
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    35
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    36
  # add new command called vimdiff, runs gvimdiff with DirDiff plugin
9257
50ebe8845a1b extdiff: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9207
diff changeset
    37
  # (see http://www.vim.org/scripts/script.php?script_id=102) Non
50ebe8845a1b extdiff: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9207
diff changeset
    38
  # English user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    39
  # your .vimrc
16242
55174ab81973 extdiff: escape filenames with vim/DirDiff and make quoting work with Windows
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14739
diff changeset
    40
  vimdiff = gvim -f "+next" \\
55174ab81973 extdiff: escape filenames with vim/DirDiff and make quoting work with Windows
Thomas Arendsen Hein <thomas@intevation.de>
parents: 14739
diff changeset
    41
            "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    42
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    43
Tool arguments can include variables that are expanded at runtime::
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    44
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    45
  $parent1, $plabel1 - filename, descriptive label of first parent
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    46
  $child,   $clabel  - filename, descriptive label of child revision
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    47
  $parent2, $plabel2 - filename, descriptive label of second parent
14045
1c38777f7b8a extdiff: add repository root as a variable
Steven Stallion <sstallion@gmail.com>
parents: 14024
diff changeset
    48
  $root              - repository root
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    49
  $parent is an alias for $parent1.
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    50
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    51
The extdiff extension will look in your [diff-tools] and [merge-tools]
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    52
sections for diff tool arguments, when none are specified in [extdiff].
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    53
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    54
::
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    55
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    56
  [extdiff]
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    57
  kdiff3 =
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    58
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    59
  [diff-tools]
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    60
  kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    61
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    62
If a program has a graphical interface, it might be interesting to tell
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    63
Mercurial about it. It will prevent the program from being mistakenly
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    64
used in a terminal-only environment (such as an SSH terminal session),
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    65
and will make :hg:`extdiff --per-file` open multiple file diffs at once
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    66
instead of one by one (if you still want to open file diffs one by one,
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    67
you can use the --confirm option).
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    68
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    69
Declaring that a tool has a graphical interface can be done with the
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    70
``gui`` flag next to where ``diffargs`` are specified:
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    71
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    72
::
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    73
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    74
  [diff-tools]
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    75
  kdiff3.diffargs=--L1 '$plabel1' --L2 '$clabel' $parent $child
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    76
  kdiff3.gui = true
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    77
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    78
You can use -I/-X and list of file or directory names like normal
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    79
:hg:`diff` command. The extdiff extension makes snapshots of only
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    80
needed files, so running the external diff program will actually be
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    81
pretty fast (at least faster than having to compare the entire tree).
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    82
'''
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    83
51863
f4733654f144 typing: add `from __future__ import annotations` to most files
Matt Harbison <matt_harbison@yahoo.com>
parents: 51859
diff changeset
    84
from __future__ import annotations
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    85
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    86
import os
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    87
import re
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    88
import shutil
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36268
diff changeset
    89
import stat
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
    90
import subprocess
51859
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
    91
import typing
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
    92
from typing import (
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
    93
    List,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
    94
    Optional,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
    95
    Tuple,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
    96
)
38165
2ce60954b1b7 py3: wrap tempfile.mkdtemp() to use bytes path
Yuya Nishihara <yuya@tcha.org>
parents: 37604
diff changeset
    97
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
    98
from mercurial.i18n import _
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    99
from mercurial.node import (
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46133
diff changeset
   100
    nullrev,
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   101
    short,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   102
)
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   103
from mercurial import (
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   104
    archival,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   105
    cmdutil,
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   106
    encoding,
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   107
    error,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   108
    filemerge,
37604
daafaff4e5be export: enable formatter support (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37253
diff changeset
   109
    formatter,
48117
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46843
diff changeset
   110
    logcmdutil,
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29841
diff changeset
   111
    pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32283
diff changeset
   112
    registrar,
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   113
    scmutil,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   114
    util,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
   115
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
   116
from mercurial.utils import (
37120
a8a902d7176e procutil: bulk-replace function calls to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   117
    procutil,
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
   118
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36781
diff changeset
   119
)
5135
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   120
51859
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   121
if typing.TYPE_CHECKING:
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   122
    from mercurial import (
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   123
        localrepo,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   124
        ui as uimod,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   125
    )
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   126
21246
29eeaa6d662f extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20674
diff changeset
   127
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32283
diff changeset
   128
command = registrar.command(cmdtable)
34777
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   129
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   130
configtable = {}
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   131
configitem = registrar.configitem(configtable)
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   132
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   133
configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   134
    b'extdiff',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   135
    br'opts\..*',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   136
    default=b'',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   137
    generic=True,
34777
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   138
)
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   139
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   140
configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   141
    b'extdiff',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   142
    br'gui\..*',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   143
    generic=True,
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   144
)
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   145
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   146
configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   147
    b'diff-tools',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   148
    br'.*\.diffargs$',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   149
    default=None,
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   150
    generic=True,
34778
bf138446ac2f configitems: register the 'extdata.*.diffargs' config
Boris Feld <boris.feld@octobus.net>
parents: 34777
diff changeset
   151
)
bf138446ac2f configitems: register the 'extdata.*.diffargs' config
Boris Feld <boris.feld@octobus.net>
parents: 34777
diff changeset
   152
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   153
configitem(
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   154
    b'diff-tools',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   155
    br'.*\.gui$',
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   156
    generic=True,
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   157
)
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   158
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29723
diff changeset
   159
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24193
diff changeset
   160
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24193
diff changeset
   161
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24193
diff changeset
   162
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   163
testedwith = b'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16686
diff changeset
   164
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   165
51859
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   166
def snapshot(
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   167
    ui: "uimod.ui",
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   168
    repo: "localrepo.localrepository",
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   169
    files,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   170
    node: Optional[bytes],
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   171
    tmproot: bytes,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   172
    listsubrepos: bool,
b60f25f00e94 typing: add explicit hints for recent pytype regressions
Matt Harbison <matt_harbison@yahoo.com>
parents: 51703
diff changeset
   173
) -> Tuple[bytes, List[Tuple[bytes, bytes, os.stat_result]]]:
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   174
    """snapshot files as of some revision
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   175
    if not using snapshot, -I/-X does not work and recursive diff
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   176
    in tools like kdiff3 and meld displays too many files."""
5135
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   177
    dirname = os.path.basename(repo.root)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
    if dirname == b"":
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   179
        dirname = b"root"
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   180
    if node is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
        dirname = b'%s.%s' % (dirname, short(node))
5135
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   182
    base = os.path.join(tmproot, dirname)
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   183
    os.mkdir(base)
32217
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   184
    fnsandstat = []
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   185
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   186
    if node is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   187
        ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   188
            _(b'making snapshot of %d files from rev %s\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   189
            % (len(files), short(node))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   190
        )
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   191
    else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   192
        ui.note(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   193
            _(b'making snapshot of %d files from working directory\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   194
            % (len(files))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   195
        )
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   196
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   197
    if files:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   198
        repo.ui.setconfig(b"ui", b"archivemeta", False)
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   199
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   200
        archival.archive(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   201
            repo,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   202
            base,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   203
            node,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   204
            b'files',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   205
            match=scmutil.matchfiles(repo, files),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   206
            subrepos=listsubrepos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   207
        )
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   208
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   209
        for fn in sorted(files):
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   210
            wfn = util.pconvert(fn)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   211
            ui.note(b'  %s\n' % wfn)
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   212
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   213
            if node is None:
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   214
                dest = os.path.join(base, wfn)
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   215
32217
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   216
                fnsandstat.append((dest, repo.wjoin(fn), os.lstat(dest)))
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   217
    return dirname, fnsandstat
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5137
diff changeset
   218
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   219
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   220
def formatcmdline(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   221
    cmdline,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   222
    repo_root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   223
    do3way,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   224
    parent1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   225
    plabel1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   226
    parent2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   227
    plabel2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   228
    child,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   229
    clabel,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   230
):
41196
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   231
    # Function to quote file/dir names in the argument string.
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   232
    # When not operating in 3-way mode, an empty string is
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   233
    # returned for parent2
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   234
    replace = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
        b'parent': parent1,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
        b'parent1': parent1,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
        b'parent2': parent2,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   238
        b'plabel1': plabel1,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
        b'plabel2': plabel2,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
        b'child': child,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   241
        b'clabel': clabel,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
        b'root': repo_root,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   243
    }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   244
41196
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   245
    def quote(match):
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   246
        pre = match.group(2)
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   247
        key = match.group(3)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
        if not do3way and key == b'parent2':
41196
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   249
            return pre
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   250
        return pre + procutil.shellquote(replace[key])
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   251
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   252
    # Match parent2 first, so 'parent1?' will match both parent1 and parent
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   253
    regex = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   254
        br'''(['"]?)([^\s'"$]*)'''
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   255
        br'\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)\1'
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   256
    )
41196
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   257
    if not do3way and not re.search(regex, cmdline):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   258
        cmdline += b' $parent1 $child'
41196
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   259
    return re.sub(regex, quote, cmdline)
4f675c12d083 extdiff: move external tool command line building into separate function
Ludovic Chabant <ludovic@chabant.com>
parents: 40819
diff changeset
   260
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   261
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   262
def _systembackground(cmd, environ=None, cwd=None):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   263
    """like 'procutil.system', but returns the Popen object directly
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   264
    so we don't have to wait on it.
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   265
    """
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   266
    env = procutil.shellenviron(environ)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   267
    proc = subprocess.Popen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   268
        procutil.tonativestr(cmd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   269
        shell=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   270
        close_fds=procutil.closefds,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   271
        env=procutil.tonativeenv(env),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   272
        cwd=pycompat.rapply(procutil.tonativestr, cwd),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   273
    )
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   274
    return proc
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   275
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   276
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   277
def _runperfilediff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   278
    cmdline,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   279
    repo_root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   280
    ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   281
    guitool,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   282
    do3way,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   283
    confirm,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   284
    commonfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   285
    tmproot,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   286
    dir1a,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   287
    dir1b,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   288
    dir2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   289
    rev1a,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   290
    rev1b,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   291
    rev2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   292
):
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   293
    # Note that we need to sort the list of files because it was
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   294
    # built in an "unstable" way and it's annoying to get files in a
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   295
    # random order, especially when "confirm" mode is enabled.
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   296
    waitprocs = []
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   297
    totalfiles = len(commonfiles)
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   298
    for idx, commonfile in enumerate(sorted(commonfiles)):
45399
e7c5735433ac extdiff: pass full paths of `dir1a` and `dir1b` to `_runperfilediff()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45130
diff changeset
   299
        path1a = os.path.join(dir1a, commonfile)
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   300
        label1a = commonfile + rev1a
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   301
        if not os.path.isfile(path1a):
43790
765a9c299c44 py3: make a pycompat.osdevnull, use it in extdiff
Kyle Lippincott <spectral@google.com>
parents: 43638
diff changeset
   302
            path1a = pycompat.osdevnull
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   303
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   304
        path1b = b''
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   305
        label1b = b''
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   306
        if do3way:
45399
e7c5735433ac extdiff: pass full paths of `dir1a` and `dir1b` to `_runperfilediff()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45130
diff changeset
   307
            path1b = os.path.join(dir1b, commonfile)
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   308
            label1b = commonfile + rev1b
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   309
            if not os.path.isfile(path1b):
43790
765a9c299c44 py3: make a pycompat.osdevnull, use it in extdiff
Kyle Lippincott <spectral@google.com>
parents: 43638
diff changeset
   310
                path1b = pycompat.osdevnull
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   311
45400
1bed1b00b18d extdiff: remove dir2root and pass full path as dir2 in _runperfilediff()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45399
diff changeset
   312
        path2 = os.path.join(dir2, commonfile)
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   313
        label2 = commonfile + rev2
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   314
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   315
        if confirm:
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   316
            # Prompt before showing this diff
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   317
            difffiles = _(b'diff %s (%d of %d)') % (
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   318
                commonfile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   319
                idx + 1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   320
                totalfiles,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   321
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   322
            responses = _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
                b'[Yns?]'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   324
                b'$$ &Yes, show diff'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
                b'$$ &No, skip this diff'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   326
                b'$$ &Skip remaining diffs'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   327
                b'$$ &? (display help)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   328
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   329
            r = ui.promptchoice(b'%s %s' % (difffiles, responses))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   330
            if r == 3:  # ?
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   331
                while r == 3:
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   332
                    for c, t in ui.extractchoices(responses)[1]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
                        ui.write(b'%s - %s\n' % (c, encoding.lower(t)))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   334
                    r = ui.promptchoice(b'%s %s' % (difffiles, responses))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   335
            if r == 0:  # yes
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   336
                pass
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   337
            elif r == 1:  # no
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   338
                continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   339
            elif r == 2:  # skip
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   340
                break
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   341
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   342
        curcmdline = formatcmdline(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   343
            cmdline,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   344
            repo_root,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   345
            do3way=do3way,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   346
            parent1=path1a,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   347
            plabel1=label1a,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   348
            parent2=path1b,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   349
            plabel2=label1b,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   350
            child=path2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   351
            clabel=label2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   352
        )
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   353
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   354
        if confirm or not guitool:
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   355
            # Run the comparison program and wait for it to exit
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   356
            # before we show the next file.
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   357
            # This is because either we need to wait for confirmation
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   358
            # from the user between each invocation, or because, as far
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   359
            # as we know, the tool doesn't have a GUI, in which case
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   360
            # we can't run multiple CLI programs at the same time.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   361
            ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   362
                b'running %r in %s\n' % (pycompat.bytestr(curcmdline), tmproot)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   363
            )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   364
            ui.system(curcmdline, cwd=tmproot, blockedtag=b'extdiff')
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   365
        else:
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   366
            # Run the comparison program but don't wait, as we're
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   367
            # going to rapid-fire each file diff and then wait on
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   368
            # the whole group.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   369
            ui.debug(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   370
                b'running %r in %s (backgrounded)\n'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   371
                % (pycompat.bytestr(curcmdline), tmproot)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   372
            )
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   373
            proc = _systembackground(curcmdline, cwd=tmproot)
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   374
            waitprocs.append(proc)
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   375
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   376
    if waitprocs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   377
        with ui.timeblockedsection(b'extdiff'):
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   378
            for proc in waitprocs:
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   379
                proc.wait()
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   380
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   381
45129
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   382
def diffpatch(ui, repo, node1, node2, tmproot, matcher, cmdline):
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   383
    template = b'hg-%h.patch'
45129
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   384
    # write patches to temporary files
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   385
    with formatter.nullformatter(ui, b'extdiff', {}) as fm:
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   386
        cmdutil.export(
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   387
            repo,
45129
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   388
            [repo[node1].rev(), repo[node2].rev()],
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   389
            fm,
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   390
            fntemplate=repo.vfs.reljoin(tmproot, template),
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   391
            match=matcher,
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   392
        )
45129
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   393
    label1 = cmdutil.makefilename(repo[node1], template)
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   394
    label2 = cmdutil.makefilename(repo[node2], template)
45129
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   395
    file1 = repo.vfs.reljoin(tmproot, label1)
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   396
    file2 = repo.vfs.reljoin(tmproot, label2)
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   397
    cmdline = formatcmdline(
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   398
        cmdline,
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   399
        repo.root,
45128
d23881b17388 extdiff: remove unrequired do3way argument to diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45127
diff changeset
   400
        # no 3way while comparing patches
d23881b17388 extdiff: remove unrequired do3way argument to diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45127
diff changeset
   401
        do3way=False,
45129
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   402
        parent1=file1,
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   403
        plabel1=label1,
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   404
        # while comparing patches, there is no second parent
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   405
        parent2=None,
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   406
        plabel2=None,
30c31de4d1db extdiff: add comments and minor variable renames diffpatch()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45128
diff changeset
   407
        child=file2,
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   408
        clabel=label2,
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   409
    )
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   410
    ui.debug(b'running %r in %s\n' % (pycompat.bytestr(cmdline), tmproot))
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   411
    ui.system(cmdline, cwd=tmproot, blockedtag=b'extdiff')
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   412
    return 1
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   413
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   414
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   415
def diffrevs(
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   416
    ui,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   417
    repo,
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   418
    ctx1a,
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   419
    ctx1b,
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   420
    ctx2,
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   421
    matcher,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   422
    tmproot,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   423
    cmdline,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   424
    do3way,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   425
    guitool,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   426
    opts,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   427
):
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   428
    subrepos = opts.get(b'subrepos')
45130
33524b6bef53 extdiff: add some comments in diffrevs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45129
diff changeset
   429
33524b6bef53 extdiff: add some comments in diffrevs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45129
diff changeset
   430
    # calculate list of files changed between both revs
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   431
    st = ctx1a.status(ctx2, matcher, listsubrepos=subrepos)
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   432
    mod_a, add_a, rem_a = set(st.modified), set(st.added), set(st.removed)
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   433
    if do3way:
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   434
        stb = ctx1b.status(ctx2, matcher, listsubrepos=subrepos)
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   435
        mod_b, add_b, rem_b = (
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   436
            set(stb.modified),
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   437
            set(stb.added),
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   438
            set(stb.removed),
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   439
        )
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   440
    else:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   441
        mod_b, add_b, rem_b = set(), set(), set()
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   442
    modadd = mod_a | add_a | mod_b | add_b
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   443
    common = modadd | rem_a | rem_b
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   444
    if not common:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   445
        return 0
45130
33524b6bef53 extdiff: add some comments in diffrevs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45129
diff changeset
   446
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   447
    # Always make a copy of ctx1a (and ctx1b, if applicable)
45130
33524b6bef53 extdiff: add some comments in diffrevs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45129
diff changeset
   448
    # dir1a should contain files which are:
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   449
    #   * modified or removed from ctx1a to ctx2
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   450
    #   * modified or added from ctx1b to ctx2
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   451
    #     (except file added from ctx1a to ctx2 as they were not present in
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   452
    #     ctx1a)
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   453
    dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a)
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   454
    dir1a = snapshot(ui, repo, dir1a_files, ctx1a.node(), tmproot, subrepos)[0]
46132
dfe2760db2a6 extdiff: fix crash when showing diff from wdir()
Martin von Zweigbergk <martinvonz@google.com>
parents: 46131
diff changeset
   455
    rev1a = b'' if ctx1a.rev() is None else b'@%d' % ctx1a.rev()
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   456
    if do3way:
45130
33524b6bef53 extdiff: add some comments in diffrevs()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45129
diff changeset
   457
        # file calculation criteria same as dir1a
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   458
        dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b)
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   459
        dir1b = snapshot(
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   460
            ui, repo, dir1b_files, ctx1b.node(), tmproot, subrepos
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   461
        )[0]
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   462
        rev1b = b'@%d' % ctx1b.rev()
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   463
    else:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   464
        dir1b = None
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   465
        rev1b = b''
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   466
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   467
    fnsandstat = []
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   468
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   469
    # If ctx2 is not the wc or there is >1 change, copy it
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   470
    dir2root = b''
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   471
    rev2 = b''
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   472
    if ctx2.node() is not None:
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   473
        dir2 = snapshot(ui, repo, modadd, ctx2.node(), tmproot, subrepos)[0]
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   474
        rev2 = b'@%d' % ctx2.rev()
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   475
    elif len(common) > 1:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   476
        # we only actually need to get the files to copy back to
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   477
        # the working dir in this case (because the other cases
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   478
        # are: diffing 2 revisions or single file -- in which case
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   479
        # the file is already directly passed to the diff tool).
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   480
        dir2, fnsandstat = snapshot(ui, repo, modadd, None, tmproot, subrepos)
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   481
    else:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   482
        # This lets the diff tool open the changed file directly
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   483
        dir2 = b''
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   484
        dir2root = repo.root
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   485
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   486
    label1a = rev1a
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   487
    label1b = rev1b
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   488
    label2 = rev2
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   489
45401
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   490
    if not opts.get(b'per_file'):
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   491
        # If only one change, diff the files instead of the directories
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   492
        # Handle bogus modifies correctly by checking if the files exist
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   493
        if len(common) == 1:
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   494
            common_file = util.localpath(common.pop())
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   495
            dir1a = os.path.join(tmproot, dir1a, common_file)
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   496
            label1a = common_file + rev1a
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   497
            if not os.path.isfile(dir1a):
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   498
                dir1a = pycompat.osdevnull
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   499
            if do3way:
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   500
                dir1b = os.path.join(tmproot, dir1b, common_file)
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   501
                label1b = common_file + rev1b
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   502
                if not os.path.isfile(dir1b):
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   503
                    dir1b = pycompat.osdevnull
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   504
            dir2 = os.path.join(dir2root, dir2, common_file)
451e13cc6d85 extdiff: move single file handling inside `not per-file` conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45400
diff changeset
   505
            label2 = common_file + rev2
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   506
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   507
        # Run the external tool on the 2 temp directories or the patches
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   508
        cmdline = formatcmdline(
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   509
            cmdline,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   510
            repo.root,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   511
            do3way=do3way,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   512
            parent1=dir1a,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   513
            plabel1=label1a,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   514
            parent2=dir1b,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   515
            plabel2=label1b,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   516
            child=dir2,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   517
            clabel=label2,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   518
        )
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   519
        ui.debug(b'running %r in %s\n' % (pycompat.bytestr(cmdline), tmproot))
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   520
        ui.system(cmdline, cwd=tmproot, blockedtag=b'extdiff')
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   521
    else:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   522
        # Run the external tool once for each pair of files
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   523
        _runperfilediff(
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   524
            cmdline,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   525
            repo.root,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   526
            ui,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   527
            guitool=guitool,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   528
            do3way=do3way,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   529
            confirm=opts.get(b'confirm'),
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   530
            commonfiles=common,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   531
            tmproot=tmproot,
45399
e7c5735433ac extdiff: pass full paths of `dir1a` and `dir1b` to `_runperfilediff()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45130
diff changeset
   532
            dir1a=os.path.join(tmproot, dir1a),
e7c5735433ac extdiff: pass full paths of `dir1a` and `dir1b` to `_runperfilediff()`
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45130
diff changeset
   533
            dir1b=os.path.join(tmproot, dir1b) if do3way else None,
45400
1bed1b00b18d extdiff: remove dir2root and pass full path as dir2 in _runperfilediff()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45399
diff changeset
   534
            dir2=os.path.join(dir2root, dir2),
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   535
            rev1a=rev1a,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   536
            rev1b=rev1b,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   537
            rev2=rev2,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   538
        )
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   539
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   540
    for copy_fn, working_fn, st in fnsandstat:
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   541
        cpstat = os.lstat(copy_fn)
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   542
        # Some tools copy the file and attributes, so mtime may not detect
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   543
        # all changes.  A size check will detect more cases, but not all.
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   544
        # The only certain way to detect every case is to diff all files,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   545
        # which could be expensive.
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   546
        # copyfile() carries over the permission, so the mode check could
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   547
        # be in an 'elif' branch, but for the case where the file has
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   548
        # changed without affecting mtime or size.
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   549
        if (
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   550
            cpstat[stat.ST_MTIME] != st[stat.ST_MTIME]
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   551
            or cpstat.st_size != st.st_size
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   552
            or (cpstat.st_mode & 0o100) != (st.st_mode & 0o100)
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   553
        ):
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   554
            ui.debug(
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   555
                b'file changed while diffing. '
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   556
                b'Overwriting: %s (src: %s)\n' % (working_fn, copy_fn)
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   557
            )
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   558
            util.copyfile(copy_fn, working_fn)
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   559
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   560
    return 1
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   561
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   562
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   563
def dodiff(ui, repo, cmdline, pats, opts, guitool=False):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   564
    """Do the actual diff:
6103
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   565
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   566
    - copy to a temp structure if diffing 2 internal revisions
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   567
    - copy to a temp structure if diffing working revision with
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   568
      another one and more than 1 file is changed
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   569
    - just invoke the diff for a single file in the working dir
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   570
    """
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   571
44808
aac816f584ad diff: use cmdutil.check_at_most_one_arg() for checking --rev/--change
Martin von Zweigbergk <martinvonz@google.com>
parents: 43790
diff changeset
   572
    cmdutil.check_at_most_one_arg(opts, b'rev', b'change')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   573
    revs = opts.get(b'rev')
46133
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   574
    from_rev = opts.get(b'from')
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   575
    to_rev = opts.get(b'to')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   576
    change = opts.get(b'change')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   577
    do3way = b'$parent2' in cmdline
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   578
44808
aac816f584ad diff: use cmdutil.check_at_most_one_arg() for checking --rev/--change
Martin von Zweigbergk <martinvonz@google.com>
parents: 43790
diff changeset
   579
    if change:
48118
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   580
        ctx2 = logcmdutil.revsingle(repo, change, None)
37253
6089ef933ab5 extdiff: use context-returning revpair()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37251
diff changeset
   581
        ctx1a, ctx1b = ctx2.p1(), ctx2.p2()
46133
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   582
    elif from_rev or to_rev:
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   583
        repo = scmutil.unhidehashlikerevs(
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   584
            repo, [from_rev] + [to_rev], b'nowarn'
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   585
        )
48118
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   586
        ctx1a = logcmdutil.revsingle(repo, from_rev, None)
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46133
diff changeset
   587
        ctx1b = repo[nullrev]
48118
5105a9975407 errors: raise InputError from revsingle() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 48117
diff changeset
   588
        ctx2 = logcmdutil.revsingle(repo, to_rev, None)
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   589
    else:
48117
b74e128676d4 errors: raise InputError from revpair() iff revset provided by the user
Martin von Zweigbergk <martinvonz@google.com>
parents: 46843
diff changeset
   590
        ctx1a, ctx2 = logcmdutil.revpair(repo, revs)
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   591
        if not revs:
37253
6089ef933ab5 extdiff: use context-returning revpair()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37251
diff changeset
   592
            ctx1b = repo[None].p2()
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   593
        else:
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46133
diff changeset
   594
            ctx1b = repo[nullrev]
37253
6089ef933ab5 extdiff: use context-returning revpair()
Martin von Zweigbergk <martinvonz@google.com>
parents: 37251
diff changeset
   595
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   596
    # Disable 3-way merge if there is only one parent
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   597
    if do3way:
46843
728d89f6f9b1 refactor: prefer checks against nullrev over nullid
Joerg Sonnenberger <joerg@bec.de>
parents: 46133
diff changeset
   598
        if ctx1b.rev() == nullrev:
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   599
            do3way = False
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   600
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   601
    matcher = scmutil.match(ctx2, pats, opts)
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   602
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   603
    if opts.get(b'patch'):
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   604
        if opts.get(b'subrepos'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   605
            raise error.Abort(_(b'--patch cannot be used with --subrepos'))
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   606
        if opts.get(b'per_file'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   607
            raise error.Abort(_(b'--patch cannot be used with --per-file'))
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   608
        if ctx2.node() is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   609
            raise error.Abort(_(b'--patch requires two revisions'))
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   610
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   611
    tmproot = pycompat.mkdtemp(prefix=b'extdiff.')
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   612
    try:
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   613
        if opts.get(b'patch'):
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   614
            return diffpatch(
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   615
                ui, repo, ctx1a.node(), ctx2.node(), tmproot, matcher, cmdline
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   616
            )
45126
48c38018bd77 extdiff: refactor logic which does diff of patches
Pulkit Goyal <7895pulkit@gmail.com>
parents: 44867
diff changeset
   617
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   618
        return diffrevs(
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   619
            ui,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   620
            repo,
46131
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   621
            ctx1a,
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   622
            ctx1b,
55542b213813 extdiff: pass contexts instead of nodeids into diffrevs()
Martin von Zweigbergk <martinvonz@google.com>
parents: 45942
diff changeset
   623
            ctx2,
45127
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   624
            matcher,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   625
            tmproot,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   626
            cmdline,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   627
            do3way,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   628
            guitool,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   629
            opts,
da2e69a278df extdiff: refactor logic to diff revs of versions of files
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45126
diff changeset
   630
        )
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5137
diff changeset
   631
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   632
    finally:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   633
        ui.note(_(b'cleaning up temp directory\n'))
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   634
        shutil.rmtree(tmproot)
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   635
27680
c750245c6b85 extdiff: factor out list of common options
Yuya Nishihara <yuya@tcha.org>
parents: 26587
diff changeset
   636
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   637
extdiffopts = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   638
    [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   639
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   640
            b'o',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   641
            b'option',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   642
            [],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   643
            _(b'pass option to comparison program'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   644
            _(b'OPT'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   645
        ),
46133
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   646
        (b'r', b'rev', [], _(b'revision (DEPRECATED)'), _(b'REV')),
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   647
        (b'', b'from', b'', _(b'revision to diff from'), _(b'REV1')),
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   648
        (b'', b'to', b'', _(b'revision to diff to'), _(b'REV2')),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   649
        (b'c', b'change', b'', _(b'change made by revision'), _(b'REV')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   650
        (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   651
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   652
            b'per-file',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   653
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   654
            _(b'compare each file instead of revision snapshots'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   655
        ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   656
        (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   657
            b'',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   658
            b'confirm',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   659
            False,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   660
            _(b'prompt user before each external program invocation'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   661
        ),
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   662
        (b'', b'patch', None, _(b'compare patches for two revisions')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   663
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   664
    + cmdutil.walkopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   665
    + cmdutil.subrepoopts
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   666
)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   667
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   668
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   669
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   670
    b'extdiff',
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   671
    [
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   672
        (b'p', b'program', b'', _(b'comparison program to run'), _(b'CMD')),
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   673
    ]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   674
    + extdiffopts,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   675
    _(b'hg extdiff [OPT]... [FILE]...'),
40293
c303d65d2e34 help: assigning categories to existing commands
rdamazio@google.com
parents: 38165
diff changeset
   676
    helpcategory=command.CATEGORY_FILE_CONTENTS,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   677
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   678
)
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   679
def extdiff(ui, repo, *pats, **opts):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   680
    """use external program to diff repository (or selected files)
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   681
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   682
    Show differences between revisions for the specified files, using
7983
7b813bdbd5d0 Change double spaces to single spaces in help texts.
Martin Geisler <mg@daimi.au.dk>
parents: 7758
diff changeset
   683
    an external program. The default program used is diff, with
2906
453097750fbf extdiff: fix bugs. add test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2903
diff changeset
   684
    default options "-Npru".
453097750fbf extdiff: fix bugs. add test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2903
diff changeset
   685
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8066
diff changeset
   686
    To select a different program, use the -p/--program option. The
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   687
    program will be passed the names of two directories to compare,
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   688
    unless the --per-file option is specified (see below). To pass
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   689
    additional options to the program, use -o/--option. These will be
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   690
    passed before the names of the directories or files to compare.
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   691
46133
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   692
    The --from, --to, and --change options work the same way they do for
0a4d47f4337b extdiff: add --from/--to and deprecate -r, as was done for `hg diff`
Martin von Zweigbergk <martinvonz@google.com>
parents: 46132
diff changeset
   693
    :hg:`diff`.
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   694
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   695
    The --per-file option runs the external program repeatedly on each
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   696
    file to diff, instead of once on two directories. By default,
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   697
    this happens one by one, where the next file diff is open in the
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   698
    external program only once the previous external program (for the
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   699
    previous file diff) has exited. If the external program has a
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   700
    graphical interface, it can open all the file diffs at once instead
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   701
    of one by one. See :hg:`help -e extdiff` for information about how
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   702
    to tell Mercurial that a given program has a graphical interface.
41487
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   703
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   704
    The --confirm option will prompt the user before each invocation of
fa471151d269 extdiff: add --per-file and --confirm options
Ludovic Chabant <ludovic@chabant.com>
parents: 41196
diff changeset
   705
    the external program. It is ignored if --per-file isn't specified.
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45410
diff changeset
   706
    """
34976
a8bc191fee5a py3: handle keyword arguments in hgext/extdiff.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34778
diff changeset
   707
    opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   708
    program = opts.get(b'program')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   709
    option = opts.get(b'option')
9519
0d3c1aa9d5de extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8934
diff changeset
   710
    if not program:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   711
        program = b'diff'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   712
        option = option or [b'-Npru']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   713
    cmdline = b' '.join(map(procutil.shellquote, [program] + option))
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   714
    return dodiff(ui, repo, cmdline, pats, opts)
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   715
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   716
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   717
class savedcmd:
29723
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   718
    """use external program to diff repository (or selected files)
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   719
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   720
    Show differences between revisions for the specified files, using
29723
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   721
    the following program::
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   722
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   723
        %(path)s
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   724
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   725
    When two revision arguments are given, then changes are shown
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   726
    between those revisions. If only one revision is specified then
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   727
    that revision is compared to the working directory, and, when no
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   728
    revisions are specified, the working directory files are compared
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   729
    to its parent.
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   730
    """
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   731
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   732
    def __init__(self, path, cmdline, isgui):
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   733
        # We can't pass non-ASCII through docstrings (and path is
40806
151aec6494a8 extdiff: avoid double backslashes in the displayed tool path on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40407
diff changeset
   734
        # in an unknown encoding anyway), but avoid double separators on
151aec6494a8 extdiff: avoid double backslashes in the displayed tool path on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40407
diff changeset
   735
        # Windows
151aec6494a8 extdiff: avoid double backslashes in the displayed tool path on Windows
Matt Harbison <matt_harbison@yahoo.com>
parents: 40407
diff changeset
   736
        docpath = stringutil.escapestr(path).replace(b'\\\\', b'\\')
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
   737
        self.__doc__ %= {'path': pycompat.sysstr(stringutil.uirepr(docpath))}
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   738
        self._cmdline = cmdline
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
   739
        self._isgui = isgui
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   740
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   741
    def __call__(self, ui, repo, *pats, **opts):
34976
a8bc191fee5a py3: handle keyword arguments in hgext/extdiff.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34778
diff changeset
   742
        opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   743
        options = b' '.join(map(procutil.shellquote, opts[b'option']))
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   744
        if options:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   745
            options = b' ' + options
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   746
        return dodiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   747
            ui, repo, self._cmdline + options, pats, opts, guitool=self._isgui
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   748
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   749
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   750
45410
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   751
def _gettooldetails(ui, cmd, path):
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   752
    """
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   753
    returns following things for a
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   754
    ```
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   755
    [extdiff]
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   756
    <cmd> = <path>
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   757
    ```
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   758
    entry:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   759
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   760
    cmd: command/tool name
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   761
    path: path to the tool
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   762
    cmdline: the command which should be run
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   763
    isgui: whether the tool uses GUI or not
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   764
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   765
    Reads all external tools related configs, whether it be extdiff section,
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   766
    diff-tools or merge-tools section, or its specified in an old format or
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   767
    the latest format.
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   768
    """
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   769
    path = util.expandpath(path)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   770
    if cmd.startswith(b'cmd.'):
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   771
        cmd = cmd[4:]
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   772
        if not path:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   773
            path = procutil.findexe(cmd)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   774
            if path is None:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   775
                path = filemerge.findexternaltool(ui, cmd) or cmd
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   776
        diffopts = ui.config(b'extdiff', b'opts.' + cmd)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   777
        cmdline = procutil.shellquote(path)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   778
        if diffopts:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   779
            cmdline += b' ' + diffopts
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   780
        isgui = ui.configbool(b'extdiff', b'gui.' + cmd)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   781
    else:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   782
        if path:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   783
            # case "cmd = path opts"
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   784
            cmdline = path
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   785
            diffopts = len(pycompat.shlexsplit(cmdline)) > 1
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   786
        else:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   787
            # case "cmd ="
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   788
            path = procutil.findexe(cmd)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   789
            if path is None:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   790
                path = filemerge.findexternaltool(ui, cmd) or cmd
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   791
            cmdline = procutil.shellquote(path)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   792
            diffopts = False
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   793
        isgui = ui.configbool(b'extdiff', b'gui.' + cmd)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   794
    # look for diff arguments in [diff-tools] then [merge-tools]
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   795
    if not diffopts:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   796
        key = cmd + b'.diffargs'
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   797
        for section in (b'diff-tools', b'merge-tools'):
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   798
            args = ui.config(section, key)
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   799
            if args:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   800
                cmdline += b' ' + args
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   801
                if isgui is None:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   802
                    isgui = ui.configbool(section, cmd + b'.gui') or False
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   803
                break
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   804
    return cmd, path, cmdline, isgui
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   805
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   806
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   807
def uisetup(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   808
    for cmd, path in ui.configitems(b'extdiff'):
45409
a28da102fd36 extdiff: reorder an if-else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45401
diff changeset
   809
        if cmd.startswith(b'opts.') or cmd.startswith(b'gui.'):
a28da102fd36 extdiff: reorder an if-else conditional
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45401
diff changeset
   810
            continue
45410
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
   811
        cmd, path, cmdline, isgui = _gettooldetails(ui, cmd, path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   812
        command(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   813
            cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   814
            extdiffopts[:],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   815
            _(b'hg %s [OPTION]... [FILE]...') % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   816
            helpcategory=command.CATEGORY_FILE_CONTENTS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   817
            inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   818
        )(savedcmd(path, cmdline, isgui))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
   819
29722
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
   820
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
   821
# tell hggettext to extract docstrings from these functions:
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
   822
i18nfunctions = [savedcmd]