hgkw/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Fri, 10 Aug 2012 20:37:20 +0100
changeset 1141 4e2090ed2e72
parent 1121 f4dcce73f362
child 1145 446f29d60749
permissions -rw-r--r--
Avoid traceback caused by bogus date input (issue3344) Wrap datefilters which split date texts with util.parsedate. We do not abort, as the bogus date must have been given by the user.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
     1
# keyword.py - $Keyword$ expansion for Mercurial
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     2
#
1082
2ba350253f76 Update copyleft
Christian Ebert <blacktrash@gmx.net>
parents: 1081
diff changeset
     3
# Copyright 2007-2012 Christian Ebert <blacktrash@gmx.net>
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     4
#
540
e30c2a251010 updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 538
diff changeset
     5
# This software may be used and distributed according to the terms of the
674
0efa9d6ac11f Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 668
diff changeset
     6
# GNU General Public License version 2 or any later version.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     7
#
82
9bf0f7db5928 Add keyword; comment backwards compatible import
Christian Ebert <blacktrash@gmx.net>
parents: 81
diff changeset
     8
# $Id$
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     9
#
1121
f4dcce73f362 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 1114
diff changeset
    10
# Keyword expansion hack against the grain of a Distributed SCM
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    11
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    12
# There are many good reasons why this is not needed in a distributed
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    13
# SCM, still it may be useful in very small projects based on single
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    15
# audience not running a version control system.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    16
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    17
# For in-depth discussion refer to
656
89e0584cdc5c change wiki/bts URLs to point to new hostname
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 654
diff changeset
    18
# <http://mercurial.selenic.com/wiki/KeywordPlan>.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    19
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    20
# Keyword expansion is based on Mercurial's changeset template mappings.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    21
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    22
# Binary files are not touched.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    23
#
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    24
# Files to act upon/ignore are specified in the [keyword] section.
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    25
# Customized keyword template mappings in the [keywordmaps] section.
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    26
#
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    27
# Run "hg help keyword" and "hg kwdemo" to get info on configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    28
584
763d20224433 extensions: improve the consistency of synopses
C?dric Duval <cedricduval@free.fr>
parents: 582
diff changeset
    29
'''expand keywords in tracked files
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    30
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    31
This extension expands RCS/CVS-like or self-customized $Keywords$ in
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    32
tracked text files selected by your configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    33
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    34
Keywords are only expanded in local repositories and not stored in the
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    35
change history. The mechanism can be regarded as a convenience for the
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    36
current user or for archive distribution.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    37
790
b14093780eaf Explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 788
diff changeset
    38
Keywords expand to the changeset data pertaining to the latest change
b14093780eaf Explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 788
diff changeset
    39
relative to the working directory parent of each file.
b14093780eaf Explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 788
diff changeset
    40
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    41
Configuration is done in the [keyword], [keywordset] and [keywordmaps]
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    42
sections of hgrc files.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    43
624
2b7eb429112e commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 621
diff changeset
    44
Example::
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    45
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    46
    [keyword]
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    47
    # expand keywords in every python file except those matching "x*"
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    48
    **.py =
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    49
    x*    = ignore
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    50
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    51
    [keywordset]
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    52
    # prefer svn- over cvs-like default keywordmaps
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    53
    svn = True
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    54
804
b7fbc49d5c75 Use note admonition in help text
Christian Ebert <blacktrash@gmx.net>
parents: 790
diff changeset
    55
.. note::
b7fbc49d5c75 Use note admonition in help text
Christian Ebert <blacktrash@gmx.net>
parents: 790
diff changeset
    56
   The more specific you are in your filename patterns the less you
b7fbc49d5c75 Use note admonition in help text
Christian Ebert <blacktrash@gmx.net>
parents: 790
diff changeset
    57
   lose speed in huge repositories.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    58
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    59
For [keywordmaps] template mapping and expansion demonstration and
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    60
control run :hg:`kwdemo`. See :hg:`help templates` for a list of
635
49307521cf96 Reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 633
diff changeset
    61
available templates and filters.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    62
897
2ffafb688274 keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 893
diff changeset
    63
Three additional date template filters are provided:
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    64
897
2ffafb688274 keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 893
diff changeset
    65
:``utcdate``:    "2006/09/18 15:13:13"
2ffafb688274 keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 893
diff changeset
    66
:``svnutcdate``: "2006-09-18 15:13:13Z"
2ffafb688274 keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 893
diff changeset
    67
:``svnisodate``: "2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)"
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    68
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    69
The default template mappings (view with :hg:`kwdemo -d`) can be
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    70
replaced with customized keywords and templates. Again, run
864
2cadbd48a31b s/config/configuration/ in help
Christian Ebert <blacktrash@gmx.net>
parents: 854
diff changeset
    71
:hg:`kwdemo` to control the results of your configuration changes.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    72
873
05e160f8f8bc Update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 871
diff changeset
    73
Before changing/disabling active keywords, you must run :hg:`kwshrink`
05e160f8f8bc Update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 871
diff changeset
    74
to avoid storing expanded keywords in the change history.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    75
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    76
To force expansion after enabling it, or a configuration change, run
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    77
:hg:`kwexpand`.
211
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    78
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    79
Expansions spanning more than one line and incremental expansions,
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    80
like CVS' $Log$, are not supported. A keyword template map "Log =
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    81
{desc}" expands to the first line of the changeset description.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    82
'''
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    83
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
    84
