hgext/keyword.py
author Patrick Mezard <patrick@mezard.eu>
Mon, 30 Apr 2012 20:45:45 +0200
branchstable
changeset 16553 9224cc2e99cc
parent 15871 07893690c435
child 16686 67964cda8701
permissions -rw-r--r--
amend: fix copy records handling (issue3410) Messing with the dirstate before the intermediate commit seems error prone. Instead, commit and recompute the copies with copies.pathcopies(), then use that with commitctx(). Since copies.pathcopies() does not support file replacement very well, the whole .renamed() condition in samefile() is removed and the "file replacement caused by differing copy source" effect is discarded. Test shamelessly stolen from Idan Kamara <idankk86@gmail.com>
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
13885
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
    63
Three additional date template filters are provided:
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
    64
13885
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
    65
:``utcdate``:    "2006/09/18 15:13:13"
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
    66
:``svnutcdate``: "2006-09-18 15:13:13Z"
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
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
13025
99210fb3bc0a keyword: s/config/configuration/ in help
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
    71
:hg:`kwdemo` to control the results of your configuration changes.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    72
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
    73
Before changing/disabling active keywords, you must run :hg:`kwshrink`
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
    74
to avoid storing expanded keywords in the change history.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    75
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    76
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
    77
:hg:`kwexpand`.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    78
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    79
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
    80
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
    81
{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
    82
'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    83
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
    84
from mercurial import commands, context, cmdutil, dispatch, filelog, extensions
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 localrepo, match, patch, templatefilters, templater, util
13971
bfeaa88b875d move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13885
diff changeset
    86
from mercurial import scmutil
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 _
15387
87248de09135 keyword: backout realpath change (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15354
diff changeset
    89
import os, 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
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
    93
cmdtable = {}
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
    94
command = cmdutil.command(cmdtable)
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
    95
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
    96
# hg commands that do not act on keywords
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
    97
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
    98
                ' 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
    99
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
   100
# 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
   101
# 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
   102
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
   103
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   104
# names of extensions using dorecord
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   105
recordextensions = 'record'
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   106
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   107
colortable = {
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   108
    'kwfiles.enabled': 'green bold',
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   109
    'kwfiles.deleted': 'cyan bold underline',
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   110
    'kwfiles.enabledunknown': 'green',
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   111
    'kwfiles.ignored': 'bold',
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   112
    'kwfiles.ignoredunknown': 'none'
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   113
}
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   114
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   115
# date like in cvs' $Date
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
   116
def utcdate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   117
    ''':utcdate: Date. Returns a UTC-date in this format: "2009/08/18 11:00:13".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   118
    '''
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
   119
    return util.datestr((text[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
   120
# date like in svn's $Date
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
   121
def svnisodate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   122
    ''':svnisodate: Date. Returns a date in this format: "2009-08-18 13:00:13
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   123
    +0200 (Tue, 18 Aug 2009)".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   124
    '''
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
   125
    return util.datestr(text, '%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   126
# date like in svn's $Id
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
   127
def svnutcdate(text):
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   128
    ''':svnutcdate: Date. Returns a UTC-date in this format: "2009-08-18
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   129
    11:00:13Z".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   130
    '''
13592
ad2ee188f4a5 templates: document missing keywords or filters
Patrick Mezard <pmezard@gmail.com>
parents: 13299
diff changeset
   131
    return util.datestr((text[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
   132
13634
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
   133
templatefilters.filters.update({'utcdate': utcdate,
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
   134
                                'svnisodate': svnisodate,
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
   135
                                'svnutcdate': svnutcdate})
15470463f932 keyword: offer additional datefilters when the extension is enabled
Christian Ebert <blacktrash@gmx.net>
parents: 13633
diff changeset
   136
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   137
# make keyword tools accessible
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   138
kwtools = {'templater': None, 'hgcmd': ''}
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   139
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   140
def _defaultkwmaps(ui):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   141
    '''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
   142
    templates = {
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   143
        'Revision': '{node|short}',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   144
        'Author': '{author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   145
    }
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   146
    kwsets = ({
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   147
        'Date': '{date|utcdate}',
9943
f8d779791161 keyword: the CVS keyword is $RCSfile$, not $RCSFile$
Christian Ebert <blacktrash@gmx.net>
parents: 9942
diff changeset
   148
        'RCSfile': '{file|basename},v',
9950
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
   149
        'RCSFile': '{file|basename},v', # kept for backwards compatibility
af5f99d8195e keyword: clarify object of backwards compatibility
timeless
parents: 9943
diff changeset
   150
                                        # with hg-keyword
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   151
        'Source': '{root}/{file},v',
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   152
        '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
   153
        '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
   154
    }, {
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   155
        'Date': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   156
        '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
   157
        'LastChangedRevision': '{node|short}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   158
        'LastChangedBy': '{author|user}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   159
        'LastChangedDate': '{date|svnisodate}',
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   160
    })
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   161
    templates.update(kwsets[ui.configbool('keywordset', 'svn')])
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   162
    return templates
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   163
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   164
def _shrinktext(text, subfunc):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   165
    '''Helper for keyword expansion removal in text.
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   166
    Depending on subfunc also returns number of substitutions.'''
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   167
    return subfunc(r'$\1$', text)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   168
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   169
def _preselect(wstatus, changed):
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   170
    '''Retrieves modfied and added files from a working directory state
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   171
    and returns the subset of each contained in given changed files
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   172
    retrieved from a change context.'''
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   173
    modified, added = wstatus[:2]
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   174
    modified = [f for f in modified if f in changed]
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   175
    added = [f for f in added if f in changed]
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   176
    return modified, added
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   177
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   178
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   179
class kwtemplater(object):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   180
    '''
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   181
    Sets up keyword templates, corresponding keyword regex, and
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   182
    provides keyword substitution functions.
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   183
    '''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   184
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   185
    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
   186
        self.ui = ui
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   187
        self.repo = repo
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   188
        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
   189
        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
   190
        self.record = False
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   191
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   192
        kwmaps = self.ui.configitems('keywordmaps')
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   193
        if kwmaps: # override default templates
9081
d8e8447a4b7b keyword: collect kwmaps using a generator expression
Christian Ebert <blacktrash@gmx.net>
parents: 9066
diff changeset
   194
            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
   195
                                  for k, v in kwmaps)
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   196
        else:
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   197
            self.templates = _defaultkwmaps(self.ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   198
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   199
    @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   200
    def escape(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   201
        '''Returns bar-separated and escaped keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   202
        return '|'.join(map(re.escape, self.templates.keys()))
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   203
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   204
    @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   205
    def rekw(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   206
        '''Returns regex for unexpanded keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   207
        return re.compile(r'\$(%s)\$' % self.escape)
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   208
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   209
    @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   210
    def rekwexp(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   211
        '''Returns regex for expanded keywords.'''
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   212
        return re.compile(r'\$(%s): [^$\n\r]*? \$' % self.escape)
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   213
7375
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
   214
    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
   215
        '''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
   216
        def kwsub(mobj):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   217
            kw = mobj.group(1)
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   218
            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
   219
                                             False, None, '', False)
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   220
            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
   221
            self.ui.pushbuffer()
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   222
            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
   223
            ekw = templatefilters.firstline(self.ui.popbuffer())
ee7df90d1daa keyword: split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 6022
diff changeset
   224
            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
   225
        return subfunc(kwsub, data)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   226
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   227
    def linkctx(self, path, fileid):
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   228
        '''Similar to filelog.linkrev, but returns a changectx.'''
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   229
        return self.repo.filectx(path, fileid=fileid).changectx()
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   230
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   231
    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
   232
        '''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
   233
        if not self.restrict and self.match(path) and not util.binary(data):
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   234
            ctx = self.linkctx(path, node)
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   235
            return self.substitute(data, path, ctx, self.rekw.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   236
        return data
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   237
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   238
    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
   239
        '''Returns subset of candidates which are configured for keyword
15324
0890842c41d1 keyword: correct grammar in iskwfile docstring
Christian Ebert <blacktrash@gmx.net>
parents: 15183
diff changeset
   240
        expansion but are not symbolic links.'''
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   241
        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
   242
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
   243
    def overwrite(self, ctx, candidates, lookup, expand, rekw=False):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   244
        '''Overwrites selected files expanding/shrinking keywords.'''
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
   245
        if self.restrict or lookup or self.record: # 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
   246
            candidates = self.iskwfile(candidates, ctx)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   247
        if not candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   248
            return
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
   249
        kwcmd = self.restrict and lookup # kwexpand/kwshrink
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   250
        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
   251
            mf = ctx.manifest()
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   252
        if self.restrict or rekw:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   253
            re_kw = self.rekw
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   254
        else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   255
            re_kw = self.rekwexp
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   256
        if expand:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   257
            msg = _('overwriting %s expanding keywords\n')
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   258
        else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   259
            msg = _('overwriting %s shrinking keywords\n')
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   260
        for f in candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   261
            if self.restrict:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   262
                data = self.repo.file(f).read(mf[f])
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   263
            else:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   264
                data = self.repo.wread(f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   265
            if util.binary(data):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   266
                continue
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   267
            if expand:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   268
                if lookup:
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   269
                    ctx = self.linkctx(f, mf[f])
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   270
                data, found = self.substitute(data, f, ctx, re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   271
            elif self.restrict:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   272
                found = re_kw.search(data)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   273
            else:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   274
                data, found = _shrinktext(data, re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   275
            if found:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   276
                self.ui.note(msg % f)
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   277
                fp = self.repo.wopener(f, "wb", atomictemp=True)
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   278
                fp.write(data)
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   279
                fp.close()
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
   280
                if kwcmd:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   281
                    self.repo.dirstate.normal(f)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   282
                elif self.record:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   283
                    self.repo.dirstate.normallookup(f)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   284
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   285
    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
   286
        '''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
   287
        if self.match(fname) and not util.binary(text):
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   288
            return _shrinktext(text, self.rekwexp.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   289
        return text
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   290
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   291
    def shrinklines(self, fname, lines):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   292
        '''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
   293
        if self.match(fname):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   294
            text = ''.join(lines)
6508
4b2c266bf059 Get rid of reimplementations of util.binary
Bryan O'Sullivan <bos@serpentine.com>
parents: 6506
diff changeset
   295
            if not util.binary(text):
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   296
                return _shrinktext(text, self.rekwexp.sub).splitlines(True)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   297
        return lines
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   298
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   299
    def wread(self, fname, data):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   300
        '''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
   301
        keyword substitutions removed.'''
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   302
        if self.restrict:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   303
            return self.shrink(fname, data)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   304
        return data
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
class kwfilelog(filelog.filelog):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   307
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   308
    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
   309
    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
   310
    '''
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   311
    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
   312
        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
   313
        self.kwt = kwt
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   314
        self.path = path
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   315
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   316
    def read(self, node):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   317
        '''Expands keywords when reading filelog.'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   318
        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
   319
        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
   320
            return data
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   321
        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
   322
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   323
    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
   324
        '''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
   325
        text = self.kwt.shrink(self.path, text)
6504
1be53f931c9c keyword: compact setting of optional arguments
Christian Ebert <blacktrash@gmx.net>
parents: 6503
diff changeset
   326
        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
   327
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   328
    def cmp(self, node, text):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   329
        '''Removes keyword substitutions for comparison.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   330
        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
   331
        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
   332
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   333
def _status(ui, repo, wctx, kwt, *pats, **opts):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   334
    '''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
   335
    Returns status of working directory.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   336
    if kwt:
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   337
        return repo.status(match=scmutil.match(wctx, pats, opts), clean=True,
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
   338
                           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
   339
    if ui.configitems('keyword'):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   340
        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
   341
    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
   342
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   343
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
   344
    '''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
   345
    wctx = repo[None]
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
   346
    if len(wctx.parents()) > 1:
6672
6004eedb13f4 keyword: mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 6667
diff changeset
   347
        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
   348
    kwt = kwtools['templater']
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   349
    wlock = repo.wlock()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   350
    try:
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   351
        status = _status(ui, repo, wctx, kwt, *pats, **opts)
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   352
        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
   353
        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
   354
            raise util.Abort(_('outstanding uncommitted changes'))
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   355
        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
   356
    finally:
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   357
        wlock.release()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   358
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   359
@command('kwdemo',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   360
         [('d', 'default', None, _('show default keyword template maps')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   361
          ('f', 'rcfile', '',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   362
           _('read maps from rcfile'), _('FILE'))],
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   363
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   364
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
   365
    '''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
   366
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
   367
    Show current, custom, or default keyword template maps and their
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   368
    expansions.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   369
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   370
    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
   371
    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
   372
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   373
    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
   374
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11168
diff changeset
   375
    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
   376
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   377
    def demoitems(section, items):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   378
        ui.write('[%s]\n' % section)
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
   379
        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
   380
            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
   381
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   382
    fn = 'demo.txt'
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   383
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
8027
9c7ca86fc658 expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 7993
diff changeset
   384
    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
   385
    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
   386
    ui.setconfig('keyword', fn, '')
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   387
    svn = ui.configbool('keywordset', 'svn')
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   388
    # explicitly set keywordset for demo output
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   389
    ui.setconfig('keywordset', 'svn', svn)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   390
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   391
    uikwmaps = ui.configitems('keywordmaps')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   392
    if args or opts.get('rcfile'):
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   393
        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
   394
        if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   395
            ui.status(_('\textending current template maps\n'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   396
        if opts.get('default') or not uikwmaps:
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   397
            if svn:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   398
                ui.status(_('\toverriding default svn keywordset\n'))
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   399
            else:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   400
                ui.status(_('\toverriding default cvs keywordset\n'))
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   401
        if opts.get('rcfile'):
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   402
            ui.readconfig(opts.get('rcfile'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   403
        if args:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   404
            # simulate hgrc parsing
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   405
            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
   406
            fp = repo.opener('hgrc', 'w')
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   407
            fp.writelines(rcmaps)
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   408
            fp.close()
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   409
            ui.readconfig(repo.join('hgrc'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   410
        kwmaps = dict(ui.configitems('keywordmaps'))
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   411
    elif opts.get('default'):
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   412
        if svn:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   413
            ui.status(_('\n\tconfiguration using default svn keywordset\n'))
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   414
        else:
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   415
            ui.status(_('\n\tconfiguration using default cvs keywordset\n'))
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   416
        kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   417
        if uikwmaps:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   418
            ui.status(_('\tdisabling current template maps\n'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
   419
            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
   420
                ui.setconfig('keywordmaps', k, v)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   421
    else:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   422
        ui.status(_('\n\tconfiguration using current keyword template maps\n'))
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   423
        if uikwmaps:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   424
            kwmaps = dict(uikwmaps)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   425
        else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   426
            kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   427
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   428
    uisetup(ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   429
    reposetup(ui, repo)
10714
9c0a1887bd4b keyword: do not bother about detecting extension path in demo
Christian Ebert <blacktrash@gmx.net>
parents: 10713
diff changeset
   430
    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
   431
    demoitems('keyword', ui.configitems('keyword'))
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   432
    demoitems('keywordset', ui.configitems('keywordset'))
5946
ee0dc0f3804b keyword: improve use of dicts
Christian Ebert <blacktrash@gmx.net>
parents: 5945
diff changeset
   433
    demoitems('keywordmaps', kwmaps.iteritems())
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
   434
    keywords = '$' + '$\n$'.join(sorted(kwmaps.keys())) + '$\n'
14168
135e244776f0 prevent transient leaks of file handle by using new helper functions
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 13971
diff changeset
   435
    repo.wopener.write(fn, keywords)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11296
diff changeset
   436
    repo[None].add([fn])
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
   437
    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
   438
    ui.note(keywords)
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
   439
    repo.dirstate.setbranch('demobranch')
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   440
    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
   441
        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
   442
            repo.ui.setconfig('hooks', name, '')
10499
4401b0dfee88 keyword: mark improved demo commit message for translation
Christian Ebert <blacktrash@gmx.net>
parents: 10495
diff changeset
   443
    msg = _('hg keyword configuration and expansion example')
10713
b9c3f8e88e4f keyword: make kwdemo less verbose
Christian Ebert <blacktrash@gmx.net>
parents: 10712
diff changeset
   444
    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
   445
    repo.commit(text=msg)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   446
    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
   447
    ui.write(repo.wread(fn))
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   448
    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
   449
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   450
@command('kwexpand', commands.walkopts, _('hg kwexpand [OPTION]... [FILE]...'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   451
def expand(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   452
    '''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
   453
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   454
    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
   455
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   456
    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
   457
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   458
    # 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
   459
    _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
   460
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   461
@command('kwfiles',
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   462
         [('A', 'all', None, _('show keyword status flags of all files')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   463
          ('i', 'ignore', None, _('show files excluded from expansion')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   464
          ('u', 'unknown', None, _('only show unknown (not tracked) files')),
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   465
         ] + commands.walkopts,
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   466
         _('hg kwfiles [OPTION]... [FILE]...'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   467
def files(ui, repo, *pats, **opts):
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
   468
    '''show files configured for keyword expansion
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
   469
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   470
    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
   471
    [keyword] configuration patterns.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   472
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   473
    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
   474
    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
   475
    expansion.
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
   476
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
   477
    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
   478
    inclusion and exclusion of files.
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
   479
9494
bdd8a41ea6f6 keyword: uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 9493
diff changeset
   480
    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
   481
    of files are::
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   482
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   483
      K = keyword expansion candidate
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   484
      k = keyword expansion candidate (not tracked)
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   485
      I = ignored
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   486
      i = ignored (not tracked)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   487
    '''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   488
    kwt = kwtools['templater']
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   489
    wctx = repo[None]
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   490
    status = _status(ui, repo, wctx, kwt, *pats, **opts)
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   491
    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
   492
    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
   493
    files = []
10652
e7f840e4ac7d keyword: remove deprecated options
Christian Ebert <blacktrash@gmx.net>
parents: 10604
diff changeset
   494
    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
   495
        files = sorted(modified + added + clean)
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   496
    kwfiles = kwt.iskwfile(files, wctx)
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   497
    kwdeleted = kwt.iskwfile(deleted, wctx)
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   498
    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
   499
    if not opts.get('ignore') or opts.get('all'):
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   500
        showfiles = kwfiles, kwdeleted, kwunknown
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   501
    else:
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   502
        showfiles = [], [], []
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   503
    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
   504
        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
   505
                      [f for f in unknown if f not in kwunknown])
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   506
    kwlabels = 'enabled deleted enabledunknown ignored ignoredunknown'.split()
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   507
    kwstates = zip('K!kIi', showfiles, kwlabels)
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   508
    for char, filenames, kwstate in kwstates:
7417
d3f1d316b72b keyword: do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 7391
diff changeset
   509
        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
   510
        for f in filenames:
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   511
            ui.write(fmt % repo.pathto(f, cwd), label='kwfiles.' + kwstate)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   512
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   513
@command('kwshrink', commands.walkopts, _('hg kwshrink [OPTION]... [FILE]...'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   514
def shrink(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   515
    '''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
   516
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
   517
    Must be run before changing/disabling active keywords.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   518
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   519
    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
   520
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   521
    # 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
   522
    _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
   523
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   524
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   525
def uisetup(ui):
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   526
    ''' 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
   527
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   528
    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
   529
        '''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
   530
        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
   531
        kwtools['hgcmd'] = cmd
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   532
        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
   533
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   534
    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
   535
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   536
def reposetup(ui, repo):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   537
    '''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
   538
    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
   539
    if file matches user configuration.
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   540
    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
   541
    keyword substitutions.
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   542
    Monkeypatches patch and webcommands.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   543
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   544
    try:
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   545
        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   546
            or '.hg' in util.splitpath(repo.root)
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   547
            or repo._url.startswith('bundle:')):
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   548
            return
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   549
    except AttributeError:
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   550
        pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   551
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   552
    inc, exc = [], ['.hg*']
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   553
    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
   554
        if opt != 'ignore':
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   555
            inc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   556
        else:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   557
            exc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   558
    if not inc:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   559
        return
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   560
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   561
    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
   562
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   563
    class kwrepo(repo.__class__):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   564
        def file(self, f):
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   565
            if f[0] == '/':
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   566
                f = f[1:]
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   567
            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
   568
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   569
        def wread(self, filename):
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   570
            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
   571
            return kwt.wread(filename, data)
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   572
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   573
        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
   574
            # 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
   575
            # 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
   576
            self.commitctx = self.kwcommitctx
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   577
            try:
10495
2c2d2f1354b4 keyword: do not postpone commit hooks
Christian Ebert <blacktrash@gmx.net>
parents: 10492
diff changeset
   578
                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
   579
            finally:
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   580
                del self.commitctx
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   581
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   582
        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
   583
            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
   584
            # 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
   585
            if not kwt.record:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   586
                restrict = kwt.restrict
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   587
                kwt.restrict = True
11320
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
   588
                kwt.overwrite(self[n], sorted(ctx.added() + ctx.modified()),
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   589
                              False, True)
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   590
                kwt.restrict = restrict
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   591
            return n
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   592
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
   593
        def rollback(self, dryrun=False, force=False):
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   594
            wlock = self.wlock()
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   595
            try:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   596
                if not dryrun:
12604
415ab8911724 keyword: rename variable "cfiles" to "changed" for clarity
Christian Ebert <blacktrash@gmx.net>
parents: 12498
diff changeset
   597
                    changed = self['.'].files()
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
   598
                ret = super(kwrepo, self).rollback(dryrun, force)
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   599
                if not dryrun:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   600
                    ctx = self['.']
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   601
                    modified, added = _preselect(self[None].status(), changed)
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   602
                    kwt.overwrite(ctx, modified, True, True)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   603
                    kwt.overwrite(ctx, added, True, False)
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   604
                return ret
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   605
            finally:
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   606
                wlock.release()
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   607
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   608
    # monkeypatches
14566
d0c2cc11e611 patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 14452
diff changeset
   609
    def kwpatchfile_init(orig, self, ui, gp, backend, store, eolmode=None):
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   610
        '''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
   611
        rejects or conflicts due to expanded keywords in working dir.'''
14566
d0c2cc11e611 patch: generalize the use of patchmeta in applydiff()
Patrick Mezard <pmezard@gmail.com>
parents: 14452
diff changeset
   612
        orig(self, ui, gp, backend, store, eolmode)
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   613
        # 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
   614
        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
   615
7308
b6f5490effbf patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7216
diff changeset
   616
    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
   617
                opts=None, prefix=''):
12497
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
   618
        '''Monkeypatch patch.diff to avoid expansion.'''
5d00a35ea2ea keyword: do not expand at all during diff
Christian Ebert <blacktrash@gmx.net>
parents: 12496
diff changeset
   619
        kwt.restrict = True
12167
d2c5b0927c28 diff: recurse into subrepositories with --subrepos/-S flag
Martin Geisler <mg@lazybytes.net>
parents: 11681
diff changeset
   620
        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
   621
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   622
    def kwweb_skip(orig, web, req, tmpl):
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   623
        '''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
   624
        kwt.match = util.never
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   625
        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
   626
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   627
    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
   628
        '''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
   629
        contain expanded keywords.
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   630
        Note that the source of a regular file destination may also be a
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   631
        symlink:
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   632
        hg cp sym x                -> x is symlink
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   633
        cp sym x; hg cp -A sym x   -> x is file (maybe expanded keywords)
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   634
        For the latter we have to follow the symlink to find out whether its
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   635
        target is configured for expansion and we therefore must unexpand the
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   636
        keywords in the destination.'''
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   637
        orig(ui, repo, pats, opts, rename)
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   638
        if opts.get('dry_run'):
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   639
            return
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   640
        wctx = repo[None]
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   641
        cwd = repo.getcwd()
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   642
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   643
        def haskwsource(dest):
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   644
            '''Returns true if dest is a regular file and configured for
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   645
            expansion or a symlink which points to a file configured for
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   646
            expansion. '''
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   647
            source = repo.dirstate.copied(dest)
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   648
            if 'l' in wctx.flags(source):
13971
bfeaa88b875d move canonpath from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13885
diff changeset
   649
                source = scmutil.canonpath(repo.root, cwd,
15387
87248de09135 keyword: backout realpath change (issue3071)
Matt Mackall <mpm@selenic.com>
parents: 15354
diff changeset
   650
                                           os.path.realpath(source))
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   651
            return kwt.match(source)
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   652
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   653
        candidates = [f for f in repo.dirstate.copies() if
13069
6aff4f144ad3 keyword: copy: when copied source is a symlink, follow it
Christian Ebert <blacktrash@gmx.net>
parents: 13025
diff changeset
   654
                      not 'l' in wctx.flags(f) and haskwsource(f)]
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   655
        kwt.overwrite(wctx, candidates, False, False)
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   656
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   657
    def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   658
        '''Wraps record.dorecord expanding keywords after recording.'''
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   659
        wlock = repo.wlock()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   660
        try:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   661
            # record returns 0 even when nothing has changed
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   662
            # therefore compare nodes before and after
12631
7b34fdffed65 keyword: switch kwtemplater.record in kw_dorecord()
Christian Ebert <blacktrash@gmx.net>
parents: 12630
diff changeset
   663
            kwt.record = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   664
            ctx = repo['.']
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   665
            wstatus = repo[None].status()
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   666
            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
   667
            recctx = repo['.']
94926263b7ab keyword: specific regular expressions depending on read mode
Christian Ebert <blacktrash@gmx.net>
parents: 12628
diff changeset
   668
            if ctx != recctx:
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   669
                modified, added = _preselect(wstatus, recctx.files())
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   670
                kwt.restrict = False
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
   671
                kwt.overwrite(recctx, modified, False, True)
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
   672
                kwt.overwrite(recctx, added, False, True, True)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   673
                kwt.restrict = True
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   674
            return ret
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   675
        finally:
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   676
            wlock.release()
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   677
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
   678
    def kwfilectx_cmp(orig, self, fctx):
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
   679
        # keyword affects data size, comparing wdir and filelog size does
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
   680
        # not make sense
12732
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
   681
        if (fctx._filerev is None and
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
   682
            (self._repo._encodefilterpats or
15871
07893690c435 keyword: update filectx.cmp monkeypatch to handle '\1\n' at start of file
Christian Ebert <blacktrash@gmx.net>
parents: 15387
diff changeset
   683
             kwt.match(fctx.path()) and not 'l' in fctx.flags() or
07893690c435 keyword: update filectx.cmp monkeypatch to handle '\1\n' at start of file
Christian Ebert <blacktrash@gmx.net>
parents: 15387
diff changeset
   684
             self.size() - 4 == fctx.size()) or
12732
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
   685
            self.size() == fctx.size()):
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
   686
            return self._filelog.cmp(self._filenode, fctx.data())
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
   687
        return True
4bca87c29445 keyword: only use expensive fctx.cmp when needed
Christian Ebert <blacktrash@gmx.net>
parents: 12723
diff changeset
   688
12709
4147a292c508 filectx: use ctx.size comparisons to speed up ctx.cmp
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 12685
diff changeset
   689
    extensions.wrapfunction(context.filectx, 'cmp', kwfilectx_cmp)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   690
    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
   691
    extensions.wrapfunction(patch, 'diff', kw_diff)
12626
41df968a54c9 keyword: support copy and rename
Christian Ebert <blacktrash@gmx.net>
parents: 12625
diff changeset
   692
    extensions.wrapfunction(cmdutil, 'copy', kw_copy)
7216
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   693
    for c in 'annotate changeset rev filediff diff'.split():
292fb2ad2846 extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 6933
diff changeset
   694
        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
   695
    for name in recordextensions.split():
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   696
        try:
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   697
            record = extensions.find(name)
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   698
            extensions.wrapfunction(record, 'dorecord', kw_dorecord)
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   699
        except KeyError:
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   700
            pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   701
13299
f24ea9356e7d keyword: move repo.__class__ assignment out of monkeypatch context
Christian Ebert <blacktrash@gmx.net>
parents: 13298
diff changeset
   702
    repo.__class__ = kwrepo