hgkw/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Wed, 18 Jul 2007 16:12:14 +0200
branchkwmap-templates
changeset 186 c1b7b1d052de
parent 185 bc5cd6cf69bc
child 187 a01a0392f648
permissions -rw-r--r--
Avoid global vars by passing opt args to kwrepo.file "Normal" reading of filelog just expands keywords in given data. Reading filelog for overwrite on commit, kwshrink, kwexpand triggers kwtemplater.process, which returns read data (expanding in case of commit, kwexpand; not expanding for kwshrink) and a count of keywords. If kwcnt is positive file will be overwritten.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
     1
# keyword.py - keyword expansion for Mercurial
120
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     2
#
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     3
# Copyright 2007 Christian Ebert <blacktrash@gmx.net>
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     4
#
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     5
# This software may be used and distributed according to the terms
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     7
#
82
9bf0f7db5928 Add keyword; comment backwards compatible import
Christian Ebert <blacktrash@gmx.net>
parents: 81
diff changeset
     8
# $Id$
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
     9
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    10
# Keyword expansion hack against the grain of a DSCM
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    11
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    12
# There are many good reasons why this is not needed in a distributed
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    13
# SCM, still it may be useful in very small projects based on single
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an audience
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    15
# not running a version control system.
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    16
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    17
# For in-depth discussion refer to
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    18
# <http://www.selenic.com/mercurial/wiki/index.cgi/KeywordPlan>.
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    19
#
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    20
# Keyword expansion is based on Mercurial's changeset template mappings.
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    21
# The extension provides an additional UTC-date filter ({date|utcdate}).
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    22
#
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    23
# Expansions spanning more than one line are truncated to their first line.
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    24
# Incremental expansion (like CVS' $Log$) is not supported.
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    25
#
147
11a031a33ea2 Try making help more concise, include warning about "hg import"
Christian Ebert <blacktrash@gmx.net>
parents: 146
diff changeset
    26
# Binary files are not touched.
11a031a33ea2 Try making help more concise, include warning about "hg import"
Christian Ebert <blacktrash@gmx.net>
parents: 146
diff changeset
    27
#
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    28
# Setup in hgrc:
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    29
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    30
#     # enable extension
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    31
#     keyword = /full/path/to/keyword.py
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    32
#     # or, if script in hgext folder:
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    33
#     # hgext.keyword =
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    34
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    35
'''keyword expansion in local repositories
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    36
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    37
This extension expands RCS/CVS-like or self-customized $Keywords$
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    38
in the text files selected by your configuration.
102
393d6f8ea83c More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents: 101
diff changeset
    39
114
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    40
Keywords are only expanded in local repositories and not logged by
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    41
Mercurial internally. The mechanism can be regarded as a convenience
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    42
for the current user or archive distribution.
147
11a031a33ea2 Try making help more concise, include warning about "hg import"
Christian Ebert <blacktrash@gmx.net>
parents: 146
diff changeset
    43
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    44
Configuration is done in the [keyword] and [keywordmaps] sections of
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    45
hgrc files.
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    46
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    47
Example:
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    48
    [extensions]
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    49
    hgext.keyword =
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    50
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    51
    [keyword]
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    52
    # 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
    53
    **.py =
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    54
    x* = ignore
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    55
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    56
Note: the more specific you are in your [keyword] filename patterns
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    57
      the less you lose speed in huge repos.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    58
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    59
For a [keywordmaps] template mapping and expansion demonstration
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    60
run "hg kwdemo".
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    61
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    62
An additional date template filter {date|utcdate} is provided.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    63
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    64
You can replace the default template mappings with customized keywords
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    65
and templates of your choice.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    66
Again, run "hg kwdemo" to control the results of your config changes.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    67
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    68
When you change keyword configuration, especially the active keywords,
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    69
and do not want to store expanded keywords in change history, run
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    70
"hg kwshrink", and then change configuration.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    71
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    72
Caveat: "hg import" fails if the patch context contains an active
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    73
        keyword. In that case run "hg kwshrink", reimport, and then
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    74
        "hg kwexpand".
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    75
        Or, better, use bundle/unbundle to share changes.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    76
'''
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    77
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    78
from mercurial import commands, cmdutil, context, fancyopts
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    79
from mercurial import filelog, localrepo, templater, util, hg
159
28fd5b5eb3ad Simplify backward compatible import
Christian Ebert <blacktrash@gmx.net>
parents: 158
diff changeset
    80
