hgext/extdiff.py
author Gregory Szorc <gregory.szorc@gmail.com>
Thu, 08 Mar 2018 15:14:32 -0800
changeset 36805 ec46415ed826
parent 36781 ffa3026d4196
child 37084 f0b6fbea00cf
permissions -rw-r--r--
hgweb: always use "?" when writing session vars This code resolves a string to insert in URLs as part of a query string. Essentially, it resolves the {sessionvars} template keyword, which is used by hgweb templates to build a URL as a string. The whole approach here feels wrong because there's no way of knowing when this code runs how the final URL will look. There could be additional URL fragments added before this template keyword that add a query string component. Furthermore, I don't think there's *any* for req.url to have a query string. That's because the code that populates this variable only takes SCRIPT_NAME and REPO_NAME into account. The "?" character it is searching for would only be added if some code attempted to add QUERY_STRING to the URL. Hacking the code up to raise if "?" is present in the URL yields a clean test suite run. I'm not sure if we broke this code or if it has always been broken. Anyway, this commit removes support for emitting "&" as the first character in {sessionvars} and makes it always emit "?", which is what it was always doing before AFAICT. Differential Revision: https://phab.mercurial-scm.org/D2733
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     1
# extdiff.py - external diff program support for mercurial
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     2
#
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     3
# Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com>
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8076
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9956
diff changeset
     6
# GNU General Public License version 2 or any later version.
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
     7
8934
9dda4c73fc3b extensions: change descriptions for extensions providing a few commands
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8873
diff changeset
     8
'''command to allow external programs to compare revisions
8873
e872ef2e6758 help: add/fix docstrings for a bunch of extensions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8866
diff changeset
     9
9286
a8fdcec4ab34 doc: fix quotes mismatches affecting rst
Cédric Duval <cedricduval@free.fr>
parents: 9257
diff changeset
    10
The extdiff Mercurial extension allows you to use external programs
9257
50ebe8845a1b extdiff: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9207
diff changeset
    11
to compare revisions, or revision with working directory. The external
50ebe8845a1b extdiff: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9207
diff changeset
    12
diff programs are called with a configurable set of options and two
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    13
non-option arguments: paths to directories containing snapshots of
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    14
files to compare.
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    15
14327
d943412e2fba extdiff: grammar "allows to" -> "allows one to"
Javi Merino <cibervicho@gmail.com>
parents: 14322
diff changeset
    16
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
    17
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
    18
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    19
  [extdiff]
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    20
  # 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
    21
  cdiff = gdiff -Nprc5
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    22
  ## or the old way:
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    23
  #cmd.cdiff = gdiff
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    24
  #opts.cdiff = -Nprc5
3127
8e8deb8035a4 Update [extdiff] configuration sample for vimdiff,
Mathieu Clabaut <mathieu.clabaut@systerel.fr>
parents: 3090
diff changeset
    25
23150
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
    26
  # 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
    27
  # 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
    28
  # will be used, if available
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    29
  meld =
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    30
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    31
  # 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
    32
  # (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
    33
  # 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
    34
  # 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
    35
  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
    36
            "+execute 'DirDiff' fnameescape(argv(0)) fnameescape(argv(1))"
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
    37
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    38
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
    39
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    40
  $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
    41
  $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
    42
  $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
    43
  $root              - repository root
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    44
  $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
    45
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    46
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
    47
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
    48
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    49
::
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    50
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    51
  [extdiff]
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    52
  kdiff3 =
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    53
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    54
  [diff-tools]
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
    55
  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
    56
11191
c45a47bc4114 extdiff: fix reST syntax in module docstring
Martin Geisler <mg@lazybytes.net>
parents: 11184
diff changeset
    57
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
    58
: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
    59
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
    60
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
    61
'''
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
    62
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    63
from __future__ import absolute_import
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    64
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    65
import os
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    66
import re
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    67
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
    68
import stat
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    69
import tempfile
3891
6b4127c7d52a Simplify i18n imports
Matt Mackall <mpm@selenic.com>
parents: 3877
diff changeset
    70
