annotate hgext/keyword.py @ 23877:7cc77030c557

localrepo: remove all external users of localrepo.opener This change touches every module in which repository.opener was being used, and changes it for the equivalent repository.vfs. This is meant to make it easier to split the repository.vfs into several separate vfs. It should now be possible to remove localrepo.opener.
author Angel Ezquerra <angel.ezquerra@gmail.com>
date Thu, 15 Jan 2015 23:17:12 +0100
parents fd62b3e750af
children 37a92908a382
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
1 # keyword.py - $Keyword$ expansion for Mercurial
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
2 #
23723
fd62b3e750af keyword: update copyright year
Christian Ebert <blacktrash@gmx.net>
parents: 23722
diff changeset
3 # Copyright 2007-2015 Christian Ebert <blacktrash@gmx.net>
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
4 #
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
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: 10117
diff changeset
6 # GNU General Public License version 2 or any later version.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
7 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
8 # $Id$
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
9 #
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17057
diff changeset
10 # Keyword expansion hack against the grain of a Distributed SCM
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
11 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
12 # There are many good reasons why this is not needed in a distributed
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
13 # SCM, still it may be useful in very small projects based on single
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
14 # files (like LaTeX packages), that are mostly addressed to an
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
15 # audience not running a version control system.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
16 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
17 # For in-depth discussion refer to
8936
1de6e7e1bb9f change wiki/bts URLs to point to new hostname
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
18 # <http://mercurial.selenic.com/wiki/KeywordPlan>.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
19 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
20 # Keyword expansion is based on Mercurial's changeset template mappings.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
21 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
22 # Binary files are not touched.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
23 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
24 # Files to act upon/ignore are specified in the [keyword] section.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
25 # Customized keyword template mappings in the [keywordmaps] section.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
26 #
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
27 # Run "hg help keyword" and "hg kwdemo" to get info on configuration.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
28
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8866
diff changeset
29 '''expand keywords in tracked files
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
30
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
31 This extension expands RCS/CVS-like or self-customized $Keywords$ in
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
32 tracked text files selected by your configuration.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
33
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
34 Keywords are only expanded in local repositories and not stored in the
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
35 change history. The mechanism can be regarded as a convenience for the
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
36 current user or for archive distribution.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
37
12203
0f6164806283 keyword: explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 11678
diff changeset
38 Keywords expand to the changeset data pertaining to the latest change
0f6164806283 keyword: explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 11678
diff changeset
39 relative to the working directory parent of each file.
0f6164806283 keyword: explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 11678
diff changeset
40
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
41 Configuration is done in the [keyword], [keywordset] and [keywordmaps]
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
42 sections of hgrc files.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
43
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9106
diff changeset
44 Example::
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
45
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
46 [keyword]
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
47 # expand keywords in every python file except those matching "x*"
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
48 **.py =
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
49 x* = ignore
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
50
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
51 [keywordset]
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
52 # prefer svn- over cvs-like default keywordmaps
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
53 svn = True
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
54
12390
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
55 .. note::
19997
de16c673455b documentation: add an extra newline after note directive
Simon Heimberg <simohe@besonet.ch>
parents: 18825
diff changeset
56
12390
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
57 The more specific you are in your filename patterns the less you
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
58 lose speed in huge repositories.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
59
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
60 For [keywordmaps] template mapping and expansion demonstration and
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
61 control run :hg:`kwdemo`. See :hg:`help templates` for a list of
9307
2715506d54e4 keyword: reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 9305
diff changeset
62 available templates and filters.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
63
13885
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
64 Three additional date template filters are provided:
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
65
13885
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
66 :``utcdate``: "2006/09/18 15:13:13"
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
67 :``svnutcdate``: "2006-09-18 15:13:13Z"
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
68 :``svnisodate``: "2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)"
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
69
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
70 The default template mappings (view with :hg:`kwdemo -d`) can be
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
71 replaced with customized keywords and templates. Again, run
13025
99210fb3bc0a keyword: s/config/configuration/ in help
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
72 :hg:`kwdemo` to control the results of your configuration changes.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
73
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
74 Before changing/disabling active keywords, you must run :hg:`kwshrink`
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
75 to avoid storing expanded keywords in the change history.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
76
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
77 To force expansion after enabling it, or a configuration change, run
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
78 :hg:`kwexpand`.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
79
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
80 Expansions spanning more than one line and incremental expansions,
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
81 like CVS' $Log$, are not supported. A keyword template map "Log =
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
82 {desc}" expands to the first line of the changeset description.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
83 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
84
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
85 from mercurial import commands, context, cmdutil, dispatch, filelog, extensions
12628
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
86 from mercurial import localrepo, match, patch, templatefilters, templater, util
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19997
diff changeset
87 from mercurial import scmutil, pathutil
6072
e521ec1ad985 keyword: no expansion in web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 6071
diff changeset
88 from mercurial.hgweb import webcommands
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
89 from mercurial.i18n import _
21981
897bee697d51 keyword: really clean up kwdemo temp tree
Christian Ebert <blacktrash@gmx.net>
parents: 21784
diff changeset
90 import os, re, tempfile
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
91
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
92 cmdtable = {}
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
93 command = cmdutil.command(cmdtable)
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16741
diff changeset
94 testedwith = 'internal'
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
95
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
96 # hg commands that do not act on keywords
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
97 nokwcommands = ('add addremove annotate bundle export grep incoming init log'
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
98 ' outgoing push tip verify convert email glog')
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
99
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
100 # hg commands that trigger expansion only when writing to working dir,
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
101 # not when reading filelog, and unexpand when reading from working dir
21703
99f7e5fe35f2 keyword: suppress keyword expansion while 'hg unshelve' for internal merge
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20790
diff changeset
102 restricted = ('merge kwexpand kwshrink record qrecord resolve transplant'
21708
2668a78df8ba keyword: suppress keyword expansion while 'hg fetch' for internal merge
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21707
diff changeset
103 ' unshelve rebase graft backout histedit fetch')
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
104
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
105 # names of extensions using dorecord
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
106 recordextensions = 'record'
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
107
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
108 colortable = {
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
109 'kwfiles.enabled': 'green bold',
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
110 'kwfiles.deleted': 'cyan bold underline',
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
111 'kwfiles.enabledunknown': 'green',
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
112 'kwfiles.ignored': 'bold',
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
113 'kwfiles.ignoredunknown': 'none'
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
114 }
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
115
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
116 # date like in cvs' $Date
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
117 def utcdate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
118 ''':utcdate: Date. Returns a UTC-date in this format: "2009/08/18 11:00:13".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
119 '''
17755
bededd3f0735 templatefilters: avoid traceback caused by bogus date input (issue3344)
Christian Ebert <blacktrash@gmx.net>
parents: 17424
diff changeset
120 return util.datestr((util.parsedate(text)[0], 0), '%Y/%m/%d %H:%M:%S')
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
121 # date like in svn's $Date
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
122 def svnisodate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
123 ''':svnisodate: Date. Returns a date in this format: "2009-08-18 13:00:13
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
124 +0200 (Tue, 18 Aug 2009)".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
125 '''
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
126 return util.datestr(text, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
127 # date like in svn's $Id
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
128 def svnutcdate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
129 ''':svnutcdate: Date. Returns a UTC-date in this format: "2009-08-18
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
130 11:00:13Z".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
131 '''
17755
bededd3f0735 templatefilters: avoid traceback caused by bogus date input (issue3344)
Christian Ebert <blacktrash@gmx.net>
parents: 17424
diff changeset
132 return util.datestr((util.parsedate(text)[0], 0), '%Y-%m-%d %H:%M:%SZ')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
133
13634
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
134 templatefilters.filters.update({'utcdate': utcdate,
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
135 'svnisodate': svnisodate,
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
136 'svnutcdate': svnutcdate})
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
137
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
138 # make keyword tools accessible
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
139 kwtools = {'templater': None, 'hgcmd': ''}
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
140
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
141 def _defaultkwmaps(ui):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
142 '''Returns default keywordmaps according to keywordset configuration.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
143 templates = {
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
144 'Revision': '{node|short}',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
145 'Author': '{author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
146 }
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
147 kwsets = ({
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
148 'Date': '{date|utcdate}',
9943
f8d779791161 keyword: the CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 9942
diff changeset
149 'RCSfile': '{file|basename},v',
9950
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
150 'RCSFile': '{file|basename},v', # kept for backwards compatibility
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
151 # with hg-keyword
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
152 'Source': '{root}/{file},v',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
153 'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
154 'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
155 }, {
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
156 'Date': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
157 'Id': '{file|basename},v {node|short} {date|svnutcdate} {author|user}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
158 'LastChangedRevision': '{node|short}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
159 'LastChangedBy': '{author|user}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
160 'LastChangedDate': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
161 })
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
162 templates.update(kwsets[ui.configbool('keywordset', 'svn')])
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
163 return templates
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
164
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
165 def _shrinktext(text, subfunc):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
166 '''Helper for keyword expansion removal in text.
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
167 Depending on subfunc also returns number of substitutions.'''
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
168 return subfunc(r'$\1$', text)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
169
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
170 def _preselect(wstatus, changed):
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17057
diff changeset
171 '''Retrieves modified and added files from a working directory state
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
172 and returns the subset of each contained in given changed files
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
173 retrieved from a change context.'''
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
174 modified = [f for f in wstatus.modified if f in changed]
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
175 added = [f for f in wstatus.added if f in changed]
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
176 return modified, added
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
177
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
178
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
179 class kwtemplater(object):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
180 '''
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
181 Sets up keyword templates, corresponding keyword regex, and
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
182 provides keyword substitution functions.
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
183 '''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
184
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
185 def __init__(self, ui, repo, inc, exc):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
186 self.ui = ui
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
187 self.repo = repo
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
188 self.match = match.match(repo.root, '', [], inc, exc)
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
189 self.restrict = kwtools['hgcmd'] in restricted.split()
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
190 self.postcommit = False
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
191
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
192 kwmaps = self.ui.configitems('keywordmaps')
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
193 if kwmaps: # override default templates
9081
d8e8447a4b7b keyword: collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 9066
diff changeset
194 self.templates = dict((k, templater.parsestring(v, False))
d8e8447a4b7b keyword: collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 9066
diff changeset
195 for k, v in kwmaps)
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
196 else:
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
197 self.templates = _defaultkwmaps(self.ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
198
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
199 @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
200 def escape(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
201 '''Returns bar-separated and escaped keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
202 return '|'.join(map(re.escape, self.templates.keys()))
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
203
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
204 @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
205 def rekw(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
206 '''Returns regex for unexpanded keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
207 return re.compile(r'\$(%s)\$' % self.escape)
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
208
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
209 @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
210 def rekwexp(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
211 '''Returns regex for expanded keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
212 return re.compile(r'\$(%s): [^$\n\r]*? \$' % self.escape)
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
213
7375
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
214 def substitute(self, data, path, ctx, subfunc):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
215 '''Replaces keywords in data with expanded template.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
216 def kwsub(mobj):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
217 kw = mobj.group(1)
20668
3a35ba2681ec templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents: 20667
diff changeset
218 ct = cmdutil.changeset_templater(self.ui, self.repo, False, None,
20667
e96e9f805c19 changeset_templater: remove use_template method
Matt Mackall <mpm@selenic.com>
parents: 20240
diff changeset
219 self.templates[kw], '', False)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
220 self.ui.pushbuffer()
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
221 ct.show(ctx, root=self.repo.root, file=path)
6023
ee7df90d1daa keyword: split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 6022
diff changeset
222 ekw = templatefilters.firstline(self.ui.popbuffer())
ee7df90d1daa keyword: split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 6022
diff changeset
223 return '$%s: %s $' % (kw, ekw)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
224 return subfunc(kwsub, data)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
225
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
226 def linkctx(self, path, fileid):
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
227 '''Similar to filelog.linkrev, but returns a changectx.'''
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
228 return self.repo.filectx(path, fileid=fileid).changectx()
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
229
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
230 def expand(self, path, node, data):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
231 '''Returns data with keywords expanded.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
232 if not self.restrict and self.match(path) and not util.binary(data):
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
233 ctx = self.linkctx(path, node)
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
234 return self.substitute(data, path, ctx, self.rekw.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
235 return data
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
236
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
237 def iskwfile(self, cand, ctx):
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
238 '''Returns subset of candidates which are configured for keyword
15324
0890842c41d1 keyword: correct grammar in iskwfile docstring
Christian Ebert <blacktrash@gmx.net>
parents: 15183
diff changeset
239 expansion but are not symbolic links.'''
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 15871
diff changeset
240 return [f for f in cand if self.match(f) and 'l' not in ctx.flags(f)]
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
241
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
242 def overwrite(self, ctx, candidates, lookup, expand, rekw=False):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
243 '''Overwrites selected files expanding/shrinking keywords.'''
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
244 if self.restrict or lookup or self.postcommit: # exclude kw_copy
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
245 candidates = self.iskwfile(candidates, ctx)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
246 if not candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
247 return
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
248 kwcmd = self.restrict and lookup # kwexpand/kwshrink
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
249 if self.restrict or expand and lookup:
11350
5ea28187707e keyword: postpone manifest calculation in kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11321
diff changeset
250 mf = ctx.manifest()
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
251 if self.restrict or rekw:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
252 re_kw = self.rekw
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
253 else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
254 re_kw = self.rekwexp
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
255 if expand:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
256 msg = _('overwriting %s expanding keywords\n')
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
257 else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
258 msg = _('overwriting %s shrinking keywords\n')
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
259 for f in candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
260 if self.restrict:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
261 data = self.repo.file(f).read(mf[f])
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
262 else:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
263 data = self.repo.wread(f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
264 if util.binary(data):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
265 continue
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
266 if expand:
23622
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
267 parents = ctx.parents()
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
268 if lookup:
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
269 ctx = self.linkctx(f, mf[f])
23622
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
270 elif self.restrict and len(parents) > 1:
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
271 # merge commit
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
272 # in case of conflict f is in modified state during
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
273 # merge, even if f does not differ from f in parent
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
274 for p in parents:
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
275 if f in p and not p[f].cmp(ctx[f]):
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
276 ctx = p[f].changectx()
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
277 break
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
278 data, found = self.substitute(data, f, ctx, re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
279 elif self.restrict:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
280 found = re_kw.search(data)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
281 else:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
282 data, found = _shrinktext(data, re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
283 if found:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
284 self.ui.note(msg % f)
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
285 fp = self.repo.wopener(f, "wb", atomictemp=True)
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
286 fp.write(data)
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
287 fp.close()
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
288 if kwcmd:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
289 self.repo.dirstate.normal(f)
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
290 elif self.postcommit:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
291 self.repo.dirstate.normallookup(f)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
292
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
293 def shrink(self, fname, text):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
294 '''Returns text with all keyword substitutions removed.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
295 if self.match(fname) and not util.binary(text):
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
296 return _shrinktext(text, self.rekwexp.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
297 return text
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
298
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
299 def shrinklines(self, fname, lines):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
300 '''Returns lines with keyword substitutions removed.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
301 if self.match(fname):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
302 text = ''.join(lines)
6508
4b2c266bf059 Get rid of reimplementations of util.binary
Bryan O'Sullivan <bos@serpentine.com>
parents: 6506
diff changeset
303 if not util.binary(text):
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
304 return _shrinktext(text, self.rekwexp.sub).splitlines(True)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
305 return lines
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
306
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
307 def wread(self, fname, data):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
308 '''If in restricted mode returns data read from wdir with
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
309 keyword substitutions removed.'''
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
310 if self.restrict:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
311 return self.shrink(fname, data)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
312 return data
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
313
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
314 class kwfilelog(filelog.filelog):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
315 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
316 Subclass of filelog to hook into its read, add, cmp methods.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
317 Keywords are "stored" unexpanded, and processed on reading.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
318 '''
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
319 def __init__(self, opener, kwt, path):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
320 super(kwfilelog, self).__init__(opener, path)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
321 self.kwt = kwt
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
322 self.path = path
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
323
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
324 def read(self, node):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
325 '''Expands keywords when reading filelog.'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
326 data = super(kwfilelog, self).read(node)
12628
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
327 if self.renamed(node):
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
328 return data
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
329 return self.kwt.expand(self.path, node, data)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
330
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
331 def add(self, text, meta, tr, link, p1=None, p2=None):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
332 '''Removes keyword substitutions when adding to filelog.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
333 text = self.kwt.shrink(self.path, text)
6504
1be53f931c9c keyword: compact setting of optional arguments
Christian Ebert <blacktrash@gmx.net>
parents: 6503
diff changeset
334 return super(kwfilelog, self).add(text, meta, tr, link, p1, p2)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
335
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
336 def cmp(self, node, text):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
337 '''Removes keyword substitutions for comparison.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
338 text = self.kwt.shrink(self.path, text)
12628
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
339 return super(kwfilelog, self).cmp(node, text)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
340
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
341 def _status(ui, repo, wctx, kwt, *pats, **opts):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
342 '''Bails out if [keyword] configuration is not active.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
343 Returns status of working directory.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
344 if kwt:
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
345 return repo.status(match=scmutil.match(wctx, pats, opts), clean=True,
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
346 unknown=opts.get('unknown') or opts.get('all'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
347 if ui.configitems('keyword'):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
348 raise util.Abort(_('[keyword] patterns cannot match'))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
349 raise util.Abort(_('no [keyword] patterns configured'))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
350
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
351 def _kwfwrite(ui, repo, expand, *pats, **opts):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
352 '''Selects files and passes them to kwtemplater.overwrite.'''
11320
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
353 wctx = repo[None]
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
354 if len(wctx.parents()) > 1:
6672
6004eedb13f4 keyword: mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 6667
diff changeset
355 raise util.Abort(_('outstanding uncommitted merge'))
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
356 kwt = kwtools['templater']
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
357 wlock = repo.wlock()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
358 try:
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
359 status = _status(ui, repo, wctx, kwt, *pats, **opts)
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
360 if status.modified or status.added or status.removed or status.deleted:
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
361 raise util.Abort(_('outstanding uncommitted changes'))
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
362 kwt.overwrite(wctx, status.clean, True, expand)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
363 finally:
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
364 wlock.release()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
365
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
366 @command('kwdemo',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
367 [('d', 'default', None, _('show default keyword template maps')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
368 ('f', 'rcfile', '',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
369 _('read maps from rcfile'), _('FILE'))],
21776
c4633e287c56 keyword: define optionalrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21708
diff changeset
370 _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'),
c4633e287c56 keyword: define optionalrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21708
diff changeset
371 optionalrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
372 def demo(ui, repo, *args, **opts):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
373 '''print [keywordmaps] configuration and an expansion example
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
374
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
375 Show current, custom, or default keyword template maps and their
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
376 expansions.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
377
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
378 Extend the current configuration by specifying maps as arguments
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
379 and using -f/--rcfile to source an external hgrc file.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
380
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
381 Use -d/--default to disable current configuration.
9307
2715506d54e4 keyword: reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 9305
diff changeset
382
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11168
diff changeset
383 See :hg:`help templates` for information on templates and filters.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
384 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
385 def demoitems(section, items):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
386 ui.write('[%s]\n' % section)
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
387 for k, v in sorted(items):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
388 ui.write('%s = %s\n' % (k, v))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
389
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
390 fn = 'demo.txt'
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
391 tmpdir = tempfile.mkdtemp('', 'kwdemo.')
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 7993
diff changeset
392 ui.note(_('creating temporary repository at %s\n') % tmpdir)
18825
f0564402d059 repo: repo isolation, do not pass on repo.ui for creating new repos
Simon Heimberg <simohe@besonet.ch>
parents: 17795
diff changeset
393 repo = localrepo.localrepository(repo.baseui, tmpdir, True)
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20668
diff changeset
394 ui.setconfig('keyword', fn, '', 'keyword')
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
395 svn = ui.configbool('keywordset', 'svn')
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
396 # explicitly set keywordset for demo output
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20668
diff changeset
397 ui.setconfig('keywordset', 'svn', svn, 'keyword')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
398
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
399 uikwmaps = ui.configitems('keywordmaps')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
400 if args or opts.get('rcfile'):
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
401 ui.status(_('\n\tconfiguration using custom keyword template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
402 if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
403 ui.status(_('\textending current template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
404 if opts.get('default') or not uikwmaps:
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
405 if svn:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
406 ui.status(_('\toverriding default svn keywordset\n'))
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
407 else:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
408 ui.status(_('\toverriding default cvs keywordset\n'))
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
409 if opts.get('rcfile'):
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
410 ui.readconfig(opts.get('rcfile'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
411 if args:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
412 # simulate hgrc parsing
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
413 rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
23877
7cc77030c557 localrepo: remove all external users of localrepo.opener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23723
diff changeset
414 fp = repo.vfs('hgrc', 'w')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
415 fp.writelines(rcmaps)
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
416 fp.close()
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
417 ui.readconfig(repo.join('hgrc'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
418 kwmaps = dict(ui.configitems('keywordmaps'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
419 elif opts.get('default'):
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
420 if svn:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
421 ui.status(_('\n\tconfiguration using default svn keywordset\n'))
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
422 else:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
423 ui.status(_('\n\tconfiguration using default cvs keywordset\n'))
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
424 kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
425 if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
426 ui.status(_('\tdisabling current template maps\n'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
427 for k, v in kwmaps.iteritems():
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20668
diff changeset
428 ui.setconfig('keywordmaps', k, v, 'keyword')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
429 else:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
430 ui.status(_('\n\tconfiguration using current keyword template maps\n'))
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
431 if uikwmaps:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
432 kwmaps = dict(uikwmaps)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
433 else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
434 kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
435
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
436 uisetup(ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
437 reposetup(ui, repo)
10714
9c0a1887bd4b keyword: do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 10713
diff changeset
438 ui.write('[extensions]\nkeyword =\n')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
439 demoitems('keyword', ui.configitems('keyword'))
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
440 demoitems('keywordset', ui.configitems('keywordset'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
441 demoitems('keywordmaps', kwmaps.iteritems())
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
442 keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13971
diff changeset
443 repo.wopener.write(fn, keywords)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11296
diff changeset
444 repo[None].add([fn])
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
445 ui.note(_('\nkeywords written to %s:\n') % fn)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
446 ui.note(keywords)
20113
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
447 wlock = repo.wlock()
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
448 try:
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
449 repo.dirstate.setbranch('demobranch')
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
450 finally:
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
451 wlock.release()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
452 for name, cmd in ui.configitems('hooks'):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
453 if name.split('.', 1)[0].find('commit') > -1:
20790
49f2d5644f04 config: set a 'source' in most cases where config don't come from file but code
Mads Kiilerich <madski@unity3d.com>
parents: 20668
diff changeset
454 repo.ui.setconfig('hooks', name, '', 'keyword')
10499
4401b0dfee88 keyword: mark improved demo commit message for translation
Christian Ebert <blacktrash@gmx.net>
parents: 10495
diff changeset
455 msg = _('hg keyword configuration and expansion example')
20240
60c4d76b79b5 cleanup: Remove the only ever used skip-check-code pragma
Simon Heimberg <simohe@besonet.ch>
parents: 20113
diff changeset
456 ui.note(("hg ci -m '%s'\n" % msg))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
457 repo.commit(text=msg)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
458 ui.status(_('\n\tkeywords expanded\n'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
459 ui.write(repo.wread(fn))
23722
5803bfeebbfe keyword: use vfs.reljoin and util.unlinkpath to remove kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 23622
diff changeset
460 for root, dirs, files in os.walk(tmpdir):
21981
897bee697d51 keyword: really clean up kwdemo temp tree
Christian Ebert <blacktrash@gmx.net>
parents: 21784
diff changeset
461 for f in files:
23722
5803bfeebbfe keyword: use vfs.reljoin and util.unlinkpath to remove kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 23622
diff changeset
462 util.unlinkpath(repo.vfs.reljoin(root, f))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
463
21784
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
464 @command('kwexpand',
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
465 commands.walkopts,
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
466 _('hg kwexpand [OPTION]... [FILE]...'),
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
467 inferrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
468 def expand(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
469 '''expand keywords in the working directory
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
470
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
471 Run after (re)enabling keyword expansion.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
472
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
473 kwexpand refuses to run if given files contain local changes.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
474 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
475 # 3rd argument sets expansion to True
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
476 _kwfwrite(ui, repo, True, *pats, **opts)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
477
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
478 @command('kwfiles',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
479 [('A', 'all', None, _('show keyword status flags of all files')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
480 ('i', 'ignore', None, _('show files excluded from expansion')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
481 ('u', 'unknown', None, _('only show unknown (not tracked) files')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
482 ] + commands.walkopts,
21784
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
483 _('hg kwfiles [OPTION]... [FILE]...'),
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
484 inferrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
485 def files(ui, repo, *pats, **opts):
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
486 '''show files configured for keyword expansion
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
487
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
488 List which files in the working directory are matched by the
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
489 [keyword] configuration patterns.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
490
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
491 Useful to prevent inadvertent keyword expansion and to speed up
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
492 execution by including only files that are actual candidates for
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
493 expansion.
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
494
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
495 See :hg:`help keyword` on how to construct patterns both for
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
496 inclusion and exclusion of files.
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
497
9494
bdd8a41ea6f6 keyword: uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 9493
diff changeset
498 With -A/--all and -v/--verbose the codes used to show the status
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
499 of files are::
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
500
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
501 K = keyword expansion candidate
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
502 k = keyword expansion candidate (not tracked)
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
503 I = ignored
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
504 i = ignored (not tracked)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
505 '''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
506 kwt = kwtools['templater']
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
507 wctx = repo[None]
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
508 status = _status(ui, repo, wctx, kwt, *pats, **opts)
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
509 cwd = pats and repo.getcwd() or ''
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
510 files = []
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
511 if not opts.get('unknown') or opts.get('all'):
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
512 files = sorted(status.modified + status.added + status.clean)
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
513 kwfiles = kwt.iskwfile(files, wctx)
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
514 kwdeleted = kwt.iskwfile(status.deleted, wctx)
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
515 kwunknown = kwt.iskwfile(status.unknown, wctx)
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
516 if not opts.get('ignore') or opts.get('all'):
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
517 showfiles = kwfiles, kwdeleted, kwunknown
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
518 else:
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
519 showfiles = [], [], []
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
520 if opts.get('all') or opts.get('ignore'):
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
521 showfiles += ([f for f in files if f not in kwfiles],
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
522 [f for f in status.unknown if f not in kwunknown])
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
523 kwlabels = 'enabled deleted enabledunknown ignored ignoredunknown'.split()
17057
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
524 kwstates = zip(kwlabels, 'K!kIi', showfiles)
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
525 fm = ui.formatter('kwfiles', opts)
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
526 fmt = '%.0s%s\n'
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
527 if opts.get('all') or ui.verbose:
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
528 fmt = '%s %s\n'
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
529 for kwstate, char, filenames in kwstates:
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
530 label = 'kwfiles.' + kwstate
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
531 for f in filenames:
17057
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
532 fm.startitem()
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
533 fm.write('kwstatus path', fmt, char,
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
534 repo.pathto(f, cwd), label=label)
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
535 fm.end()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
536
21784
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
537 @command('kwshrink',
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
538 commands.walkopts,
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
539 _('hg kwshrink [OPTION]... [FILE]...'),
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
540 inferrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
541 def shrink(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
542 '''revert expanded keywords in the working directory
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
543
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
544 Must be run before changing/disabling active keywords.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
545
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
546 kwshrink refuses to run if given files contain local changes.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
547 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
548 # 3rd argument sets expansion to False
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
549 _kwfwrite(ui, repo, False, *pats, **opts)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
550
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
551
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
552 def uisetup(ui):
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
553 ''' Monkeypatches dispatch._parse to retrieve user command.'''
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
554
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
555 def kwdispatch_parse(orig, ui, args):
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
556 '''Monkeypatch dispatch._parse to obtain running hg command.'''
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
557 cmd, func, args, options, cmdoptions = orig(ui, args)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
558 kwtools['hgcmd'] = cmd
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
559 return cmd, func, args, options, cmdoptions
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
560
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
561 extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
562
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
563 def reposetup(ui, repo):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
564 '''Sets up repo as kwrepo for keyword substitution.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
565 Overrides file method to return kwfilelog instead of filelog
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
566 if file matches user configuration.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
567 Wraps commit to overwrite configured files with updated
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
568 keyword substitutions.
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
569 Monkeypatches patch and webcommands.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
570
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
571 try:
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
572 if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
573 or '.hg' in util.splitpath(repo.root)
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
574 or repo._url.startswith('bundle:')):
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
575 return
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
576 except AttributeError:
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
577 pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
578
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
579 inc, exc = [], ['.hg*']
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
580 for pat, opt in ui.configitems('keyword'):
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
581 if opt != 'ignore':
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
582 inc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
583 else:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
584 exc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
585 if not inc:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
586 return
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
587
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
588 kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
589
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
590 class kwrepo(repo.__class__):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
591 def file(self, f):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
592 if f[0] == '/':
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
593 f = f[1:]
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
594 return kwfilelog(self.sopener, kwt, f)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
595
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
596 def wread(self, filename):
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
597 data = super(kwrepo, self).wread(filename)
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
598 return kwt.wread(filename, data)
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
599
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
600 def commit(self, *args, **opts):
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
601 # use custom commitctx for user commands
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
602 # other extensions can still wrap repo.commitctx directly
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
603 self.commitctx = self.kwcommitctx
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
604 try:
10495
2c2d2f1354b4 keyword: do not postpone commit hooks
Christian Ebert <blacktrash@gmx.net>
parents: 10492
diff changeset
605 return super(kwrepo, self).commit(*args, **opts)
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
606 finally:
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
607 del self.commitctx
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
608
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
609 def kwcommitctx(self, ctx, error=False):
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
610 n = super(kwrepo, self).commitctx(ctx, error)
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
611 # no lock needed, only called from repo.commit() which already locks
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
612 if not kwt.postcommit:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
613 restrict = kwt.restrict
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
614 kwt.restrict = True
11320
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
615 kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
616 False, True)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
617 kwt.restrict = restrict
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
618 return n
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
619
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
620 def rollback(self, dryrun=False, force=False):
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
621 wlock = self.wlock()
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
622 try:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
623 if not dryrun:
12604
415ab8911724 keyword: rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 12498
diff changeset
624 changed = self['.'].files()
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
625 ret = super(kwrepo, self).rollback(dryrun, force)
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
626 if not dryrun:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
627 ctx = self['.']
23079
c4ce50a3d634 keyword: use parent of working copy as base for status
Martin von Zweigbergk <martinvonz@google.com>
parents: 22918
diff changeset
628 modified, added = _preselect(ctx.status(), changed)
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
629 kwt.overwrite(ctx, modified, True, True)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
630 kwt.overwrite(ctx, added, True, False)
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
631 return ret
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
632 finally:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
633 wlock.release()
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
634
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
635 # monkeypatches
14566
d0c2cc11e611 patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 14452
diff changeset
636 def kwpatchfile_init(orig, self, ui, gp, backend, store, eolmode=None):
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
637 '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
638 rejects or conflicts due to expanded keywords in working dir.'''
14566
d0c2cc11e611 patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 14452
diff changeset
639 orig(self, ui, gp, backend, store, eolmode)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
640 # shrink keywords read from working dir
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
641 self.lines = kwt.shrinklines(self.fname, self.lines)
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
642
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7216
diff changeset
643 def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None,
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 11681
diff changeset
644 opts=None, prefix=''):
12497
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
645 '''Monkeypatch patch.diff to avoid expansion.'''
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
646 kwt.restrict = True
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 11681
diff changeset
647 return orig(repo, node1, node2, match, changes, opts, prefix)
6667
01e95d4bc66c keyword: disable expansion for annotate
Christian Ebert <blacktrash@gmx.net>
parents: 6603
diff changeset
648
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
649 def kwweb_skip(orig, web, req, tmpl):
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
650 '''Wraps webcommands.x turning off keyword expansion.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
651 kwt.match = util.never
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
652 return orig(web, req, tmpl)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
653
16810
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
654 def kw_amend(orig, ui, repo, commitfunc, old, extra, pats, opts):
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
655 '''Wraps cmdutil.amend expanding keywords after amend.'''
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
656 wlock = repo.wlock()
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
657 try:
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
658 kwt.postcommit = True
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
659 newid = orig(ui, repo, commitfunc, old, extra, pats, opts)
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
660 if newid != old.node():
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
661 ctx = repo[newid]
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
662 kwt.restrict = True
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
663 kwt.overwrite(ctx, ctx.files(), False, True)
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
664 kwt.restrict = False
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
665 return newid
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
666 finally:
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
667 wlock.release()
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
668
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
669 def kw_copy(orig, ui, repo, pats, opts, rename=False):
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
670 '''Wraps cmdutil.copy so that copy/rename destinations do not
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
671 contain expanded keywords.
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
672 Note that the source of a regular file destination may also be a
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
673 symlink:
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
674 hg cp sym x -> x is symlink
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
675 cp sym x; hg cp -A sym x -> x is file (maybe expanded keywords)
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
676 For the latter we have to follow the symlink to find out whether its
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
677 target is configured for expansion and we therefore must unexpand the
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
678 keywords in the destination.'''
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
679 wlock = repo.wlock()
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
680 try:
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
681 orig(ui, repo, pats, opts, rename)
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
682 if opts.get('dry_run'):
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
683 return
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
684 wctx = repo[None]
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
685 cwd = repo.getcwd()
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
686
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
687 def haskwsource(dest):
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
688 '''Returns true if dest is a regular file and configured for
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
689 expansion or a symlink which points to a file configured for
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
690 expansion. '''
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
691 source = repo.dirstate.copied(dest)
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
692 if 'l' in wctx.flags(source):
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19997
diff changeset
693 source = pathutil.canonpath(repo.root, cwd,
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
694 os.path.realpath(source))
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
695 return kwt.match(source)
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
696
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
697 candidates = [f for f in repo.dirstate.copies() if
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
698 'l' not in wctx.flags(f) and haskwsource(f)]
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
699 kwt.overwrite(wctx, candidates, False, False)
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
700 finally:
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
701 wlock.release()
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
702
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
703 def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
704 '''Wraps record.dorecord expanding keywords after recording.'''
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
705 wlock = repo.wlock()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
706 try:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
707 # record returns 0 even when nothing has changed
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
708 # therefore compare nodes before and after
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
709 kwt.postcommit = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
710 ctx = repo['.']
23079
c4ce50a3d634 keyword: use parent of working copy as base for status
Martin von Zweigbergk <martinvonz@google.com>
parents: 22918
diff changeset
711 wstatus = ctx.status()
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
712 ret = orig(ui, repo, commitfunc, *pats, **opts)
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
713 recctx = repo['.']
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
714 if ctx != recctx:
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
715 modified, added = _preselect(wstatus, recctx.files())
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
716 kwt.restrict = False
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
717 kwt.overwrite(recctx, modified, False, True)
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
718 kwt.overwrite(recctx, added, False, True, True)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
719 kwt.restrict = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
720 return ret
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
721 finally:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
722 wlock.release()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
723
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
724 def kwfilectx_cmp(orig, self, fctx):
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
725 # keyword affects data size, comparing wdir and filelog size does
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
726 # not make sense
12732
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
727 if (fctx._filerev is None and
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
728 (self._repo._encodefilterpats or
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 15871
diff changeset
729 kwt.match(fctx.path()) and 'l' not in fctx.flags() or
15871
07893690c435 keyword: update filectx.cmp monkeypatch to handle '\1\n' at start of file
Christian Ebert <blacktrash@gmx.net>
parents: 15387
diff changeset
730 self.size() - 4 == fctx.size()) or
12732
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
731 self.size() == fctx.size()):
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
732 return self._filelog.cmp(self._filenode, fctx.data())
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
733 return True
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
734
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
735 extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
736 extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
12497
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
737 extensions.wrapfunction(patch, 'diff', kw_diff)
16810
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
738 extensions.wrapfunction(cmdutil, 'amend', kw_amend)
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
739 extensions.wrapfunction(cmdutil, 'copy', kw_copy)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
740 for c in 'annotate changeset rev filediff diff'.split():
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
741 extensions.wrapfunction(webcommands, c, kwweb_skip)
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
742 for name in recordextensions.split():
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
743 try:
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
744 record = extensions.find(name)
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
745 extensions.wrapfunction(record, 'dorecord', kw_dorecord)
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
746 except KeyError:
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
747 pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
748
13299
f24ea9356e7d keyword: move repo.__class__ assignment out of monkeypatch context
Christian Ebert <blacktrash@gmx.net>
parents: 13298
diff changeset
749 repo.__class__ = kwrepo