annotate hgext/extdiff.py @ 52290:e03bc88776d3

tests: stop killing (most) https servers individually This is easier to manage, and avoids one nested conditional. There is one final sweep of killing individual servers near the end, but that's left alone because there's a comment about not killing `tinyproxy.py`, due to potentially emitting additional output.
author Matt Harbison <matt_harbison@yahoo.com>
date Mon, 11 Nov 2024 12:08:26 -0500
parents d1b54c152673
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
52023
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
732 def __init__(self, cmd, 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))}
52023
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
738 self._name = cmd
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
739 self._cmdline = cmdline
41584
a4cd77a425a3 extdiff: support tools that can be run simultaneously
Ludovic Chabant <ludovic@chabant.com>
parents: 41487
diff changeset
740 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
741
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
742 def __call__(self, ui, repo, *pats, **opts):
52023
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
743 if self._isgui and not procutil.gui():
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
744 msg = _(b"tool '%s' requires a GUI") % self._name
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
745 hint = (
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
746 _(b"to override, use: --config diff-tools.%s.gui=False")
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
747 % self._name
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
748 )
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
749 raise error.Abort(msg, hint=hint)
34976
a8bc191fee5a py3: handle keyword arguments in hgext/extdiff.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34778
diff changeset
750 opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
751 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
752 if options:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
753 options = b' ' + options
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
754 return dodiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
755 ui, repo, self._cmdline + options, pats, opts, guitool=self._isgui
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
756 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
757
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
758
45410
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
759 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
760 """
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
761 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
762 ```
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
763 [extdiff]
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
764 <cmd> = <path>
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
765 ```
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
766 entry:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
767
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
768 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
769 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
770 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
771 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
772
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
773 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
774 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
775 the latest format.
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
776 """
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
777 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
778 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
779 cmd = cmd[4:]
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
780 if not path:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
781 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
782 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
783 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
784 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
785 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
786 if diffopts:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
787 cmdline += b' ' + diffopts
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
788 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
789 else:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
790 if path:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
791 # 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
792 cmdline = path
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
793 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
794 else:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
795 # case "cmd ="
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
796 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
797 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
798 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
799 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
800 diffopts = False
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
801 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
802 # 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
803 if not diffopts:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
804 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
805 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
806 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
807 if args:
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
808 cmdline += b' ' + args
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
809 break
52023
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
810 if isgui is None:
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
811 key = cmd + b'.gui'
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
812 for section in (b'diff-tools', b'merge-tools'):
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
813 isgui = ui.configbool(section, key)
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
814 if isgui is not None:
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
815 break
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
816 if isgui is None:
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
817 isgui = False
45410
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
818 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
819
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
820
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
821 def uisetup(ui):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
822 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
823 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
824 continue
45410
2d08dcf8fd9e extdiff: refactor cmdline and gui calculation login in a separate fn
Pulkit Goyal <7895pulkit@gmail.com>
parents: 45409
diff changeset
825 cmd, path, cmdline, isgui = _gettooldetails(ui, cmd, path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
826 command(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
827 cmd,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
828 extdiffopts[:],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
829 _(b'hg %s [OPTION]... [FILE]...') % cmd,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
830 helpcategory=command.CATEGORY_FILE_CONTENTS,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
831 inferrepo=True,
52023
d1b54c152673 extdiff: don't run gui programs when in a cli-only environment
Ludovic Chabant <ludovic@chabant.com>
parents: 51863
diff changeset
832 )(savedcmd(cmd, path, cmdline, isgui))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41584
diff changeset
833
29722
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
834
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
835 # 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
836 i18nfunctions = [savedcmd]