hgext/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Sun, 10 Oct 2010 00:30:09 +0100
changeset 12684 8348599c68d7
parent 12631 7b34fdffed65
child 12685 a247751652ba
permissions -rw-r--r--
keyword: fix weeding of expansion candidates when recording Rearrange tests to check this, i.e. that there are changes in other files, not only the recorded one.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
     1
# keyword.py - $Keyword$ expansion for Mercurial
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
     2
#
10653
4f559a469972 keyword: update copyright
Christian Ebert <blacktrash@gmx.net>
parents: 10652
diff changeset
     3
# Copyright 2007-2010 Christian Ebert <blacktrash@gmx.net>
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     5
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 10117
diff changeset
     6
# GNU General Public License version 2 or any later version.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
     7
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
     8
# $Id$
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
     9
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    10
# Keyword expansion hack against the grain of a DSCM
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    11
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    12
# There are many good reasons why this is not needed in a distributed
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    13
# SCM, still it may be useful in very small projects based on single
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
    15
# audience not running a version control system.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    16
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    17
# For in-depth discussion refer to
8936
1de6e7e1bb9f change wiki/bts URLs to point to new hostname
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8894
diff changeset
    18
# <http://mercurial.selenic.com/wiki/KeywordPlan>.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    19
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    20
# Keyword expansion is based on Mercurial's changeset template mappings.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    21
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    22
# Binary files are not touched.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    23
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    24
# Files to act upon/ignore are specified in the [keyword] section.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    25
# Customized keyword template mappings in the [keywordmaps] section.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    26
#
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    27
# Run "hg help keyword" and "hg kwdemo" to get info on configuration.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    28
8894
868670dbc237 extensions: improve the consistency of synopses
Cédric Duval <cedricduval@free.fr>
parents: 8866
diff changeset
    29
