hgkw/keyword.py
author Nicolas Dumazet <nicdumz.commits@gmail.com>
Tue, 27 Jul 2010 23:07:30 +0900
branchstable
changeset 840 df93d61a7790
parent 838 c793c1a87f1c
child 842 12f6e285e4e7
permissions -rw-r--r--
filectx: use ctx.size comparisons to speed up ctx.cmp Comparing sizes is cheaper than comparing file contents, as it does not involve reading the file on disk or from the filelog. It is however not always possible: some extensions, or encode filters, change data when extracting it to the working directory. [ original upstream description ]
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
     1
# keyword.py - $Keyword$ expansion for Mercurial
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     2
#
696
2305f9255f04 Update copyright
Christian Ebert <blacktrash@gmx.net>
parents: 695
diff changeset
     3
# Copyright 2007-2010 Christian Ebert <blacktrash@gmx.net>
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     4
#
540
e30c2a251010 updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 538
diff changeset
     5
# This software may be used and distributed according to the terms of the
674
0efa9d6ac11f Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 668
diff changeset
     6
# GNU General Public License version 2 or any later version.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     7
#
82
9bf0f7db5928 Add keyword; comment backwards compatible import
Christian Ebert <blacktrash@gmx.net>
parents: 81
diff changeset
     8
# $Id$
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     9
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    10
# Keyword expansion hack against the grain of a DSCM
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    11
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    12
# There are many good reasons why this is not needed in a distributed
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    13
# SCM, still it may be useful in very small projects based on single
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    15
# audience not running a version control system.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    16
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    17
# For in-depth discussion refer to
656
89e0584cdc5c change wiki/bts URLs to point to new hostname
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 654
diff changeset
    18
# <http://mercurial.selenic.com/wiki/KeywordPlan>.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    19
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    20
# Keyword expansion is based on Mercurial's changeset template mappings.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    21
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    22
# Binary files are not touched.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    23
#
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    24
# Files to act upon/ignore are specified in the [keyword] section.
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    25
# Customized keyword template mappings in the [keywordmaps] section.
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    26
#
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    27
# Run "hg help keyword" and "hg kwdemo" to get info on configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    28
584
763d20224433 extensions: improve the consistency of synopses
C?dric Duval <cedricduval@free.fr>
parents: 582
diff changeset
    29
'''expand keywords in tracked files
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    30
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    31
This extension expands RCS/CVS-like or self-customized $Keywords$ in
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    32
tracked text files selected by your configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    33
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    34
Keywords are only expanded in local repositories and not stored in the
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    35
change history. The mechanism can be regarded as a convenience for the
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    36
current user or for archive distribution.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    37
790
b14093780eaf Explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 788
diff changeset
    38
Keywords expand to the changeset data pertaining to the latest change
b14093780eaf Explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 788
diff changeset
    39
relative to the working directory parent of each file.
b14093780eaf Explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 788
diff changeset
    40
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    41
Configuration is done in the [keyword], [keywordset] and [keywordmaps]
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    42
sections of hgrc files.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    43
624
2b7eb429112e commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 621
diff changeset
    44
Example::
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    45
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    46
    [keyword]
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    47
    # expand keywords in every python file except those matching "x*"
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    48
    **.py =
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    49
    x*    = ignore
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    50
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    51
    [keywordset]
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    52
    # prefer svn- over cvs-like default keywordmaps
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    53
    svn = True
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
    54
804
b7fbc49d5c75 Use note admonition in help text
Christian Ebert <blacktrash@gmx.net>
parents: 790
diff changeset
    55
.. note::
b7fbc49d5c75 Use note admonition in help text
Christian Ebert <blacktrash@gmx.net>
parents: 790
diff changeset
    56
   The more specific you are in your filename patterns the less you
b7fbc49d5c75 Use note admonition in help text
Christian Ebert <blacktrash@gmx.net>
parents: 790
diff changeset
    57
   lose speed in huge repositories.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    58
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    59
For [keywordmaps] template mapping and expansion demonstration and
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    60
control run :hg:`kwdemo`. See :hg:`help templates` for a list of
635
49307521cf96 Reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 633
diff changeset
    61
available templates and filters.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    62
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    63
Three additional date template filters are provided::
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    64
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    65
    utcdate      "2006/09/18 15:13:13"
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    66
    svnutcdate   "2006-09-18 15:13:13Z"
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
    67
    svnisodate   "2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)"
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    68
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    69
The default template mappings (view with :hg:`kwdemo -d`) can be
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    70
replaced with customized keywords and templates. Again, run
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    71
:hg:`kwdemo` to control the results of your config changes.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    72
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
    73
Before changing/disabling active keywords, run :hg:`kwshrink` to avoid
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    74
the risk of inadvertently storing expanded keywords in the change
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    75
history.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    76
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    77
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
    78
:hg:`kwexpand`.
211
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    79
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
    80
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
    81
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
    82
{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
    83
'''
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    84
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
    85
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
    86
