hgext/keyword.py
author Manuel Jacob <me@manueljacob.de>
Mon, 29 Jun 2020 15:03:36 +0200
branchstable
changeset 45022 e3b19004087a
parent 43506 9f70512ae2cf
child 45942 89a2afe31e82
permissions -rw-r--r--
convert: correctly convert paths to UTF-8 for Subversion The previous code using encoding.tolocal() only worked by chance in these situations: * The string is ASCII: The fast path was triggered and the string was returned unmodified. * The local encoding is UTF-8: The source and target encoding is the same. * The string is not valid UTF-8 and the native encoding is ISO-8859-1: If the string doesn’t decode using UTF-8, ISO-8859-1 is tried as a fallback. During `hg convert`, the local encoding is always UTF-8. The irony is that in this case, encoding.tolocal() behaves like what someone would expect the reverse function, encoding.fromlocal(), to do. When the locale encoding is ISO-8859-15, trying to convert a SVN repo `/tmp/a€` failed before like this: file:///tmp/a%C2%A4 does not look like a Subversion repository to libsvn version 1.14.0 The correct URL is `file:///tmp/a%E2%82%AC`. Unlike previously (with the ISO-8859-1 fallback), decoding the path using the locale encoding can fail. In this case, we have to bail out, as Subversion won’t be able to do anything useful with the path.
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
#
23723
fd62b3e750af keyword: update copyright year
Christian Ebert <blacktrash@gmx.net>
parents: 23722
diff changeset
     3
# Copyright 2007-2015 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
#
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17057
diff changeset
    10
# Keyword expansion hack against the grain of a Distributed SCM
5815
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
26421
4b0fc75f9403 urls: bulk-change primary website URLs
Matt Mackall <mpm@selenic.com>
parents: 25186
diff changeset
    18
# <https://mercurial-scm.org/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
#
29969
862ab1cdb218 keyword: use single quotes in use warning
timeless <timeless@mozdev.org>
parents: 29841
diff changeset
    27
# Run 'hg help keyword' and 'hg kwdemo' to get info on configuration.
5815
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::
19997
de16c673455b documentation: add an extra newline after note directive
Simon Heimberg <simohe@besonet.ch>
parents: 18825
diff changeset
    56
12390
aff4afdcfd2b Use more note admonitions in help texts
Christian Ebert <blacktrash@gmx.net>
parents: 12207
diff changeset
    57
   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
    58
   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
    59
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    60
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
    61
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
    62
available templates and filters.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    63
13885
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
    64
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
    65
13885
5d115ea4030b keyword: convert a verbatim block to a field list
Martin Geisler <mg@aragost.com>
parents: 13634
diff changeset
    66
:``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
    67
:``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
    68
:``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
    69
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    70
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
    71
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
    72
: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
    73
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
    74
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
    75
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
    76
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    77
To force expansion after enabling it, or a configuration change, run
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
    78
:hg:`kwexpand`.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    79
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    80
Expansions spanning more than one line and incremental expansions,
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    81
like CVS' $Log$, are not supported. A keyword template map "Log =
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
    82
{desc}" expands to the first line of the changeset description.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    83
'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    84
28321
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    85
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    86
from __future__ import absolute_import
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    87
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    88
import os
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    89
import re
33067
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
    90
import weakref
28321
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    91
29205
a0939666b836 py3: move up symbol imports to enforce import-checker rules
Yuya Nishihara <yuya@tcha.org>
parents: 29055
diff changeset
    92
from mercurial.i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43080
diff changeset
    93
from mercurial.pycompat import getattr
6072
e521ec1ad985 keyword: no expansion in web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 6071
diff changeset
    94
from mercurial.hgweb import webcommands
28321
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    95
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    96
from mercurial import (
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    97
    cmdutil,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    98
    context,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
    99
    dispatch,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   100
    error,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   101
    extensions,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   102
    filelog,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   103
    localrepo,
35888
c8e2d6ed1f9e cmdutil: drop aliases for logcmdutil functions (API)
Yuya Nishihara <yuya@tcha.org>
parents: 35001
diff changeset
   104
    logcmdutil,
28321
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   105
    match,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   106
    patch,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   107
    pathutil,
35001
3fbc30f7b9f0 py3: handle keyword arguments in hgext/keyword.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34500
diff changeset
   108
    pycompat,
28694
9a6fa1d93bc8 keyword: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28458
diff changeset
   109
    registrar,
28321
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   110
    scmutil,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   111
    templatefilters,
37228
a0b17f744cbc keyword: declare input type of date filters as date
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   112
    templateutil,
28321
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   113
    util,
a7b453b47726 keyword: use absolute_import
Christian Ebert <blacktrash@gmx.net>
parents: 27819
diff changeset
   114
)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   115
from mercurial.utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   116
    dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   117
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   118
)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   119
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   120
cmdtable = {}
32337
46ba2cdda476 registrar: move cmdutil.command to registrar module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31331
diff changeset
   121
command = registrar.command(cmdtable)
29841
d5883fd055c6 extensions: change magic "shipped with hg" string
Augie Fackler <augie@google.com>
parents: 29634
diff changeset
   122
# Note for extension authors: ONLY specify testedwith = 'ships-with-hg-core' for
25186
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
   123
# extensions which SHIP WITH MERCURIAL. Non-mainline extensions should
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
   124
# be specifying the version(s) of Mercurial they are tested with, or
80c5b2666a96 extensions: document that `testedwith = 'internal'` is special
Augie Fackler <augie@google.com>
parents: 24987
diff changeset
   125
# leave the attribute unspecified.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   126
testedwith = b'ships-with-hg-core'
14300
1b8e421d8e42 keyword: use cmdutil.command decorator
Martin Geisler <mg@aragost.com>
parents: 14168
diff changeset
   127
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
   128
# hg commands that do not act on keywords
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   129
nokwcommands = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   130
    b'add addremove annotate bundle export grep incoming init log'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
    b' outgoing push tip verify convert email glog'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   132
)
6024
3121f0feefb4 keyword: nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 6023
diff changeset
   133
33065
0afdc1a4f925 keyword: make comparison webcommand suppress keyword expansion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33064
diff changeset
   134