from mercurial.i18n import _
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    71
from mercurial.node import (
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    72
    nullid,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    73
    short,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    74
)
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    75
from mercurial import (
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    76
    archival,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    77
    cmdutil,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    78
    error,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    79
    filemerge,
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29841
diff changeset
    80
    pycompat,
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32283
diff changeset
    81
    registrar,
28970
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    82
    scmutil,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    83
    util,
4f86c3bed63b py3: make extdiff use absolute_import
Pulkit Goyal <7895pulkit@gmail.com>
parents: 27681
diff changeset
    84
)
5135
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
    85
21246
29eeaa6d662f extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20674
diff changeset
    86
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32283
diff changeset
    87
command = registrar.command(cmdtable)
34777
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    88
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    89
configtable = {}
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    90
configitem = registrar.configitem(configtable)
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    91
36267
08f061a48a8f py3: make regexp patterns bytes in extdiff
Yuya Nishihara <yuya@tcha.org>
parents: 36266
diff changeset
    92
configitem('extdiff', br'opts\..*',
34777
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    93
    default='',
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    94
    generic=True,
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    95
)
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
    96
36267
08f061a48a8f py3: make regexp patterns bytes in extdiff
Yuya Nishihara <yuya@tcha.org>
parents: 36266
diff changeset
    97
configitem('diff-tools', br'.*\.diffargs$',
34778
bf138446ac2f configitems: register the 'extdata.*.diffargs' config
Boris Feld <boris.feld@octobus.net>
parents: 34777
diff changeset
    98
    default=None,
bf138446ac2f configitems: register the 'extdata.*.diffargs' config
Boris Feld <boris.feld@octobus.net>
parents: 34777
diff changeset
    99
    generic=True,
bf138446ac2f configitems: register the 'extdata.*.diffargs' config
Boris Feld <boris.feld@octobus.net>
parents: 34777
diff changeset
   100
)
bf138446ac2f configitems: register the 'extdata.*.diffargs' config
Boris Feld <boris.feld@octobus.net>
parents: 34777
diff changeset
   101
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29723
diff changeset
   102
# 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
   103
# 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
   104
# 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
   105
# leave the attribute unspecified.
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29723
diff changeset
   106
testedwith = 'ships-with-hg-core'
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16686
diff changeset
   107
