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