from mercurial.i18n import gettext as _
163
c18c0c80b6c2 Move findcmd switch to imports
Christian Ebert <blacktrash@gmx.net>
parents: 162
diff changeset
    81
# findcmd might be in cmdutil or commands
c18c0c80b6c2 Move findcmd switch to imports
Christian Ebert <blacktrash@gmx.net>
parents: 162
diff changeset
    82
# depending on mercurial version
176
3aed363c9eaf Cosmetic changes for overwrite condition, single quotes
Christian Ebert <blacktrash@gmx.net>
parents: 175
diff changeset
    83
if hasattr(cmdutil, 'findcmd'):
163
c18c0c80b6c2 Move findcmd switch to imports
Christian Ebert <blacktrash@gmx.net>
parents: 162
diff changeset
    84
    findcmd = cmdutil.findcmd
c18c0c80b6c2 Move findcmd switch to imports
Christian Ebert <blacktrash@gmx.net>
parents: 162
diff changeset
    85
else:
c18c0c80b6c2 Move findcmd switch to imports
Christian Ebert <blacktrash@gmx.net>
parents: 162
diff changeset
    86
    findcmd = commands.findcmd
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    87
import os, re, shutil, sys, tempfile, time
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    88
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    89
commands.optionalrepo += ' kwdemo'
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    90
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    91
deftemplates = {
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    92
    'Revision': '{node|short}',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    93
    'Author': '{author|user}',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    94
    'Date': '{date|utcdate}',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    95
    'RCSFile': '{file|basename},v',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    96
    'Source': '{root}/{file},v',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    97
    'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    98
    'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    99
}
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
   100
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   101
nokwcommands = ('add', 'addremove', 'bundle', 'clone', 'copy', 'export',
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   102
                'incoming', 'outgoing', 'push', 'remove', 'rename', 'rollback')
164
d16332759801 Confine activation to specific commands; drop broken archive configuration
Christian Ebert <blacktrash@gmx.net>
parents: 163
diff changeset
   103
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   104
def utcdate(date):
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   105
    '''Returns hgdate in cvs-like UTC format.'''
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   106
    return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   107
149
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   108
def getcmd(ui):
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   109
    '''Returns current hg command.'''
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   110
    # commands.parse(ui, sys.argv[1:])[0] breaks "hg diff -r"
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   111
    try:
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   112
        args = fancyopts.fancyopts(sys.argv[1:], commands.globalopts, {})
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   113
    except fancyopts.getopt.GetoptError, inst:
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   114
        raise commands.ParseError(None, inst)
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   115
    if args:
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   116
        cmd = args[0]
163
c18c0c80b6c2 Move findcmd switch to imports
Christian Ebert <blacktrash@gmx.net>
parents: 162
diff changeset
   117
        aliases, i = findcmd(ui, cmd)
149
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   118
        return aliases[0]
0c8b7e5c25a6 Implement archive mode by configuration
Christian Ebert <blacktrash@gmx.net>
parents: 147
diff changeset
   119
182
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   120
def keywordmatcher(ui, repo):
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   121
    '''Collects include/exclude filename patterns for expansion
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   122
    candidates of current configuration. Returns filename matching
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   123
    function if include patterns exist, None otherwise.'''
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   124
    inc, exc = [], ['.hg*']
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   125
    for pat, opt in ui.configitems('keyword'):
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   126
        if opt != 'ignore':
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   127
            inc.append(pat)
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   128
        else:
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   129
            exc.append(pat)
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   130
    if not inc:
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   131
        return None
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   132
    return util.matcher(repo.root, inc=inc, exc=exc)[1]
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   133
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   134
class kwtemplater(object):
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   135
    '''
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   136
    Sets up keyword templates, corresponding keyword regex, and
139
0ea07bb56ff6 Move context into kwtemplater.expand
Christian Ebert <blacktrash@gmx.net>
parents: 138
diff changeset
   137
    provides keyword substitution functions.
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   138
    '''
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   139
    def __init__(self, ui, repo, path='', node=None, expand=True):
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   140
        self.ui = ui
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   141
        self.repo = repo