'''expand keywords in tracked files
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    30
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    31
This extension expands RCS/CVS-like or self-customized $Keywords$ in
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    32
tracked text files selected by your configuration.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    33
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    34
Keywords are only expanded in local repositories and not stored in the
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    35
change history. The mechanism can be regarded as a convenience for the
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    36
current user or for archive distribution.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    37
12203
0f6164806283 keyword: explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 11678
diff changeset
    38
Keywords expand to the changeset data pertaining to the latest change
0f6164806283 keyword: explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 11678
diff changeset
    39
relative to the working directory parent of each file.
0f6164806283 keyword: explain file-wise expansion in help
Christian Ebert <blacktrash@gmx.net>
parents: 11678
diff changeset
    40
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
    41
Configuration is done in the [keyword], [keywordset] and [keywordmaps]
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
    42
sections of hgrc files.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    43
9157
9261667e9b82 commands: use minirst parser when displaying help
Martin Geisler <mg@lazybytes.net>
parents: 9106
diff changeset
    44
Example::
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    45
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    46
    [keyword]
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    47
    # expand keywords in every python file except those matching "x*"
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    48
    **.py =
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    49
    x*    = ignore
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    50
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
    51
    [keywordset]
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
    52
    # prefer svn- over cvs-like default keywordmaps
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
    53
    svn = True
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
    54
12390
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
    55
.. note::
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
    56
   The more specific you are in your filename patterns the less you
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
    57
   lose speed in huge repositories.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    58
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    59
For [keywordmaps] template mapping and expansion demonstration and
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    60
control run :hg:`kwdemo`. See :hg:`help templates` for a list of
9307
2715506d54e4 keyword: reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 9305
diff changeset
    61
available templates and filters.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    62
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
    63
Three additional date template filters are provided::
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
    64
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
    65
    utcdate      "2006/09/18 15:13:13"
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
    66
    svnutcdate   "2006-09-18 15:13:13Z"
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
    67
    svnisodate   "2006-09-18 08:13:13 -700 (Mon, 18 Sep 2006)"
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    68
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    69
The default template mappings (view with :hg:`kwdemo -d`) can be
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    70
replaced with customized keywords and templates. Again, run
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    71
:hg:`kwdemo` to control the results of your config changes.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    72
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    73
Before changing/disabling active keywords, run :hg:`kwshrink` to avoid
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    74
the risk of inadvertently storing expanded keywords in the change
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    75
history.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    76
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    77
To force expansion after enabling it, or a configuration change, run
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    78
:hg:`kwexpand`.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    79
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    80
Expansions spanning more than one line and incremental expansions,
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    81
like CVS' $Log$, are not supported. A keyword template map "Log =
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    82
{desc}" expands to the first line of the changeset description.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    83
'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    84
12628
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
    85
from mercurial import commands, cmdutil, dispatch, filelog, extensions
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
    86
from mercurial import localrepo, match, patch, templatefilters, templater, util
6072
e521ec1ad985 keyword: no expansion in web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 6071
diff changeset
    87
from mercurial.hgweb import webcommands
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    88
from mercurial.i18n import _
9308
6fdd39f52f7f keyword: use util.datestr for utcdate filter, expose through variable
Christian Ebert <blacktrash@gmx.net>
parents: 9307
diff changeset
    89
import re, shutil, tempfile
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    90
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    91
commands.optionalrepo += ' kwdemo'
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    92
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
    93
# hg commands that do not act on keywords
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
    94
nokwcommands = ('add addremove annotate bundle export grep incoming init log'
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
    95
                ' outgoing push tip verify convert email glog')
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
    96
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
    97
# hg commands that trigger expansion only when writing to working dir,
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
    98
# not when reading filelog, and unexpand when reading from working dir
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
    99
restricted = 'merge kwexpand kwshrink record qrecord resolve transplant'
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
   100
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   101
# names of extensions using dorecord
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   102
recordextensions = 'record'
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   103
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   104
# date like in cvs' $Date
10332
f64160f28b3f keyword: fix utcdate filter
Christian Ebert <blacktrash@gmx.net>
parents: 10264
diff changeset
   105
utcdate = lambda x: util.datestr((x[0], 0), '%Y/%m/%d %H:%M:%S')
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   106
# date like in svn's $Date
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   107
svnisodate = lambda x: util.datestr(x, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   108
# date like in svn's $Id
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   109
svnutcdate = lambda x: util.datestr((x[0], 0), '%Y-%m-%d %H:%M:%SZ')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   110
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   111
# make keyword tools accessible
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   112
kwtools = {'templater': None, 'hgcmd': ''}
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   113
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   114
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   115
def _defaultkwmaps(ui):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   116
    '''Returns default keywordmaps according to keywordset configuration.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   117
    templates = {
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   118
        'Revision': '{node|short}',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   119
        'Author': '{author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   120
    }
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   121
    kwsets = ({
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   122
        'Date': '{date|utcdate}',
9943
f8d779791161 keyword: the CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 9942
diff changeset
   123
        'RCSfile': '{file|basename},v',
9950
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
   124
        'RCSFile': '{file|basename},v', # kept for backwards compatibility
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
   125
                                        # with hg-keyword
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   126
        'Source': '{root}/{file},v',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   127
        'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   128
        'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   129
    }, {
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   130
        'Date': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   131
        'Id': '{file|basename},v {node|short} {date|svnutcdate} {author|user}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   132
        'LastChangedRevision': '{node|short}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   133
        'LastChangedBy': '{author|user}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   134
        'LastChangedDate': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   135
    })
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   136
    templates.update(kwsets[ui.configbool('keywordset', 'svn')])
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   137
    return templates
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   138
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   139
def _shrinktext(text, subfunc):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   140
    '''Helper for keyword expansion removal in text.
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   141
    Depending on subfunc also returns number of substitutions.'''
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   142
    return subfunc(r'$\1$', text)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   143
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   144
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   145
class kwtemplater(object):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   146
    '''
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   147
    Sets up keyword templates, corresponding keyword regex, and
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   148
    provides keyword substitution functions.
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   149
    '''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   150
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   151
    def __init__(self, ui, repo, inc, exc):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   152
        self.ui = ui
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   153
        self.repo = repo
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   154
        self.match = match.match(repo.root, '', [], inc, exc)
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   155
        self.restrict = kwtools['hgcmd'] in restricted.split()
