Mercurial > hg
annotate hgext/extdiff.py @ 26417:9a466b9f9792 stable 3.5.2
largefiles: restore archiving largefiles with hgweb (issue4859)
This regressed in 7699d3212994, when trying to conditionally disable archiving
of largefiles.
I'm not sure if wrapfunction() is the right way to do this, but it seems to
work. The mysterious issue with lfstatus getting out of sync in the proxy and
the unfiltered view crops up again here. See the referenced cset for more info.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Tue, 29 Sep 2015 23:29:44 -0400 |
parents | 415709a43e54 |
children | 611ba118ebfc |
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 | 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 |
3891 | 63 from mercurial.i18n import _ |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
64 from mercurial.node import short, nullid |
23150
aff73c777b0b
extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents:
23149
diff
changeset
|
65 from mercurial import cmdutil, scmutil, util, commands, encoding, filemerge |
25812
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
66 from mercurial import archival |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
67 import os, shlex, shutil, tempfile, re |
5135
1830bc7676ee
extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents:
4730
diff
changeset
|
68 |
21246
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
69 cmdtable = {} |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
70 command = cmdutil.command(cmdtable) |
25186
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24193
diff
changeset
|
71 # Note for extension authors: ONLY specify testedwith = 'internal' for |
80c5b2666a96
extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents:
24193
diff
changeset
|
72 # 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
|
73 # 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
|
74 # leave the attribute unspecified. |
16743
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16686
diff
changeset
|
75 testedwith = 'internal' |
38caf405d010
hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents:
16686
diff
changeset
|
76 |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
77 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
|
78 '''snapshot files as of some revision |
5c7bc1aece9e
extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents:
7758
diff
changeset
|
79 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
|
80 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
|
81 dirname = os.path.basename(repo.root) |
1830bc7676ee
extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents:
4730
diff
changeset
|
82 if dirname == "": |
1830bc7676ee
extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents:
4730
diff
changeset
|
83 dirname = "root" |
8064
5c7bc1aece9e
extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents:
7758
diff
changeset
|
84 if node is not None: |
5c7bc1aece9e
extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents:
7758
diff
changeset
|
85 dirname = '%s.%s' % (dirname, short(node)) |
5135
1830bc7676ee
extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents:
4730
diff
changeset
|
86 base = os.path.join(tmproot, dirname) |
1830bc7676ee
extdiff: un-nested two functions
Brad Schick <schickb@gmail.com>
parents:
4730
diff
changeset
|
87 os.mkdir(base) |
25812
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
88 fns_and_mtime = [] |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
89 |
8064
5c7bc1aece9e
extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents:
7758
diff
changeset
|
90 if node is not None: |
5c7bc1aece9e
extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents:
7758
diff
changeset
|
91 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
|
92 (len(files), short(node))) |
5c7bc1aece9e
extdiff: merge node and working dir snapshot modes
Patrick Mezard <pmezard@gmail.com>
parents:
7758
diff
changeset
|
93 else: |
8066 | 94 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
|
95 (len(files))) |
25812
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
96 |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
97 if files: |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
98 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
|
99 |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
100 archival.archive(repo, base, node, 'files', |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
101 matchfn=scmutil.matchfiles(repo, files), |
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
102 subrepos=listsubrepos) |
25812
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
103 |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
104 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
|
105 wfn = util.pconvert(fn) |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
106 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
|
107 |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
108 if node is None: |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
109 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
|
110 |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
111 fns_and_mtime.append((dest, repo.wjoin(fn), |
68822b7cdd01
extdiff: use archiver to take snapshots of committed revisions
Matt Harbison <matt_harbison@yahoo.com>
parents:
25186
diff
changeset
|
112 os.lstat(dest).st_mtime)) |
6103
e668fd796b8b
Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents:
5293
diff
changeset
|
113 return dirname, fns_and_mtime |
5143
d4fa6bafc43a
Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5137
diff
changeset
|
114 |
23681
9476cb62298e
extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23680
diff
changeset
|
115 def dodiff(ui, repo, cmdline, pats, opts): |
17424
e7cfe3587ea4
fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents:
16743
diff
changeset
|
116 '''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
|
117 |
e668fd796b8b
Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents:
5293
diff
changeset
|
118 - 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
|
119 - 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
|
120 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
|
121 - 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
|
122 ''' |
7758
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
123 |
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
124 revs = opts.get('rev') |
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
125 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
|
126 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
|
127 |
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
128 if revs and change: |
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
129 msg = _('cannot specify --rev and --change at the same time') |
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
130 raise util.Abort(msg) |
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
131 elif change: |
14319
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14232
diff
changeset
|
132 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
|
133 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
|
134 else: |
14319
b33f3e35efb0
scmutil: move revsingle/pair/range from cmdutil
Matt Mackall <mpm@selenic.com>
parents:
14232
diff
changeset
|
135 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
|
136 if not revs: |
13878
a8d13ee0ce68
misc: replace .parents()[0] with p1()
Matt Mackall <mpm@selenic.com>
parents:
13758
diff
changeset
|
137 node1b = repo.dirstate.p2() |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
138 else: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
139 node1b = nullid |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
140 |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
141 # 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
|
142 if do3way: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
143 if node1b == nullid: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
144 do3way = False |
7758
e81e6c996e99
extdiff: add --change option to display single changeset diff
Gilles Moris <gilles.moris@free.fr>
parents:
7599
diff
changeset
|
145 |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
146 subrepos=opts.get('subrepos') |
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
147 |
14671
35c2cc322ba8
scmutil: switch match users to supplying contexts
Matt Mackall <mpm@selenic.com>
parents:
14327
diff
changeset
|
148 matcher = scmutil.match(repo[node2], pats, opts) |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
149 mod_a, add_a, rem_a = map(set, repo.status(node1a, node2, matcher, |
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
150 listsubrepos=subrepos)[:3]) |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
151 if do3way: |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
152 mod_b, add_b, rem_b = map(set, repo.status(node1b, node2, matcher, |
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
153 listsubrepos=subrepos)[:3]) |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
154 else: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
155 mod_b, add_b, rem_b = set(), set(), set() |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
156 modadd = mod_a | add_a | mod_b | add_b |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
157 common = modadd | rem_a | rem_b |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
158 if not common: |
10394
4612cded5176
fix coding style (reported by pylint)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
10282
diff
changeset
|
159 return 0 |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
160 |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
161 tmproot = tempfile.mkdtemp(prefix='extdiff.') |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
162 try: |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
163 # Always make a copy of node1a (and node1b, if applicable) |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
164 dir1a_files = mod_a | rem_a | ((mod_b | add_b) - add_a) |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
165 dir1a = snapshot(ui, repo, dir1a_files, node1a, tmproot, subrepos)[0] |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
166 rev1a = '@%d' % repo[node1a].rev() |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
167 if do3way: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
168 dir1b_files = mod_b | rem_b | ((mod_a | add_a) - add_b) |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
169 dir1b = snapshot(ui, repo, dir1b_files, node1b, tmproot, |
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
170 subrepos)[0] |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
171 rev1b = '@%d' % repo[node1b].rev() |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
172 else: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
173 dir1b = None |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
174 rev1b = '' |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
175 |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
176 fns_and_mtime = [] |
5137
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
177 |
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
178 # If node2 in not the wc or there is >1 change, copy it |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
179 dir2root = '' |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
180 rev2 = '' |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
181 if node2: |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
182 dir2 = snapshot(ui, repo, modadd, node2, tmproot, subrepos)[0] |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
183 rev2 = '@%d' % repo[node2].rev() |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
184 elif len(common) > 1: |
9945
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
185 #we only actually need to get the files to copy back to |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
186 #the working dir in this case (because the other cases |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
187 #are: diffing 2 revisions or single file -- in which case |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
188 #the file is already directly passed to the diff tool). |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
189 dir2, fns_and_mtime = snapshot(ui, repo, modadd, None, tmproot, |
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
190 subrepos) |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
191 else: |
5137
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
192 # This lets the diff tool open the changed file directly |
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
193 dir2 = '' |
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
194 dir2root = repo.root |
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
195 |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
196 label1a = rev1a |
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
197 label1b = rev1b |
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
198 label2 = rev2 |
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
199 |
5137
2be225ea5722
extdiff: do single file diffs from the wc with no copy
Brad Schick <schickb@gmail.com>
parents:
5136
diff
changeset
|
200 # If only one change, diff the files instead of the directories |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
201 # Handle bogus modifies correctly by checking if the files exist |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
202 if len(common) == 1: |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
203 common_file = util.localpath(common.pop()) |
13758
5c0e1222e7c0
extdiff: use absolute paths for any temporary files
jfh <jason@jasonfharris.com>
parents:
13660
diff
changeset
|
204 dir1a = os.path.join(tmproot, dir1a, common_file) |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
205 label1a = common_file + rev1a |
13758
5c0e1222e7c0
extdiff: use absolute paths for any temporary files
jfh <jason@jasonfharris.com>
parents:
13660
diff
changeset
|
206 if not os.path.isfile(dir1a): |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
207 dir1a = os.devnull |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
208 if do3way: |
13758
5c0e1222e7c0
extdiff: use absolute paths for any temporary files
jfh <jason@jasonfharris.com>
parents:
13660
diff
changeset
|
209 dir1b = os.path.join(tmproot, dir1b, common_file) |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
210 label1b = common_file + rev1b |
13758
5c0e1222e7c0
extdiff: use absolute paths for any temporary files
jfh <jason@jasonfharris.com>
parents:
13660
diff
changeset
|
211 if not os.path.isfile(dir1b): |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
212 dir1b = os.devnull |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
213 dir2 = os.path.join(dir2root, dir2, common_file) |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
214 label2 = common_file + rev2 |
5143
d4fa6bafc43a
Remove trailing spaces, fix indentation
Thomas Arendsen Hein <thomas@intevation.de>
parents:
5137
diff
changeset
|
215 |
9945
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
216 # 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
|
217 # 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
|
218 # returned for parent2 |
20674
2aafd5854243
extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
17773
diff
changeset
|
219 replace = {'parent': dir1a, 'parent1': dir1a, 'parent2': dir1b, |
2aafd5854243
extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
17773
diff
changeset
|
220 'plabel1': label1a, 'plabel2': label1b, |
2aafd5854243
extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
17773
diff
changeset
|
221 'clabel': label2, 'child': dir2, |
2aafd5854243
extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
17773
diff
changeset
|
222 'root': repo.root} |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
223 def quote(match): |
23969
01e5b7323a48
extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents:
23681
diff
changeset
|
224 pre = match.group(2) |
01e5b7323a48
extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents:
23681
diff
changeset
|
225 key = match.group(3) |
9512
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
226 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
|
227 return pre |
01e5b7323a48
extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents:
23681
diff
changeset
|
228 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
|
229 |
e7bde4680eec
extdiff: add 3-way diff for merge changesets
Sune Foldager <cryo@cyanite.org>
parents:
9467
diff
changeset
|
230 # Match parent2 first, so 'parent1?' will match both parent1 and parent |
23969
01e5b7323a48
extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents:
23681
diff
changeset
|
231 regex = (r'''(['"]?)([^\s'"$]*)''' |
01e5b7323a48
extdiff: reintroduce backward compatibility with manual quoting of parameters
Mads Kiilerich <madski@unity3d.com>
parents:
23681
diff
changeset
|
232 r'\$(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
|
233 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
|
234 cmdline += ' $parent1 $child' |
9476cb62298e
extdiff: rename the name of an argument for readability
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23680
diff
changeset
|
235 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
|
236 |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9286
diff
changeset
|
237 ui.debug('running %r in %s\n' % (cmdline, tmproot)) |
23270
41c03b7592ed
util.system: use ui.system() in place of optional ui.fout parameter
Yuya Nishihara <yuya@tcha.org>
parents:
23152
diff
changeset
|
238 ui.system(cmdline, cwd=tmproot) |
6103
e668fd796b8b
Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents:
5293
diff
changeset
|
239 |
e668fd796b8b
Propagating changes back to working dirs when changing files in external
Fabio Zadrozny <fabiofz at gmail dot com>
parents:
5293
diff
changeset
|
240 for copy_fn, working_fn, mtime in fns_and_mtime: |
14021
3eb632d9cf42
extdiff: fix broken symlinks handling (issue1909)
Patrick Mezard <pmezard@gmail.com>
parents:
11321
diff
changeset
|
241 if os.lstat(copy_fn).st_mtime != mtime: |
9467
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9286
diff
changeset
|
242 ui.debug('file changed while diffing. ' |
4c041f1ee1b4
do not attempt to translate ui.debug output
Martin Geisler <mg@lazybytes.net>
parents:
9286
diff
changeset
|
243 '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
|
244 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
|
245 |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
246 return 1 |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
247 finally: |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
248 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
|
249 shutil.rmtree(tmproot) |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
250 |
21246
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
251 @command('extdiff', |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
252 [('p', 'program', '', |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
253 _('comparison program to run'), _('CMD')), |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
254 ('o', 'option', [], |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
255 _('pass option to comparison program'), _('OPT')), |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
256 ('r', 'rev', [], _('revision'), _('REV')), |
29eeaa6d662f
extdiff: declare command using decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
20674
diff
changeset
|
257 ('c', 'change', '', _('change made by revision'), _('REV')), |
25813
18bae5eb58c5
extdiff: add support for subrepos
Matt Harbison <matt_harbison@yahoo.com>
parents:
25812
diff
changeset
|
258 ] + commands.walkopts + commands.subrepoopts, |
21781
f0c3b95af47f
extdiff: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21246
diff
changeset
|
259 _('hg extdiff [OPT]... [FILE]...'), |
f0c3b95af47f
extdiff: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21246
diff
changeset
|
260 inferrepo=True) |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
261 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
|
262 '''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
|
263 |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
264 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
|
265 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
|
266 default options "-Npru". |
453097750fbf
extdiff: fix bugs. add test.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
2903
diff
changeset
|
267 |
8076
5ec526c1a32f
help texts: write command line switches as -a/--abc
Martin Geisler <mg@lazybytes.net>
parents:
8066
diff
changeset
|
268 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
|
269 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
|
270 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
|
271 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
|
272 |
7990
cdb848e8c4b5
extdiff: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents:
7983
diff
changeset
|
273 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
|
274 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
|
275 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
|
276 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
|
277 to its parent.''' |
9519
0d3c1aa9d5de
extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
8934
diff
changeset
|
278 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
|
279 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
|
280 if not program: |
0d3c1aa9d5de
extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
8934
diff
changeset
|
281 program = 'diff' |
0d3c1aa9d5de
extdiff: fix defaulting to "diff" if no --program is given
Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
parents:
8934
diff
changeset
|
282 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
|
283 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
|
284 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
|
285 |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
286 def uisetup(ui): |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
287 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
|
288 path = util.expandpath(path) |
5245
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
289 if cmd.startswith('cmd.'): |
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
290 cmd = cmd[4:] |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10264
diff
changeset
|
291 if not path: |
23150
aff73c777b0b
extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents:
23149
diff
changeset
|
292 path = util.findexe(cmd) |
aff73c777b0b
extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents:
23149
diff
changeset
|
293 if path is None: |
aff73c777b0b
extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents:
23149
diff
changeset
|
294 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
|
295 diffopts = ui.config('extdiff', 'opts.' + cmd, '') |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
296 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
|
297 if diffopts: |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
298 cmdline += ' ' + diffopts |
5245
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
299 elif cmd.startswith('opts.'): |
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
300 continue |
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
301 else: |
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
302 if path: |
23680
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
303 # 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
|
304 cmdline = path |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
305 diffopts = len(shlex.split(cmdline)) > 1 |
5245
a1efa71f3ece
Improve extdiff configuration.
Brendan Cully <brendan@kublai.com>
parents:
5147
diff
changeset
|
306 else: |
23680
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
307 # case "cmd =" |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
308 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
|
309 if path is None: |
aff73c777b0b
extdiff: allow a preconfigured merge-tool to be invoked
Matt Harbison <matt_harbison@yahoo.com>
parents:
23149
diff
changeset
|
310 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
|
311 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
|
312 diffopts = False |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
313 # 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
|
314 if not diffopts: |
11184
7d99edddbaea
extdiff: add labels, read diff arguments from [merge-tools]
Steve Borho <steve@borho.org>
parents:
10394
diff
changeset
|
315 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
|
316 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
|
317 if args: |
23680
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
318 cmdline += ' ' + args |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
319 def save(cmdline): |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
320 '''use closure to save diff command to use''' |
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
321 def mydiff(ui, repo, *pats, **opts): |
23680
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
322 options = ' '.join(map(util.shellquote, opts['option'])) |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
323 if options: |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
324 options = ' ' + options |
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
325 return dodiff(ui, repo, cmdline + options, pats, opts) |
9941
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
326 doc = _('''\ |
9050
77324df822e2
extdiff: fix indentation and use gettext
Martin Geisler <mg@lazybytes.net>
parents:
8934
diff
changeset
|
327 use %(path)s 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
|
328 |
9945
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
329 Show differences between revisions for the specified files, using |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
330 the %(path)s program. |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
331 |
9945
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
332 When two revision arguments are given, then changes are shown |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
333 between those revisions. If only one revision is specified then |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
334 that revision is compared to the working directory, and, when no |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
335 revisions are specified, the working directory files are compared |
5e4ef56b4d42
extdiff: wrap long lines in docstring and comments
Martin Geisler <mg@lazybytes.net>
parents:
9941
diff
changeset
|
336 to its parent.\ |
20674
2aafd5854243
extdiff: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents:
17773
diff
changeset
|
337 ''') % {'path': util.uirepr(path)} |
9941
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
338 |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
339 # We must translate the docstring right away since it is |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
340 # used as a format string. The string will unfortunately |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
341 # be translated again in commands.helpcmd and this will |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
342 # fail when the docstring contains non-ASCII characters. |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
343 # Decoding the string to a Unicode string here (using the |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
344 # right encoding) prevents that. |
11d7ee94b56a
extdiff: prevent exception on double-translation
Martin Geisler <mg@lazybytes.net>
parents:
9523
diff
changeset
|
345 mydiff.__doc__ = doc.decode(encoding.encoding) |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
346 return mydiff |
23680
4075f2f8ea53
extdiff: avoid unexpected quoting arguments for external tools (issue4463)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
23270
diff
changeset
|
347 cmdtable[cmd] = (save(cmdline), |
2333
de0c05afa511
new extension: extdiff. allows to use external diff program.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents:
diff
changeset
|
348 cmdtable['extdiff'][1][1:], |
4730
eadfaa9ec487
Updated command tables in commands.py and hgext extensions.
Thomas Arendsen Hein <thomas@intevation.de>
parents:
4096
diff
changeset
|
349 _('hg %s [OPTION]... [FILE]...') % cmd) |