160
e45d804d28dd Make path, node kwtemplater attribs
Christian Ebert <blacktrash@gmx.net>
parents: 159
diff changeset
   142
        self.path = path
e45d804d28dd Make path, node kwtemplater attribs
Christian Ebert <blacktrash@gmx.net>
parents: 159
diff changeset
   143
        self.node = node
136
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   144
        templates = dict(ui.configitems('keywordmaps'))
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   145
        if templates:
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   146
            for k in templates.keys():
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   147
                templates[k] = templater.parsestring(templates[k],
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   148
                                                     quoted=False)
136
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   149
        self.templates = templates or deftemplates
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   150
        escaped = [re.escape(k) for k in self.templates.keys()]
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   151
        self.re_kw = re.compile(r'\$(%s)[^$]*?\$' % '|'.join(escaped))
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   152
        if expand:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   153
            templater.common_filters['utcdate'] = utcdate
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   154
            try:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   155
                self.t = cmdutil.changeset_templater(ui, repo,
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   156
                                                     False, '', False)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   157
            except TypeError:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   158
                # depending on hg rev changeset_templater has extra "brinfo" arg
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   159
                self.t = cmdutil.changeset_templater(ui, repo,
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   160
                                                     False, None, '', False)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   161
        else:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   162
            self.t = None
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   163
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   164
    def ctxnode(self, node):
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   165
        '''Obtains missing node from file context.'''
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   166
        if not self.node:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   167
            c = context.filectx(self.repo, self.path, fileid=node)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   168
            self.node = c.node()
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   169
160
e45d804d28dd Make path, node kwtemplater attribs
Christian Ebert <blacktrash@gmx.net>
parents: 159
diff changeset
   170
    def kwsub(self, mobj):
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   171
        '''Substitutes keyword using corresponding template.'''
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   172
        kw = mobj.group(1)
136
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   173
        self.t.use_template(self.templates[kw])
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   174
        self.ui.pushbuffer()
160
e45d804d28dd Make path, node kwtemplater attribs
Christian Ebert <blacktrash@gmx.net>
parents: 159
diff changeset
   175
        self.t.show(changenode=self.node, root=self.repo.root, file=self.path)
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   176
        keywordsub = templater.firstline(self.ui.popbuffer())
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   177
        return '$%s: %s $' % (kw, keywordsub)
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   178
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   179
    def expand(self, node, data):
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   180
        '''Returns data with keywords expanded.'''
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   181
        if util.binary(data):
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   182
            return data
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   183
        self.ctxnode(node)
160
e45d804d28dd Make path, node kwtemplater attribs
Christian Ebert <blacktrash@gmx.net>
parents: 159
diff changeset
   184
        return self.re_kw.sub(self.kwsub, data)
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   185
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   186
    def process(self, node, data):
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   187
        '''Returns a tuple: data, count.
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   188
        Count is number of keywords/keyword substitutions.
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   189
        Keywords in data are expanded, if templater was initialized.'''
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   190
        if util.binary(data):
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   191
            return data, None
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   192
        if self.t:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   193
            self.ctxnode(node)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   194
            return self.re_kw.subn(self.kwsub, data)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   195
        return data, self.re_kw.search(data)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   196
133
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   197
    def shrink(self, text):
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   198
        '''Returns text with all keyword substitutions removed.'''
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   199
        if util.binary(text):
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   200
            return text