# webcommands that do not act on keywords
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   135
nokwwebcommands = b'annotate changeset rev filediff diff comparison'
33065
0afdc1a4f925 keyword: make comparison webcommand suppress keyword expansion
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33064
diff changeset
   136
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
   137
# 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
   138
# not when reading filelog, and unexpand when reading from working dir
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   139
restricted = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   140
    b'merge kwexpand kwshrink record qrecord resolve transplant'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   141
    b' unshelve rebase graft backout histedit fetch'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   142
)
5961
ed4d55c2366f keyword: detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 5946
diff changeset
   143
11168
6d0d945f9e52 keyword: support extensions using dorecord, e.g. crecord
Christian Ebert <blacktrash@gmx.net>
parents: 11096
diff changeset
   144
# names of extensions using dorecord
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   145
recordextensions = b'record'
11045
eb67196d20fa keyword: support (q)record
Christian Ebert <blacktrash@gmx.net>
parents: 11044
diff changeset
   146
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   147
colortable = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   148
    b'kwfiles.enabled': b'green bold',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   149
    b'kwfiles.deleted': b'cyan bold underline',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   150
    b'kwfiles.enabledunknown': b'green',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   151
    b'kwfiles.ignored': b'bold',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   152
    b'kwfiles.ignoredunknown': b'none',
13078
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   153
}
69405131c968 keyword: colorize hg kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 13072
diff changeset
   154
28694
9a6fa1d93bc8 keyword: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28458
diff changeset
   155
templatefilter = registrar.templatefilter()
9a6fa1d93bc8 keyword: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28458
diff changeset
   156
34500
6c705bf6a8ff configitems: register the 'keywordset.svn' config
Boris Feld <boris.feld@octobus.net>
parents: 34086
diff changeset
   157
configtable = {}
6c705bf6a8ff configitems: register the 'keywordset.svn' config
Boris Feld <boris.feld@octobus.net>
parents: 34086
diff changeset
   158
configitem = registrar.configitem(configtable)
6c705bf6a8ff configitems: register the 'keywordset.svn' config
Boris Feld <boris.feld@octobus.net>
parents: 34086
diff changeset
   159
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   160
configitem(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   161
    b'keywordset', b'svn', default=False,
34500
6c705bf6a8ff configitems: register the 'keywordset.svn' config
Boris Feld <boris.feld@octobus.net>
parents: 34086
diff changeset
   162
)
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   163
# date like in cvs' $Date
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   164
@templatefilter(b'utcdate', intype=templateutil.date)
37228
a0b17f744cbc keyword: declare input type of date filters as date
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   165
def utcdate(date):
28694
9a6fa1d93bc8 keyword: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28458
diff changeset
   166
    '''Date. Returns a UTC-date in this format: "2009/08/18 11:00:13".
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   167
    '''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   168
    dateformat = b'%Y/%m/%d %H:%M:%S'
37228
a0b17f744cbc keyword: declare input type of date filters as date
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   169
    return dateutil.datestr((date[0], 0), dateformat)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   170
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   171
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   172
# date like in svn's $Date
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   173
@templatefilter(b'svnisodate', intype=templateutil.date)
37228
a0b17f744cbc keyword: declare input type of date filters as date
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   174
def svnisodate(date):
28694
9a6fa1d93bc8 keyword: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28458
diff changeset
   175
    '''Date. Returns a date in this format: "2009-08-18 13:00:13
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   176
    +0200 (Tue, 18 Aug 2009)".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   177
    '''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
    return dateutil.datestr(date, b'%Y-%m-%d %H:%M:%S %1%2 (%a, %d %b %Y)')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   179
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   180
11213
3d61813a300e keyword: add 2 svn-like date filters
Christian Ebert <blacktrash@gmx.net>
parents: 11193
diff changeset
   181
# date like in svn's $Id
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
@templatefilter(b'svnutcdate', intype=templateutil.date)
37228
a0b17f744cbc keyword: declare input type of date filters as date
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   183
def svnutcdate(date):
28694
9a6fa1d93bc8 keyword: use templatefilter to mark a function as template filter
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 28458
diff changeset
   184
    '''Date. Returns a UTC-date in this format: "2009-08-18
13633
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   185
    11:00:13Z".
20d13244f192 keyword: docstrings for additional date filters
Christian Ebert <blacktrash@gmx.net>
parents: 13592
diff changeset
   186
    '''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   187
    dateformat = b'%Y-%m-%d %H:%M:%SZ'
