2 # |
2 # |
3 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
3 # Copyright 2006 Vadim Gelfer <vadim.gelfer@gmail.com> |
4 # |
4 # |
5 # This software may be used and distributed according to the terms |
5 # This software may be used and distributed according to the terms |
6 # of the GNU General Public License, incorporated herein by reference. |
6 # of the GNU General Public License, incorporated herein by reference. |
7 # |
7 |
8 # The `extdiff' Mercurial extension allows you to use external programs |
8 ''' |
9 # to compare revisions, or revision with working dir. The external diff |
9 The `extdiff' Mercurial extension allows you to use external programs |
10 # programs are called with a configurable set of options and two |
10 to compare revisions, or revision with working dir. The external diff |
11 # non-option arguments: paths to directories containing snapshots of |
11 programs are called with a configurable set of options and two |
12 # files to compare. |
12 non-option arguments: paths to directories containing snapshots of |
13 # |
13 files to compare. |
14 # To enable this extension: |
14 |
15 # |
15 To enable this extension: |
16 # [extensions] |
16 |
17 # hgext.extdiff = |
17 [extensions] |
18 # |
18 hgext.extdiff = |
19 # The `extdiff' extension also allows to configure new diff commands, so |
19 |
20 # you do not need to type "hg extdiff -p kdiff3" always. |
20 The `extdiff' extension also allows to configure new diff commands, so |
21 # |
21 you do not need to type "hg extdiff -p kdiff3" always. |
22 # [extdiff] |
22 |
23 # # add new command that runs GNU diff(1) in 'context diff' mode |
23 [extdiff] |
24 # cmd.cdiff = gdiff |
24 # add new command that runs GNU diff(1) in 'context diff' mode |
25 # opts.cdiff = -Nprc5 |
25 cdiff = gdiff -Nprc5 |
26 |
26 ## or the old way: |
27 # # add new command called vdiff, runs kdiff3 |
27 #cmd.cdiff = gdiff |
28 # cmd.vdiff = kdiff3 |
28 #opts.cdiff = -Nprc5 |
29 |
29 |
30 # # add new command called meld, runs meld (no need to name twice) |
30 # add new command called vdiff, runs kdiff3 |
31 # cmd.meld = |
31 vdiff = kdiff3 |
32 |
32 |
33 # # add new command called vimdiff, runs gvimdiff with DirDiff plugin |
33 # add new command called meld, runs meld (no need to name twice) |
34 # #(see http://www.vim.org/scripts/script.php?script_id=102) |
34 meld = |
35 # # Non english user, be sure to put "let g:DirDiffDynamicDiffText = 1" in |
35 |
36 # # your .vimrc |
36 # add new command called vimdiff, runs gvimdiff with DirDiff plugin |
37 # cmd.vimdiff = gvim |
37 #(see http://www.vim.org/scripts/script.php?script_id=102) |
38 # opts.vimdiff = -f '+next' '+execute "DirDiff" argv(0) argv(1)' |
38 # Non english user, be sure to put "let g:DirDiffDynamicDiffText = 1" in |
39 # |
39 # your .vimrc |
40 # Each custom diff commands can have two parts: a `cmd' and an `opts' |
40 vimdiff = gvim -f '+next' '+execute "DirDiff" argv(0) argv(1)' |
41 # part. The cmd.xxx option defines the name of an executable program |
41 |
42 # that will be run, and opts.xxx defines a set of command-line options |
42 You can use -I/-X and list of file or directory names like normal |
43 # which will be inserted to the command between the program name and |
43 "hg diff" command. The `extdiff' extension makes snapshots of only |
44 # the files/directories to diff (i.e. the cdiff example above). |
44 needed files, so running the external diff program will actually be |
45 # |
45 pretty fast (at least faster than having to compare the entire tree). |
46 # You can use -I/-X and list of file or directory names like normal |
46 ''' |
47 # "hg diff" command. The `extdiff' extension makes snapshots of only |
|
48 # needed files, so running the external diff program will actually be |
|
49 # pretty fast (at least faster than having to compare the entire tree). |
|
50 |
47 |
51 from mercurial.i18n import _ |
48 from mercurial.i18n import _ |
52 from mercurial.node import * |
49 from mercurial.node import * |
53 from mercurial import cmdutil, util, commands |
50 from mercurial import cmdutil, util, commands |
54 import os, shutil, tempfile |
51 import os, shlex, shutil, tempfile |
55 |
|
56 |
52 |
57 def snapshot_node(ui, repo, files, node, tmproot): |
53 def snapshot_node(ui, repo, files, node, tmproot): |
58 '''snapshot files as of some revision''' |
54 '''snapshot files as of some revision''' |
59 mf = repo.changectx(node).manifest() |
55 mf = repo.changectx(node).manifest() |
60 dirname = os.path.basename(repo.root) |
56 dirname = os.path.basename(repo.root) |
185 _('hg extdiff [OPT]... [FILE]...')), |
181 _('hg extdiff [OPT]... [FILE]...')), |
186 } |
182 } |
187 |
183 |
188 def uisetup(ui): |
184 def uisetup(ui): |
189 for cmd, path in ui.configitems('extdiff'): |
185 for cmd, path in ui.configitems('extdiff'): |
190 if not cmd.startswith('cmd.'): continue |
186 if cmd.startswith('cmd.'): |
191 cmd = cmd[4:] |
187 cmd = cmd[4:] |
192 if not path: path = cmd |
188 if not path: path = cmd |
193 diffopts = ui.config('extdiff', 'opts.' + cmd, '') |
189 diffopts = ui.config('extdiff', 'opts.' + cmd, '') |
194 diffopts = diffopts and [diffopts] or [] |
190 diffopts = diffopts and [diffopts] or [] |
|
191 elif cmd.startswith('opts.'): |
|
192 continue |
|
193 else: |
|
194 # command = path opts |
|
195 if path: |
|
196 diffopts = shlex.split(path) |
|
197 path = diffopts.pop(0) |
|
198 else: |
|
199 path, diffopts = cmd, [] |
195 def save(cmd, path, diffopts): |
200 def save(cmd, path, diffopts): |
196 '''use closure to save diff command to use''' |
201 '''use closure to save diff command to use''' |
197 def mydiff(ui, repo, *pats, **opts): |
202 def mydiff(ui, repo, *pats, **opts): |
198 return dodiff(ui, repo, path, diffopts, pats, opts) |
203 return dodiff(ui, repo, path, diffopts, pats, opts) |
199 mydiff.__doc__ = '''use %(path)r to diff repository (or selected files) |
204 mydiff.__doc__ = '''use %(path)r to diff repository (or selected files) |