from mercurial import commands, context, cmdutil, dispatch, filelog, extensions
816
00570f650792 disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 815
diff changeset
    85
from mercurial import localrepo, match, patch, templatefilters, templater, util
901
3d47747bf5b3 move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 897
diff changeset
    86
from mercurial import scmutil
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
    87
from mercurial.hgweb import webcommands
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
    88
from mercurial.i18n import _
998
cc54b798aca4 Backout b78cce2b1430 until a proper solution is found
Christian Ebert <blacktrash@gmx.net>
parents: 995
diff changeset
    89
import os, re, shutil, tempfile
227
8ae160f24b9f cmdutil.parse moves to dispatch._parse; use fancyopts bugfix
Christian Ebert <blacktrash@gmx.net>
parents: 226
diff changeset
    90
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    91
commands.optionalrepo += ' kwdemo'
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    92
938
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
    93
cmdtable = {}
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
    94
command = cmdutil.command(cmdtable)
1077
2a1ab2f6559c hgext: mark all first-party extensions as such
Augie Fackler <raf@durin42.com>
parents: 1075
diff changeset
    95
testedwith = 'internal'
938
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
    96
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    97
# hg commands that do not act on keywords
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
    98
nokwcommands = ('add addremove annotate bundle export grep incoming init log'
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
    99
                ' outgoing push tip verify convert email glog')
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
   100
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
   101
# hg commands that trigger expansion only when writing to working dir,
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
   102
# not when reading filelog, and unexpand when reading from working dir
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   103
restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
   104
749
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   105
# names of extensions using dorecord
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   106
recordextensions = 'record'
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   107
870
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   108
colortable = {
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   109
    'kwfiles.enabled': 'green bold',
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   110
    'kwfiles.deleted': 'cyan bold underline',
870
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   111
    'kwfiles.enabledunknown': 'green',
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   112
    'kwfiles.ignored': 'bold',
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   113
    'kwfiles.ignoredunknown': 'none'
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   114
}
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   115
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   116
# date like in cvs' $Date
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   117
def utcdate(text):
892
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   118
    ''':utcdate: Date. Returns a UTC-date in this format: "2009/08/18 11:00:13".
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   119
    '''