133
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   201
        return self.re_kw.sub(r'$\1$', text)
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   202
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   203
    def overwrite(self, candidates, man, commit=True):
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   204
        '''Overwrites files in working directory if keywords are detected.
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   205
        Keywords are expanded if keyword templater is initialized,
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   206
        otherwise their substitution is removed.'''
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   207
        expand = self.t is not None
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   208
        action = ('shrinking', 'expanding')[expand]
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   209
        notify = (self.ui.note, self.ui.debug)[commit]
138
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   210
        files = []
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   211
        for f in candidates:
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   212
            fp = self.repo.file(f, kwcnt=True, kwexp=expand)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   213
            data, cnt = fp.read(man[f])
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   214
            if cnt:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   215
                notify(_('overwriting %s %s keywords\n') % (f, action))
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   216
                self.repo.wwrite(f, data, man.flags(f))
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   217
                files.append(f)
138
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   218
        if files:
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   219
            self.repo.dirstate.update(files, 'n')
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   220
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   221
class kwfilelog(filelog.filelog):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   222
    '''
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   223
    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
   224
    Keywords are "stored" unexpanded, and processed on reading.
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   225
    '''
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   226
    def __init__(self, opener, path, kwtemplater, kwcnt):
156
0382bccf861e Omit keyword argument for filelog __init__
Christian Ebert <blacktrash@gmx.net>
parents: 155
diff changeset
   227
        super(kwfilelog, self).__init__(opener, path)
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   228
        self.kwtemplater = kwtemplater
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   229
        self.kwcnt = kwcnt
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   230
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   231
    def read(self, node):
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   232
        '''Passes data through kwemplater methods for
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   233
        either unconditional keyword expansion
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   234
        or counting of keywords and substitution method
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   235
        set by the calling overwrite function.'''
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   236
        data = super(kwfilelog, self).read(node)
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   237
        if not self.kwcnt:
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   238
            return self.kwtemplater.expand(node, data)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   239
        return self.kwtemplater.process(node, data)
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   240
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   241
    def add(self, text, meta, tr, link, p1=None, p2=None):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   242
        '''Removes keyword substitutions when adding to filelog.'''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   243
        text = self.kwtemplater.shrink(text)
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   244
        return super(kwfilelog, self).add(text, meta, tr, link, p1=p1, p2=p2)
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   245
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   246
    def cmp(self, node, text):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   247
        '''Removes keyword substitutions for comparison.'''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   248
        text = self.kwtemplater.shrink(text)
174
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   249
        if self.renamed(node):
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   250
            t2 = super(kwfilelog, self).read(node)
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   251
            return t2 != text
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   252
        return super(kwfilelog, self).cmp(node, text)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   253
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   254
def overwrite(ui, repo, files=None, expand=True):
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   255
    '''Expands/shrinks keywords in working directory.'''
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   256
    wlock = repo.wlock()
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   257
    try:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   258
        ctx = repo.changectx()
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   259
        if not ctx:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   260
            raise hg.RepoError(_('no changeset found'))
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   261
        for changed in repo.status()[:4]:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   262
            if changed:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   263
                raise util.Abort(_('local changes detected'))
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   264
        kwfmatcher = keywordmatcher(ui, repo)
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   265
        if kwfmatcher is None:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   266
            ui.warn(_('no files configured for keyword expansion\n'))
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   267
            return
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   268
        m = ctx.manifest()
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   269
        if files:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   270
            files = [f for f in files if f in m.keys()]
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   271
        else:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   272
            files = m.keys()
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   273
        files = [f for f in files if kwfmatcher(f) and not os.path.islink(f)]
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   274
        if not files:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   275
            ui.warn(_('given files not tracked or '
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   276
                      'not configured for expansion\n'))
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   277
            return
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   278
        kwt = kwtemplater(ui, repo, node=ctx.node(), expand=expand)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   279
        kwt.overwrite(files, m, commit=False)
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   280
    finally:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   281
        wlock.release()
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   282
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   283
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   284
def shrink(ui, repo, *args):
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   285
    '''revert expanded keywords in working directory
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   286
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   287
    run before:
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   288
               disabling keyword expansion
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   289
               changing keyword expansion configuration
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   290
    or if you experience problems with "hg import"
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   291
    '''
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   292
    overwrite(ui, repo, files=args, expand=False)
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   293
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   294
def expand(ui, repo, *args):
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   295
    '''expand keywords in working directory
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   296
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   297
    run after (re)enabling keyword expansion
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   298
    '''
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   299
    overwrite(ui, repo, files=args)
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   300
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   301
def demo(ui, repo, **opts):
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   302
    '''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
   303
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   304
    Show current or default keyword template maps and their expansion
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   305
    '''
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   306
    msg = 'hg keyword config and expansion example'
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   307
    fn = 'demo.txt'
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   308
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   309
    ui.note(_('creating temporary repo at %s\n') % tmpdir)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   310
    _repo = localrepo.localrepository(ui, path=tmpdir, create=True)