from mercurial import localrepo, match, patch, templatefilters, templater, util
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
    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 _
636
d0c35f5fa25f Use util.datestr for utcdate filter, make it accessable in variable
Christian Ebert <blacktrash@gmx.net>
parents: 635
diff changeset
    89
import 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
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    93
# hg commands that do not act on keywords
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
    94
nokwcommands = ('add addremove annotate bundle export grep incoming init log'
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
    95
                ' 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
    96
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    97
# 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
    98
# 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
    99
restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
   100
749
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   101
# names of extensions using dorecord
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   102
recordextensions = 'record'
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   103
756
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   104
# date like in cvs' $Date
676
c15f0019c15b Fix utcdate filter
Christian Ebert <blacktrash@gmx.net>
parents: 674
diff changeset
   105
utcdate = lambda x: util.datestr((x[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
   106
# date like in svn's $Date
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   107
svnisodate = lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   108
# date like in svn's $Id
c39a201b2b7f Add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 754
diff changeset
   109
svnutcdate = lambda x: util.datestr((x[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
   110
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   111
# make keyword tools accessible
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   112
kwtools = {'templater': None, 'hgcmd': ''}
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   113
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   114
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   115
def _defaultkwmaps(ui):
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   116
    '''Returns default keywordmaps according to keywordset configuration.'''
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   117
    templates = {
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   118
        'Revision': '{node|short}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   119
        'Author': '{author|user}',
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   120
    }
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   121
    kwsets = ({
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   122
        'Date': '{date|utcdate}',
662
25e813ce68e2 The CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 660
diff changeset
   123
        'RCSfile': '{file|basename},v',
665
06ccaeb6cfc1 keyword: clarify object of backwards compatibility
timeless
parents: 662
diff changeset
   124
        'RCSFile': '{file|basename},v', # kept for backwards compatibility
06ccaeb6cfc1 keyword: clarify object of backwards compatibility
timeless
parents: 662
diff changeset
   125
                                        # with hg-keyword
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   126
        'Source': '{root}/{file},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   127
        '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
   128
        '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
   129
    }, {
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   130
        'Date': '{date|svnisodate}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   131
        '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
   132
        'LastChangedRevision': '{node|short}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   133
        'LastChangedBy': '{author|user}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   134
        'LastChangedDate': '{date|svnisodate}',
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   135
    })
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   136
    templates.update(kwsets[ui.configbool('keywordset', 'svn')])
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   137
    return templates
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   138
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   139
def _shrinktext(text, subfunc):
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   140
    '''Helper for keyword expansion removal in text.
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   141
    Depending on subfunc also returns number of substitutions.'''
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   142
    return subfunc(r'$\1$', text)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   143
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   144
def _preselect(wstatus, changed):
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   145
    '''Retrieves modfied and added files from a working directory state
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   146
    and returns the subset of each contained in given changed files
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   147
    retrieved from a change context.'''
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   148
    modified, added = wstatus[:2]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   149
    modified = [f for f in modified if f in changed]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   150
    added = [f for f in added if f in changed]
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   151
    return modified, added
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   152
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   153
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   154
class kwtemplater(object):
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   155
    '''
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   156
    Sets up keyword templates, corresponding keyword regex, and
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   157
    provides keyword substitution functions.
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   158
    '''
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   159
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   160
    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
   161
        self.ui = ui
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   162
        self.repo = repo
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   163
        self.match = match.match(repo.root, '', [], inc, exc)
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   164
        self.restrict = kwtools['hgcmd'] in restricted.split()
819
8f2c2cc51789 Switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 818
diff changeset
   165
        self.record = False
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   166
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   167
        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
   168
        if kwmaps: # override default templates
609
fefdf82b2320 Collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 606
diff changeset
   169
            self.templates = dict((k, templater.parsestring(v, False))
fefdf82b2320 Collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 606
diff changeset
   170
                                  for k, v in kwmaps)
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   171
        else:
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   172
            self.templates = _defaultkwmaps(self.ui)
818
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   173
        escaped = '|'.join(map(re.escape, self.templates.keys()))
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   174
        self.re_kw = re.compile(r'\$(%s)\$' % escaped)
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   175
        self.re_kwexp = re.compile(r'\$(%s): [^$\n\r]*? \$' % escaped)
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   176
771
09e39675a702 Add extra datefilters in a single update call
Christian Ebert <blacktrash@gmx.net>
parents: 769
diff changeset
   177
        templatefilters.filters.update({'utcdate': utcdate,
09e39675a702 Add extra datefilters in a single update call
Christian Ebert <blacktrash@gmx.net>
parents: 769
diff changeset
   178
                                        'svnisodate': svnisodate,
09e39675a702 Add extra datefilters in a single update call
Christian Ebert <blacktrash@gmx.net>
parents: 769
diff changeset
   179
                                        'svnutcdate': svnutcdate})
235
baef9dcfb219 Compatible repo.dirstate.normal/update into own function
Christian Ebert <blacktrash@gmx.net>
parents: 234
diff changeset
   180
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   181
    def substitute(self, data, path, ctx, subfunc):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   182
        '''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
   183
        def kwsub(mobj):
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   184
            kw = mobj.group(1)
714
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   185
            ct = cmdutil.changeset_templater(self.ui, self.repo,
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   186
                                             False, None, '', False)
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   187
            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
   188
            self.ui.pushbuffer()
714
1acf49264a06 Make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 710
diff changeset
   189
            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
   190
            ekw = templatefilters.firstline(self.ui.popbuffer())
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   191
            return '$%s: %s $' % (kw, ekw)
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   192
        return subfunc(kwsub, data)
255
c4f37735be9b Turn off debug while expanding
Christian Ebert <blacktrash@gmx.net>
parents: 254
diff changeset
   193
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   194
    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
   195
        '''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
   196
        if not self.restrict and self.match(path) and not util.binary(data):
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   197
            ctx = self.repo.filectx(path, fileid=node).changectx()
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   198
            return self.substitute(data, path, ctx, self.re_kw.sub)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   199
        return data
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   200
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   201
    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
   202
        '''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
   203
        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
   204
        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
   205
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   206
    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
   207
        '''Overwrites selected files expanding/shrinking keywords.'''
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   208
        if self.restrict or lookup: # exclude kw_copy
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   209
            candidates = self.iskwfile(candidates, ctx)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   210
        if not candidates:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   211
            return
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   212
        commit = self.restrict and not lookup
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   213
        if self.restrict or expand and lookup:
769
3bf3212b13bc Postpone manifest calculation in kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 767
diff changeset
   214
            mf = ctx.manifest()
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   215
        fctx = ctx
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   216
        subn = (self.restrict or rekw) and self.re_kw.subn or self.re_kwexp.subn
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   217
        msg = (expand and _('overwriting %s expanding keywords\n')
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   218
               or _('overwriting %s shrinking keywords\n'))
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   219
        for f in candidates:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   220
            if self.restrict:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   221
                data = self.repo.file(f).read(mf[f])
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   222
            else:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   223
                data = self.repo.wread(f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   224
            if util.binary(data):
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   225
                continue
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   226
            if expand:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   227
                if lookup:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   228
                    fctx = self.repo.filectx(f, fileid=mf[f]).changectx()
818
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   229
                data, found = self.substitute(data, f, fctx, subn)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   230
            elif self.restrict:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   231
                found = self.re_kw.search(data)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   232
            else:
818
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   233
                data, found = _shrinktext(data, subn)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   234
            if found:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   235
                self.ui.note(msg % f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   236
                self.repo.wwrite(f, data, ctx.flags(f))
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   237
                if commit:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   238
                    self.repo.dirstate.normal(f)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   239
                elif self.record:
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   240
                    self.repo.dirstate.normallookup(f)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   241
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   242
    def shrink(self, fname, text):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   243
        '''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
   244
        if self.match(fname) and not util.binary(text):
818
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   245
            return _shrinktext(text, self.re_kwexp.sub)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   246
        return text
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   247
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   248
    def shrinklines(self, fname, lines):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   249
        '''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
   250
        if self.match(fname):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   251
            text = ''.join(lines)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   252
            if not util.binary(text):
818
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   253
                return _shrinktext(text, self.re_kwexp.sub).splitlines(True)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   254
        return lines
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   255
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   256
    def wread(self, fname, data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   257
        '''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
   258
        keyword substitutions removed.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   259
        return self.restrict and self.shrink(fname, data) or data
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   260
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   261
class kwfilelog(filelog.filelog):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   262
    '''
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   263
    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
   264
    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
   265
    '''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   266
    def __init__(self, opener, kwt, path):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   267
        super(kwfilelog, self).__init__(opener, path)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   268
        self.kwt = kwt
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   269
        self.path = path
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   270
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   271
    def read(self, node):
265
1b6b7835e3f9 Count keywords in a customized kwfilelog read method
Christian Ebert <blacktrash@gmx.net>
parents: 264
diff changeset
   272
        '''Expands keywords when reading filelog.'''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   273
        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
   274
        if self.renamed(node):
00570f650792 disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 815
diff changeset
   275
            return data
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   276
        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
   277
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   278
    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
   279
        '''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
   280
        text = self.kwt.shrink(self.path, text)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   281
        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
   282
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   283
    def cmp(self, node, text):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   284
        '''Removes keyword substitutions for comparison.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   285
        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
   286
        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
   287
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   288
def _status(ui, repo, kwt, *pats, **opts):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   289
    '''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
   290
    Returns status of working directory.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   291
    if kwt:
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   292
        return repo.status(match=cmdutil.match(repo, pats, opts), clean=True,
695
31b9e6615cec Remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 688
diff changeset
   293
                           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
   294
    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
   295
        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
   296
    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
   297
275
cb2b11e63906 _overwrite method for kwrepo.commit, kwexpand, kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 274
diff changeset
   298
def _kwfwrite(ui, repo, expand, *pats, **opts):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   299
    '''Selects files and passes them to kwtemplater.overwrite.'''
764
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   300
    wctx = repo[None]
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   301
    if len(wctx.parents()) > 1:
465
2f017ca736ce (stable) mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 463
diff changeset
   302
        raise util.Abort(_('outstanding uncommitted merge'))
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   303
    kwt = kwtools['templater']
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   304
    wlock = repo.wlock()
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   305
    try:
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   306
        status = _status(ui, repo, kwt, *pats, **opts)
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   307
        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
   308
        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
   309
            raise util.Abort(_('outstanding uncommitted changes'))
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   310
        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
   311
    finally:
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   312
        wlock.release()
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   313
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   314
def demo(ui, repo, *args, **opts):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   315
    '''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
   316
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   317
    Show current, custom, or default keyword template maps and their
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   318
    expansions.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   319
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   320
    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
   321
    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
   322
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   323
    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
   324
754
6c99007688ce Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 749
diff changeset
   325
    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
   326
    '''
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   327
    def demoitems(section, items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   328
        ui.write('[%s]\n' % section)
660
583a0371249c keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 656
diff changeset
   329
        for k, v in sorted(items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   330
            ui.write('%s = %s\n' % (k, v))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   331
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   332
    fn = 'demo.txt'
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   333
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
529
7197324dfa4d expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 527
diff changeset
   334
    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
   335
    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
   336
    ui.setconfig('keyword', fn, '')
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   337
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   338
    uikwmaps = ui.configitems('keywordmaps')
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   339
    if args or opts.get('rcfile'):
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   340
        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
   341
        if uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   342
            ui.status(_('\textending current template maps\n'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   343
        if opts.get('default') or not uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   344
            ui.status(_('\toverriding default template maps\n'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   345
        if opts.get('rcfile'):
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   346
            ui.readconfig(opts.get('rcfile'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   347
        if args:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   348
            # simulate hgrc parsing
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   349
            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
   350
            fp = repo.opener('hgrc', 'w')
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   351
            fp.writelines(rcmaps)
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   352
            fp.close()
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   353
            ui.readconfig(repo.join('hgrc'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   354
        kwmaps = dict(ui.configitems('keywordmaps'))
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   355
    elif opts.get('default'):
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   356
        ui.status(_('\n\tconfiguration using default keyword template maps\n'))
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   357
        kwmaps = _defaultkwmaps(ui)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   358
        if uikwmaps:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   359
            ui.status(_('\tdisabling current template maps\n'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   360
            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
   361
                ui.setconfig('keywordmaps', k, v)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   362
    else:
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   363
        ui.status(_('\n\tconfiguration using current keyword template maps\n'))
757
fdbfecffd95b Offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 756
diff changeset
   364
        kwmaps = dict(uikwmaps) or _defaultkwmaps(ui)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   365
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   366
    uisetup(ui)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   367
    reposetup(ui, repo)
710
2f341cf2268d Do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 708
diff changeset
   368
    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
   369
    demoitems('keyword', ui.configitems('keyword'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   370
    demoitems('keywordmaps', kwmaps.iteritems())
660
583a0371249c keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 656
diff changeset
   371
    keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   372
    repo.wopener(fn, 'w').write(keywords)
761
81d8da31c542 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 759
diff changeset
   373
    repo[None].add([fn])
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   374
    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
   375
    ui.note(keywords)
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   376
    repo.dirstate.setbranch('demobranch')
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   377
    for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   378
        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
   379
            repo.ui.setconfig('hooks', name, '')
699
57f8b7f021e8 Mark improved demo commit message for translation
Christian Ebert <blacktrash@gmx.net>
parents: 696
diff changeset
   380
    msg = _('hg keyword configuration and expansion example')
702
c118a9c5ca24 Make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 701
diff changeset
   381
    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
   382
    repo.commit(text=msg)
633
ca4b437a817c Refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 631
diff changeset
   383
    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
   384
    ui.write(repo.wread(fn))
251
b37f2f065a9c Ignore errors when removing temp dir in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 250
diff changeset
   385
    shutil.rmtree(tmpdir, ignore_errors=True)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   386
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   387
def expand(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   388
    '''expand keywords in the working directory
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   389
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   390
    Run after (re)enabling keyword expansion.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   391
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   392
    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
   393
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   394
    # 3rd argument sets expansion to True
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   395
    _kwfwrite(ui, repo, True, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   396
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   397
def files(ui, repo, *pats, **opts):
597
795a95d7dc61 Improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 596
diff changeset
   398
    '''show files configured for keyword expansion
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   399
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   400
    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
   401
    [keyword] configuration patterns.
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   402
625
b17b1cf1341a keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 624
diff changeset
   403
    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
   404
    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
   405
    expansion.
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   406
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
   407
    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
   408
    inclusion and exclusion of files.
597
795a95d7dc61 Improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 596
diff changeset
   409
654
e188e35ff4ad Uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 653
diff changeset
   410
    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
   411
    of files are::
620
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   412
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   413
      K = keyword expansion candidate
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   414
      k = keyword expansion candidate (not tracked)
620
04781aad754a Reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 614
diff changeset
   415
      I = ignored
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   416
      i = ignored (not tracked)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   417
    '''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   418
    kwt = kwtools['templater']
651
a047bb9bab24 kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 646
diff changeset
   419
    status = _status(ui, repo, kwt, *pats, **opts)
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   420
    cwd = pats and repo.getcwd() or ''
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   421
    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
   422
    files = []
695
31b9e6615cec Remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 688
diff changeset
   423
    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
   424
        files = sorted(modified + added + clean)
470
2c530e5df1d4 use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 469
diff changeset
   425
    wctx = repo[None]
815
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   426
    kwfiles = kwt.iskwfile(files, wctx)
1c9959ca570a Make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 814
diff changeset
   427
    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
   428
    if not opts.get('ignore') or opts.get('all'):
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   429
        showfiles = kwfiles, kwunknown
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   430
    else:
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   431
        showfiles = [], []
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   432
    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
   433
        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
   434
                      [f for f in unknown if f not in kwunknown])
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   435
    for char, filenames in zip('KkIi', showfiles):
509
16b690351c0d Do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 507
diff changeset
   436
        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
   437
        for f in filenames:
509
16b690351c0d Do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 507
diff changeset
   438
            ui.write(fmt % repo.pathto(f, cwd))
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   439
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   440
def shrink(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   441
    '''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
   442
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   443
    Run before changing/disabling active keywords or if you experience
732
0ff5881bc04b Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 730
diff changeset
   444
    problems with :hg:`import` or :hg:`merge`.
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   445
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   446
    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
   447
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   448
    # 3rd argument sets expansion to False
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   449
    _kwfwrite(ui, repo, False, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   450
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   451
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   452
def uisetup(ui):
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   453
    ''' Monkeypatches dispatch._parse to retrieve user command.'''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   454
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   455
    def kwdispatch_parse(orig, ui, args):
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   456
        '''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
   457
        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
   458
        kwtools['hgcmd'] = cmd
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   459
        return cmd, func, args, options, cmdoptions
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   460
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   461
    extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   462
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   463
def reposetup(ui, repo):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   464
    '''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
   465
    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
   466
    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
   467
    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
   468
    keyword substitutions.
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   469
    Monkeypatches patch and webcommands.'''
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
   470
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   471
    try:
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   472
        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   473
            or '.hg' in util.splitpath(repo.root)
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   474
            or repo._url.startswith('bundle:')):
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   475
            return
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   476
    except AttributeError:
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   477
        pass
292
783c1310e20f Avoid dispatch import, revert to simple argument parser
Christian Ebert <blacktrash@gmx.net>
parents: 290
diff changeset
   478
773
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   479
    inc, exc = [], ['.hg*']
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   480
    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
   481
        if opt != 'ignore':
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   482
            inc.append(pat)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   483
        else:
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   484
            exc.append(pat)
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   485
    if not inc:
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   486
        return
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   487
9f939fae8ff3 Move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 771
diff changeset
   488
    kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
261
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   489
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   490
    class kwrepo(repo.__class__):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   491
        def file(self, f):
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   492
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   493
                f = f[1:]
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   494
            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
   495
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   496
        def wread(self, filename):
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   497
            data = super(kwrepo, self).wread(filename)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   498
            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
   499
611
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   500
        def commit(self, *args, **opts):
600
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   501
            # use custom commitctx for user commands
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   502
            # 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
   503
            self.commitctx = self.kwcommitctx
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   504
            try:
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   505
                return super(kwrepo, self).commit(*args, **opts)
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   506
            finally:
c50f56b5f4b8 Eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 609
diff changeset
   507
                del self.commitctx
600
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   508
b40e7861defd Make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 597
diff changeset
   509
        def kwcommitctx(self, ctx, error=False):
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   510
            n = super(kwrepo, self).commitctx(ctx, error)
715
0614ba0295f6 Add forgotten comment
Christian Ebert <blacktrash@gmx.net>
parents: 714
diff changeset
   511
            # 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
   512
            if not kwt.record:
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   513
                restrict = kwt.restrict
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   514
                kwt.restrict = True
764
b8234da61635 Pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 763
diff changeset
   515
                kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   516
                              False, True)
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   517
                kwt.restrict = restrict
688
13bb123ad894 Remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 687
diff changeset
   518
            return n
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   519
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   520
        def rollback(self, dryrun=False):
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   521
            wlock = self.wlock()
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   522
            try:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   523
                if not dryrun:
811
31205612c018 Rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 809
diff changeset
   524
                    changed = self['.'].files()
809
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   525
                ret = super(kwrepo, self).rollback(dryrun)
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   526
                if not dryrun:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   527
                    ctx = self['.']
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   528
                    modified, added = _preselect(self[None].status(), changed)
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   529
                    kwt.overwrite(ctx, modified, True, True)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   530
                    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
   531
                return ret
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   532
            finally:
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   533
                wlock.release()
028b6584decb Support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 808
diff changeset
   534
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   535
    # monkeypatches
602
b21fe4c86037 Break overlong line
Christian Ebert <blacktrash@gmx.net>
parents: 600
diff changeset
   536
    def kwpatchfile_init(orig, self, ui, fname, opener,
730
bd1722740798 keyword: monkeypatch patch so that optional args can be passed as kwargs
Augie Fackler <durin42@gmail.com>
parents: 715
diff changeset
   537
                         missing=False, eolmode=None):
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   538
        '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   539
        rejects or conflicts due to expanded keywords in working dir.'''
730
bd1722740798 keyword: monkeypatch patch so that optional args can be passed as kwargs
Augie Fackler <durin42@gmail.com>
parents: 715
diff changeset
   540
        orig(self, ui, fname, opener, missing, eolmode)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   541
        # shrink keywords read from working dir
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   542
        self.lines = kwt.shrinklines(self.fname, self.lines)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   543
502
6fccffd4059a patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 500
diff changeset
   544
    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
   545
                opts=None, prefix=''):
808
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   546
        '''Monkeypatch patch.diff to avoid expansion.'''
cd9ec33f5bca Do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 807
diff changeset
   547
        kwt.restrict = True
788
1ae8e3a80298 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 773
diff changeset
   548
        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
   549
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   550
    def kwweb_skip(orig, web, req, tmpl):
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   551
        '''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
   552
        kwt.match = util.never
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   553
        return orig(web, req, tmpl)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   554
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   555
    def kw_copy(orig, ui, repo, pats, opts, rename=False):
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   556
        '''Wraps cmdutil.copy so that copy/rename destinations do not
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   557
        contain expanded keywords.
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   558
        Note that the source may also be a symlink as:
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   559
        hg cp sym x                -> x is symlink
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   560
        cp sym x; hg cp -A sym x   -> x is file (maybe expanded keywords)
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   561
        '''
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   562
        orig(ui, repo, pats, opts, rename)
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   563
        if opts.get('dry_run'):
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   564
            return
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   565
        wctx = repo[None]
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   566
        candidates = [f for f in repo.dirstate.copies() if
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   567
                      kwt.match(repo.dirstate.copied(f)) and
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   568
                      not 'l' in wctx.flags(f)]
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   569
        kwt.overwrite(wctx, candidates, False, False)
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   570
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   571
    def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   572
        '''Wraps record.dorecord expanding keywords after recording.'''
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   573
        wlock = repo.wlock()
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   574
        try:
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   575
            # record returns 0 even when nothing has changed
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   576
            # therefore compare nodes before and after
819
8f2c2cc51789 Switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 818
diff changeset
   577
            kwt.record = True
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   578
            ctx = repo['.']
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   579
            wstatus = repo[None].status()
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   580
            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
   581
            recctx = repo['.']
b742a071ad9c Specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 816
diff changeset
   582
            if ctx != recctx:
838
c793c1a87f1c Code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 837
diff changeset
   583
                modified, added = _preselect(wstatus, recctx.files())
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   584
                kwt.restrict = False
837
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   585
                kwt.overwrite(recctx, modified, False, True)
448a71a24a84 enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 836
diff changeset
   586
                kwt.overwrite(recctx, added, False, True, True)
813
9d01f9cab5e2 Refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 812
diff changeset
   587
                kwt.restrict = True
736
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   588
            return ret
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   589
        finally:
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   590
            wlock.release()
38ef84cc9dd1 Support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 735
diff changeset
   591
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   592
    repo.__class__ = kwrepo
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   593
840
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   594
    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
   595
        # 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
   596
        # not make sense
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   597
        return self._filelog.cmp(self._filenode, fctx.data())
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   598
    extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
df93d61a7790 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 838
diff changeset
   599
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   600
    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
   601
    extensions.wrapfunction(patch, 'diff', kw_diff)
814
0588121c815b Support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 813
diff changeset
   602
    extensions.wrapfunction(cmdutil, 'copy', kw_copy)
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   603
    for c in 'annotate changeset rev filediff diff'.split():
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   604
        extensions.wrapfunction(webcommands, c, kwweb_skip)
749
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   605
    for name in recordextensions.split():
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   606
        try:
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   607
            record = extensions.find(name)
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   608
            extensions.wrapfunction(record, 'dorecord', kw_dorecord)
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   609
        except KeyError:
9f46c562c4b5 Support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 747
diff changeset
   610
            pass
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   611
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   612
cmdtable = {
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   613
    'kwdemo':
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   614
        (demo,
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   615
         [('d', 'default', None, _('show default keyword template maps')),
767
0492a5acf652 help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 765
diff changeset
   616
          ('f', 'rcfile', '',
0492a5acf652 help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 765
diff changeset
   617
           _('read maps from rcfile'), _('FILE'))],
283
071bfbd482b4 Respect Mercurial conventions in kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 282
diff changeset
   618
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...')),
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   619
    'kwexpand': (expand, commands.walkopts,
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   620
                 _('hg kwexpand [OPTION]... [FILE]...')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   621
    'kwfiles':
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   622
        (files,
654
e188e35ff4ad Uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 653
diff changeset
   623
         [('A', 'all', None, _('show keyword status flags of all files')),
270
371ce7fe5f13 kwfiles: change option "ignored" to "ignore", add option "untracked"
Christian Ebert <blacktrash@gmx.net>
parents: 269
diff changeset
   624
          ('i', 'ignore', None, _('show files excluded from expansion')),
653
f4b2fe9d23df Make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 652
diff changeset
   625
          ('u', 'unknown', None, _('only show unknown (not tracked) files')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   626
         ] + commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   627
         _('hg kwfiles [OPTION]... [FILE]...')),
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   628
    'kwshrink': (shrink, commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   629
                 _('hg kwshrink [OPTION]... [FILE]...')),
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   630
}