12631
7b34fdffed65 keyword: switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 12630
diff changeset
   156
        self.record = False
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   157
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   158
        kwmaps = self.ui.configitems('keywordmaps')
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   159
        if kwmaps: # override default templates
9081
d8e8447a4b7b keyword: collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 9066
diff changeset
   160
            self.templates = dict((k, templater.parsestring(v, False))
d8e8447a4b7b keyword: collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 9066
diff changeset
   161
                                  for k, v in kwmaps)
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   162
        else:
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   163
            self.templates = _defaultkwmaps(self.ui)
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   164
        escaped = '|'.join(map(re.escape, self.templates.keys()))
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   165
        self.re_kw = re.compile(r'\$(%s)\$' % escaped)
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   166
        self.re_kwexp = re.compile(r'\$(%s): [^$\n\r]*? \$' % escaped)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   167
11616
fda0e478fb79 keyword: add extra datefilters in a single update call
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   168
        templatefilters.filters.update({'utcdate': utcdate,
fda0e478fb79 keyword: add extra datefilters in a single update call
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   169
                                        'svnisodate': svnisodate,
fda0e478fb79 keyword: add extra datefilters in a single update call
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   170
                                        'svnutcdate': svnutcdate})
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   171
7375
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
   172
    def substitute(self, data, path, ctx, subfunc):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   173
        '''Replaces keywords in data with expanded template.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   174
        def kwsub(mobj):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   175
            kw = mobj.group(1)
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   176
            ct = cmdutil.changeset_templater(self.ui, self.repo,
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   177
                                             False, None, '', False)
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   178
            ct.use_template(self.templates[kw])
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   179
            self.ui.pushbuffer()
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   180
            ct.show(ctx, root=self.repo.root, file=path)
6023
ee7df90d1daa keyword: split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 6022
diff changeset
   181
            ekw = templatefilters.firstline(self.ui.popbuffer())
ee7df90d1daa keyword: split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 6022
diff changeset
   182
            return '$%s: %s $' % (kw, ekw)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   183
        return subfunc(kwsub, data)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   184
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   185
    def expand(self, path, node, data):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   186
        '''Returns data with keywords expanded.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
   187
        if not self.restrict and self.match(path) and not util.binary(data):