25813
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   108
def snapshot(ui, repo, files, node, tmproot, listsubrepos):
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   109
    '''snapshot files as of some revision
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   110
    if not using snapshot, -I/-X does not work and recursive diff
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   111
    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
   112
    dirname = os.path.basename(repo.root)
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   113
    if dirname == "":
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   114
        dirname = "root"
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   115
    if node is not None:
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   116
        dirname = '%s.%s' % (dirname, short(node))
5135
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   117
    base = os.path.join(tmproot, dirname)
1830bc7676ee extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents: 4730
diff changeset
   118
    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
   119
    fnsandstat = []
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   120
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   121
    if node is not None:
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   122
        ui.note(_('making snapshot of %d files from rev %s\n') %
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   123
                (len(files), short(node)))
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   124
    else:
8066
aece3c9e62f1 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 8026 8065
diff changeset
   125
        ui.note(_('making snapshot of %d files from working directory\n') %
8064
5c7bc1aece9e extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents: 7758
diff changeset
   126
            (len(files)))
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   127
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   128
    if files:
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   129
        repo.ui.setconfig("ui", "archivemeta", False)
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   130
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   131
        archival.archive(repo, base, node, 'files',
25813
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   132
                         matchfn=scmutil.matchfiles(repo, files),
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   133
                         subrepos=listsubrepos)
25812
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   134
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   135
        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
   136
            wfn = util.pconvert(fn)
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   137
            ui.note('  %s\n' % wfn)
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   138
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   139
            if node is None:
68822b7cdd01 extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents: 25186
diff changeset
   140
                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
   141
32217
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   142
                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
   143
    return dirname, fnsandstat
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5137
diff changeset
   144
23681
9476cb62298e extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23680
diff changeset
   145
def dodiff(ui, repo, cmdline, pats, opts):
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 16743
diff changeset
   146
    '''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
   147
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   148
    - 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
   149
    - 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
   150
      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
   151
    - just invoke the diff for a single file in the working dir
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   152
    '''
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   153
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   154
    revs = opts.get('rev')
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   155
    change = opts.get('change')
23681
9476cb62298e extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23680
diff changeset
   156
    do3way = '$parent2' in cmdline
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   157
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   158
    if revs and change:
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   159
        msg = _('cannot specify --rev and --change at the same time')
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
   160
        raise error.Abort(msg)
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   161
    elif change:
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14232
diff changeset
   162
        node2 = scmutil.revsingle(repo, change, None).node()
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   163
        node1a, node1b = repo.changelog.parents(node2)
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   164
    else:
14319
b33f3e35efb0 scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents: 14232
diff changeset
   165
        node1a, node2 = scmutil.revpair(repo, revs)
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   166
        if not revs:
13878
a8d13ee0ce68 misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents: 13758
diff changeset
   167
            node1b = repo.dirstate.p2()
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   168
        else:
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   169
            node1b = nullid
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   170
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   171
    # 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
   172
    if do3way:
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   173
        if node1b == nullid:
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   174
            do3way = False
7758
e81e6c996e99 extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents: 7599
diff changeset
   175
25813
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   176
    subrepos=opts.get('subrepos')
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   177
14671
35c2cc322ba8 scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents: 14327
diff changeset
   178
    matcher = scmutil.match(repo[node2], pats, opts)
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   179
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   180
    if opts.get('patch'):
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   181
        if subrepos:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
   182
            raise error.Abort(_('--patch cannot be used with --subrepos'))
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   183
        if node2 is None:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26229
diff changeset
   184
            raise error.Abort(_('--patch requires two revisions'))
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   185
    else:
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   186
        mod_a, add_a, rem_a = map(set, repo.status(node1a, node2, matcher,
25813
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   187
                                                   listsubrepos=subrepos)[:3])
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   188
        if do3way:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   189
            mod_b, add_b, rem_b = map(set,
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   190
                                      repo.status(node1b, node2, matcher,
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   191
                                                  listsubrepos=subrepos)[:3])
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   192
        else:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   193
            mod_b, add_b, rem_b = set(), set(), set()
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   194
        modadd = mod_a | add_a | mod_b | add_b
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   195
        common = modadd | rem_a | rem_b
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   196
        if not common:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   197
            return 0
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   198
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   199
    tmproot = tempfile.mkdtemp(prefix='extdiff.')
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   200
    try:
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   201
        if not opts.get('patch'):
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   202
            # Always make a copy of node1a (and node1b, if applicable)
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   203
            dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a)
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   204
            dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot,
25813
18bae5eb58c5 extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 25812
diff changeset
   205
                             subrepos)[0]
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   206
            rev1a = '@%d' % repo[node1a].rev()
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   207
            if do3way:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   208
                dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b)
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   209
                dir1b = snapshot(ui, repo, dir1b_files, node1b, tmproot,
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   210
                                 subrepos)[0]
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   211
                rev1b = '@%d' % repo[node1b].rev()
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   212
            else:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   213
                dir1b = None
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   214
                rev1b = ''
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
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 = []
5137
2be225ea5722 extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents: 5136
diff changeset
   217
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   218
            # If node2 in not the wc or there is >1 change, copy it
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   219
            dir2root = ''
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   220
            rev2 = ''
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   221
            if node2:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   222
                dir2 = snapshot(ui, repo, modadd, node2, tmproot, subrepos)[0]
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   223
                rev2 = '@%d' % repo[node2].rev()
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   224
            elif len(common) > 1:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   225
                #we only actually need to get the files to copy back to
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   226
                #the working dir in this case (because the other cases
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   227
                #are: diffing 2 revisions or single file -- in which case
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   228
                #the file is already directly passed to the diff tool).
32217
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   229
                dir2, fnsandstat = snapshot(ui, repo, modadd, None, tmproot,
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   230
                                            subrepos)
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   231
            else:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   232
                # This lets the diff tool open the changed file directly
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   233
                dir2 = ''
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   234
                dir2root = repo.root
5137
2be225ea5722 extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents: 5136
diff changeset
   235
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   236
            label1a = rev1a
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   237
            label1b = rev1b
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   238
            label2 = rev2
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
   239
26227
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   240
            # If only one change, diff the files instead of the directories
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   241
            # Handle bogus modifies correctly by checking if the files exist
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   242
            if len(common) == 1:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   243
                common_file = util.localpath(common.pop())
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   244
                dir1a = os.path.join(tmproot, dir1a, common_file)
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   245
                label1a = common_file + rev1a
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   246
                if not os.path.isfile(dir1a):
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   247
                    dir1a = os.devnull
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   248
                if do3way:
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   249
                    dir1b = os.path.join(tmproot, dir1b, common_file)
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   250
                    label1b = common_file + rev1b
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   251
                    if not os.path.isfile(dir1b):
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   252
                        dir1b = os.devnull
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   253
                dir2 = os.path.join(dir2root, dir2, common_file)
611ba118ebfc extdiff: prepare sections of dodiff() for conditionalizing
Matt Harbison <matt_harbison@yahoo.com>
parents: 25876
diff changeset
   254
                label2 = common_file + rev2
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   255
        else:
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   256
            template = 'hg-%h.patch'
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   257
            cmdutil.export(repo, [repo[node1a].rev(), repo[node2].rev()],
32431
9fd9f91b0c43 cmdutil: rename template param to export to fntemplate
Augie Fackler <augie@google.com>
parents: 32375
diff changeset
   258
                           fntemplate=repo.vfs.reljoin(tmproot, template),
26229
d1530c6e8613 extdiff: enable -I/-X with --patch
Matt Harbison <matt_harbison@yahoo.com>
parents: 26228
diff changeset
   259
                           match=matcher)
36204
33ed8b511185 cmdutil: pass ctx to makefilename() in place of repo/node pair (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34976
diff changeset
   260
            label1a = cmdutil.makefilename(repo[node1a], template)
33ed8b511185 cmdutil: pass ctx to makefilename() in place of repo/node pair (API)
Yuya Nishihara <yuya@tcha.org>
parents: 34976
diff changeset
   261
            label2 = cmdutil.makefilename(repo[node2], template)
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   262
            dir1a = repo.vfs.reljoin(tmproot, label1a)
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   263
            dir2 = repo.vfs.reljoin(tmproot, label2)
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   264
            dir1b = None
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   265
            label1b = None
32217
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   266
            fnsandstat = []
5143
d4fa6bafc43a Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5137
diff changeset
   267
9945
5e4ef56b4d42 extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents: 9941
diff changeset
   268
        # Function to quote file/dir names in the argument string.
5e4ef56b4d42 extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents: 9941
diff changeset
   269
        # When not operating in 3-way mode, an empty string is
5e4ef56b4d42 extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents: 9941
diff changeset
   270
        # returned for parent2
20674
2aafd5854243 extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 17773
diff changeset
   271
        replace = {'parent': dir1a, 'parent1': dir1a, 'parent2': dir1b,
2aafd5854243 extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 17773
diff changeset
   272
                   'plabel1': label1a, 'plabel2': label1b,
2aafd5854243 extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 17773
diff changeset
   273
                   'clabel': label2, 'child': dir2,
2aafd5854243 extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 17773
diff changeset
   274
                   'root': repo.root}
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   275
        def quote(match):
23969
01e5b7323a48 extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents: 23681
diff changeset
   276
            pre = match.group(2)
01e5b7323a48 extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents: 23681
diff changeset
   277
            key = match.group(3)
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   278
            if not do3way and key == 'parent2':
23969
01e5b7323a48 extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents: 23681
diff changeset
   279
                return pre
01e5b7323a48 extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents: 23681
diff changeset
   280
            return pre + util.shellquote(replace[key])
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   281
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   282
        # Match parent2 first, so 'parent1?' will match both parent1 and parent
36267
08f061a48a8f py3: make regexp patterns bytes in extdiff
Yuya Nishihara <yuya@tcha.org>
parents: 36266
diff changeset
   283
        regex = (br'''(['"]?)([^\s'"$]*)'''
08f061a48a8f py3: make regexp patterns bytes in extdiff
Yuya Nishihara <yuya@tcha.org>
parents: 36266
diff changeset
   284
                 br'\$(parent2|parent1?|child|plabel1|plabel2|clabel|root)\1')
23681
9476cb62298e extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23680
diff changeset
   285
        if not do3way and not re.search(regex, cmdline):
9476cb62298e extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23680
diff changeset
   286
            cmdline += ' $parent1 $child'
9476cb62298e extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23680
diff changeset
   287
        cmdline = re.sub(regex, quote, cmdline)
9512
e7bde4680eec extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents: 9467
diff changeset
   288
36268
be5a6fe3643a py3: make test-extdiff.t pass on Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 36267
diff changeset
   289
        ui.debug('running %r in %s\n' % (pycompat.bytestr(cmdline), tmproot))
30982
08e6f4dac2ca extdiff: log time spent in external diff program
Simon Farnsworth <simonfar@fb.com>
parents: 30678
diff changeset
   290
        ui.system(cmdline, cwd=tmproot, blockedtag='extdiff')
6103
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   291
32217
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   292
        for copy_fn, working_fn, st in fnsandstat:
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   293
            cpstat = os.lstat(copy_fn)
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   294
            # Some tools copy the file and attributes, so mtime may not detect
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   295
            # all changes.  A size check will detect more cases, but not all.
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   296
            # The only certain way to detect every case is to diff all files,
affd753ddaf1 extdiff: copy back files to the working directory if the size changed
Matt Harbison <matt_harbison@yahoo.com>
parents: 31451
diff changeset
   297
            # which could be expensive.
32283
8a1ff5ed620e extdiff: copy back execbit-only changes to the working directory
Matt Harbison <matt_harbison@yahoo.com>
parents: 32217
diff changeset
   298
            # copyfile() carries over the permission, so the mode check could
8a1ff5ed620e extdiff: copy back execbit-only changes to the working directory
Matt Harbison <matt_harbison@yahoo.com>
parents: 32217
diff changeset
   299
            # be in an 'elif' branch, but for the case where the file has
8a1ff5ed620e extdiff: copy back execbit-only changes to the working directory
Matt Harbison <matt_harbison@yahoo.com>
parents: 32217
diff changeset
   300
            # changed without affecting mtime or size.
36781
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36268
diff changeset
   301
            if (cpstat[stat.ST_MTIME] != st[stat.ST_MTIME]
ffa3026d4196 cleanup: use stat_result[stat.ST_MTIME] instead of stat_result.st_mtime
Augie Fackler <augie@google.com>
parents: 36268
diff changeset
   302
                or cpstat.st_size != st.st_size
32283
8a1ff5ed620e extdiff: copy back execbit-only changes to the working directory
Matt Harbison <matt_harbison@yahoo.com>
parents: 32217
diff changeset
   303
                or (cpstat.st_mode & 0o100) != (st.st_mode & 0o100)):
9467
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9286
diff changeset
   304
                ui.debug('file changed while diffing. '
4c041f1ee1b4 do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents: 9286
diff changeset
   305
                         'Overwriting: %s (src: %s)\n' % (working_fn, copy_fn))
6103
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   306
                util.copyfile(copy_fn, working_fn)
e668fd796b8b Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents: 5293
diff changeset
   307
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   308
        return 1
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   309
    finally:
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   310
        ui.note(_('cleaning up temp directory\n'))
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   311
        shutil.rmtree(tmproot)
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   312
27680
c750245c6b85 extdiff: factor out list of common options
Yuya Nishihara <yuya@tcha.org>
parents: 26587
diff changeset
   313
extdiffopts = [
21246
29eeaa6d662f extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20674
diff changeset
   314
    ('o', 'option', [],
29eeaa6d662f extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20674
diff changeset
   315
     _('pass option to comparison program'), _('OPT')),
29eeaa6d662f extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20674
diff changeset
   316
    ('r', 'rev', [], _('revision'), _('REV')),
29eeaa6d662f extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 20674
diff changeset
   317
    ('c', 'change', '', _('change made by revision'), _('REV')),
26228
0fd20a71abdb extdiff: add a --patch argument for diffing changeset deltas
Matt Harbison <matt_harbison@yahoo.com>
parents: 26227
diff changeset
   318
    ('', 'patch', None, _('compare patches for two revisions'))
32375
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   319
    ] + cmdutil.walkopts + cmdutil.subrepoopts
27680
c750245c6b85 extdiff: factor out list of common options
Yuya Nishihara <yuya@tcha.org>
parents: 26587
diff changeset
   320
c750245c6b85 extdiff: factor out list of common options
Yuya Nishihara <yuya@tcha.org>
parents: 26587
diff changeset
   321
@command('extdiff',
c750245c6b85 extdiff: factor out list of common options
Yuya Nishihara <yuya@tcha.org>
parents: 26587
diff changeset
   322
    [('p', 'program', '', _('comparison program to run'), _('CMD')),
c750245c6b85 extdiff: factor out list of common options
Yuya Nishihara <yuya@tcha.org>
parents: 26587
diff changeset
   323
     ] + extdiffopts,
21781
f0c3b95af47f extdiff: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21246
diff changeset
   324
    _('hg extdiff [OPT]... [FILE]...'),
f0c3b95af47f extdiff: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21246
diff changeset
   325
    inferrepo=True)
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   326
def extdiff(ui, repo, *pats, **opts):
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   327
    '''use external program to diff repository (or selected files)
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   328
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   329
    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
   330
    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
   331
    default options "-Npru".
453097750fbf extdiff: fix bugs. add test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2903
diff changeset
   332
8076
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8066
diff changeset
   333
    To select a different program, use the -p/--program option. The
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8066
diff changeset
   334
    program will be passed the names of two directories to compare. To
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8066
diff changeset
   335
    pass additional options to the program, use -o/--option. These
5ec526c1a32f help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents: 8066
diff changeset
   336
    will be passed before the names of the directories to compare.
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   337
7990
cdb848e8c4b5 extdiff: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
   338
    When two revision arguments are given, then changes are shown
cdb848e8c4b5 extdiff: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
   339
    between those revisions. If only one revision is specified then
cdb848e8c4b5 extdiff: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
   340
    that revision is compared to the working directory, and, when no
cdb848e8c4b5 extdiff: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
   341
    revisions are specified, the working directory files are compared
cdb848e8c4b5 extdiff: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7983
diff changeset
   342
    to its parent.'''
34976
a8bc191fee5a py3: handle keyword arguments in hgext/extdiff.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34778
diff changeset
   343
    opts = pycompat.byteskwargs(opts)
9519
0d3c1aa9d5de extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8934
diff changeset
   344
    program = opts.get('program')
0d3c1aa9d5de extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8934
diff changeset
   345
    option = opts.get('option')
0d3c1aa9d5de extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8934
diff changeset
   346
    if not program:
0d3c1aa9d5de extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8934
diff changeset
   347
        program = 'diff'
0d3c1aa9d5de extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents: 8934
diff changeset
   348
        option = option or ['-Npru']
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   349
    cmdline = ' '.join(map(util.shellquote, [program] + option))
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   350
    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
   351
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   352
class savedcmd(object):
29723
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   353
    """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
   354
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   355
    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
   356
    the following program::
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   357
91b2f2176395 extdiff: isolate path variable of saved command to independent paragraph
Yuya Nishihara <yuya@tcha.org>
parents: 29722
diff changeset
   358
        %(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
   359
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   360
    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
   361
    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
   362
    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
   363
    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
   364
    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
   365
    """
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   366
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   367
    def __init__(self, path, cmdline):
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   368
        # We can't pass non-ASCII through docstrings (and path is
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   369
        # in an unknown encoding anyway)
31451
53865692a354 util: wrap s.encode('string_escape') call for future py3 compatibility
Yuya Nishihara <yuya@tcha.org>
parents: 30982
diff changeset
   370
        docpath = util.escapestr(path)
36266
1fa33bd848ee py3: fix bytes-unicode dance while building docstring of extdiff
Yuya Nishihara <yuya@tcha.org>
parents: 36204
diff changeset
   371
        self.__doc__ %= {r'path': pycompat.sysstr(util.uirepr(docpath))}
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   372
        self._cmdline = cmdline
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   373
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   374
    def __call__(self, ui, repo, *pats, **opts):
34976
a8bc191fee5a py3: handle keyword arguments in hgext/extdiff.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34778
diff changeset
   375
        opts = pycompat.byteskwargs(opts)
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   376
        options = ' '.join(map(util.shellquote, opts['option']))
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   377
        if options:
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   378
            options = ' ' + options
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   379
        return dodiff(ui, repo, self._cmdline + options, pats, opts)
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   380
2333
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   381
def uisetup(ui):
de0c05afa511 new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff changeset
   382
    for cmd, path in ui.configitems('extdiff'):
24193
fa4642439aa0 extdiff: expand tildes and variables in paths to user-supplied diff programs
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 23969
diff changeset
   383
        path = util.expandpath(path)
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   384
        if cmd.startswith('cmd.'):
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   385
            cmd = cmd[4:]
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   386
            if not path:
23150
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
   387
                path = util.findexe(cmd)
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
   388
                if path is None:
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
   389
                    path = filemerge.findexternaltool(ui, cmd) or cmd
34777
bb2525871d95 configitems: register the 'exdiff.opts.*' config
Boris Feld <boris.feld@octobus.net>
parents: 32431
diff changeset
   390
            diffopts = ui.config('extdiff', 'opts.' + cmd)
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   391
            cmdline = util.shellquote(path)
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   392
            if diffopts:
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   393
                cmdline += ' ' + diffopts
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   394
        elif cmd.startswith('opts.'):
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   395
            continue
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   396
        else:
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   397
            if path:
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   398
                # case "cmd = path opts"
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   399
                cmdline = path
30678
caf7e1c5efe4 py3: have a bytes version of shlex.split()
Pulkit Goyal <7895pulkit@gmail.com>
parents: 29841
diff changeset
   400
                diffopts = len(pycompat.shlexsplit(cmdline)) > 1
5245
a1efa71f3ece Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents: 5147
diff changeset
   401
            else:
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   402
                # case "cmd ="
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   403
                path = util.findexe(cmd)
23150
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
   404
                if path is None:
aff73c777b0b extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents: 23149
diff changeset
   405
                    path = filemerge.findexternaltool(ui, cmd) or cmd
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   406
                cmdline = util.shellquote(path)
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   407
                diffopts = False
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
   408
        # look for diff arguments in [diff-tools] then [merge-tools]
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   409
        if not diffopts:
11184
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
   410
            args = ui.config('diff-tools', cmd+'.diffargs') or \
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
   411
                   ui.config('merge-tools', cmd+'.diffargs')
7d99edddbaea extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents: 10394
diff changeset
   412
            if args:
23680
4075f2f8ea53 extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 23270
diff changeset
   413
                cmdline += ' ' + args
27681
174069440929 extdiff: use @command decorator to set up diff commands
Yuya Nishihara <yuya@tcha.org>
parents: 27680
diff changeset
   414
        command(cmd, extdiffopts[:], _('hg %s [OPTION]... [FILE]...') % cmd,
29721
479076db51be extdiff: refactor closure of saved diff command as a top-level class
Yuya Nishihara <yuya@tcha.org>
parents: 29630
diff changeset
   415
                inferrepo=True)(savedcmd(path, cmdline))
29722
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
   416
14c3afcb1c26 extdiff: export __doc__ of saved command for translation
Yuya Nishihara <yuya@tcha.org>
parents: 29721
diff changeset
   417
# 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
   418
i18nfunctions = [savedcmd]