annotate hgext/extdiff.py @ 52182:bd8081e9fd62

rust: don't star export from the `revlog` module This made a lot of the imports confusing because they didn't make sense at the top level (so, outside of `revlog`), and they hide the more common types when autocompleting.
author Raphaël Gomès <rgomes@octobus.net>
date Thu, 26 Sep 2024 14:26:24 +0200
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]