1141
4e2090ed2e72 Avoid traceback caused by bogus date input (issue3344)
Christian Ebert <blacktrash@gmx.net>
parents: 1121
diff changeset
   120
    return util.datestr((util.parsedate(text)[0], 0), '%Y/%m/%d %H:%M:%S')
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   121
# date like in svn's $Date
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   122
def svnisodate(text):
892
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   123
    ''':svnisodate: Date. Returns a date in this format: "2009-08-18 13:00:13
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   124
    +0200 (Tue, 18 Aug 2009)".
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   125
    '''
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   126
    return util.datestr(text, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   127
# date like in svn's $Id
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   128
def svnutcdate(text):
892
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   129
    ''':svnutcdate: Date. Returns a UTC-date in this format: "2009-08-18
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   130
    11:00:13Z".
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   131
    '''
1141
4e2090ed2e72 Avoid traceback caused by bogus date input (issue3344)
Christian Ebert <blacktrash@gmx.net>
parents: 1121
diff changeset
   132
    return util.datestr((util.parsedate(text)[0], 0), '%Y-%m-%d %H:%M:%SZ')
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   133
893
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   134
templatefilters.filters.update({'utcdate': utcdate,
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   135
                                'svnisodate': svnisodate,
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   136
                                'svnutcdate': svnutcdate})
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   137
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   138
# make keyword tools accessible
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   139
kwtools = {'templater': None, 'hgcmd': ''}
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   140
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   141
def _defaultkwmaps(ui):
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   142
    '''Returns default keywordmaps according to keywordset configuration.'''
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   143
    templates = {
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   144
        'Revision': '{node|short}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   145
        'Author': '{author|user}',
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   146
    }
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   147
    kwsets = ({
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   148
        'Date': '{date|utcdate}',
662
25e813ce68e2 The CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 660
diff changeset
   149
        'RCSfile': '{file|basename},v',
665
06ccaeb6cfc1 keyword: clarify object of backwards compatibility
timeless
parents: 662
diff changeset
   150
        'RCSFile': '{file|basename},v', # kept for backwards compatibility
06ccaeb6cfc1 keyword: clarify object of backwards compatibility
timeless
parents: 662
diff changeset
   151
                                        # with hg-keyword
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   152
        'Source': '{root}/{file},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   153
        'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   154
        'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   155
    }, {
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   156
        'Date': '{date|svnisodate}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   157
        'Id': '{file|basename},v {node|short} {date|svnutcdate} {author|user}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   158
        'LastChangedRevision': '{node|short}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   159
        'LastChangedBy': '{author|user}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   160
        'LastChangedDate': '{date|svnisodate}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   161
    })
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   162
    templates.update(kwsets[ui.configbool('keywordset', 'svn')])
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   163
    return templates
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   164
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   165
def _shrinktext(text, subfunc):
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   166
    '''Helper for keyword expansion removal in text.
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   167
    Depending on subfunc also returns number of substitutions.'''
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   168
    return subfunc(r'$\1$', text)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   169
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   170
def _preselect(wstatus, changed):
1121
f4dcce73f362 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 1114
diff changeset
   171
    '''Retrieves modified and added files from a working directory state
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   172
    and returns the subset of each contained in given changed files
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   173
    retrieved from a change context.'''
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   174
    modified, added = wstatus[:2]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   175
    modified = [f for f in modified if f in changed]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   176
    added = [f for f in added if f in changed]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   177
    return modified, added
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   178
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   179
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   180
class kwtemplater(object):
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   181
    '''
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   182
    Sets up keyword templates, corresponding keyword regex, and
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   183
    provides keyword substitution functions.
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   184
    '''
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   185
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   186
    def __init__(self, ui, repo, inc, exc):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   187
        self.ui = ui
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   188
        self.repo = repo
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   189
        self.match = match.match(repo.root, '', [], inc, exc)
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   190
        self.restrict = kwtools['hgcmd'] in restricted.split()
1079
502c40551c8d Rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 1077
diff changeset
   191
        self.postcommit = False
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   192
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   193
        kwmaps = self.ui.configitems('keywordmaps')
253
22e08d0f25dc List comprehension instead of loop to create ui template dictionary
Christian Ebert <blacktrash@gmx.net>
parents: 252
diff changeset
   194
        if kwmaps: # override default templates
609
fefdf82b2320 Collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 606
diff changeset
   195
            self.templates = dict((k, templater.parsestring(v, False))
fefdf82b2320 Collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 606
diff changeset
   196
                                  for k, v in kwmaps)
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   197
        else:
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   198
            self.templates = _defaultkwmaps(self.ui)
235
baef9dcfb219 Compatible repo.dirstate.normal/update into own function
Christian Ebert <blacktrash@gmx.net>
parents: 234
diff changeset
   199
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   200
    @util.propertycache
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   201
    def escape(self):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   202
        '''Returns bar-separated and escaped keywords.'''
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   203
        return '|'.join(map(re.escape, self.templates.keys()))
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   204
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   205
    @util.propertycache
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   206
    def rekw(self):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   207
        '''Returns regex for unexpanded keywords.'''
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   208
        return re.compile(r'\$(%s)\$' % self.escape)
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   209
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   210
    @util.propertycache
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   211
    def rekwexp(self):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   212
        '''Returns regex for expanded keywords.'''
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   213
        return re.compile(r'\$(%s): [^$\n\r]*? \$' % self.escape)
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   214
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   215
    def substitute(self, data, path, ctx, subfunc):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   216
        '''Replaces keywords in data with expanded template.'''
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   217
        def kwsub(mobj):
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   218
            kw = mobj.group(1)
714
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   219
            ct = cmdutil.changeset_templater(self.ui, self.repo,
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   220
                                             False, None, '', False)
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   221
            ct.use_template(self.templates[kw])
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   222
            self.ui.pushbuffer()
714
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   223
            ct.show(ctx, root=self.repo.root, file=path)
373
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   224
            ekw = templatefilters.firstline(self.ui.popbuffer())
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   225
            return '$%s: %s $' % (kw, ekw)
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   226
        return subfunc(kwsub, data)
255
c4f37735be9b Turn off debug while expanding
Christian Ebert <blacktrash@gmx.net>
parents: 254
diff changeset
   227
849
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   228
    def linkctx(self, path, fileid):
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   229
        '''Similar to filelog.linkrev, but returns a changectx.'''
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   230
        return self.repo.filectx(path, fileid=fileid).changectx()
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   231
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   232
    def expand(self, path, node, data):
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   233
        '''Returns data with keywords expanded.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   234
        if not self.restrict and self.match(path) and not util.binary(data):
849
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   235
            ctx = self.linkctx(path, node)
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   236
            return self.substitute(data, path, ctx, self.rekw.sub)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   237
        return data
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   238
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   239
    def iskwfile(self, cand, ctx):
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   240
        '''Returns subset of candidates which are configured for keyword
993
e50f10baa81a Correct grammar in iskwfile docstring
Christian Ebert <blacktrash@gmx.net>
parents: 991
diff changeset
   241
        expansion but are not symbolic links.'''
1073
bc8e57c1ae32 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 1042
diff changeset
   242
        return [f for f in cand if self.match(f) and 'l' not in ctx.flags(f)]
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   243
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   244
    def overwrite(self, ctx, candidates, lookup, expand, rekw=False):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   245
        '''Overwrites selected files expanding/shrinking keywords.'''
1079
502c40551c8d Rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 1077
diff changeset
   246
        if self.restrict or lookup or self.postcommit: # exclude kw_copy
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   247
            candidates = self.iskwfile(candidates, ctx)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   248
        if not candidates:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   249
            return
846
d565787a8a5d Fix regressions introduced in 9d01f9cab5e2
Christian Ebert <blacktrash@gmx.net>
parents: 842
diff changeset
   250
        kwcmd = self.restrict and lookup # kwexpand/kwshrink
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   251
        if self.restrict or expand and lookup:
769
3bf3212b13bc Postpone manifest calculation in kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 767
diff changeset
   252
            mf = ctx.manifest()
979
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   253
        if self.restrict or rekw:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   254
            re_kw = self.rekw
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   255
        else:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   256
            re_kw = self.rekwexp
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   257
        if expand:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   258
            msg = _('overwriting %s expanding keywords\n')
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   259
        else:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   260
            msg = _('overwriting %s shrinking keywords\n')
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   261
        for f in candidates:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   262
            if self.restrict:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   263
                data = self.repo.file(f).read(mf[f])
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   264
            else:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   265
                data = self.repo.wread(f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   266
            if util.binary(data):
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   267
                continue
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   268
            if expand:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   269
                if lookup:
981
0b32ba113ad2 Preserve file mode when overwriting
Christian Ebert <blacktrash@gmx.net>
parents: 979
diff changeset
   270
                    ctx = self.linkctx(f, mf[f])
0b32ba113ad2 Preserve file mode when overwriting
Christian Ebert <blacktrash@gmx.net>
parents: 979
diff changeset
   271
                data, found = self.substitute(data, f, ctx, re_kw.subn)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   272
            elif self.restrict:
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   273
                found = re_kw.search(data)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   274
            else:
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   275
                data, found = _shrinktext(data, re_kw.subn)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   276
            if found:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   277
                self.ui.note(msg % f)
981
0b32ba113ad2 Preserve file mode when overwriting
Christian Ebert <blacktrash@gmx.net>
parents: 979
diff changeset
   278
                fp = self.repo.wopener(f, "wb", atomictemp=True)
0b32ba113ad2 Preserve file mode when overwriting
Christian Ebert <blacktrash@gmx.net>
parents: 979
diff changeset
   279
                fp.write(data)
0b32ba113ad2 Preserve file mode when overwriting
Christian Ebert <blacktrash@gmx.net>
parents: 979
diff changeset
   280
                fp.close()
846
d565787a8a5d Fix regressions introduced in 9d01f9cab5e2
Christian Ebert <blacktrash@gmx.net>
parents: 842
diff changeset
   281
                if kwcmd:
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   282
                    self.repo.dirstate.normal(f)
1079
502c40551c8d Rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 1077
diff changeset
   283
                elif self.postcommit:
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   284
                    self.repo.dirstate.normallookup(f)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   285
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   286
    def shrink(self, fname, text):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   287
        '''Returns text with all keyword substitutions removed.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   288
        if self.match(fname) and not util.binary(text):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   289
            return _shrinktext(text, self.rekwexp.sub)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   290
        return text
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   291
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   292
    def shrinklines(self, fname, lines):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   293
        '''Returns lines with keyword substitutions removed.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   294
        if self.match(fname):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   295
            text = ''.join(lines)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   296
            if not util.binary(text):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   297
                return _shrinktext(text, self.rekwexp.sub).splitlines(True)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   298
        return lines
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   299
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   300
    def wread(self, fname, data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   301
        '''If in restricted mode returns data read from wdir with
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   302
        keyword substitutions removed.'''
979
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   303
        if self.restrict:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   304
            return self.shrink(fname, data)
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   305
        return data
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   306
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   307
class kwfilelog(filelog.filelog):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   308
    '''
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   309
    Subclass of filelog to hook into its read, add, cmp methods.
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   310
    Keywords are "stored" unexpanded, and processed on reading.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   311
    '''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   312
    def __init__(self, opener, kwt, path):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   313
        super(kwfilelog, self).__init__(opener, path)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   314
        self.kwt = kwt
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   315
        self.path = path
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   316
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   317
    def read(self, node):
265
1b6b7835e3f9 Count keywords in a customized kwfilelog read method
Christian Ebert <blacktrash@gmx.net>
parents: 264
diff changeset
   318
        '''Expands keywords when reading filelog.'''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   319
        data = super(kwfilelog, self).read(node)
816
00570f650792 disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 815
diff changeset
   320
        if self.renamed(node):
00570f650792 disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 815
diff changeset
   321
            return data
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   322
        return self.kwt.expand(self.path, node, data)
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   323
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   324
    def add(self, text, meta, tr, link, p1=None, p2=None):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   325
        '''Removes keyword substitutions when adding to filelog.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   326
        text = self.kwt.shrink(self.path, text)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   327
        return super(kwfilelog, self).add(text, meta, tr, link, p1, p2)
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   328
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   329
    def cmp(self, node, text):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   330
        '''Removes keyword substitutions for comparison.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   331
        text = self.kwt.shrink(self.path, text)
816
00570f650792 disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 815
diff changeset
   332
        return super(kwfilelog, self).cmp(node, text)
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   333
973
82015736cc7e Reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 968
diff changeset
   334
def _status(ui, repo, wctx, kwt, *pats, **opts):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   335
    '''Bails out if [keyword] configuration is not active.
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   336
    Returns status of working directory.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   337
    if kwt:
973
82015736cc7e Reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 968
diff changeset
   338
        return repo.status(match=scmutil.match(wctx, pats, opts), clean=True,
695
31b9e6615cec Remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 688
diff changeset
   339
                           unknown=opts.get('unknown') or opts.get('all'))
271
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   340
    if ui.configitems('keyword'):
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   341
        raise util.Abort(_('[keyword] patterns cannot match'))
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   342
    raise util.Abort(_('no [keyword] patterns configured'))
263
fc7f60b109b6 kwfiles notifies if there are no files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 262
diff changeset
   343
275
cb2b11e63906 _overwrite method for kwrepo.commit, kwexpand, kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 274
diff changeset
   344
def _kwfwrite(ui, repo, expand, *pats, **opts):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   345
    '''Selects files and passes them to kwtemplater.overwrite.'''
764
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   346
    wctx = repo[None]
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   347
    if len(wctx.parents()) > 1:
465
2f017ca736ce (stable) mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 463
diff changeset
   348
        raise util.Abort(_('outstanding uncommitted merge'))
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   349
    kwt = kwtools['templater']
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   350
    wlock = repo.wlock()
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   351
    try:
973
82015736cc7e Reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 968
diff changeset
   352
        status = _status(ui, repo, wctx, kwt, *pats, **opts)
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   353
        modified, added, removed, deleted, unknown, ignored, clean = status
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   354
        if modified or added or removed or deleted:
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   355
            raise util.Abort(_('outstanding uncommitted changes'))
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   356
        kwt.overwrite(wctx, clean, True, expand)
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   357
    finally:
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   358
        wlock.release()
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   359
938
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   360
@command('kwdemo',
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   361
         [('d', 'default', None, _('show default keyword template maps')),
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   362
          ('f', 'rcfile', '',
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   363
           _('read maps from rcfile'), _('FILE'))],
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   364
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'))
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   365
def demo(ui, repo, *args, **opts):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   366
    '''print [keywordmaps] configuration and an expansion example
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   367
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   368
    Show current, custom, or default keyword template maps and their
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   369
    expansions.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   370
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   371
    Extend the current configuration by specifying maps as arguments
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   372
    and using -f/--rcfile to source an external hgrc file.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   373
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   374
    Use -d/--default to disable current configuration.
635
49307521cf96 Reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 633
diff changeset
   375
754
6c99007688ce Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 749
diff changeset
   376
    See :hg:`help templates` for information on templates and filters.
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   377
    '''
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   378
    def demoitems(section, items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   379
        ui.write('[%s]\n' % section)
660
583a0371249c keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 656
diff changeset
   380
        for k, v in sorted(items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   381
            ui.write('%s = %s\n' % (k, v))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   382
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   383
    fn = 'demo.txt'
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   384
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
529
7197324dfa4d expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 527
diff changeset
   385
    ui.note(_('creating temporary repository at %s\n') % tmpdir)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   386
    repo = localrepo.localrepository(ui, tmpdir, True)
184
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   387
    ui.setconfig('keyword', fn, '')
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   388
    svn = ui.configbool('keywordset', 'svn')
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   389
    # explicitly set keywordset for demo output
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   390
    ui.setconfig('keywordset', 'svn', svn)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   391
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   392
    uikwmaps = ui.configitems('keywordmaps')
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   393
    if args or opts.get('rcfile'):
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   394
        ui.status(_('\n\tconfiguration using custom keyword template maps\n'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   395
        if uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   396
            ui.status(_('\textending current template maps\n'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   397
        if opts.get('default') or not uikwmaps:
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   398
            if svn:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   399
                ui.status(_('\toverriding default svn keywordset\n'))
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   400
            else:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   401
                ui.status(_('\toverriding default cvs keywordset\n'))
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   402
        if opts.get('rcfile'):
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   403
            ui.readconfig(opts.get('rcfile'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   404
        if args:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   405
            # simulate hgrc parsing
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   406
            rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   407
            fp = repo.opener('hgrc', 'w')
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   408
            fp.writelines(rcmaps)
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   409
            fp.close()
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   410
            ui.readconfig(repo.join('hgrc'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   411
        kwmaps = dict(ui.configitems('keywordmaps'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   412
    elif opts.get('default'):
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   413
        if svn:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   414
            ui.status(_('\n\tconfiguration using default svn keywordset\n'))
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   415
        else:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   416
            ui.status(_('\n\tconfiguration using default cvs keywordset\n'))
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   417
        kwmaps = _defaultkwmaps(ui)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   418
        if uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   419
            ui.status(_('\tdisabling current template maps\n'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   420
            for k, v in kwmaps.iteritems():
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   421
                ui.setconfig('keywordmaps', k, v)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   422
    else:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   423
        ui.status(_('\n\tconfiguration using current keyword template maps\n'))
979
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   424
        if uikwmaps:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   425
            kwmaps = dict(uikwmaps)
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   426
        else:
6cabb1c47f21 Avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 973
diff changeset
   427
            kwmaps = _defaultkwmaps(ui)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   428
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   429
    uisetup(ui)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   430
    reposetup(ui, repo)
710
2f341cf2268d Do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 708
diff changeset
   431
    ui.write('[extensions]\nkeyword =\n')
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   432
    demoitems('keyword', ui.configitems('keyword'))
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   433
    demoitems('keywordset', ui.configitems('keywordset'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   434
    demoitems('keywordmaps', kwmaps.iteritems())
660
583a0371249c keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 656
diff changeset
   435
    keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
929
9bed13113742 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 901
diff changeset
   436
    repo.wopener.write(fn, keywords)
761
81d8da31c542 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 759
diff changeset
   437
    repo[None].add([fn])
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   438
    ui.note(_('\nkeywords written to %s:\n') % fn)
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   439
    ui.note(keywords)
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   440
    repo.dirstate.setbranch('demobranch')
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   441
    for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   442
        if name.split('.', 1)[0].find('commit') > -1:
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   443
            repo.ui.setconfig('hooks', name, '')
699
57f8b7f021e8 Mark improved demo commit message for translation
Christian Ebert <blacktrash@gmx.net>
parents: 696
diff changeset
   444
    msg = _('hg keyword configuration and expansion example')
1075
9c31017cb4b2 Intentionally ignore check-code warning about unwrapped ui message
Christian Ebert <blacktrash@gmx.net>
parents: 1073
diff changeset
   445
    ui.note("hg ci -m '%s'\n" % msg) # check-code-ignore
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   446
    repo.commit(text=msg)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   447
    ui.status(_('\n\tkeywords expanded\n'))
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   448
    ui.write(repo.wread(fn))
251
b37f2f065a9c Ignore errors when removing temp dir in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 250
diff changeset
   449
    shutil.rmtree(tmpdir, ignore_errors=True)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   450
938
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   451
@command('kwexpand', commands.walkopts, _('hg kwexpand [OPTION]... [FILE]...'))
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   452
def expand(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   453
    '''expand keywords in the working directory
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   454
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   455
    Run after (re)enabling keyword expansion.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   456
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   457
    kwexpand refuses to run if given files contain local changes.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   458
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   459
    # 3rd argument sets expansion to True
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   460
    _kwfwrite(ui, repo, True, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   461
938
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   462
@command('kwfiles',
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   463
         [('A', 'all', None, _('show keyword status flags of all files')),
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   464
          ('i', 'ignore', None, _('show files excluded from expansion')),
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   465
          ('u', 'unknown', None, _('only show unknown (not tracked) files')),
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   466
         ] + commands.walkopts,
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   467
         _('hg kwfiles [OPTION]... [FILE]...'))
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   468
def files(ui, repo, *pats, **opts):
597
795a95d7dc61 Improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 596
diff changeset
   469
    '''show files configured for keyword expansion
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   470
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   471
    List which files in the working directory are matched by the
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   472
    [keyword] configuration patterns.
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   473
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   474
    Useful to prevent inadvertent keyword expansion and to speed up
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   475
    execution by including only files that are actual candidates for
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   476
    expansion.
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   477
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
   478
    See :hg:`help keyword` on how to construct patterns both for
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   479
    inclusion and exclusion of files.
597
795a95d7dc61 Improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 596
diff changeset
   480
654
e188e35ff4ad Uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 653
diff changeset
   481
    With -A/--all and -v/--verbose the codes used to show the status
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   482
    of files are::
620
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   483
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   484
      K = keyword expansion candidate
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   485
      k = keyword expansion candidate (not tracked)
620
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   486
      I = ignored
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   487
      i = ignored (not tracked)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   488
    '''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   489
    kwt = kwtools['templater']
973
82015736cc7e Reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 968
diff changeset
   490
    wctx = repo[None]
82015736cc7e Reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 968
diff changeset
   491
    status = _status(ui, repo, wctx, kwt, *pats, **opts)
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   492
    cwd = pats and repo.getcwd() or ''
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   493
    modified, added, removed, deleted, unknown, ignored, clean = status
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   494
    files = []
695
31b9e6615cec Remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 688
diff changeset
   495
    if not opts.get('unknown') or opts.get('all'):
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   496
        files = sorted(modified + added + clean)
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   497
    kwfiles = kwt.iskwfile(files, wctx)
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   498
    kwdeleted = kwt.iskwfile(deleted, wctx)
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   499
    kwunknown = kwt.iskwfile(unknown, wctx)
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   500
    if not opts.get('ignore') or opts.get('all'):
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   501
        showfiles = kwfiles, kwdeleted, kwunknown
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   502
    else:
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   503
        showfiles = [], [], []
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   504
    if opts.get('all') or opts.get('ignore'):
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   505
        showfiles += ([f for f in files if f not in kwfiles],
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   506
                      [f for f in unknown if f not in kwunknown])
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   507
    kwlabels = 'enabled deleted enabledunknown ignored ignoredunknown'.split()
1114
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   508
    kwstates = zip(kwlabels, 'K!kIi', showfiles)
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   509
    fm = ui.formatter('kwfiles', opts)
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   510
    fmt = '%.0s%s\n'
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   511
    if opts.get('all') or ui.verbose:
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   512
        fmt = '%s %s\n'
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   513
    for kwstate, char, filenames in kwstates:
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   514
        label = 'kwfiles.' + kwstate
298
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   515
        for f in filenames:
1114
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   516
            fm.startitem()
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   517
            fm.write('kwstatus path', fmt, char,
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   518
                     repo.pathto(f, cwd), label=label)
22b300b7a7c1 Use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 1082
diff changeset
   519
    fm.end()
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   520
938
9e55adfb3a21 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 929
diff changeset
   521
@command('kwshrink', commands.walkopts, _('hg kwshrink [OPTION]... [FILE]...'))
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   522
def shrink(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   523
    '''revert expanded keywords in the working directory
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   524
873
05e160f8f8bc Update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 871
diff changeset
   525
    Must be run before changing/disabling active keywords.
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   526
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   527
    kwshrink refuses to run if given files contain local changes.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   528
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   529
    # 3rd argument sets expansion to False
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   530
    _kwfwrite(ui, repo, False, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   531
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   532
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   533
def uisetup(ui):
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   534
    ''' Monkeypatches dispatch._parse to retrieve user command.'''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   535
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   536
    def kwdispatch_parse(orig, ui, args):
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   537
        '''Monkeypatch dispatch._parse to obtain running hg command.'''
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   538
        cmd, func, args, options, cmdoptions = orig(ui, args)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   539
        kwtools['hgcmd'] = cmd
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   540
        return cmd, func, args, options, cmdoptions
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   541
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   542
    extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   543
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   544
def reposetup(ui, repo):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   545
    '''Sets up repo as kwrepo for keyword substitution.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   546
    Overrides file method to return kwfilelog instead of filelog
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   547
    if file matches user configuration.
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   548
    Wraps commit to overwrite configured files with updated
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   549
    keyword substitutions.
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   550
    Monkeypatches patch and webcommands.'''
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
   551
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   552
    try:
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   553
        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   554
            or '.hg' in util.splitpath(repo.root)
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   555
            or repo._url.startswith('bundle:')):
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   556
            return
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   557
    except AttributeError:
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   558
        pass
292
783c1310e20f Avoid dispatch import, revert to simple argument parser
Christian Ebert <blacktrash@gmx.net>
parents: 290
diff changeset
   559
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   560
    inc, exc = [], ['.hg*']
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   561
    for pat, opt in ui.configitems('keyword'):
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   562
        if opt != 'ignore':
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   563
            inc.append(pat)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   564
        else:
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   565
            exc.append(pat)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   566
    if not inc:
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   567
        return
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   568
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   569
    kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
261
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   570
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   571
    class kwrepo(repo.__class__):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   572
        def file(self, f):
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   573
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   574
                f = f[1:]
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   575
            return kwfilelog(self.sopener, kwt, f)
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   576
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   577
        def wread(self, filename):
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   578
            data = super(kwrepo, self).wread(filename)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   579
            return kwt.wread(filename, data)
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   580
611
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   581
        def commit(self, *args, **opts):
600
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   582
            # use custom commitctx for user commands
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   583
            # other extensions can still wrap repo.commitctx directly
611
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   584
            self.commitctx = self.kwcommitctx
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   585
            try:
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   586
                return super(kwrepo, self).commit(*args, **opts)
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   587
            finally:
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   588
                del self.commitctx
600
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   589
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   590
        def kwcommitctx(self, ctx, error=False):
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   591
            n = super(kwrepo, self).commitctx(ctx, error)
715
0614ba0295f6 Add forgotten comment
Christian Ebert <blacktrash@gmx.net>
parents: 714
diff changeset
   592
            # no lock needed, only called from repo.commit() which already locks
1079
502c40551c8d Rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 1077
diff changeset
   593
            if not kwt.postcommit:
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   594
                restrict = kwt.restrict
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   595
                kwt.restrict = True
764
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   596
                kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   597
                              False, True)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   598
                kwt.restrict = restrict
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   599
            return n
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   600
991
68475648cd7e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 981
diff changeset
   601
        def rollback(self, dryrun=False, force=False):
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   602
            wlock = self.wlock()
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   603
            try:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   604
                if not dryrun:
811
31205612c018 Rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 809
diff changeset
   605
                    changed = self['.'].files()
991
68475648cd7e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 981
diff changeset
   606
                ret = super(kwrepo, self).rollback(dryrun, force)
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   607
                if not dryrun:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   608
                    ctx = self['.']
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   609
                    modified, added = _preselect(self[None].status(), changed)
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   610
                    kwt.overwrite(ctx, modified, True, True)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   611
                    kwt.overwrite(ctx, added, True, False)
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   612
                return ret
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   613
            finally:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   614
                wlock.release()
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   615
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   616
    # monkeypatches
964
aaafe06aaa5f patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 958
diff changeset
   617
    def kwpatchfile_init(orig, self, ui, gp, backend, store, eolmode=None):
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   618
        '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   619
        rejects or conflicts due to expanded keywords in working dir.'''
964
aaafe06aaa5f patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 958
diff changeset
   620
        orig(self, ui, gp, backend, store, eolmode)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   621
        # shrink keywords read from working dir
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   622
        self.lines = kwt.shrinklines(self.fname, self.lines)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   623
502
6fccffd4059a patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 500
diff changeset
   624
    def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None,
788
1ae8e3a80298 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 773
diff changeset
   625
                opts=None, prefix=''):
808
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   626
        '''Monkeypatch patch.diff to avoid expansion.'''
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   627
        kwt.restrict = True
788
1ae8e3a80298 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 773
diff changeset
   628
        return orig(repo, node1, node2, match, changes, opts, prefix)
463
55f535bc13bc keyword: disable expansion for annotate
Christian Ebert <blacktrash@gmx.net>
parents: 452
diff changeset
   629
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   630
    def kwweb_skip(orig, web, req, tmpl):
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   631
        '''Wraps webcommands.x turning off keyword expansion.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   632
        kwt.match = util.never
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   633
        return orig(web, req, tmpl)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   634
1080
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   635
    def kw_amend(orig, ui, repo, commitfunc, old, extra, pats, opts):
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   636
        '''Wraps cmdutil.amend expanding keywords after amend.'''
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   637
        wlock = repo.wlock()
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   638
        try:
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   639
            kwt.postcommit = True
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   640
            newid = orig(ui, repo, commitfunc, old, extra, pats, opts)
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   641
            if newid != old.node():
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   642
                ctx = repo[newid]
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   643
                kwt.restrict = True
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   644
                kwt.overwrite(ctx, ctx.files(), False, True)
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   645
                kwt.restrict = False
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   646
            return newid
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   647
        finally:
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   648
            wlock.release()
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   649
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   650
    def kw_copy(orig, ui, repo, pats, opts, rename=False):
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   651
        '''Wraps cmdutil.copy so that copy/rename destinations do not
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   652
        contain expanded keywords.
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   653
        Note that the source of a regular file destination may also be a
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   654
        symlink:
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   655
        hg cp sym x                -> x is symlink
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   656
        cp sym x; hg cp -A sym x   -> x is file (maybe expanded keywords)
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   657
        For the latter we have to follow the symlink to find out whether its
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   658
        target is configured for expansion and we therefore must unexpand the
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   659
        keywords in the destination.'''
1081
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   660
        wlock = repo.wlock()
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   661
        try:
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   662
            orig(ui, repo, pats, opts, rename)
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   663
            if opts.get('dry_run'):
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   664
                return
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   665
            wctx = repo[None]
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   666
            cwd = repo.getcwd()
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   667
1081
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   668
            def haskwsource(dest):
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   669
                '''Returns true if dest is a regular file and configured for
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   670
                expansion or a symlink which points to a file configured for
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   671
                expansion. '''
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   672
                source = repo.dirstate.copied(dest)
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   673
                if 'l' in wctx.flags(source):
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   674
                    source = scmutil.canonpath(repo.root, cwd,
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   675
                                               os.path.realpath(source))
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   676
                return kwt.match(source)
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   677
1081
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   678
            candidates = [f for f in repo.dirstate.copies() if
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   679
                          'l' not in wctx.flags(f) and haskwsource(f)]
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   680
            kwt.overwrite(wctx, candidates, False, False)
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   681
        finally:
adc6c1fea13d Wlock cmdutil.copy wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 1080
diff changeset
   682
            wlock.release()
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   683
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   684
    def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   685
        '''Wraps record.dorecord expanding keywords after recording.'''
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   686
        wlock = repo.wlock()
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   687
        try:
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   688
            # record returns 0 even when nothing has changed
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   689
            # therefore compare nodes before and after
1079
502c40551c8d Rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 1077
diff changeset
   690
            kwt.postcommit = True
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   691
            ctx = repo['.']
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   692
            wstatus = repo[None].status()
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   693
            ret = orig(ui, repo, commitfunc, *pats, **opts)
818
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   694
            recctx = repo['.']
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   695
            if ctx != recctx:
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   696
                modified, added = _preselect(wstatus, recctx.files())
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   697
                kwt.restrict = False
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   698
                kwt.overwrite(recctx, modified, False, True)
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   699
                kwt.overwrite(recctx, added, False, True, True)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   700
                kwt.restrict = True
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   701
            return ret
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   702
        finally:
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   703
            wlock.release()
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   704
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   705
    def kwfilectx_cmp(orig, self, fctx):
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   706
        # keyword affects data size, comparing wdir and filelog size does
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   707
        # not make sense
842
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   708
        if (fctx._filerev is None and
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   709
            (self._repo._encodefilterpats or
1073
bc8e57c1ae32 cleanup: "not x in y" -> "x not in y"
Brodie Rao <brodie@sf.io>
parents: 1042
diff changeset
   710
             kwt.match(fctx.path()) and 'l' not in fctx.flags() or
1042
91e083fab1a3 Update filectx.cmp monkeypatch to handle '\1\n' at start of file
Christian Ebert <blacktrash@gmx.net>
parents: 998
diff changeset
   711
             self.size() - 4 == fctx.size()) or
842
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   712
            self.size() == fctx.size()):
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   713
            return self._filelog.cmp(self._filenode, fctx.data())
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   714
        return True
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   715
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   716
    extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   717
    extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
808
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   718
    extensions.wrapfunction(patch, 'diff', kw_diff)
1080
4ee1c08706c4 Support commit --amend (issue3471)
Christian Ebert <blacktrash@gmx.net>
parents: 1079
diff changeset
   719
    extensions.wrapfunction(cmdutil, 'amend', kw_amend)
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   720
    extensions.wrapfunction(cmdutil, 'copy', kw_copy)
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   721
    for c in 'annotate changeset rev filediff diff'.split():
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   722
        extensions.wrapfunction(webcommands, c, kwweb_skip)
749
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   723
    for name in recordextensions.split():
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   724
        try:
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   725
            record = extensions.find(name)
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   726
            extensions.wrapfunction(record, 'dorecord', kw_dorecord)
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   727
        except KeyError:
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   728
            pass
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   729
875
e01f1b4a62e9 Move repo.__class__ assignment out of monkeypatch context
Christian Ebert <blacktrash@gmx.net>
parents: 874
diff changeset
   730
    repo.__class__ = kwrepo