hgkw/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Mon, 14 Mar 2011 12:26:50 +0100
changeset 893 24924dfb8326
parent 892 d6b24cad9513
child 897 2ffafb688274
permissions -rw-r--r--
Offer additional datefilters when the extension is enabled Before the additional datefilters (utcdate, svnisodate, svnutcdate) were used when kwtemplater was initialized. Now they always be used once the extension is enabled.
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
#
696
2305f9255f04 Update copyright
Christian Ebert <blacktrash@gmx.net>
parents: 695
diff changeset
     3
# Copyright 2007-2010 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
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    10
# Keyword expansion hack against the grain of a DSCM
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
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    63
Three additional date template filters are provided::
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    64
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    65
    utcdate      "2006/09/18 15:13:13"
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    66
    svnutcdate   "2006-09-18 15:13:13Z"
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
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
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
    86
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
    87
from mercurial.i18n import _
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
    88
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
    89
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    90
commands.optionalrepo += ' kwdemo'
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    91
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    92
# hg commands that do not act on keywords
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
    93
nokwcommands = ('add addremove annotate bundle export grep incoming init log'
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
    94
                ' 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
    95
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    96
# 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
    97
# 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
    98
restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    99
749
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   100
# names of extensions using dorecord
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   101
recordextensions = 'record'
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   102
870
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   103
colortable = {
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   104
    'kwfiles.enabled': 'green bold',
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   105
    'kwfiles.deleted': 'cyan bold underline',
870
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   106
    'kwfiles.enabledunknown': 'green',
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   107
    'kwfiles.ignored': 'bold',
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   108
    'kwfiles.ignoredunknown': 'none'
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   109
}
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   110
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   111
# date like in cvs' $Date
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   112
def utcdate(text):
892
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   113
    ''':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
   114
    '''
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   115
    return util.datestr((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
   116
# date like in svn's $Date
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   117
def svnisodate(text):
892
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   118
    ''':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
   119
    +0200 (Tue, 18 Aug 2009)".
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   120
    '''
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   121
    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
   122
# date like in svn's $Id
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   123
def svnutcdate(text):
892
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   124
    ''':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
   125
    11:00:13Z".
d6b24cad9513 Docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 890
diff changeset
   126
    '''
890
ddd525b7dd4a templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 875
diff changeset
   127
    return util.datestr((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
   128
893
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   129
templatefilters.filters.update({'utcdate': utcdate,
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   130
                                'svnisodate': svnisodate,
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   131
                                'svnutcdate': svnutcdate})
24924dfb8326 Offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 892
diff changeset
   132
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   133
# make keyword tools accessible
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   134
kwtools = {'templater': None, 'hgcmd': ''}
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   135
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   136
def _defaultkwmaps(ui):
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   137
    '''Returns default keywordmaps according to keywordset configuration.'''
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   138
    templates = {
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   139
        'Revision': '{node|short}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   140
        'Author': '{author|user}',
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   141
    }
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   142
    kwsets = ({
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   143
        'Date': '{date|utcdate}',
662
25e813ce68e2 The CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 660
diff changeset
   144
        'RCSfile': '{file|basename},v',
665
06ccaeb6cfc1 keyword: clarify object of backwards compatibility
timeless
parents: 662
diff changeset
   145
        'RCSFile': '{file|basename},v', # kept for backwards compatibility
06ccaeb6cfc1 keyword: clarify object of backwards compatibility
timeless
parents: 662
diff changeset
   146
                                        # with hg-keyword
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   147
        'Source': '{root}/{file},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   148
        '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
   149
        '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
   150
    }, {
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   151
        'Date': '{date|svnisodate}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   152
        '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
   153
        'LastChangedRevision': '{node|short}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   154
        'LastChangedBy': '{author|user}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   155
        'LastChangedDate': '{date|svnisodate}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   156
    })
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   157
    templates.update(kwsets[ui.configbool('keywordset', 'svn')])
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   158
    return templates
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   159
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   160
def _shrinktext(text, subfunc):
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   161
    '''Helper for keyword expansion removal in text.
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   162
    Depending on subfunc also returns number of substitutions.'''
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   163
    return subfunc(r'$\1$', text)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   164
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   165
def _preselect(wstatus, changed):
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   166
    '''Retrieves modfied and added files from a working directory state
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   167
    and returns the subset of each contained in given changed files
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   168
    retrieved from a change context.'''
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   169
    modified, added = wstatus[:2]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   170
    modified = [f for f in modified if f in changed]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   171
    added = [f for f in added if f in changed]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   172
    return modified, added
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   173
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   174
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   175
class kwtemplater(object):
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   176
    '''
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   177
    Sets up keyword templates, corresponding keyword regex, and
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   178
    provides keyword substitution functions.
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   179
    '''
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   180
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   181
    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
   182
        self.ui = ui
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   183
        self.repo = repo
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   184
        self.match = match.match(repo.root, '', [], inc, exc)
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   185
        self.restrict = kwtools['hgcmd'] in restricted.split()
819
8f2c2cc51789 Switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 818
diff changeset
   186
        self.record = False
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   187
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   188
        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
   189
        if kwmaps: # override default templates
609
fefdf82b2320 Collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 606
diff changeset
   190
            self.templates = dict((k, templater.parsestring(v, False))
fefdf82b2320 Collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 606
diff changeset
   191
                                  for k, v in kwmaps)
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   192
        else:
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   193
            self.templates = _defaultkwmaps(self.ui)
235
baef9dcfb219 Compatible repo.dirstate.normal/update into own function
Christian Ebert <blacktrash@gmx.net>
parents: 234
diff changeset
   194
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   195
    @util.propertycache
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   196
    def escape(self):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   197
        '''Returns bar-separated and escaped keywords.'''
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   198
        return '|'.join(map(re.escape, self.templates.keys()))
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
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 rekw(self):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   202
        '''Returns regex for unexpanded keywords.'''
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   203
        return re.compile(r'\$(%s)\$' % self.escape)
848
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 rekwexp(self):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   207
        '''Returns regex for expanded 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): [^$\n\r]*? \$' % self.escape)
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   209
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   210
    def substitute(self, data, path, ctx, subfunc):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   211
        '''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
   212
        def kwsub(mobj):
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   213
            kw = mobj.group(1)
714
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   214
            ct = cmdutil.changeset_templater(self.ui, self.repo,
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   215
                                             False, None, '', False)
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   216
            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
   217
            self.ui.pushbuffer()
714
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   218
            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
   219
            ekw = templatefilters.firstline(self.ui.popbuffer())
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   220
            return '$%s: %s $' % (kw, ekw)
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   221
        return subfunc(kwsub, data)
255
c4f37735be9b Turn off debug while expanding
Christian Ebert <blacktrash@gmx.net>
parents: 254
diff changeset
   222
849
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   223
    def linkctx(self, path, fileid):
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   224
        '''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
   225
        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
   226
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   227
    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
   228
        '''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
   229
        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
   230
            ctx = self.linkctx(path, node)
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   231
            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
   232
        return data
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   233
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   234
    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
   235
        '''Returns subset of candidates which are configured for keyword
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   236
        expansion are not symbolic links.'''
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   237
        return [f for f in cand if self.match(f) and not 'l' in ctx.flags(f)]
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   238
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   239
    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
   240
        '''Overwrites selected files expanding/shrinking keywords.'''
846
d565787a8a5d Fix regressions introduced in 9d01f9cab5e2
Christian Ebert <blacktrash@gmx.net>
parents: 842
diff changeset
   241
        if self.restrict or lookup or self.record: # exclude kw_copy
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   242
            candidates = self.iskwfile(candidates, ctx)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   243
        if not candidates:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   244
            return
846
d565787a8a5d Fix regressions introduced in 9d01f9cab5e2
Christian Ebert <blacktrash@gmx.net>
parents: 842
diff changeset
   245
        kwcmd = self.restrict and lookup # kwexpand/kwshrink
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   246
        if self.restrict or expand and lookup:
769
3bf3212b13bc Postpone manifest calculation in kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 767
diff changeset
   247
            mf = ctx.manifest()
849
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   248
        lctx = ctx
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   249
        re_kw = (self.restrict or rekw) and self.rekw or self.rekwexp
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   250
        msg = (expand and _('overwriting %s expanding keywords\n')
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   251
               or _('overwriting %s shrinking keywords\n'))
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   252
        for f in candidates:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   253
            if self.restrict:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   254
                data = self.repo.file(f).read(mf[f])
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   255
            else:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   256
                data = self.repo.wread(f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   257
            if util.binary(data):
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   258
                continue
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   259
            if expand:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   260
                if lookup:
849
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   261
                    lctx = self.linkctx(f, mf[f])
f7b34429edb7 Function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 848
diff changeset
   262
                data, found = self.substitute(data, f, lctx, re_kw.subn)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   263
            elif self.restrict:
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   264
                found = re_kw.search(data)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   265
            else:
848
3e57838f5434 Compile regexes on demand
Christian Ebert <blacktrash@gmx.net>
parents: 846
diff changeset
   266
                data, found = _shrinktext(data, re_kw.subn)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   267
            if found:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   268
                self.ui.note(msg % f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   269
                self.repo.wwrite(f, data, ctx.flags(f))
846
d565787a8a5d Fix regressions introduced in 9d01f9cab5e2
Christian Ebert <blacktrash@gmx.net>
parents: 842
diff changeset
   270
                if kwcmd:
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   271
                    self.repo.dirstate.normal(f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   272
                elif self.record:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   273
                    self.repo.dirstate.normallookup(f)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   274
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   275
    def shrink(self, fname, text):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   276
        '''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
   277
        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
   278
            return _shrinktext(text, self.rekwexp.sub)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   279
        return text
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   280
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   281
    def shrinklines(self, fname, lines):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   282
        '''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
   283
        if self.match(fname):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   284
            text = ''.join(lines)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   285
            if not util.binary(text):
854
3450d7f7d1a3 Turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 849
diff changeset
   286
                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
   287
        return lines
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   288
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   289
    def wread(self, fname, data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   290
        '''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
   291
        keyword substitutions removed.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   292
        return self.restrict and self.shrink(fname, data) or data
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   293
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   294
class kwfilelog(filelog.filelog):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   295
    '''
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   296
    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
   297
    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
   298
    '''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   299
    def __init__(self, opener, kwt, path):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   300
        super(kwfilelog, self).__init__(opener, path)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   301
        self.kwt = kwt
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   302
        self.path = path
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   303
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   304
    def read(self, node):
265
1b6b7835e3f9 Count keywords in a customized kwfilelog read method
Christian Ebert <blacktrash@gmx.net>
parents: 264
diff changeset
   305
        '''Expands keywords when reading filelog.'''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   306
        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
   307
        if self.renamed(node):
00570f650792 disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 815
diff changeset
   308
            return data
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   309
        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
   310
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   311
    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
   312
        '''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
   313
        text = self.kwt.shrink(self.path, text)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   314
        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
   315
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   316
    def cmp(self, node, text):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   317
        '''Removes keyword substitutions for comparison.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   318
        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
   319
        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
   320
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   321
def _status(ui, repo, kwt, *pats, **opts):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   322
    '''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
   323
    Returns status of working directory.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   324
    if kwt:
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   325
        return repo.status(match=cmdutil.match(repo, pats, opts), clean=True,
695
31b9e6615cec Remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 688
diff changeset
   326
                           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
   327
    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
   328
        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
   329
    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
   330
275
cb2b11e63906 _overwrite method for kwrepo.commit, kwexpand, kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 274
diff changeset
   331
def _kwfwrite(ui, repo, expand, *pats, **opts):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   332
    '''Selects files and passes them to kwtemplater.overwrite.'''
764
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   333
    wctx = repo[None]
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   334
    if len(wctx.parents()) > 1:
465
2f017ca736ce (stable) mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 463
diff changeset
   335
        raise util.Abort(_('outstanding uncommitted merge'))
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   336
    kwt = kwtools['templater']
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   337
    wlock = repo.wlock()
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   338
    try:
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   339
        status = _status(ui, repo, kwt, *pats, **opts)
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   340
        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
   341
        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
   342
            raise util.Abort(_('outstanding uncommitted changes'))
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   343
        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
   344
    finally:
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   345
        wlock.release()
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   346
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   347
def demo(ui, repo, *args, **opts):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   348
    '''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
   349
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   350
    Show current, custom, or default keyword template maps and their
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   351
    expansions.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   352
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   353
    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
   354
    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
   355
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   356
    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
   357
754
6c99007688ce Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 749
diff changeset
   358
    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
   359
    '''
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   360
    def demoitems(section, items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   361
        ui.write('[%s]\n' % section)
660
583a0371249c keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 656
diff changeset
   362
        for k, v in sorted(items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   363
            ui.write('%s = %s\n' % (k, v))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   364
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   365
    fn = 'demo.txt'
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   366
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
529
7197324dfa4d expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 527
diff changeset
   367
    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
   368
    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
   369
    ui.setconfig('keyword', fn, '')
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   370
    svn = ui.configbool('keywordset', 'svn')
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   371
    # explicitly set keywordset for demo output
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   372
    ui.setconfig('keywordset', 'svn', svn)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   373
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   374
    uikwmaps = ui.configitems('keywordmaps')
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   375
    if args or opts.get('rcfile'):
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   376
        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
   377
        if uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   378
            ui.status(_('\textending current template maps\n'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   379
        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
   380
            if svn:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   381
                ui.status(_('\toverriding default svn keywordset\n'))
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   382
            else:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   383
                ui.status(_('\toverriding default cvs keywordset\n'))
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   384
        if opts.get('rcfile'):
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   385
            ui.readconfig(opts.get('rcfile'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   386
        if args:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   387
            # simulate hgrc parsing
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   388
            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
   389
            fp = repo.opener('hgrc', 'w')
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   390
            fp.writelines(rcmaps)
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   391
            fp.close()
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   392
            ui.readconfig(repo.join('hgrc'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   393
        kwmaps = dict(ui.configitems('keywordmaps'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   394
    elif opts.get('default'):
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   395
        if svn:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   396
            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
   397
        else:
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   398
            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
   399
        kwmaps = _defaultkwmaps(ui)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   400
        if uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   401
            ui.status(_('\tdisabling current template maps\n'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   402
            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
   403
                ui.setconfig('keywordmaps', k, v)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   404
    else:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   405
        ui.status(_('\n\tconfiguration using current keyword template maps\n'))
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   406
        kwmaps = dict(uikwmaps) or _defaultkwmaps(ui)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   407
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   408
    uisetup(ui)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   409
    reposetup(ui, repo)
710
2f341cf2268d Do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 708
diff changeset
   410
    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
   411
    demoitems('keyword', ui.configitems('keyword'))
874
272a8a316f7a Inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 873
diff changeset
   412
    demoitems('keywordset', ui.configitems('keywordset'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   413
    demoitems('keywordmaps', kwmaps.iteritems())
660
583a0371249c keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 656
diff changeset
   414
    keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   415
    repo.wopener(fn, 'w').write(keywords)
761
81d8da31c542 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 759
diff changeset
   416
    repo[None].add([fn])
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   417
    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
   418
    ui.note(keywords)
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   419
    repo.dirstate.setbranch('demobranch')
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   420
    for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   421
        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
   422
            repo.ui.setconfig('hooks', name, '')
699
57f8b7f021e8 Mark improved demo commit message for translation
Christian Ebert <blacktrash@gmx.net>
parents: 696
diff changeset
   423
    msg = _('hg keyword configuration and expansion example')
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   424
    ui.note("hg ci -m '%s'\n" % msg)
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   425
    repo.commit(text=msg)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   426
    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
   427
    ui.write(repo.wread(fn))
251
b37f2f065a9c Ignore errors when removing temp dir in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 250
diff changeset
   428
    shutil.rmtree(tmpdir, ignore_errors=True)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   429
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   430
def expand(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   431
    '''expand keywords in the working directory
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   432
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   433
    Run after (re)enabling keyword expansion.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   434
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   435
    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
   436
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   437
    # 3rd argument sets expansion to True
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   438
    _kwfwrite(ui, repo, True, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   439
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   440
def files(ui, repo, *pats, **opts):
597
795a95d7dc61 Improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 596
diff changeset
   441
    '''show files configured for keyword expansion
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   442
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   443
    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
   444
    [keyword] configuration patterns.
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   445
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   446
    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
   447
    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
   448
    expansion.
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   449
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
   450
    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
   451
    inclusion and exclusion of files.
597
795a95d7dc61 Improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 596
diff changeset
   452
654
e188e35ff4ad Uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 653
diff changeset
   453
    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
   454
    of files are::
620
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   455
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   456
      K = keyword expansion candidate
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   457
      k = keyword expansion candidate (not tracked)
620
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   458
      I = ignored
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   459
      i = ignored (not tracked)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   460
    '''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   461
    kwt = kwtools['templater']
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   462
    status = _status(ui, repo, kwt, *pats, **opts)
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   463
    cwd = pats and repo.getcwd() or ''
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   464
    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
   465
    files = []
695
31b9e6615cec Remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 688
diff changeset
   466
    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
   467
        files = sorted(modified + added + clean)
470
2c530e5df1d4 use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 469
diff changeset
   468
    wctx = repo[None]
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   469
    kwfiles = kwt.iskwfile(files, wctx)
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   470
    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
   471
    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
   472
    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
   473
        showfiles = kwfiles, kwdeleted, kwunknown
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   474
    else:
871
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   475
        showfiles = [], [], []
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   476
    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
   477
        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
   478
                      [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
   479
    kwlabels = 'enabled deleted enabledunknown ignored ignoredunknown'.split()
c2651cd808b7 Make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 870
diff changeset
   480
    kwstates = zip('K!kIi', showfiles, kwlabels)
870
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   481
    for char, filenames, kwstate in kwstates:
509
16b690351c0d Do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 507
diff changeset
   482
        fmt = (opts.get('all') or ui.verbose) and '%s %%s\n' % char or '%s\n'
298
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   483
        for f in filenames:
870
ef8b368bf24b Colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 868
diff changeset
   484
            ui.write(fmt % repo.pathto(f, cwd), label='kwfiles.' + kwstate)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   485
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   486
def shrink(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   487
    '''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
   488
873
05e160f8f8bc Update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 871
diff changeset
   489
    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
   490
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   491
    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
   492
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   493
    # 3rd argument sets expansion to False
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   494
    _kwfwrite(ui, repo, False, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   495
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   496
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   497
def uisetup(ui):
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   498
    ''' Monkeypatches dispatch._parse to retrieve user command.'''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   499
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   500
    def kwdispatch_parse(orig, ui, args):
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   501
        '''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
   502
        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
   503
        kwtools['hgcmd'] = cmd
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   504
        return cmd, func, args, options, cmdoptions
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   505
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   506
    extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   507
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   508
def reposetup(ui, repo):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   509
    '''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
   510
    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
   511
    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
   512
    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
   513
    keyword substitutions.
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   514
    Monkeypatches patch and webcommands.'''
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
   515
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   516
    try:
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   517
        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   518
            or '.hg' in util.splitpath(repo.root)
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   519
            or repo._url.startswith('bundle:')):
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   520
            return
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   521
    except AttributeError:
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   522
        pass
292
783c1310e20f Avoid dispatch import, revert to simple argument parser
Christian Ebert <blacktrash@gmx.net>
parents: 290
diff changeset
   523
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   524
    inc, exc = [], ['.hg*']
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   525
    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
   526
        if opt != 'ignore':
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   527
            inc.append(pat)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   528
        else:
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   529
            exc.append(pat)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   530
    if not inc:
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   531
        return
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   532
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   533
    kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
261
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   534
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   535
    class kwrepo(repo.__class__):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   536
        def file(self, f):
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   537
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   538
                f = f[1:]
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   539
            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
   540
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   541
        def wread(self, filename):
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   542
            data = super(kwrepo, self).wread(filename)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   543
            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
   544
611
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   545
        def commit(self, *args, **opts):
600
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   546
            # use custom commitctx for user commands
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   547
            # 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
   548
            self.commitctx = self.kwcommitctx
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   549
            try:
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   550
                return super(kwrepo, self).commit(*args, **opts)
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   551
            finally:
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   552
                del self.commitctx
600
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   553
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   554
        def kwcommitctx(self, ctx, error=False):
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   555
            n = super(kwrepo, self).commitctx(ctx, error)
715
0614ba0295f6 Add forgotten comment
Christian Ebert <blacktrash@gmx.net>
parents: 714
diff changeset
   556
            # no lock needed, only called from repo.commit() which already locks
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   557
            if not kwt.record:
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   558
                restrict = kwt.restrict
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   559
                kwt.restrict = True
764
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   560
                kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   561
                              False, True)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   562
                kwt.restrict = restrict
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   563
            return n
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   564
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   565
        def rollback(self, dryrun=False):
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   566
            wlock = self.wlock()
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   567
            try:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   568
                if not dryrun:
811
31205612c018 Rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 809
diff changeset
   569
                    changed = self['.'].files()
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   570
                ret = super(kwrepo, self).rollback(dryrun)
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   571
                if not dryrun:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   572
                    ctx = self['.']
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   573
                    modified, added = _preselect(self[None].status(), changed)
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   574
                    kwt.overwrite(ctx, modified, True, True)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   575
                    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
   576
                return ret
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   577
            finally:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   578
                wlock.release()
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   579
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   580
    # monkeypatches
602
b21fe4c86037 Break overlong line
Christian Ebert <blacktrash@gmx.net>
parents: 600
diff changeset
   581
    def kwpatchfile_init(orig, self, ui, fname, opener,
730
bd1722740798 keyword: monkeypatch patch so that optional args can be passed as kwargs
Augie Fackler <durin42@gmail.com>
parents: 715
diff changeset
   582
                         missing=False, eolmode=None):
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   583
        '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   584
        rejects or conflicts due to expanded keywords in working dir.'''
730
bd1722740798 keyword: monkeypatch patch so that optional args can be passed as kwargs
Augie Fackler <durin42@gmail.com>
parents: 715
diff changeset
   585
        orig(self, ui, fname, opener, missing, eolmode)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   586
        # shrink keywords read from working dir
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   587
        self.lines = kwt.shrinklines(self.fname, self.lines)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   588
502
6fccffd4059a patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 500
diff changeset
   589
    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
   590
                opts=None, prefix=''):
808
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   591
        '''Monkeypatch patch.diff to avoid expansion.'''
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   592
        kwt.restrict = True
788
1ae8e3a80298 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 773
diff changeset
   593
        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
   594
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   595
    def kwweb_skip(orig, web, req, tmpl):
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   596
        '''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
   597
        kwt.match = util.never
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   598
        return orig(web, req, tmpl)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   599
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   600
    def kw_copy(orig, ui, repo, pats, opts, rename=False):
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   601
        '''Wraps cmdutil.copy so that copy/rename destinations do not
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   602
        contain expanded keywords.
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   603
        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
   604
        symlink:
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   605
        hg cp sym x                -> x is symlink
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   606
        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
   607
        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
   608
        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
   609
        keywords in the destination.'''
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   610
        orig(ui, repo, pats, opts, rename)
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   611
        if opts.get('dry_run'):
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   612
            return
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   613
        wctx = repo[None]
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   614
        cwd = repo.getcwd()
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   615
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   616
        def haskwsource(dest):
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   617
            '''Returns true if dest is a regular file and configured for
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   618
            expansion or a symlink which points to a file configured for
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   619
            expansion. '''
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   620
            source = repo.dirstate.copied(dest)
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   621
            if 'l' in wctx.flags(source):
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   622
                source = util.canonpath(repo.root, cwd,
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   623
                                        os.path.realpath(source))
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   624
            return kwt.match(source)
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   625
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   626
        candidates = [f for f in repo.dirstate.copies() if
868
16cfcb56859a Copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 864
diff changeset
   627
                      not 'l' in wctx.flags(f) and haskwsource(f)]
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   628
        kwt.overwrite(wctx, candidates, False, False)
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   629
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   630
    def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   631
        '''Wraps record.dorecord expanding keywords after recording.'''
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   632
        wlock = repo.wlock()
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   633
        try:
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   634
            # record returns 0 even when nothing has changed
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   635
            # therefore compare nodes before and after
819
8f2c2cc51789 Switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 818
diff changeset
   636
            kwt.record = True
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   637
            ctx = repo['.']
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   638
            wstatus = repo[None].status()
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   639
            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
   640
            recctx = repo['.']
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   641
            if ctx != recctx:
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   642
                modified, added = _preselect(wstatus, recctx.files())
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   643
                kwt.restrict = False
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   644
                kwt.overwrite(recctx, modified, False, True)
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   645
                kwt.overwrite(recctx, added, False, True, True)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   646
                kwt.restrict = True
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   647
            return ret
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   648
        finally:
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   649
            wlock.release()
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   650
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   651
    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
   652
        # 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
   653
        # not make sense
842
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   654
        if (fctx._filerev is None and
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   655
            (self._repo._encodefilterpats or
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   656
             kwt.match(fctx.path()) and not 'l' in fctx.flags()) or
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   657
            self.size() == fctx.size()):
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   658
            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
   659
        return True
12f6e285e4e7 Only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 840
diff changeset
   660
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   661
    extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   662
    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
   663
    extensions.wrapfunction(patch, 'diff', kw_diff)
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   664
    extensions.wrapfunction(cmdutil, 'copy', kw_copy)
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   665
    for c in 'annotate changeset rev filediff diff'.split():
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   666
        extensions.wrapfunction(webcommands, c, kwweb_skip)
749
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   667
    for name in recordextensions.split():
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   668
        try:
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   669
            record = extensions.find(name)
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   670
            extensions.wrapfunction(record, 'dorecord', kw_dorecord)
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   671
        except KeyError:
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   672
            pass
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   673
875
e01f1b4a62e9 Move repo.__class__ assignment out of monkeypatch context
Christian Ebert <blacktrash@gmx.net>
parents: 874
diff changeset
   674
    repo.__class__ = kwrepo
e01f1b4a62e9 Move repo.__class__ assignment out of monkeypatch context
Christian Ebert <blacktrash@gmx.net>
parents: 874
diff changeset
   675
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   676
cmdtable = {
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   677
    'kwdemo':
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   678
        (demo,
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   679
         [('d', 'default', None, _('show default keyword template maps')),
767
0492a5acf652 help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 765
diff changeset
   680
          ('f', 'rcfile', '',
0492a5acf652 help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 765
diff changeset
   681
           _('read maps from rcfile'), _('FILE'))],
283
071bfbd482b4 Respect Mercurial conventions in kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 282
diff changeset
   682
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...')),
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   683
    'kwexpand': (expand, commands.walkopts,
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   684
                 _('hg kwexpand [OPTION]... [FILE]...')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   685
    'kwfiles':
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   686
        (files,
654
e188e35ff4ad Uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 653
diff changeset
   687
         [('A', 'all', None, _('show keyword status flags of all files')),
270
371ce7fe5f13 kwfiles: change option "ignored" to "ignore", add option "untracked"
Christian Ebert <blacktrash@gmx.net>
parents: 269
diff changeset
   688
          ('i', 'ignore', None, _('show files excluded from expansion')),
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   689
          ('u', 'unknown', None, _('only show unknown (not tracked) files')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   690
         ] + commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   691
         _('hg kwfiles [OPTION]... [FILE]...')),
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   692
    'kwshrink': (shrink, commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   693
                 _('hg kwshrink [OPTION]... [FILE]...')),
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   694
}