7375
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
   188
            ctx = self.repo.filectx(path, fileid=node).changectx()
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
   189
            return self.substitute(data, path, ctx, self.re_kw.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   190
        return data
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   191
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   192
    def iskwfile(self, cand, ctx):
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   193
        '''Returns subset of candidates which are configured for keyword
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   194
        expansion are not symbolic links.'''
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   195
        return [f for f in cand if self.match(f) and not 'l' in ctx.flags(f)]
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   196
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   197
    def overwrite(self, ctx, candidates, lookup, expand, recsubn=None):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   198
        '''Overwrites selected files expanding/shrinking keywords.'''
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   199
        if self.restrict or lookup: # exclude kw_copy
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   200
            candidates = self.iskwfile(candidates, ctx)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   201
        if not candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   202
            return
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   203
        commit = self.restrict and not lookup
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   204
        if self.restrict or expand and lookup:
11350
5ea28187707e keyword: postpone manifest calculation in kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11321
diff changeset
   205
            mf = ctx.manifest()
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   206
        fctx = ctx
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   207
        subn = (self.restrict and self.re_kw.subn or
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   208
                recsubn or self.re_kwexp.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   209
        msg = (expand and _('overwriting %s expanding keywords\n')
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   210
               or _('overwriting %s shrinking keywords\n'))
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   211
        for f in candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   212
            if self.restrict:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   213
                data = self.repo.file(f).read(mf[f])
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   214
            else:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   215
                data = self.repo.wread(f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   216
            if util.binary(data):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   217
                continue
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   218
            if expand:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   219
                if lookup:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   220
                    fctx = self.repo.filectx(f, fileid=mf[f]).changectx()
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   221
                data, found = self.substitute(data, f, fctx, subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   222
            elif self.restrict:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   223
                found = self.re_kw.search(data)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   224
            else:
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   225
                data, found = _shrinktext(data, subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   226
            if found:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   227
                self.ui.note(msg % f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   228
                self.repo.wwrite(f, data, ctx.flags(f))
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   229
                if commit:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   230
                    self.repo.dirstate.normal(f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   231
                elif self.record:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   232
                    self.repo.dirstate.normallookup(f)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   233
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   234
    def shrink(self, fname, text):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   235
        '''Returns text with all keyword substitutions removed.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
   236
        if self.match(fname) and not util.binary(text):
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   237
            return _shrinktext(text, self.re_kwexp.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   238
        return text
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   239
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   240
    def shrinklines(self, fname, lines):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   241
        '''Returns lines with keyword substitutions removed.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
   242
        if self.match(fname):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   243
            text = ''.join(lines)
6508
4b2c266bf059 Get rid of reimplementations of util.binary
Bryan O'Sullivan <bos@serpentine.com>
parents: 6506
diff changeset
   244
            if not util.binary(text):
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   245
                return _shrinktext(text, self.re_kwexp.sub).splitlines(True)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   246
        return lines
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   247
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   248
    def wread(self, fname, data):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   249
        '''If in restricted mode returns data read from wdir with
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   250
        keyword substitutions removed.'''
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   251
        return self.restrict and self.shrink(fname, data) or data
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   252
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   253
class kwfilelog(filelog.filelog):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   254
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   255
    Subclass of filelog to hook into its read, add, cmp methods.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   256
    Keywords are "stored" unexpanded, and processed on reading.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   257
    '''
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   258
    def __init__(self, opener, kwt, path):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   259
        super(kwfilelog, self).__init__(opener, path)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   260
        self.kwt = kwt
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   261
        self.path = path
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   262
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   263
    def read(self, node):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   264
        '''Expands keywords when reading filelog.'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   265
        data = super(kwfilelog, self).read(node)
12628
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
   266
        if self.renamed(node):
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
   267
            return data
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   268
        return self.kwt.expand(self.path, node, data)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   269
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   270
    def add(self, text, meta, tr, link, p1=None, p2=None):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   271
        '''Removes keyword substitutions when adding to filelog.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   272
        text = self.kwt.shrink(self.path, text)
6504
1be53f931c9c keyword: compact setting of optional arguments
Christian Ebert <blacktrash@gmx.net>
parents: 6503
diff changeset
   273
        return super(kwfilelog, self).add(text, meta, tr, link, p1, p2)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   274
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   275
    def cmp(self, node, text):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   276
        '''Removes keyword substitutions for comparison.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   277
        text = self.kwt.shrink(self.path, text)
12628
799cec3ba3b1 keyword: disable expansion in kwfilelog.read() if file renamed in node
Christian Ebert <blacktrash@gmx.net>
parents: 12627
diff changeset
   278
        return super(kwfilelog, self).cmp(node, text)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   279
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   280
def _status(ui, repo, kwt, *pats, **opts):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   281
    '''Bails out if [keyword] configuration is not active.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   282
    Returns status of working directory.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   283
    if kwt:
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   284
        return repo.status(match=cmdutil.match(repo, pats, opts), clean=True,
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
   285
                           unknown=opts.get('unknown') or opts.get('all'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   286
    if ui.configitems('keyword'):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   287
        raise util.Abort(_('[keyword] patterns cannot match'))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   288
    raise util.Abort(_('no [keyword] patterns configured'))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   289
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   290
def _kwfwrite(ui, repo, expand, *pats, **opts):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   291
    '''Selects files and passes them to kwtemplater.overwrite.'''
11320
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
   292
    wctx = repo[None]
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
   293
    if len(wctx.parents()) > 1:
6672
6004eedb13f4 keyword: mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 6667
diff changeset
   294
        raise util.Abort(_('outstanding uncommitted merge'))
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   295
    kwt = kwtools['templater']
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   296
    wlock = repo.wlock()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   297
    try:
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   298
        status = _status(ui, repo, kwt, *pats, **opts)
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   299
        modified, added, removed, deleted, unknown, ignored, clean = status
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   300
        if modified or added or removed or deleted:
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   301
            raise util.Abort(_('outstanding uncommitted changes'))
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   302
        kwt.overwrite(wctx, clean, True, expand)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   303
    finally:
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   304
        wlock.release()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   305
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   306
def demo(ui, repo, *args, **opts):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   307
    '''print [keywordmaps] configuration and an expansion example
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   308
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
   309
    Show current, custom, or default keyword template maps and their
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   310
    expansions.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   311
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   312
    Extend the current configuration by specifying maps as arguments
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   313
    and using -f/--rcfile to source an external hgrc file.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   314
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   315
    Use -d/--default to disable current configuration.
9307
2715506d54e4 keyword: reference templating help, add utcdate filter example
Christian Ebert <blacktrash@gmx.net>
parents: 9305
diff changeset
   316
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11168
diff changeset
   317
    See :hg:`help templates` for information on templates and filters.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   318
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   319
    def demoitems(section, items):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   320
        ui.write('[%s]\n' % section)
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
   321
        for k, v in sorted(items):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   322
            ui.write('%s = %s\n' % (k, v))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   323
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   324
    fn = 'demo.txt'
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   325
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 7993
diff changeset
   326
    ui.note(_('creating temporary repository at %s\n') % tmpdir)
6504
1be53f931c9c keyword: compact setting of optional arguments
Christian Ebert <blacktrash@gmx.net>
parents: 6503
diff changeset
   327
    repo = localrepo.localrepository(ui, tmpdir, True)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   328
    ui.setconfig('keyword', fn, '')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   329
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   330
    uikwmaps = ui.configitems('keywordmaps')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   331
    if args or opts.get('rcfile'):
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   332
        ui.status(_('\n\tconfiguration using custom keyword template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   333
        if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   334
            ui.status(_('\textending current template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   335
        if opts.get('default') or not uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   336
            ui.status(_('\toverriding default template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   337
        if opts.get('rcfile'):
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   338
            ui.readconfig(opts.get('rcfile'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   339
        if args:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   340
            # simulate hgrc parsing
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   341
            rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   342
            fp = repo.opener('hgrc', 'w')
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   343
            fp.writelines(rcmaps)
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   344
            fp.close()
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   345
            ui.readconfig(repo.join('hgrc'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   346
        kwmaps = dict(ui.configitems('keywordmaps'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   347
    elif opts.get('default'):
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   348
        ui.status(_('\n\tconfiguration using default keyword template maps\n'))
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   349
        kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   350
        if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   351
            ui.status(_('\tdisabling current template maps\n'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
   352
            for k, v in kwmaps.iteritems():
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   353
                ui.setconfig('keywordmaps', k, v)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   354
    else:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   355
        ui.status(_('\n\tconfiguration using current keyword template maps\n'))
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   356
        kwmaps = dict(uikwmaps) or _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   357
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   358
    uisetup(ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   359
    reposetup(ui, repo)
10714
9c0a1887bd4b keyword: do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 10713
diff changeset
   360
    ui.write('[extensions]\nkeyword =\n')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   361
    demoitems('keyword', ui.configitems('keyword'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
   362
    demoitems('keywordmaps', kwmaps.iteritems())
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
   363
    keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   364
    repo.wopener(fn, 'w').write(keywords)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11296
diff changeset
   365
    repo[None].add([fn])
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
   366
    ui.note(_('\nkeywords written to %s:\n') % fn)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   367
    ui.note(keywords)
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
   368
    repo.dirstate.setbranch('demobranch')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   369
    for name, cmd in ui.configitems('hooks'):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   370
        if name.split('.', 1)[0].find('commit') > -1:
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   371
            repo.ui.setconfig('hooks', name, '')
10499
4401b0dfee88 keyword: mark improved demo commit message for translation
Christian Ebert <blacktrash@gmx.net>
parents: 10495
diff changeset
   372
    msg = _('hg keyword configuration and expansion example')
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
   373
    ui.note("hg ci -m '%s'\n" % msg)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   374
    repo.commit(text=msg)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   375
    ui.status(_('\n\tkeywords expanded\n'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   376
    ui.write(repo.wread(fn))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   377
    shutil.rmtree(tmpdir, ignore_errors=True)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   378
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   379
def expand(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   380
    '''expand keywords in the working directory
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   381
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   382
    Run after (re)enabling keyword expansion.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   383
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   384
    kwexpand refuses to run if given files contain local changes.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   385
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   386
    # 3rd argument sets expansion to True
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   387
    _kwfwrite(ui, repo, True, *pats, **opts)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   388
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   389
def files(ui, repo, *pats, **opts):
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
   390
    '''show files configured for keyword expansion
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
   391
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   392
    List which files in the working directory are matched by the
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   393
    [keyword] configuration patterns.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   394
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   395
    Useful to prevent inadvertent keyword expansion and to speed up
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   396
    execution by including only files that are actual candidates for
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   397
    expansion.
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
   398
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
   399
    See :hg:`help keyword` on how to construct patterns both for
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   400
    inclusion and exclusion of files.
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
   401
9494
bdd8a41ea6f6 keyword: uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 9493
diff changeset
   402
    With -A/--all and -v/--verbose the codes used to show the status
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   403
    of files are::
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   404
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   405
      K = keyword expansion candidate
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   406
      k = keyword expansion candidate (not tracked)
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   407
      I = ignored
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   408
      i = ignored (not tracked)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   409
    '''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   410
    kwt = kwtools['templater']
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   411
    status = _status(ui, repo, kwt, *pats, **opts)
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   412
    cwd = pats and repo.getcwd() or ''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   413
    modified, added, removed, deleted, unknown, ignored, clean = status
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   414
    files = []
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
   415
    if not opts.get('unknown') or opts.get('all'):
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   416
        files = sorted(modified + added + clean)
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6743
diff changeset
   417
    wctx = repo[None]
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   418
    kwfiles = kwt.iskwfile(files, wctx)
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   419
    kwunknown = kwt.iskwfile(unknown, wctx)
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   420
    if not opts.get('ignore') or opts.get('all'):
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   421
        showfiles = kwfiles, kwunknown
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   422
    else:
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   423
        showfiles = [], []
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   424
    if opts.get('all') or opts.get('ignore'):
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   425
        showfiles += ([f for f in files if f not in kwfiles],
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   426
                      [f for f in unknown if f not in kwunknown])
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   427
    for char, filenames in zip('KkIi', showfiles):
7417
d3f1d316b72b keyword: do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 7391
diff changeset
   428
        fmt = (opts.get('all') or ui.verbose) and '%s %%s\n' % char or '%s\n'
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   429
        for f in filenames:
7417
d3f1d316b72b keyword: do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 7391
diff changeset
   430
            ui.write(fmt % repo.pathto(f, cwd))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   431
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   432
def shrink(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   433
    '''revert expanded keywords in the working directory
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   434
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
   435
    Run before changing/disabling active keywords or if you experience
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
   436
    problems with :hg:`import` or :hg:`merge`.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   437
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   438
    kwshrink refuses to run if given files contain local changes.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   439
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   440
    # 3rd argument sets expansion to False
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   441
    _kwfwrite(ui, repo, False, *pats, **opts)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   442
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   443
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   444
def uisetup(ui):
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   445
    ''' Monkeypatches dispatch._parse to retrieve user command.'''
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   446
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   447
    def kwdispatch_parse(orig, ui, args):
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   448
        '''Monkeypatch dispatch._parse to obtain running hg command.'''
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   449
        cmd, func, args, options, cmdoptions = orig(ui, args)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   450
        kwtools['hgcmd'] = cmd
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   451
        return cmd, func, args, options, cmdoptions
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   452
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   453
    extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   454
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   455
def reposetup(ui, repo):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   456
    '''Sets up repo as kwrepo for keyword substitution.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   457
    Overrides file method to return kwfilelog instead of filelog
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   458
    if file matches user configuration.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   459
    Wraps commit to overwrite configured files with updated
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   460
    keyword substitutions.
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   461
    Monkeypatches patch and webcommands.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   462
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   463
    try:
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   464
        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   465
            or '.hg' in util.splitpath(repo.root)
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   466
            or repo._url.startswith('bundle:')):
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   467
            return
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   468
    except AttributeError:
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   469
        pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   470
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   471
    inc, exc = [], ['.hg*']
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   472
    for pat, opt in ui.configitems('keyword'):
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   473
        if opt != 'ignore':
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   474
            inc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   475
        else:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   476
            exc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   477
    if not inc:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   478
        return
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   479
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   480
    kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   481
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   482
    class kwrepo(repo.__class__):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   483
        def file(self, f):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   484
            if f[0] == '/':
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   485
                f = f[1:]
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   486
            return kwfilelog(self.sopener, kwt, f)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   487
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   488
        def wread(self, filename):
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   489
            data = super(kwrepo, self).wread(filename)
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   490
            return kwt.wread(filename, data)
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   491
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   492
        def commit(self, *args, **opts):
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   493
            # use custom commitctx for user commands
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   494
            # other extensions can still wrap repo.commitctx directly
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   495
            self.commitctx = self.kwcommitctx
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   496
            try:
10495
2c2d2f1354b4 keyword: do not postpone commit hooks
Christian Ebert <blacktrash@gmx.net>
parents: 10492
diff changeset
   497
                return super(kwrepo, self).commit(*args, **opts)
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   498
            finally:
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   499
                del self.commitctx
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   500
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   501
        def kwcommitctx(self, ctx, error=False):
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   502
            n = super(kwrepo, self).commitctx(ctx, error)
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   503
            # no lock needed, only called from repo.commit() which already locks
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   504
            if not kwt.record:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   505
                restrict = kwt.restrict
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   506
                kwt.restrict = True
11320
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
   507
                kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   508
                              False, True)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   509
                kwt.restrict = restrict
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   510
            return n
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   511
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   512
        def rollback(self, dryrun=False):
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   513
            wlock = repo.wlock()
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   514
            try:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   515
                if not dryrun:
12604
415ab8911724 keyword: rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 12498
diff changeset
   516
                    changed = self['.'].files()
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   517
                ret = super(kwrepo, self).rollback(dryrun)
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   518
                if not dryrun:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   519
                    ctx = self['.']
12605
aa4a6e3ed0c9 keyword: use workingctx to detect modified and added files after rollback
Christian Ebert <blacktrash@gmx.net>
parents: 12604
diff changeset
   520
                    modified, added = self[None].status()[:2]
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   521
                    modified = [f for f in modified if f in changed]
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   522
                    added = [f for f in added if f in changed]
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   523
                    kwt.overwrite(ctx, added, True, False)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   524
                    kwt.overwrite(ctx, modified, True, True)
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   525
                return ret
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   526
            finally:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   527
                wlock.release()
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   528
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   529
    # monkeypatches
9013
21b29f4c7c9f keyword: break overlong line
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   530
    def kwpatchfile_init(orig, self, ui, fname, opener,
10967
479f15f3faa9 keyword: monkeypatch patch so that optional args can be passed as kwargs
Augie Fackler <durin42@gmail.com>
parents: 10894
diff changeset
   531
                         missing=False, eolmode=None):
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   532
        '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   533
        rejects or conflicts due to expanded keywords in working dir.'''
10967
479f15f3faa9 keyword: monkeypatch patch so that optional args can be passed as kwargs
Augie Fackler <durin42@gmail.com>
parents: 10894
diff changeset
   534
        orig(self, ui, fname, opener, missing, eolmode)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   535
        # shrink keywords read from working dir
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   536
        self.lines = kwt.shrinklines(self.fname, self.lines)
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   537
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7216
diff changeset
   538
    def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None,
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 11681
diff changeset
   539
                opts=None, prefix=''):
12497
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
   540
        '''Monkeypatch patch.diff to avoid expansion.'''
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
   541
        kwt.restrict = True
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 11681
diff changeset
   542
        return orig(repo, node1, node2, match, changes, opts, prefix)
6667
01e95d4bc66c keyword: disable expansion for annotate
Christian Ebert <blacktrash@gmx.net>
parents: 6603
diff changeset
   543
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   544
    def kwweb_skip(orig, web, req, tmpl):
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   545
        '''Wraps webcommands.x turning off keyword expansion.'''
8638
c6483eec6092 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 8567
diff changeset
   546
        kwt.match = util.never
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   547
        return orig(web, req, tmpl)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   548
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   549
    def kw_copy(orig, ui, repo, pats, opts, rename=False):
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   550
        '''Wraps cmdutil.copy so that copy/rename destinations do not
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   551
        contain expanded keywords.
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   552
        Note that the source may also be a symlink as:
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   553
        hg cp sym x                -> x is symlink
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   554
        cp sym x; hg cp -A sym x   -> x is file (maybe expanded keywords)
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   555
        '''
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   556
        orig(ui, repo, pats, opts, rename)
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   557
        if opts.get('dry_run'):
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   558
            return
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   559
        wctx = repo[None]
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   560
        candidates = [f for f in repo.dirstate.copies() if
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   561
                      kwt.match(repo.dirstate.copied(f)) and
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   562
                      not 'l' in wctx.flags(f)]
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   563
        kwt.overwrite(wctx, candidates, False, False)
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   564
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   565
    def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   566
        '''Wraps record.dorecord expanding keywords after recording.'''
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   567
        wlock = repo.wlock()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   568
        try:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   569
            # record returns 0 even when nothing has changed
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   570
            # therefore compare nodes before and after
12631
7b34fdffed65 keyword: switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 12630
diff changeset
   571
            kwt.record = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   572
            ctx = repo['.']
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   573
            modified, added = repo[None].status()[:2]
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   574
            ret = orig(ui, repo, commitfunc, *pats, **opts)
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   575
            recctx = repo['.']
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   576
            if ctx != recctx:
12684
8348599c68d7 keyword: fix weeding of expansion candidates when recording
Christian Ebert <blacktrash@gmx.net>
parents: 12631
diff changeset
   577
                changed = recctx.files()
8348599c68d7 keyword: fix weeding of expansion candidates when recording
Christian Ebert <blacktrash@gmx.net>
parents: 12631
diff changeset
   578
                modified = [f for f in modified if f in changed]
8348599c68d7 keyword: fix weeding of expansion candidates when recording
Christian Ebert <blacktrash@gmx.net>
parents: 12631
diff changeset
   579
                added = [f for f in added if f in changed]
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   580
                kwt.restrict = False
12630
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   581
                kwt.overwrite(recctx, modified, False, True, kwt.re_kwexp.subn)
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   582
                kwt.overwrite(recctx, added, False, True, kwt.re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   583
                kwt.restrict = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   584
            return ret
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   585
        finally:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   586
            wlock.release()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   587
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   588
    repo.__class__ = kwrepo
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   589
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   590
    extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
12497
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
   591
    extensions.wrapfunction(patch, 'diff', kw_diff)
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   592
    extensions.wrapfunction(cmdutil, 'copy', kw_copy)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   593
    for c in 'annotate changeset rev filediff diff'.split():
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   594
        extensions.wrapfunction(webcommands, c, kwweb_skip)
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   595
    for name in recordextensions.split():
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   596
        try:
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   597
            record = extensions.find(name)
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   598
            extensions.wrapfunction(record, 'dorecord', kw_dorecord)
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   599
        except KeyError:
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   600
            pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   601
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   602
cmdtable = {
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   603
    'kwdemo':
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   604
        (demo,
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   605
         [('d', 'default', None, _('show default keyword template maps')),
11321
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11320
diff changeset
   606
          ('f', 'rcfile', '',
40c06bbf58be help: show value requirement and multiple occurrence of options
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 11320
diff changeset
   607
           _('read maps from rcfile'), _('FILE'))],
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   608
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...')),
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   609
    'kwexpand': (expand, commands.walkopts,
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   610
                 _('hg kwexpand [OPTION]... [FILE]...')),
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   611
    'kwfiles':
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   612
        (files,
9494
bdd8a41ea6f6 keyword: uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 9493
diff changeset
   613
         [('A', 'all', None, _('show keyword status flags of all files')),
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   614
          ('i', 'ignore', None, _('show files excluded from expansion')),
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   615
          ('u', 'unknown', None, _('only show unknown (not tracked) files')),
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   616
         ] + commands.walkopts,
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   617
         _('hg kwfiles [OPTION]... [FILE]...')),
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   618
    'kwshrink': (shrink, commands.walkopts,
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   619
                 _('hg kwshrink [OPTION]... [FILE]...')),
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   620
}