annotate hgext/keyword.py @ 27693:2b9126d6588b

check-code: allow only-whitespace lines in tests These turn out to be necessary to embed diffs with blank lines in test input. So we now complain about whitespace following a character.
author Matt Mackall <mpm@selenic.com>
date Fri, 08 Jan 2016 12:35:02 -0600
parents 56b2bcea2529
children 16cfbbc69800
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
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 25186
diff changeset
18 # <https://mercurial-scm.org/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
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26463
diff changeset
86 from mercurial import localrepo, match, patch, templatefilters, util, error
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)
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
94 # Note for extension authors: ONLY specify testedwith = 'internal' for
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
95 # extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
96 # be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
97 # leave the attribute unspecified.
16743
38caf405d010 hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 16741
diff changeset
98 testedwith = 'internal'
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
99
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
100 # hg commands that do not act on keywords
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
101 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
102 ' 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
103
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
104 # 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
105 # 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
106 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
107 ' unshelve rebase graft backout histedit fetch')
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
108
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
109 # names of extensions using dorecord
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
110 recordextensions = 'record'
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
111
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
112 colortable = {
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
113 'kwfiles.enabled': 'green bold',
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
114 'kwfiles.deleted': 'cyan bold underline',
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
115 'kwfiles.enabledunknown': 'green',
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
116 'kwfiles.ignored': 'bold',
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
117 'kwfiles.ignoredunknown': 'none'
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
118 }
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
119
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
120 # date like in cvs' $Date
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
121 def utcdate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
122 ''':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
123 '''
17755
bededd3f0735 templatefilters: avoid traceback caused by bogus date input (issue3344)
Christian Ebert <blacktrash@gmx.net>
parents: 17424
diff changeset
124 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
125 # date like in svn's $Date
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
126 def svnisodate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
127 ''':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
128 +0200 (Tue, 18 Aug 2009)".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
129 '''
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
130 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
131 # date like in svn's $Id
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
132 def svnutcdate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
133 ''':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
134 11:00:13Z".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
135 '''
17755
bededd3f0735 templatefilters: avoid traceback caused by bogus date input (issue3344)
Christian Ebert <blacktrash@gmx.net>
parents: 17424
diff changeset
136 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
137
13634
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
138 templatefilters.filters.update({'utcdate': utcdate,
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
139 'svnisodate': svnisodate,
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
140 'svnutcdate': svnutcdate})
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
141
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
142 # make keyword tools accessible
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
143 kwtools = {'templater': None, 'hgcmd': ''}
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
144
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
145 def _defaultkwmaps(ui):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
146 '''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
147 templates = {
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
148 'Revision': '{node|short}',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
149 'Author': '{author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
150 }
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
151 kwsets = ({
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
152 'Date': '{date|utcdate}',
9943
f8d779791161 keyword: the CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 9942
diff changeset
153 'RCSfile': '{file|basename},v',
9950
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
154 'RCSFile': '{file|basename},v', # kept for backwards compatibility
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
155 # with hg-keyword
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
156 'Source': '{root}/{file},v',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
157 '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
158 '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
159 }, {
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
160 'Date': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
161 '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
162 'LastChangedRevision': '{node|short}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
163 'LastChangedBy': '{author|user}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
164 'LastChangedDate': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
165 })
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
166 templates.update(kwsets[ui.configbool('keywordset', 'svn')])
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
167 return templates
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
168
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
169 def _shrinktext(text, subfunc):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
170 '''Helper for keyword expansion removal in text.
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
171 Depending on subfunc also returns number of substitutions.'''
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
172 return subfunc(r'$\1$', text)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
173
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
174 def _preselect(wstatus, changed):
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17057
diff changeset
175 '''Retrieves modified and added files from a working directory state
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
176 and returns the subset of each contained in given changed files
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
177 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
178 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
179 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
180 return modified, added
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
181
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
182
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
183 class kwtemplater(object):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
184 '''
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
185 Sets up keyword templates, corresponding keyword regex, and
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
186 provides keyword substitution functions.
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
187 '''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
188
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
189 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
190 self.ui = ui
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
191 self.repo = repo
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
192 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
193 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
194 self.postcommit = False
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
195
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
196 kwmaps = self.ui.configitems('keywordmaps')
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
197 if kwmaps: # override default templates
24987
fd7287f0b43c templater: remove noop calls of parsestring(s, quoted=False) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 24905
diff changeset
198 self.templates = dict(kwmaps)
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
199 else:
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
200 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
201
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
202 @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
203 def escape(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
204 '''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
205 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
206
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
207 @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
208 def rekw(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
209 '''Returns regex for unexpanded keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
210 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
211
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
212 @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
213 def rekwexp(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
214 '''Returns regex for expanded keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
215 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
216
7375
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
217 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
218 '''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
219 def kwsub(mobj):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
220 kw = mobj.group(1)
20668
3a35ba2681ec templating: make -T much more flexible
Matt Mackall <mpm@selenic.com>
parents: 20667
diff changeset
221 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
222 self.templates[kw], '', False)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
223 self.ui.pushbuffer()
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
224 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
225 ekw = templatefilters.firstline(self.ui.popbuffer())
ee7df90d1daa keyword: split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 6022
diff changeset
226 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
227 return subfunc(kwsub, data)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
228
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
229 def linkctx(self, path, fileid):
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
230 '''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
231 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
232
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
233 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
234 '''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
235 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
236 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
237 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
238 return data
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
239
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
240 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
241 '''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
242 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
243 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
244
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
245 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
246 '''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
247 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
248 candidates = self.iskwfile(candidates, ctx)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
249 if not candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
250 return
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
251 kwcmd = self.restrict and lookup # kwexpand/kwshrink
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
252 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
253 mf = ctx.manifest()
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
254 if self.restrict or rekw:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
255 re_kw = self.rekw
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
256 else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
257 re_kw = self.rekwexp
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
258 if expand:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
259 msg = _('overwriting %s expanding keywords\n')
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
260 else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
261 msg = _('overwriting %s shrinking keywords\n')
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
262 for f in candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
263 if self.restrict:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
264 data = self.repo.file(f).read(mf[f])
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
265 else:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
266 data = self.repo.wread(f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
267 if util.binary(data):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
268 continue
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
269 if expand:
23622
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
270 parents = ctx.parents()
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
271 if lookup:
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
272 ctx = self.linkctx(f, mf[f])
23622
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
273 elif self.restrict and len(parents) > 1:
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
274 # merge commit
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
275 # 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
276 # 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
277 for p in parents:
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
278 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
279 ctx = p[f].changectx()
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
280 break
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
281 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
282 elif self.restrict:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
283 found = re_kw.search(data)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
284 else:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
285 data, found = _shrinktext(data, re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
286 if found:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
287 self.ui.note(msg % f)
23879
b88278a308c6 localrepo: remove all external users of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23878
diff changeset
288 fp = self.repo.wvfs(f, "wb", atomictemp=True)
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
289 fp.write(data)
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
290 fp.close()
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
291 if kwcmd:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
292 self.repo.dirstate.normal(f)
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
293 elif self.postcommit:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
294 self.repo.dirstate.normallookup(f)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
295
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
296 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
297 '''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
298 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
299 return _shrinktext(text, self.rekwexp.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
300 return text
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
301
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
302 def shrinklines(self, fname, lines):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
303 '''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
304 if self.match(fname):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
305 text = ''.join(lines)
6508
4b2c266bf059 Get rid of reimplementations of util.binary
Bryan O'Sullivan <bos@serpentine.com>
parents: 6506
diff changeset
306 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
307 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
308 return lines
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
309
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
310 def wread(self, fname, data):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
311 '''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
312 keyword substitutions removed.'''
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
313 if self.restrict:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
314 return self.shrink(fname, data)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
315 return data
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
316
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
317 class kwfilelog(filelog.filelog):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
318 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
319 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
320 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
321 '''
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
322 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
323 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
324 self.kwt = kwt
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
325 self.path = path
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
326
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
327 def read(self, node):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
328 '''Expands keywords when reading filelog.'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
329 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
330 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
331 return data
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
332 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
333
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
334 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
335 '''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
336 text = self.kwt.shrink(self.path, text)
6504
1be53f931c9c keyword: compact setting of optional arguments
Christian Ebert <blacktrash@gmx.net>
parents: 6503
diff changeset
337 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
338
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
339 def cmp(self, node, text):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
340 '''Removes keyword substitutions for comparison.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
341 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
342 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
343
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
344 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
345 '''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
346 Returns status of working directory.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
347 if kwt:
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
348 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
349 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
350 if ui.configitems('keyword'):
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26463
diff changeset
351 raise error.Abort(_('[keyword] patterns cannot match'))
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26463
diff changeset
352 raise error.Abort(_('no [keyword] patterns configured'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
353
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
354 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
355 '''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
356 wctx = repo[None]
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
357 if len(wctx.parents()) > 1:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26463
diff changeset
358 raise error.Abort(_('outstanding uncommitted merge'))
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
359 kwt = kwtools['templater']
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
360 wlock = repo.wlock()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
361 try:
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
362 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
363 if status.modified or status.added or status.removed or status.deleted:
26587
56b2bcea2529 error: get Abort from 'error' instead of 'util'
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26463
diff changeset
364 raise error.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
365 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
366 finally:
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
367 wlock.release()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
368
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
369 @command('kwdemo',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
370 [('d', 'default', None, _('show default keyword template maps')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
371 ('f', 'rcfile', '',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
372 _('read maps from rcfile'), _('FILE'))],
21776
c4633e287c56 keyword: define optionalrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21708
diff changeset
373 _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'),
c4633e287c56 keyword: define optionalrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21708
diff changeset
374 optionalrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
375 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
376 '''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
377
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
378 Show current, custom, or default keyword template maps and their
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
379 expansions.
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 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
382 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
383
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
384 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
385
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11168
diff changeset
386 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
387 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
388 def demoitems(section, items):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
389 ui.write('[%s]\n' % section)
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
390 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
391 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
392
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
393 fn = 'demo.txt'
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
394 tmpdir = tempfile.mkdtemp('', 'kwdemo.')
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 7993
diff changeset
395 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
396 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
397 ui.setconfig('keyword', fn, '', 'keyword')
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
398 svn = ui.configbool('keywordset', 'svn')
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
399 # 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
400 ui.setconfig('keywordset', 'svn', svn, 'keyword')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
401
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
402 uikwmaps = ui.configitems('keywordmaps')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
403 if args or opts.get('rcfile'):
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
404 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
405 if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
406 ui.status(_('\textending current template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
407 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
408 if svn:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
409 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
410 else:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
411 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
412 if opts.get('rcfile'):
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
413 ui.readconfig(opts.get('rcfile'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
414 if args:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
415 # simulate hgrc parsing
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
416 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
417 fp = repo.vfs('hgrc', 'w')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
418 fp.writelines(rcmaps)
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
419 fp.close()
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
420 ui.readconfig(repo.join('hgrc'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
421 kwmaps = dict(ui.configitems('keywordmaps'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
422 elif opts.get('default'):
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
423 if svn:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
424 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
425 else:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
426 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
427 kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
428 if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
429 ui.status(_('\tdisabling current template maps\n'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
430 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
431 ui.setconfig('keywordmaps', k, v, 'keyword')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
432 else:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
433 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
434 if uikwmaps:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
435 kwmaps = dict(uikwmaps)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
436 else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
437 kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
438
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
439 uisetup(ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
440 reposetup(ui, repo)
10714
9c0a1887bd4b keyword: do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 10713
diff changeset
441 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
442 demoitems('keyword', ui.configitems('keyword'))
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
443 demoitems('keywordset', ui.configitems('keywordset'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
444 demoitems('keywordmaps', kwmaps.iteritems())
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
445 keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
23879
b88278a308c6 localrepo: remove all external users of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23878
diff changeset
446 repo.wvfs.write(fn, keywords)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11296
diff changeset
447 repo[None].add([fn])
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
448 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
449 ui.note(keywords)
20113
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
450 wlock = repo.wlock()
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
451 try:
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
452 repo.dirstate.setbranch('demobranch')
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
453 finally:
7ad2ae7792ad keyword: wlock while setting branch in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 20033
diff changeset
454 wlock.release()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
455 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
456 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
457 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
458 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
459 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
460 repo.commit(text=msg)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
461 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
462 ui.write(repo.wread(fn))
24905
4ecbd88cde9a keyword: use wvfs.rmtree to remove kwdemo directory
Christian Ebert <blacktrash@gmx.net>
parents: 24370
diff changeset
463 repo.wvfs.rmtree(repo.root)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
464
21784
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
465 @command('kwexpand',
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
466 commands.walkopts,
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
467 _('hg kwexpand [OPTION]... [FILE]...'),
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
468 inferrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
469 def expand(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
470 '''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
471
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
472 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
473
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
474 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
475 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
476 # 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
477 _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
478
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
479 @command('kwfiles',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
480 [('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
481 ('i', 'ignore', None, _('show files excluded from expansion')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
482 ('u', 'unknown', None, _('only show unknown (not tracked) files')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
483 ] + commands.walkopts,
21784
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
484 _('hg kwfiles [OPTION]... [FILE]...'),
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
485 inferrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
486 def files(ui, repo, *pats, **opts):
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
487 '''show files configured for keyword expansion
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
488
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
489 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
490 [keyword] configuration patterns.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
491
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
492 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
493 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
494 expansion.
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
495
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
496 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
497 inclusion and exclusion of files.
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
498
9494
bdd8a41ea6f6 keyword: uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 9493
diff changeset
499 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
500 of files are::
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
501
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
502 K = keyword expansion candidate
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
503 k = keyword expansion candidate (not tracked)
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
504 I = ignored
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
505 i = ignored (not tracked)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
506 '''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
507 kwt = kwtools['templater']
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
508 wctx = repo[None]
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
509 status = _status(ui, repo, wctx, kwt, *pats, **opts)
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
510 if pats:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
511 cwd = repo.getcwd()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
512 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
513 cwd = ''
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
514 files = []
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
515 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
516 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
517 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
518 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
519 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
520 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
521 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
522 else:
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
523 showfiles = [], [], []
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
524 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
525 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
526 [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
527 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
528 kwstates = zip(kwlabels, 'K!kIi', showfiles)
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
529 fm = ui.formatter('kwfiles', opts)
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
530 fmt = '%.0s%s\n'
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
531 if opts.get('all') or ui.verbose:
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
532 fmt = '%s %s\n'
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
533 for kwstate, char, filenames in kwstates:
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
534 label = 'kwfiles.' + kwstate
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
535 for f in filenames:
17057
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
536 fm.startitem()
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
537 fm.write('kwstatus path', fmt, char,
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
538 repo.pathto(f, cwd), label=label)
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
539 fm.end()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
540
21784
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
541 @command('kwshrink',
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
542 commands.walkopts,
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
543 _('hg kwshrink [OPTION]... [FILE]...'),
44efd5b9ce45 keyword: define inferrepo in command decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21776
diff changeset
544 inferrepo=True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
545 def shrink(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
546 '''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
547
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
548 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
549
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
550 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
551 '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
552 # 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
553 _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
554
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
555
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
556 def uisetup(ui):
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
557 ''' 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
558
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
559 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
560 '''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
561 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
562 kwtools['hgcmd'] = cmd
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
563 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
564
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
565 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
566
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
567 def reposetup(ui, repo):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
568 '''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
569 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
570 if file matches user configuration.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
571 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
572 keyword substitutions.
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
573 Monkeypatches patch and webcommands.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
574
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
575 try:
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
576 if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
577 or '.hg' in util.splitpath(repo.root)
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
578 or repo._url.startswith('bundle:')):
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
579 return
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
580 except AttributeError:
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
581 pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
582
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
583 inc, exc = [], ['.hg*']
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
584 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
585 if opt != 'ignore':
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
586 inc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
587 else:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
588 exc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
589 if not inc:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
590 return
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
591
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
592 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
593
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
594 class kwrepo(repo.__class__):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
595 def file(self, f):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
596 if f[0] == '/':
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
597 f = f[1:]
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23877
diff changeset
598 return kwfilelog(self.svfs, kwt, f)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
599
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
600 def wread(self, filename):
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
601 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
602 return kwt.wread(filename, data)
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
603
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
604 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
605 # 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
606 # 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
607 self.commitctx = self.kwcommitctx
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
608 try:
10495
2c2d2f1354b4 keyword: do not postpone commit hooks
Christian Ebert <blacktrash@gmx.net>
parents: 10492
diff changeset
609 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
610 finally:
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
611 del self.commitctx
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
612
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
613 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
614 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
615 # 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
616 if not kwt.postcommit:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
617 restrict = kwt.restrict
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
618 kwt.restrict = True
11320
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
619 kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
620 False, True)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
621 kwt.restrict = restrict
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
622 return n
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
623
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
624 def rollback(self, dryrun=False, force=False):
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
625 wlock = self.wlock()
26463
b3188339a772 keyword: make restrict mode False while updating files for rollback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26421
diff changeset
626 origrestrict = kwt.restrict
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
627 try:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
628 if not dryrun:
12604
415ab8911724 keyword: rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 12498
diff changeset
629 changed = self['.'].files()
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
630 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
631 if not dryrun:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
632 ctx = self['.']
23079
c4ce50a3d634 keyword: use parent of working copy as base for status
Martin von Zweigbergk <martinvonz@google.com>
parents: 22918
diff changeset
633 modified, added = _preselect(ctx.status(), changed)
26463
b3188339a772 keyword: make restrict mode False while updating files for rollback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26421
diff changeset
634 kwt.restrict = False
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
635 kwt.overwrite(ctx, modified, True, True)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
636 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
637 return ret
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
638 finally:
26463
b3188339a772 keyword: make restrict mode False while updating files for rollback
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 26421
diff changeset
639 kwt.restrict = origrestrict
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
640 wlock.release()
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
641
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
642 # monkeypatches
14566
d0c2cc11e611 patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 14452
diff changeset
643 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
644 '''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
645 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
646 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
647 # 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
648 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
649
24370
3e8b06097d00 keyword: monkeypatch patch.diff more generically
Siddharth Agarwal <sid0@fb.com>
parents: 24369
diff changeset
650 def kwdiff(orig, *args, **kwargs):
12497
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
651 '''Monkeypatch patch.diff to avoid expansion.'''
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
652 kwt.restrict = True
24370
3e8b06097d00 keyword: monkeypatch patch.diff more generically
Siddharth Agarwal <sid0@fb.com>
parents: 24369
diff changeset
653 return orig(*args, **kwargs)
6667
01e95d4bc66c keyword: disable expansion for annotate
Christian Ebert <blacktrash@gmx.net>
parents: 6603
diff changeset
654
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
655 def kwweb_skip(orig, web, req, tmpl):
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
656 '''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
657 kwt.match = util.never
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
658 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
659
16810
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
660 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
661 '''Wraps cmdutil.amend expanding keywords after amend.'''
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
662 wlock = repo.wlock()
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
663 try:
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
664 kwt.postcommit = True
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
665 newid = orig(ui, repo, commitfunc, old, extra, pats, opts)
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
666 if newid != old.node():
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
667 ctx = repo[newid]
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
668 kwt.restrict = True
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
669 kwt.overwrite(ctx, ctx.files(), False, True)
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
670 kwt.restrict = False
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
671 return newid
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
672 finally:
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
673 wlock.release()
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
674
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
675 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
676 '''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
677 contain expanded keywords.
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
678 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
679 symlink:
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
680 hg cp sym x -> x is symlink
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
681 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
682 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
683 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
684 keywords in the destination.'''
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
685 wlock = repo.wlock()
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
686 try:
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
687 orig(ui, repo, pats, opts, rename)
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
688 if opts.get('dry_run'):
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
689 return
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
690 wctx = repo[None]
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
691 cwd = repo.getcwd()
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
692
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
693 def haskwsource(dest):
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
694 '''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
695 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
696 expansion. '''
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
697 source = repo.dirstate.copied(dest)
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
698 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
699 source = pathutil.canonpath(repo.root, cwd,
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
700 os.path.realpath(source))
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
701 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
702
16811
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
703 candidates = [f for f in repo.dirstate.copies() if
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
704 'l' not in wctx.flags(f) and haskwsource(f)]
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
705 kwt.overwrite(wctx, candidates, False, False)
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
706 finally:
f8c495cc6313 keyword: wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 16810
diff changeset
707 wlock.release()
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
708
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
709 def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
710 '''Wraps record.dorecord expanding keywords after recording.'''
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
711 wlock = repo.wlock()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
712 try:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
713 # record returns 0 even when nothing has changed
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
714 # 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
715 kwt.postcommit = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
716 ctx = repo['.']
23079
c4ce50a3d634 keyword: use parent of working copy as base for status
Martin von Zweigbergk <martinvonz@google.com>
parents: 22918
diff changeset
717 wstatus = ctx.status()
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
718 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
719 recctx = repo['.']
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
720 if ctx != recctx:
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
721 modified, added = _preselect(wstatus, recctx.files())
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
722 kwt.restrict = False
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
723 kwt.overwrite(recctx, modified, False, True)
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
724 kwt.overwrite(recctx, added, False, True, True)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
725 kwt.restrict = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
726 return ret
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
727 finally:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
728 wlock.release()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
729
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
730 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
731 # 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
732 # not make sense
12732
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
733 if (fctx._filerev is None and
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
734 (self._repo._encodefilterpats or
16686
67964cda8701 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 15871
diff changeset
735 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
736 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
737 self.size() == fctx.size()):
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
738 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
739 return True
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
740
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
741 extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
742 extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
24369
109a2acc19ed keyword: rename kw_diff to kwdiff in keeping with Mercurial style rules
Siddharth Agarwal <sid0@fb.com>
parents: 24306
diff changeset
743 extensions.wrapfunction(patch, 'diff', kwdiff)
16810
846607ff274f keyword: support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 16809
diff changeset
744 extensions.wrapfunction(cmdutil, 'amend', kw_amend)
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
745 extensions.wrapfunction(cmdutil, 'copy', kw_copy)
24272
26a1c617e047 record: move dorecord from record to cmdutil
Laurent Charignon <lcharignon@fb.com>
parents: 23879
diff changeset
746 extensions.wrapfunction(cmdutil, 'dorecord', kw_dorecord)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
747 for c in 'annotate changeset rev filediff diff'.split():
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
748 extensions.wrapfunction(webcommands, c, kwweb_skip)
13299
f24ea9356e7d keyword: move repo.__class__ assignment out of monkeypatch context
Christian Ebert <blacktrash@gmx.net>
parents: 13298
diff changeset
749 repo.__class__ = kwrepo