184
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   311
    # for backwards compatibility
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   312
    ui = _repo.ui
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   313
    ui.setconfig('keyword', fn, '')
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   314
    if opts['default']:
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   315
        kwstatus = 'default'
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   316
        kwmaps = deftemplates
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   317
    else:
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   318
        kwstatus = 'current'
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   319
        kwmaps = dict(ui.configitems('keywordmaps')) or deftemplates
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   320
    if ui.configitems('keywordmaps'):
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   321
        for k, v in kwmaps.items():
184
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   322
            ui.setconfig('keywordmaps', k, v)
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   323
    reposetup(ui, _repo)
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   324
    ui.status(_('config with %s keyword template maps:\n') % kwstatus)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   325
    ui.write('[keyword]\n%s =\n[keywordmaps]\n' % fn)
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   326
    for k, v in kwmaps.items():
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   327
        ui.write('%s = %s\n' % (k, v))
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   328
    path = _repo.wjoin(fn)
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   329
    keywords = '$' + '$\n$'.join(kwmaps.keys()) + '$\n'
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   330
    _repo.wopener(fn, 'w').write(keywords)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   331
    _repo.add([fn])
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   332
    ui.note(_('\n%s keywords written to %s:\n') % (kwstatus, path))
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   333
    ui.note(keywords)
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   334
    ui.note(_("\nhg --repository '%s' commit\n") % tmpdir)
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   335
    _repo.commit(text=msg)
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   336
    pathinfo = ('', ' in %s' % path)[ui.verbose]
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   337
    ui.status(_('\n%s keywords expanded%s:\n') % (kwstatus, pathinfo))
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   338
    ui.write(_repo.wread(fn))
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   339
    ui.debug(_('\nremoving temporary repo %s\n') % tmpdir)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   340
    shutil.rmtree(tmpdir)
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   341
182
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   342
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   343
def reposetup(ui, repo):
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   344
    '''Sets up repo as kwrepo for keyword substitution.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   345
    Overrides file method to return kwfilelog instead of filelog
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   346
    if file matches user configuration.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   347
    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
   348
    keyword substitutions.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   349
    This is done for local repos only, and only if there are
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   350
    files configured at all for keyword substitution.'''
108
25dac950a1f0 Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents: 107
diff changeset
   351
184
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   352
    # for backwards compatibility
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   353
    ui = repo.ui
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   354
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   355
    if not repo.local() or getcmd(ui) in nokwcommands:
110
b0b85b383f36 Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 109
diff changeset
   356
        return
108
25dac950a1f0 Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents: 107
diff changeset
   357
182
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   358
    kwfmatcher = keywordmatcher(ui, repo)
de32fbee75a4 Obtain filename matcher from function keywordmatcher
Christian Ebert <blacktrash@gmx.net>
parents: 181
diff changeset
   359
    if kwfmatcher is None:
122
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   360
        return
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   361
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   362
    class kwrepo(repo.__class__):
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   363
        def file(self, f, kwcnt=False, kwexp=True):
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   364
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   365
                f = f[1:]