37228
a0b17f744cbc keyword: declare input type of date filters as date
Yuya Nishihara <yuya@tcha.org>
parents: 37084
diff changeset
   188
    return dateutil.datestr((date[0], 0), dateformat)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   189
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   190
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   191
# make keyword tools accessible
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   192
kwtools = {b'hgcmd': b''}
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   193
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   194
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   195
def _defaultkwmaps(ui):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   196
    '''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
   197
    templates = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   198
        b'Revision': b'{node|short}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   199
        b'Author': b'{author|user}',
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   200
    }
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   201
    kwsets = (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   202
        {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   203
            b'Date': b'{date|utcdate}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   204
            b'RCSfile': b'{file|basename},v',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   205
            b'RCSFile': b'{file|basename},v',  # kept for backwards compatibility
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   206
            # with hg-keyword
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   207
            b'Source': b'{root}/{file},v',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   208
            b'Id': b'{file|basename},v {node|short} {date|utcdate} {author|user}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   209
            b'Header': b'{root}/{file},v {node|short} {date|utcdate} {author|user}',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   210
        },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   211
        {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   212
            b'Date': b'{date|svnisodate}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   213
            b'Id': b'{file|basename},v {node|short} {date|svnutcdate} {author|user}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   214
            b'LastChangedRevision': b'{node|short}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
            b'LastChangedBy': b'{author|user}',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   216
            b'LastChangedDate': b'{date|svnisodate}',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   217
        },
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   218
    )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   219
    templates.update(kwsets[ui.configbool(b'keywordset', b'svn')])
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   220
    return templates
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   221
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   222
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   223
def _shrinktext(text, subfunc):
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   224
    '''Helper for keyword expansion removal in text.
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   225
    Depending on subfunc also returns number of substitutions.'''
39431
5bf99c27a7b6 py3: make regexes in hgext/keyword.py bytes
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39369
diff changeset
   226
    return subfunc(br'$\1$', text)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   227
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   228
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   229
def _preselect(wstatus, changed):
17424
e7cfe3587ea4 fix trivial spelling errors
Mads Kiilerich <mads@kiilerich.com>
parents: 17057
diff changeset
   230
    '''Retrieves modified and added files from a working directory state
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   231
    and returns the subset of each contained in given changed files
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   232
    retrieved from a change context.'''
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   233
    modified = [f for f in wstatus.modified if f in changed]
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   234
    added = [f for f in wstatus.added if f in changed]
12723
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   235
    return modified, added
eaa09d25e7c6 keyword: code cleanup
Christian Ebert <blacktrash@gmx.net>
parents: 12709
diff changeset
   236
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   237
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   238
class kwtemplater(object):
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   239
    '''
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   240
    Sets up keyword templates, corresponding keyword regex, and
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   241
    provides keyword substitution functions.
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   242
    '''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   243
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   244
    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
   245
        self.ui = ui
33067
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   246
        self._repo = weakref.ref(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   247
        self.match = match.match(repo.root, b'', [], inc, exc)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   248
        self.restrict = kwtools[b'hgcmd'] in restricted.split()
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
   249
        self.postcommit = False
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   250
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   251
        kwmaps = self.ui.configitems(b'keywordmaps')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   252
        if kwmaps:  # override default templates
24987
fd7287f0b43c templater: remove noop calls of parsestring(s, quoted=False) (API)
Yuya Nishihara <yuya@tcha.org>
parents: 24905
diff changeset
   253
            self.templates = dict(kwmaps)
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   254
        else:
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   255
            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
   256
33067
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   257
    @property
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   258
    def repo(self):
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   259
        return self._repo()
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   260
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   261
    @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   262
    def escape(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   263
        '''Returns bar-separated and escaped keywords.'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   264
        return b'|'.join(map(stringutil.reescape, self.templates.keys()))
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   265
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   266
    @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   267
    def rekw(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   268
        '''Returns regex for unexpanded keywords.'''
39431
5bf99c27a7b6 py3: make regexes in hgext/keyword.py bytes
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39369
diff changeset
   269
        return re.compile(br'\$(%s)\$' % self.escape)
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   270
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   271
    @util.propertycache
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   272
    def rekwexp(self):
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   273
        '''Returns regex for expanded keywords.'''
39431
5bf99c27a7b6 py3: make regexes in hgext/keyword.py bytes
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39369
diff changeset
   274
        return re.compile(br'\$(%s): [^$\n\r]*? \$' % self.escape)
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   275
7375
9f1370130a45 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7369
diff changeset
   276
    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
   277
        '''Replaces keywords in data with expanded template.'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   278
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   279
        def kwsub(mobj):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   280
            kw = mobj.group(1)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   281
            ct = logcmdutil.maketemplater(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   282
                self.ui, self.repo, self.templates[kw]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   283
            )
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   284
            self.ui.pushbuffer()
10894
26cf11f9f322 keyword: make the templater a local variable
Christian Ebert <blacktrash@gmx.net>
parents: 10844
diff changeset
   285
            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
   286
            ekw = templatefilters.firstline(self.ui.popbuffer())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   287
            return b'$%s: %s $' % (kw, ekw)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   288
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   289
        return subfunc(kwsub, data)
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   290
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   291
    def linkctx(self, path, fileid):
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   292
        '''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
   293
        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
   294
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   295
    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
   296
        '''Returns data with keywords expanded.'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   297
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   298
            not self.restrict
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   299
            and self.match(path)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   300
            and not stringutil.binary(data)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   301
        ):
12920
1fab4970354e keyword: function to look up changectx for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 12844
diff changeset
   302
            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
   303
            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
   304
        return data
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   305
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   306
    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
   307
        '''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
   308
        expansion but are not symbolic links.'''
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   309
        return [f for f in cand if self.match(f) and b'l' not in ctx.flags(f)]
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   310
12685
a247751652ba keyword: enforce subn method via boolean switch
Christian Ebert <blacktrash@gmx.net>
parents: 12684
diff changeset
   311
    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
   312
        '''Overwrites selected files expanding/shrinking keywords.'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   313
        if self.restrict or lookup or self.postcommit:  # 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
   314
            candidates = self.iskwfile(candidates, ctx)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   315
        if not candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   316
            return
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   317
        kwcmd = self.restrict and lookup  # kwexpand/kwshrink
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   318
        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
   319
            mf = ctx.manifest()
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   320
        if self.restrict or rekw:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   321
            re_kw = self.rekw
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   322
        else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   323
            re_kw = self.rekwexp
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   324
        if expand:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   325
            msg = _(b'overwriting %s expanding keywords\n')
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   326
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   327
            msg = _(b'overwriting %s shrinking keywords\n')
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   328
        for f in candidates:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   329
            if self.restrict:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   330
                data = self.repo.file(f).read(mf[f])
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   331
            else:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   332
                data = self.repo.wread(f)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   333
            if stringutil.binary(data):
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   334
                continue
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   335
            if expand:
23622
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   336
                parents = ctx.parents()
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   337
                if lookup:
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   338
                    ctx = self.linkctx(f, mf[f])
23622
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   339
                elif self.restrict and len(parents) > 1:
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   340
                    # merge commit
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   341
                    # in case of conflict f is in modified state during
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   342
                    # merge, even if f does not differ from f in parent
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   343
                    for p in parents:
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   344
                        if f in p and not p[f].cmp(ctx[f]):
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   345
                            ctx = p[f].changectx()
cb9d845406e5 keyword: handle resolve to either parent
Christian Ebert <blacktrash@gmx.net>
parents: 23079
diff changeset
   346
                            break
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   347
                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
   348
            elif self.restrict:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   349
                found = re_kw.search(data)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   350
            else:
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   351
                data, found = _shrinktext(data, re_kw.subn)
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   352
            if found:
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   353
                self.ui.note(msg % f)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   354
                fp = self.repo.wvfs(f, b"wb", atomictemp=True)
15083
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   355
                fp.write(data)
6e069366e27c keyword: use wopener(..., atomictemp=True) to overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 15072
diff changeset
   356
                fp.close()
12844
a1b49b9a0328 keyword: fix regressions introduced in d87f3ff904ba
Christian Ebert <blacktrash@gmx.net>
parents: 12732
diff changeset
   357
                if kwcmd:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   358
                    self.repo.dirstate.normal(f)
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
   359
                elif self.postcommit:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   360
                    self.repo.dirstate.normallookup(f)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   361
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   362
    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
   363
        '''Returns text with all keyword substitutions removed.'''
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   364
        if self.match(fname) and not stringutil.binary(text):
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   365
            return _shrinktext(text, self.rekwexp.sub)
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   366
        return text
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   367
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   368
    def shrinklines(self, fname, lines):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   369
        '''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
   370
        if self.match(fname):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   371
            text = b''.join(lines)
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36887
diff changeset
   372
            if not stringutil.binary(text):
12926
edbe32efc89f keyword: turn regexes and escaped keywords into a propertycache
Christian Ebert <blacktrash@gmx.net>
parents: 12920
diff changeset
   373
                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
   374
        return lines
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   375
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   376
    def wread(self, fname, data):
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   377
        '''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
   378
        keyword substitutions removed.'''
15030
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   379
        if self.restrict:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   380
            return self.shrink(fname, data)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   381
        return data
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   382
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   383
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   384
class kwfilelog(filelog.filelog):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   385
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   386
    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
   387
    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
   388
    '''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   389
6503
4572beeacff1 keyword: privatize remaining monkeypatches by moving them into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 6502
diff changeset
   390
    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
   391
        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
   392
        self.kwt = kwt
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   393
        self.path = path
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   394
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   395
    def read(self, node):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   396
        '''Expands keywords when reading filelog.'''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   397
        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
   398
        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
   399
            return data
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   400
        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
   401
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   402
    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
   403
        '''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
   404
        text = self.kwt.shrink(self.path, text)
6504
1be53f931c9c keyword: compact setting of optional arguments
Christian Ebert <blacktrash@gmx.net>
parents: 6503
diff changeset
   405
        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
   406
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   407
    def cmp(self, node, text):
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   408
        '''Removes keyword substitutions for comparison.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   409
        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
   410
        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
   411
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   412
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   413
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
   414
    '''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
   415
    Returns status of working directory.'''
6115
8121e9d7bfd2 keyword: make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 6114
diff changeset
   416
    if kwt:
35001
3fbc30f7b9f0 py3: handle keyword arguments in hgext/keyword.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34500
diff changeset
   417
        opts = pycompat.byteskwargs(opts)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   418
        return repo.status(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   419
            match=scmutil.match(wctx, pats, opts),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   420
            clean=True,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   421
            unknown=opts.get(b'unknown') or opts.get(b'all'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   422
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   423
    if ui.configitems(b'keyword'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   424
        raise error.Abort(_(b'[keyword] patterns cannot match'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   425
    raise error.Abort(_(b'no [keyword] patterns configured'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   426
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   427
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   428
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
   429
    '''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
   430
    wctx = repo[None]
e4274f9f97c8 keyword: pass context to kwtemplater.overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 11303
diff changeset
   431
    if len(wctx.parents()) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   432
        raise error.Abort(_(b'outstanding uncommitted merge'))
33070
735218be6122 keyword: use _keywordkwt of repository instead of kwtools['templater']
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33069
diff changeset
   433
    kwt = getattr(repo, '_keywordkwt', None)
27815
16cfbbc69800 with: use context manager for wlock in _kwfwrite
Bryan O'Sullivan <bryano@fb.com>
parents: 26587
diff changeset
   434
    with repo.wlock():
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   435
        status = _status(ui, repo, wctx, kwt, *pats, **opts)
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   436
        if status.modified or status.added or status.removed or status.deleted:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   437
            raise error.Abort(_(b'outstanding uncommitted changes'))
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   438
        kwt.overwrite(wctx, status.clean, True, expand)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   439
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   440
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   441
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   442
    b'kwdemo',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   443
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   444
        (b'd', b'default', None, _(b'show default keyword template maps')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   445
        (b'f', b'rcfile', b'', _(b'read maps from rcfile'), _(b'FILE')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   446
    ],
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   447
    _(b'hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   448
    optionalrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   449
)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   450
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
   451
    '''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
   452
7993
b83a11536fc6 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 7853
diff changeset
   453
    Show current, custom, or default keyword template maps and their
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   454
    expansions.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   455
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   456
    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
   457
    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
   458
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   459
    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
   460
11193
687c7d395f20 Use our custom hg reStructuredText role some more
Martin Geisler <mg@aragost.com>
parents: 11168
diff changeset
   461
    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
   462
    '''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   463
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   464
    def demoitems(section, items):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   465
        ui.write(b'[%s]\n' % section)
9942
b6d484168350 keyword: sort demo output to ensure deterministic output
Martin Geisler <mg@lazybytes.net>
parents: 9494
diff changeset
   466
        for k, v in sorted(items):
40220
c7ffc53fbd19 py3: use stringutil.pprint() if we are printing bool values
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39548
diff changeset
   467
            if isinstance(v, bool):
c7ffc53fbd19 py3: use stringutil.pprint() if we are printing bool values
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 39548
diff changeset
   468
                v = stringutil.pprint(v)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   469
            ui.write(b'%s = %s\n' % (k, v))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   470
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   471
    fn = b'demo.txt'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   472
    tmpdir = pycompat.mkdtemp(b'', b'kwdemo.')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   473
    ui.note(_(b'creating temporary repository at %s\n') % tmpdir)
29634
8421cbebc783 keyword: avoid traceback when kwdemo is run outside a repo
Christian Ebert <blacktrash@gmx.net>
parents: 29397
diff changeset
   474
    if repo is None:
8421cbebc783 keyword: avoid traceback when kwdemo is run outside a repo
Christian Ebert <blacktrash@gmx.net>
parents: 29397
diff changeset
   475
        baseui = ui
8421cbebc783 keyword: avoid traceback when kwdemo is run outside a repo
Christian Ebert <blacktrash@gmx.net>
parents: 29397
diff changeset
   476
    else:
8421cbebc783 keyword: avoid traceback when kwdemo is run outside a repo
Christian Ebert <blacktrash@gmx.net>
parents: 29397
diff changeset
   477
        baseui = repo.baseui
39548
7ce9dea3a14a localrepo: move repo creation logic out of localrepository.__init__ (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39432
diff changeset
   478
    repo = localrepo.instance(baseui, tmpdir, create=True)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   479
    ui.setconfig(b'keyword', fn, b'', b'keyword')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   480
    svn = ui.configbool(b'keywordset', b'svn')
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   481
    # explicitly set keywordset for demo output
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   482
    ui.setconfig(b'keywordset', b'svn', svn, b'keyword')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   483
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   484
    uikwmaps = ui.configitems(b'keywordmaps')
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   485
    if args or opts.get('rcfile'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   486
        ui.status(_(b'\n\tconfiguration using custom keyword template maps\n'))
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   487
        if uikwmaps:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   488
            ui.status(_(b'\textending current template maps\n'))
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   489
        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
   490
            if svn:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   491
                ui.status(_(b'\toverriding default svn keywordset\n'))
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   492
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   493
                ui.status(_(b'\toverriding default cvs keywordset\n'))
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   494
        if opts.get('rcfile'):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   495
            ui.readconfig(opts.get(b'rcfile'))
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   496
        if args:
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   497
            # simulate hgrc parsing
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   498
            rcmaps = b'[keywordmaps]\n%s\n' % b'\n'.join(args)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   499
            repo.vfs.write(b'hgrc', rcmaps)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   500
            ui.readconfig(repo.vfs.join(b'hgrc'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   501
        kwmaps = dict(ui.configitems(b'keywordmaps'))
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43105
diff changeset
   502
    elif opts.get('default'):
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   503
        if svn:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   504
            ui.status(_(b'\n\tconfiguration using default svn keywordset\n'))
13298
f715e6bd8091 keyword: inform user about current keywordset in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 13270
diff changeset
   505
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   506
            ui.status(_(b'\n\tconfiguration using default cvs keywordset\n'))
11214
b05ec0cc063e keyword: offer svn-like default keywordmaps
Christian Ebert <blacktrash@gmx.net>
parents: 11213
diff changeset
   507
        kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   508
        if uikwmaps:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   509
            ui.status(_(b'\tdisabling current template maps\n'))
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   510
            for k, v in pycompat.iteritems(kwmaps):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   511
                ui.setconfig(b'keywordmaps', k, v, b'keyword')
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   512
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   513
        ui.status(_(b'\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
   514
        if uikwmaps:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   515
            kwmaps = dict(uikwmaps)
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   516
        else:
261482576c1e keyword: avoid x = a and b or c
Christian Ebert <blacktrash@gmx.net>
parents: 14835
diff changeset
   517
            kwmaps = _defaultkwmaps(ui)
9281
2a4131b264c3 keyword: refactor kwdemo and make output translatable
Christian Ebert <blacktrash@gmx.net>
parents: 9264
diff changeset
   518
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   519
    uisetup(ui)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   520
    reposetup(ui, repo)
43080
86e4daa2d54c cleanup: mark some ui.(status|note|warn|write) calls as not needing i18n
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
   521
    ui.writenoi18n(b'[extensions]\nkeyword =\n')
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   522
    demoitems(b'keyword', ui.configitems(b'keyword'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   523
    demoitems(b'keywordset', ui.configitems(b'keywordset'))
43105
649d3ac37a12 py3: define and use pycompat.iteritems() for hgext/
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43089
diff changeset
   524
    demoitems(b'keywordmaps', pycompat.iteritems(kwmaps))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   525
    keywords = b'$' + b'$\n$'.join(sorted(kwmaps.keys())) + b'$\n'
23879
b88278a308c6 localrepo: remove all external users of localrepo.wopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23878
diff changeset
   526
    repo.wvfs.write(fn, keywords)
11303
a1aad8333864 move working dir/dirstate methods from localrepo to workingctx
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 11296
diff changeset
   527
    repo[None].add([fn])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   528
    ui.note(_(b'\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
   529
    ui.note(keywords)
27816
98391f38ceb8 with: use context manager for wlock in keyword demo
Bryan O'Sullivan <bryano@fb.com>
parents: 27815
diff changeset
   530
    with repo.wlock():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   531
        repo.dirstate.setbranch(b'demobranch')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   532
    for name, cmd in ui.configitems(b'hooks'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   533
        if name.split(b'.', 1)[0].find(b'commit') > -1:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   534
            repo.ui.setconfig(b'hooks', name, b'', b'keyword')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   535
    msg = _(b'hg keyword configuration and expansion example')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   536
    ui.note((b"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
   537
    repo.commit(text=msg)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   538
    ui.status(_(b'\n\tkeywords expanded\n'))
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   539
    ui.write(repo.wread(fn))
24905
4ecbd88cde9a keyword: use wvfs.rmtree to remove kwdemo directory
Christian Ebert <blacktrash@gmx.net>
parents: 24370
diff changeset
   540
    repo.wvfs.rmtree(repo.root)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   541
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   542
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   543
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   544
    b'kwexpand',
32375
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   545
    cmdutil.walkopts,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   546
    _(b'hg kwexpand [OPTION]... [FILE]...'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   547
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   548
)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   549
def expand(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   550
    '''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
   551
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   552
    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
   553
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   554
    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
   555
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   556
    # 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
   557
    _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
   558
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   559
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   560
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
    b'kwfiles',
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   562
    [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   563
        (b'A', b'all', None, _(b'show keyword status flags of all files')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   564
        (b'i', b'ignore', None, _(b'show files excluded from expansion')),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   565
        (b'u', b'unknown', None, _(b'only show unknown (not tracked) files')),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   566
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   567
    + cmdutil.walkopts,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   568
    _(b'hg kwfiles [OPTION]... [FILE]...'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   569
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   570
)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   571
def files(ui, repo, *pats, **opts):
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
   572
    '''show files configured for keyword expansion
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
   573
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   574
    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
   575
    [keyword] configuration patterns.
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   576
9264
9abddf8c29c7 keyword: wrap docstrings at 70 characters
Martin Geisler <mg@lazybytes.net>
parents: 9219
diff changeset
   577
    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
   578
    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
   579
    expansion.
8950
be6b57b2bdb8 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8939
diff changeset
   580
10973
49a07f441496 Use hg role in help strings
Martin Geisler <mg@aragost.com>
parents: 10967
diff changeset
   581
    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
   582
    inclusion and exclusion of files.
8957
7672d8e13d0d keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 8956
diff changeset
   583
9494
bdd8a41ea6f6 keyword: uppercase short option for kwfiles --all, like hg status -A
Christian Ebert <blacktrash@gmx.net>
parents: 9493
diff changeset
   584
    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
   585
    of files are::
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   586
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   587
      K = keyword expansion candidate
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   588
      k = keyword expansion candidate (not tracked)
9195
8c719222ddd7 keyword: reformat kwfiles help for minirst parser
Christian Ebert <blacktrash@gmx.net>
parents: 9157
diff changeset
   589
      I = ignored
9491
12e340b9f1bf keyword: kwfiles --unknown instead of --untracked
Christian Ebert <blacktrash@gmx.net>
parents: 9467
diff changeset
   590
      i = ignored (not tracked)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   591
    '''
33070
735218be6122 keyword: use _keywordkwt of repository instead of kwtools['templater']
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33069
diff changeset
   592
    kwt = getattr(repo, '_keywordkwt', None)
14835
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   593
    wctx = repo[None]
ec4d4114e7fe keyword: reuse already present working contexts for match
Christian Ebert <blacktrash@gmx.net>
parents: 14671
diff changeset
   594
    status = _status(ui, repo, wctx, kwt, *pats, **opts)
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
   595
    if pats:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
   596
        cwd = repo.getcwd()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24272
diff changeset
   597
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   598
        cwd = b''
9493
fe1ecd15c6bd keyword: make kwfiles -u show untracked files only (like status)
Christian Ebert <blacktrash@gmx.net>
parents: 9492
diff changeset
   599
    files = []
35001
3fbc30f7b9f0 py3: handle keyword arguments in hgext/keyword.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 34500
diff changeset
   600
    opts = pycompat.byteskwargs(opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   601
    if not opts.get(b'unknown') or opts.get(b'all'):
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   602
        files = sorted(status.modified + status.added + status.clean)
12627
7d9162892899 keyword: make iskwfile() a weeding method in lieu of a boolean
Christian Ebert <blacktrash@gmx.net>
parents: 12626
diff changeset
   603
    kwfiles = kwt.iskwfile(files, wctx)
22918
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   604
    kwdeleted = kwt.iskwfile(status.deleted, wctx)
31f34a213384 keyword: access status fields by name rather than index
Martin von Zweigbergk <martinvonz@gmail.com>
parents: 21982
diff changeset
   605
    kwunknown = kwt.iskwfile(status.unknown, wctx)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   606
    if not opts.get(b'ignore') or opts.get(b'all'):
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   607
        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
   608
    else:
13079
f3a2bb1e4255 keyword: make kwfiles show deleted files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 13078
diff changeset
   609
        showfiles = [], [], []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   610
    if opts.get(b'all') or opts.get(b'ignore'):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   611
        showfiles += (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   612
            [f for f in files if f not in kwfiles],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   613
            [f for f in status.unknown if f not in kwunknown],
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   614
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   615
    kwlabels = b'enabled deleted enabledunknown ignored ignoredunknown'.split()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   616
    kwstates = zip(kwlabels, pycompat.bytestr(b'K!kIi'), showfiles)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   617
    fm = ui.formatter(b'kwfiles', opts)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   618
    fmt = b'%.0s%s\n'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   619
    if opts.get(b'all') or ui.verbose:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   620
        fmt = b'%s %s\n'
17057
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
   621
    for kwstate, char, filenames in kwstates:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   622
        label = b'kwfiles.' + kwstate
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   623
        for f in filenames:
17057
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
   624
            fm.startitem()
39369
34ba47117164 formatter: rename {abspath}/{file} to {path}, and drop relative {path} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38475
diff changeset
   625
            fm.data(kwstatus=char, path=f)
34ba47117164 formatter: rename {abspath}/{file} to {path}, and drop relative {path} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38475
diff changeset
   626
            fm.plain(fmt % (char, repo.pathto(f, cwd)), label=label)
17057
9720c55d605b keyword: use ui.formatter for kwfiles output
Christian Ebert <blacktrash@gmx.net>
parents: 16812
diff changeset
   627
    fm.end()
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   628
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   629
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   630
@command(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   631
    b'kwshrink',
32375
04baab18d60a commands: move templates of common command options to cmdutil (API)
Yuya Nishihara <yuya@tcha.org>
parents: 32337
diff changeset
   632
    cmdutil.walkopts,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   633
    _(b'hg kwshrink [OPTION]... [FILE]...'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   634
    inferrepo=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   635
)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   636
def shrink(ui, repo, *pats, **opts):
8763
fccdf5ca5065 keyword: improve English
timeless <timeless@gmail.com>
parents: 8706
diff changeset
   637
    '''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
   638
13270
1e0d631b843b keyword: update documentation for kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 13079
diff changeset
   639
    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
   640
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   641
    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
   642
    '''
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   643
    # 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
   644
    _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
   645
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   646
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   647
# monkeypatches
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   648
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   649
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   650
def kwpatchfile_init(orig, self, ui, gp, backend, store, eolmode=None):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   651
    '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   652
    rejects or conflicts due to expanded keywords in working dir.'''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   653
    orig(self, ui, gp, backend, store, eolmode)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   654
    kwt = getattr(getattr(backend, 'repo', None), '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   655
    if kwt:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   656
        # shrink keywords read from working dir
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   657
        self.lines = kwt.shrinklines(self.fname, self.lines)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   658
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   659
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   660
def kwdiff(orig, repo, *args, **kwargs):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   661
    '''Monkeypatch patch.diff to avoid expansion.'''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   662
    kwt = getattr(repo, '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   663
    if kwt:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   664
        restrict = kwt.restrict
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   665
        kwt.restrict = True
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   666
    try:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   667
        for chunk in orig(repo, *args, **kwargs):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   668
            yield chunk
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   669
    finally:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   670
        if kwt:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   671
            kwt.restrict = restrict
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   672
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   673
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36880
diff changeset
   674
def kwweb_skip(orig, web):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   675
    '''Wraps webcommands.x turning off keyword expansion.'''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   676
    kwt = getattr(web.repo, '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   677
    if kwt:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   678
        origmatch = kwt.match
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   679
        kwt.match = util.never
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   680
    try:
36887
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36880
diff changeset
   681
        for chunk in orig(web):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   682
            yield chunk
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   683
    finally:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   684
        if kwt:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   685
            kwt.match = origmatch
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   686
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   687
34086
a39dce4a76b8 cmdutil: remove redundant commitfunc parameter in amend (API)
Saurabh Singh <singhsrb@fb.com>
parents: 33071
diff changeset
   688
def kw_amend(orig, ui, repo, old, extra, pats, opts):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   689
    '''Wraps cmdutil.amend expanding keywords after amend.'''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   690
    kwt = getattr(repo, '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   691
    if kwt is None:
34086
a39dce4a76b8 cmdutil: remove redundant commitfunc parameter in amend (API)
Saurabh Singh <singhsrb@fb.com>
parents: 33071
diff changeset
   692
        return orig(ui, repo, old, extra, pats, opts)
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   693
    with repo.wlock():
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   694
        kwt.postcommit = True
34086
a39dce4a76b8 cmdutil: remove redundant commitfunc parameter in amend (API)
Saurabh Singh <singhsrb@fb.com>
parents: 33071
diff changeset
   695
        newid = orig(ui, repo, old, extra, pats, opts)
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   696
        if newid != old.node():
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   697
            ctx = repo[newid]
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   698
            kwt.restrict = True
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   699
            kwt.overwrite(ctx, ctx.files(), False, True)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   700
            kwt.restrict = False
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   701
        return newid
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   702
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   703
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   704
def kw_copy(orig, ui, repo, pats, opts, rename=False):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   705
    '''Wraps cmdutil.copy so that copy/rename destinations do not
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   706
    contain expanded keywords.
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   707
    Note that the source of a regular file destination may also be a
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   708
    symlink:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   709
    hg cp sym x                -> x is symlink
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   710
    cp sym x; hg cp -A sym x   -> x is file (maybe expanded keywords)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   711
    For the latter we have to follow the symlink to find out whether its
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   712
    target is configured for expansion and we therefore must unexpand the
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   713
    keywords in the destination.'''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   714
    kwt = getattr(repo, '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   715
    if kwt is None:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   716
        return orig(ui, repo, pats, opts, rename)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   717
    with repo.wlock():
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   718
        orig(ui, repo, pats, opts, rename)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   719
        if opts.get(b'dry_run'):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   720
            return
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   721
        wctx = repo[None]
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   722
        cwd = repo.getcwd()
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   723
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   724
        def haskwsource(dest):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   725
            '''Returns true if dest is a regular file and configured for
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   726
            expansion or a symlink which points to a file configured for
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   727
            expansion. '''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   728
            source = repo.dirstate.copied(dest)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   729
            if b'l' in wctx.flags(source):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   730
                source = pathutil.canonpath(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   731
                    repo.root, cwd, os.path.realpath(source)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   732
                )
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   733
            return kwt.match(source)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   734
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   735
        candidates = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   736
            f
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   737
            for f in repo.dirstate.copies()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   738
            if b'l' not in wctx.flags(f) and haskwsource(f)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   739
        ]
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   740
        kwt.overwrite(wctx, candidates, False, False)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   741
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   742
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   743
def kw_dorecord(orig, ui, repo, commitfunc, *pats, **opts):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   744
    '''Wraps record.dorecord expanding keywords after recording.'''
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   745
    kwt = getattr(repo, '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   746
    if kwt is None:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   747
        return orig(ui, repo, commitfunc, *pats, **opts)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   748
    with repo.wlock():
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   749
        # record returns 0 even when nothing has changed
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   750
        # therefore compare nodes before and after
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   751
        kwt.postcommit = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   752
        ctx = repo[b'.']
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   753
        wstatus = ctx.status()
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   754
        ret = orig(ui, repo, commitfunc, *pats, **opts)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   755
        recctx = repo[b'.']
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   756
        if ctx != recctx:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   757
            modified, added = _preselect(wstatus, recctx.files())
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   758
            kwt.restrict = False
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   759
            kwt.overwrite(recctx, modified, False, True)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   760
            kwt.overwrite(recctx, added, False, True, True)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   761
            kwt.restrict = True
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   762
        return ret
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   763
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   764
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   765
def kwfilectx_cmp(orig, self, fctx):
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   766
    if fctx._customcmp:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   767
        return fctx.cmp(self)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   768
    kwt = getattr(self._repo, '_keywordkwt', None)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   769
    if kwt is None:
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   770
        return orig(self, fctx)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   771
    # keyword affects data size, comparing wdir and filelog size does
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   772
    # not make sense
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   773
    if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   774
        fctx._filenode is None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   775
        and (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   776
            self._repo._encodefilterpats
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   777
            or kwt.match(fctx.path())
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   778
            and b'l' not in fctx.flags()
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   779
            or self.size() - 4 == fctx.size()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   780
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   781
        or self.size() == fctx.size()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   782
    ):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   783
        return self._filelog.cmp(self._filenode, fctx.data())
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   784
    return True
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   785
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   786
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   787
def uisetup(ui):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   788
    ''' Monkeypatches dispatch._parse to retrieve user command.
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   789
    Overrides file method to return kwfilelog instead of filelog
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   790
    if file matches user configuration.
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   791
    Wraps commit to overwrite configured files with updated
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   792
    keyword substitutions.
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   793
    Monkeypatches patch and webcommands.'''
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   794
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   795
    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
   796
        '''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
   797
        cmd, func, args, options, cmdoptions = orig(ui, args)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   798
        kwtools[b'hgcmd'] = cmd
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   799
        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
   800
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   801
    extensions.wrapfunction(dispatch, b'_parse', kwdispatch_parse)
6502
ba8a0338baf7 keyword: collect filename patterns, wrap dispatch._parse in uisetup
Christian Ebert <blacktrash@gmx.net>
parents: 6416
diff changeset
   802
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   803
    extensions.wrapfunction(context.filectx, b'cmp', kwfilectx_cmp)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   804
    extensions.wrapfunction(patch.patchfile, b'__init__', kwpatchfile_init)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   805
    extensions.wrapfunction(patch, b'diff', kwdiff)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   806
    extensions.wrapfunction(cmdutil, b'amend', kw_amend)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   807
    extensions.wrapfunction(cmdutil, b'copy', kw_copy)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   808
    extensions.wrapfunction(cmdutil, b'dorecord', kw_dorecord)
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   809
    for c in nokwwebcommands.split():
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   810
        extensions.wrapfunction(webcommands, c, kwweb_skip)
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   811
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   812
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   813
def reposetup(ui, repo):
33071
279c072a5c49 keyword: wrap functions only once at loading keyword extension
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33070
diff changeset
   814
    '''Sets up repo as kwrepo for keyword substitution.'''
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   815
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   816
    try:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   817
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   818
            not repo.local()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   819
            or kwtools[b'hgcmd'] in nokwcommands.split()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   820
            or b'.hg' in util.splitpath(repo.root)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   821
            or repo._url.startswith(b'bundle:')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   822
        ):
7853
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   823
            return
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   824
    except AttributeError:
af062a9fea9b bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 7762
diff changeset
   825
        pass
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   826
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   827
    inc, exc = [], [b'.hg*']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   828
    for pat, opt in ui.configitems(b'keyword'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   829
        if opt != b'ignore':
11678
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   830
            inc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   831
        else:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   832
            exc.append(pat)
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   833
    if not inc:
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   834
        return
f5aa20e177c0 keyword: move collecting of [keyword] patterns to reposetup (issue2303)
Christian Ebert <blacktrash@gmx.net>
parents: 11350
diff changeset
   835
33070
735218be6122 keyword: use _keywordkwt of repository instead of kwtools['templater']
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33069
diff changeset
   836
    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
   837
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   838
    class kwrepo(repo.__class__):
6114
ee83510fe567 keyword: move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 6092
diff changeset
   839
        def file(self, f):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   840
            if f[0] == b'/':
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   841
                f = f[1:]
23878
37a92908a382 localrepo: remove all external users of localrepo.sopener
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 23877
diff changeset
   842
            return kwfilelog(self.svfs, kwt, f)
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   843
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   844
        def wread(self, filename):
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   845
            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
   846
            return kwt.wread(filename, data)
5884
a139f141dcae keyword: support mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 5831
diff changeset
   847
9096
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   848
        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
   849
            # 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
   850
            # 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
   851
            self.commitctx = self.kwcommitctx
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   852
            try:
10495
2c2d2f1354b4 keyword: do not postpone commit hooks
Christian Ebert <blacktrash@gmx.net>
parents: 10492
diff changeset
   853
                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
   854
            finally:
47bc92755b95 keyword: eliminate potential reference cycles from kwrepo
Christian Ebert <blacktrash@gmx.net>
parents: 8996
diff changeset
   855
                del self.commitctx
8996
23e941d7f507 keyword: make repo.commit use a custom commitctx wrapper
Christian Ebert <blacktrash@gmx.net>
parents: 8957
diff changeset
   856
42620
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 40220
diff changeset
   857
        def kwcommitctx(self, ctx, error=False, origctx=None):
d98ec36be808 convert: add a config option to help doing identity hg->hg conversion
Valentin Gatien-Baron <valentin.gatienbaron@gmail.com>
parents: 40220
diff changeset
   858
            n = super(kwrepo, self).commitctx(ctx, error, origctx)
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   859
            # no lock needed, only called from repo.commit() which already locks
16809
6b704fa2bea1 keyword: rename kwt.record attribute to kwt.postcommit
Christian Ebert <blacktrash@gmx.net>
parents: 16743
diff changeset
   860
            if not kwt.postcommit:
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   861
                restrict = kwt.restrict
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   862
                kwt.restrict = True
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   863
                kwt.overwrite(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   864
                    self[n], sorted(ctx.added() + ctx.modified()), False, True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42620
diff changeset
   865
                )
12625
d87f3ff904ba keyword: refactor kwtemplater.overwrite()
Christian Ebert <blacktrash@gmx.net>
parents: 12605
diff changeset
   866
                kwt.restrict = restrict
10604
9a36d159595f keyword: remove spurious locks, improve handling of wlock
Christian Ebert <blacktrash@gmx.net>
parents: 10603
diff changeset
   867
            return n
5815
0637d97a8cb4 Add extension for filewise RCS-keyword expansion in working dir
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   868
15183
59e8bc22506e rollback: avoid unsafe rollback when not at tip (issue2998)
Greg Ward <greg@gerg.ca>
parents: 15083
diff changeset
   869
        def rollback(self, dryrun=False, force=False):
32935
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   870
            with self.wlock():
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   871
                origrestrict = kwt.restrict
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   872
                try:
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   873
                    if not dryrun:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   874
                        changed = self[b'.'].files()
32935
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   875
                    ret = super(kwrepo, self).rollback(dryrun, force)
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   876
                    if not dryrun:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   877
                        ctx = self[b'.']
32935
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   878
                        modified, added = _preselect(ctx.status(), changed)
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   879
                        kwt.restrict = False
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   880
                        kwt.overwrite(ctx, modified, True, True)
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   881
                        kwt.overwrite(ctx, added, True, False)
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   882
                    return ret
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   883
                finally:
69d1c3ea0d6f keyword: use context manager for rollback locking
Christian Ebert <blacktrash@gmx.net>
parents: 32837
diff changeset
   884
                    kwt.restrict = origrestrict
12498
4846e8cd9327 keyword: support rollback by restoring expansion to previous values
Christian Ebert <blacktrash@gmx.net>
parents: 12497
diff changeset
   885
33067
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   886
    repo.__class__ = kwrepo
5a51db8bf41b keyword: make wrapped repository and kwtemplater refer to each other
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 33065
diff changeset
   887
    repo._keywordkwt = kwt