168
368fbd5b054c Reduce use of kwrepo methods
Christian Ebert <blacktrash@gmx.net>
parents: 167
diff changeset
   366
            if kwfmatcher(f):
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   367
                kwt = kwtemplater(ui, self, path=f, expand=kwexp)
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   368
                return kwfilelog(self.sopener, f, kwt, kwcnt)
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   369
            else:
172
ad0da655bd12 Revert to kwrepo methods (self) inside class kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 171
diff changeset
   370
                return filelog.filelog(self.sopener, f)
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   371
176
3aed363c9eaf Cosmetic changes for overwrite condition, single quotes
Christian Ebert <blacktrash@gmx.net>
parents: 175
diff changeset
   372
        def commit(self, files=None, text='', user=None, date=None,
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   373
                   match=util.always, force=False, lock=None, wlock=None,
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   374
                   force_editor=False, p1=None, p2=None, extra={}):
143
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   375
            wrelease = False
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   376
            if not wlock:
172
ad0da655bd12 Revert to kwrepo methods (self) inside class kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 171
diff changeset
   377
                wlock = self.wlock()
143
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   378
                wrelease = True
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   379
            try:
172
ad0da655bd12 Revert to kwrepo methods (self) inside class kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 171
diff changeset
   380
                removed = self.status(node1=p1, node2=p2, files=files,
168
368fbd5b054c Reduce use of kwrepo methods
Christian Ebert <blacktrash@gmx.net>
parents: 167
diff changeset
   381
                                      match=match, wlock=wlock)[2]
145
1c2cefa97b96 Wrap entire commit in wlock
Christian Ebert <blacktrash@gmx.net>
parents: 144
diff changeset
   382
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   383
                node = super(kwrepo,
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   384
                             self).commit(files=files, text=text, user=user,
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   385
                                          date=date, match=match, force=force,
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   386
                                          lock=lock, wlock=wlock,
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   387
                                          force_editor=force_editor,
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   388
                                          p1=p1, p2=p2, extra=extra)
145
1c2cefa97b96 Wrap entire commit in wlock
Christian Ebert <blacktrash@gmx.net>
parents: 144
diff changeset
   389
                if node is None:
1c2cefa97b96 Wrap entire commit in wlock
Christian Ebert <blacktrash@gmx.net>
parents: 144
diff changeset
   390
                    return node
1c2cefa97b96 Wrap entire commit in wlock
Christian Ebert <blacktrash@gmx.net>
parents: 144
diff changeset
   391
177
261a6844145e wwread and wwrite methods for expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents: 176
diff changeset
   392
                cl = self.changelog.read(node)
261a6844145e wwread and wwrite methods for expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents: 176
diff changeset
   393
                candidates = [f for f in cl[3] if kwfmatcher(f)
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   394
                              and f not in removed
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   395
                              and not os.path.islink(self.wjoin(f))]
176
3aed363c9eaf Cosmetic changes for overwrite condition, single quotes
Christian Ebert <blacktrash@gmx.net>
parents: 175
diff changeset
   396
                if candidates:
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   397
                    m = self.manifest.read(cl[0])
176
3aed363c9eaf Cosmetic changes for overwrite condition, single quotes
Christian Ebert <blacktrash@gmx.net>
parents: 175
diff changeset
   398
                    kwt = kwtemplater(ui, self, node=node)
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   399
                    kwt.overwrite(candidates, m)
145
1c2cefa97b96 Wrap entire commit in wlock
Christian Ebert <blacktrash@gmx.net>
parents: 144
diff changeset
   400
                return node
143
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   401
            finally:
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   402
                if wrelease:
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   403
                    wlock.release()
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   404
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   405
    repo.__class__ = kwrepo
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   406
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   407
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   408
cmdtable = {
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   409
    'kwdemo':
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   410
        (demo,
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   411
         [('d', 'default', None, _('show default keyword template maps'))],
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   412
         _('hg kwdemo [-d]')),
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   413
    'kwshrink': (shrink, [], _('hg kwshrink [NAME] ...')),
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   414
    'kwexpand': (expand, [], _('hg kwexpand [NAME] ...')),
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   415
}