hgkw/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Mon, 29 Jun 2009 18:37:08 +0200
changeset 596 2de4e2be005c
parent 595 1475f23ba334
child 597 795a95d7dc61
permissions -rw-r--r--
Lowercase status flags of untracked files in kwfile output Document the flags and their meanings in the command help (thanks to timeless for bringing this to my attention).
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
     1
# keyword.py - $Keyword$ expansion for Mercurial
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     2
#
335
9f78d508764b Fix some doc strings; update copyright
Christian Ebert <blacktrash@gmx.net>
parents: 331
diff changeset
     3
# Copyright 2007, 2008 Christian Ebert <blacktrash@gmx.net>
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     4
#
540
e30c2a251010 updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 538
diff changeset
     5
# This software may be used and distributed according to the terms of the
e30c2a251010 updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 538
diff changeset
     6
# GNU General Public License version 2, incorporated herein by reference.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     7
#
82
9bf0f7db5928 Add keyword; comment backwards compatible import
Christian Ebert <blacktrash@gmx.net>
parents: 81
diff changeset
     8
# $Id$
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     9
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    10
# Keyword expansion hack against the grain of a DSCM
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    11
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    12
# There are many good reasons why this is not needed in a distributed
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    13
# SCM, still it may be useful in very small projects based on single
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    15
# audience not running a version control system.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    16
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    17
# For in-depth discussion refer to
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    18
# <http://www.selenic.com/mercurial/wiki/index.cgi/KeywordPlan>.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    19
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    20
# Keyword expansion is based on Mercurial's changeset template mappings.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    21
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    22
# Binary files are not touched.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    23
#
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    24
# Files to act upon/ignore are specified in the [keyword] section.
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    25
# Customized keyword template mappings in the [keywordmaps] section.
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    26
#
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    27
# Run "hg help keyword" and "hg kwdemo" to get info on configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    28
584
763d20224433 extensions: improve the consistency of synopses
C?dric Duval <cedricduval@free.fr>
parents: 582
diff changeset
    29
'''expand keywords in tracked files
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    30
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    31
This extension expands RCS/CVS-like or self-customized $Keywords$ in
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    32
tracked text files selected by your configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    33
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    34
Keywords are only expanded in local repositories and not stored in the
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    35
change history. The mechanism can be regarded as a convenience for the
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    36
current user or for archive distribution.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    37
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    38
Configuration is done in the [keyword] and [keywordmaps] sections of
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    39
hgrc files.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    40
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    41
Example:
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    42
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    43
    [keyword]
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    44
    # expand keywords in every python file except those matching "x*"
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    45
    **.py =
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    46
    x*    = ignore
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    47
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    48
Note: the more specific you are in your filename patterns
529
7197324dfa4d expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 527
diff changeset
    49
      the less you lose speed in huge repositories.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    50
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    51
For [keywordmaps] template mapping and expansion demonstration and
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    52
control run "hg kwdemo".
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    53
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    54
An additional date template filter {date|utcdate} is provided.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    55
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    56
The default template mappings (view with "hg kwdemo -d") can be
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    57
replaced with customized keywords and templates. Again, run "hg
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    58
kwdemo" to control the results of your config changes.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    59
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    60
Before changing/disabling active keywords, run "hg kwshrink" to avoid
554
2fc480f3e148 fixed typos found in translatable strings
Martin Geisler <mg@lazybytes.net>
parents: 552
diff changeset
    61
the risk of inadvertently storing expanded keywords in the change
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    62
history.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    63
211
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    64
To force expansion after enabling it, or a configuration change, run
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    65
"hg kwexpand".
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    66
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    67
Also, when committing with the record extension or using mq's qrecord,
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    68
be aware that keywords cannot be updated. Again, run "hg kwexpand" on
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    69
the files in question to update keyword expansions after all changes
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
    70
have been checked in.
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
    71
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    72
Expansions spanning more than one line and incremental expansions,
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    73
like CVS' $Log$, are not supported. A keyword template map
201
e826c3cdc52d Make sure there are no newlines in expansion
Christian Ebert <blacktrash@gmx.net>
parents: 192
diff changeset
    74
"Log = {desc}" expands to the first line of the changeset description.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    75
'''
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    76
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
    77
from mercurial import commands, cmdutil, dispatch, filelog, revlog, extensions
549
9084fb1593e6 match: change all users of util.matcher to match.match
Matt Mackall <mpm@selenic.com>
parents: 543
diff changeset
    78
from mercurial import patch, localrepo, templater, templatefilters, util, match
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
    79
from mercurial.hgweb import webcommands
534
43d8c042ca20 switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 532
diff changeset
    80
from mercurial.lock import release
421
439a24d34a13 Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents: 419
diff changeset
    81
from mercurial.node import nullid, hex
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
    82
from mercurial.i18n import _
394
fe13fe09ba2e keyword: avoid os import by using util.splitpath
Christian Ebert <blacktrash@gmx.net>
parents: 391
diff changeset
    83
import re, shutil, tempfile, time
227
8ae160f24b9f cmdutil.parse moves to dispatch._parse; use fancyopts bugfix
Christian Ebert <blacktrash@gmx.net>
parents: 226
diff changeset
    84
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    85
commands.optionalrepo += ' kwdemo'
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    86
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    87
# hg commands that do not act on keywords
463
55f535bc13bc keyword: disable expansion for annotate
Christian Ebert <blacktrash@gmx.net>
parents: 452
diff changeset
    88
nokwcommands = ('add addremove annotate bundle copy export grep incoming init'
479
18f235294dda Add verify to nokwcommands after refactor in e79a8f36c2a5
Christian Ebert <blacktrash@gmx.net>
parents: 476
diff changeset
    89
                ' log outgoing push rename rollback tip verify'
401
05d0c3e4efdc Add glog to nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 398
diff changeset
    90
                ' convert email glog')
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    91
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    92
# hg commands that trigger expansion only when writing to working dir,
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    93
# not when reading filelog, and unexpand when reading from working dir
485
5c3637b12e88 Avoid additional conflicts during merge/resolve
Christian Ebert <blacktrash@gmx.net>
parents: 479
diff changeset
    94
restricted = 'merge record resolve qfold qimport qnew qpush qrefresh qrecord'
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    95
93
9f70f953dd3b Clean keyword arg assignment in kwfilelog.add; rename utc() to utcdate()
Christian Ebert <blacktrash@gmx.net>
parents: 92
diff changeset
    96
def utcdate(date):
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
    97
    '''Returns hgdate in cvs-like UTC format.'''
93
9f70f953dd3b Clean keyword arg assignment in kwfilelog.add; rename utc() to utcdate()
Christian Ebert <blacktrash@gmx.net>
parents: 92
diff changeset
    98
    return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
    99
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   100
# make keyword tools accessible
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   101
kwtools = {'templater': None, 'hgcmd': '', 'inc': [], 'exc': ['.hg*']}
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   102
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   103
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   104
class kwtemplater(object):
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   105
    '''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   106
    Sets up keyword templates, corresponding keyword regex, and
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   107
    provides keyword substitution functions.
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   108
    '''
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   109
    templates = {
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   110
        'Revision': '{node|short}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   111
        'Author': '{author|user}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   112
        'Date': '{date|utcdate}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   113
        'RCSFile': '{file|basename},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   114
        'Source': '{root}/{file},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   115
        'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   116
        'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   117
    }
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   118
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   119
    def __init__(self, ui, repo):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   120
        self.ui = ui
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   121
        self.repo = repo
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   122
        self.match = match.match(repo.root, '', [],
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   123
                                 kwtools['inc'], kwtools['exc'])
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   124
        self.restrict = kwtools['hgcmd'] in restricted.split()
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   125
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   126
        kwmaps = self.ui.configitems('keywordmaps')
253
22e08d0f25dc List comprehension instead of loop to create ui template dictionary
Christian Ebert <blacktrash@gmx.net>
parents: 252
diff changeset
   127
        if kwmaps: # override default templates
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   128
            kwmaps = [(k, templater.parsestring(v, False))
253
22e08d0f25dc List comprehension instead of loop to create ui template dictionary
Christian Ebert <blacktrash@gmx.net>
parents: 252
diff changeset
   129
                      for (k, v) in kwmaps]
22e08d0f25dc List comprehension instead of loop to create ui template dictionary
Christian Ebert <blacktrash@gmx.net>
parents: 252
diff changeset
   130
            self.templates = dict(kwmaps)
254
474eccf2964f Map re.escape
Christian Ebert <blacktrash@gmx.net>
parents: 253
diff changeset
   131
        escaped = map(re.escape, self.templates.keys())
252
001902b60bdd String format keyword pattern before compilation
Christian Ebert <blacktrash@gmx.net>
parents: 251
diff changeset
   132
        kwpat = r'\$(%s)(: [^$\n\r]*? )??\$' % '|'.join(escaped)
001902b60bdd String format keyword pattern before compilation
Christian Ebert <blacktrash@gmx.net>
parents: 251
diff changeset
   133
        self.re_kw = re.compile(kwpat)
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   134
363
263b3b10c55f templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents: 347
diff changeset
   135
        templatefilters.filters['utcdate'] = utcdate
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   136
        self.ct = cmdutil.changeset_templater(self.ui, self.repo,
523
062ce3b9c962 add --git option to commands supporting --patch (log, incoming, history, tip)
Jim Correia <jim.correia@pobox.com>
parents: 522
diff changeset
   137
                                              False, None, '', False)
235
baef9dcfb219 Compatible repo.dirstate.normal/update into own function
Christian Ebert <blacktrash@gmx.net>
parents: 234
diff changeset
   138
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   139
    def substitute(self, data, path, ctx, subfunc):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   140
        '''Replaces keywords in data with expanded template.'''
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   141
        def kwsub(mobj):
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   142
            kw = mobj.group(1)
306
78b80b2511de Rename kwtemplater.t to kwtemplater.ct
Christian Ebert <blacktrash@gmx.net>
parents: 304
diff changeset
   143
            self.ct.use_template(self.templates[kw])
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   144
            self.ui.pushbuffer()
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   145
            self.ct.show(ctx, root=self.repo.root, file=path)
373
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   146
            ekw = templatefilters.firstline(self.ui.popbuffer())
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   147
            return '$%s: %s $' % (kw, ekw)
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   148
        return subfunc(kwsub, data)
255
c4f37735be9b Turn off debug while expanding
Christian Ebert <blacktrash@gmx.net>
parents: 254
diff changeset
   149
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   150
    def expand(self, path, node, data):
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   151
        '''Returns data with keywords expanded.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   152
        if not self.restrict and self.match(path) and not util.binary(data):
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   153
            ctx = self.repo.filectx(path, fileid=node).changectx()
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   154
            return self.substitute(data, path, ctx, self.re_kw.sub)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   155
        return data
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   156
471
2c2f35f8501f manifest: remove execf/linkf methods
Matt Mackall <mpm@selenic.com>
parents: 470
diff changeset
   157
    def iskwfile(self, path, flagfunc):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   158
        '''Returns true if path matches [keyword] pattern
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   159
        and is not a symbolic link.
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   160
        Caveat: localrepository._link fails on Windows.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   161
        return self.match(path) and not 'l' in flagfunc(path)
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   162
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   163
    def overwrite(self, node, expand, files):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   164
        '''Overwrites selected files expanding/shrinking keywords.'''
507
51296bd1652f keyword: move common code out of commit condition
Christian Ebert <blacktrash@gmx.net>
parents: 505
diff changeset
   165
        ctx = self.repo[node]
51296bd1652f keyword: move common code out of commit condition
Christian Ebert <blacktrash@gmx.net>
parents: 505
diff changeset
   166
        mf = ctx.manifest()
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   167
        if node is not None:     # commit
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   168
            files = [f for f in ctx.files() if f in mf]
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   169
            notify = self.ui.debug
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   170
        else:                    # kwexpand/kwshrink
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   171
            notify = self.ui.note
471
2c2f35f8501f manifest: remove execf/linkf methods
Matt Mackall <mpm@selenic.com>
parents: 470
diff changeset
   172
        candidates = [f for f in files if self.iskwfile(f, ctx.flags)]
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   173
        if candidates:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   174
            self.restrict = True # do not expand when reading
532
70220c2a4940 keyword: set overwrite message only once, not for each file
Christian Ebert <blacktrash@gmx.net>
parents: 531
diff changeset
   175
            msg = (expand and _('overwriting %s expanding keywords\n')
70220c2a4940 keyword: set overwrite message only once, not for each file
Christian Ebert <blacktrash@gmx.net>
parents: 531
diff changeset
   176
                   or _('overwriting %s shrinking keywords\n'))
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   177
            for f in candidates:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   178
                fp = self.repo.file(f)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   179
                data = fp.read(mf[f])
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   180
                if util.binary(data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   181
                    continue
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   182
                if expand:
505
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   183
                    if node is None:
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   184
                        ctx = self.repo.filectx(f, fileid=mf[f]).changectx()
a93358a05b80 keyword: be more efficient about ctx usage
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 504
diff changeset
   185
                    data, found = self.substitute(data, f, ctx,
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   186
                                                  self.re_kw.subn)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   187
                else:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   188
                    found = self.re_kw.search(data)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   189
                if found:
531
f7865fb770fe keyword, i18n: avoid untranslated strings as message parameters
Wagner Bruna <wbruna@yahoo.com>
parents: 529
diff changeset
   190
                    notify(msg % f)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   191
                    self.repo.wwrite(f, data, mf.flags(f))
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   192
                    self.repo.dirstate.normal(f)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   193
            self.restrict = False
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   194
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   195
    def shrinktext(self, text):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   196
        '''Unconditionally removes all keyword substitutions from text.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   197
        return self.re_kw.sub(r'$\1$', text)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   198
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   199
    def shrink(self, fname, text):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   200
        '''Returns text with all keyword substitutions removed.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   201
        if self.match(fname) and not util.binary(text):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   202
            return self.shrinktext(text)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   203
        return text
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   204
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   205
    def shrinklines(self, fname, lines):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   206
        '''Returns lines with keyword substitutions removed.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   207
        if self.match(fname):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   208
            text = ''.join(lines)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   209
            if not util.binary(text):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   210
                return self.shrinktext(text).splitlines(True)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   211
        return lines
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   212
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   213
    def wread(self, fname, data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   214
        '''If in restricted mode returns data read from wdir with
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   215
        keyword substitutions removed.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   216
        return self.restrict and self.shrink(fname, data) or data
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   217
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   218
class kwfilelog(filelog.filelog):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   219
    '''
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   220
    Subclass of filelog to hook into its read, add, cmp methods.
186
c1b7b1d052de Avoid global vars by passing opt args to kwrepo.file
Christian Ebert <blacktrash@gmx.net>
parents: 185
diff changeset
   221
    Keywords are "stored" unexpanded, and processed on reading.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   222
    '''
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   223
    def __init__(self, opener, kwt, path):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   224
        super(kwfilelog, self).__init__(opener, path)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   225
        self.kwt = kwt
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   226
        self.path = path
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   227
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   228
    def read(self, node):
265
1b6b7835e3f9 Count keywords in a customized kwfilelog read method
Christian Ebert <blacktrash@gmx.net>
parents: 264
diff changeset
   229
        '''Expands keywords when reading filelog.'''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   230
        data = super(kwfilelog, self).read(node)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   231
        return self.kwt.expand(self.path, node, data)
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   232
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   233
    def add(self, text, meta, tr, link, p1=None, p2=None):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   234
        '''Removes keyword substitutions when adding to filelog.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   235
        text = self.kwt.shrink(self.path, text)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   236
        return super(kwfilelog, self).add(text, meta, tr, link, p1, p2)
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   237
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   238
    def cmp(self, node, text):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   239
        '''Removes keyword substitutions for comparison.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   240
        text = self.kwt.shrink(self.path, text)
174
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   241
        if self.renamed(node):
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   242
            t2 = super(kwfilelog, self).read(node)
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   243
            return t2 != text
248
2c222367dab3 Use revlog.cmp to avoid checking for rename twice
Christian Ebert <blacktrash@gmx.net>
parents: 246
diff changeset
   244
        return revlog.revlog.cmp(self, node, text)
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   245
474
644b640cb3d0 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 473
diff changeset
   246
def _status(ui, repo, kwt, unknown, *pats, **opts):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   247
    '''Bails out if [keyword] configuration is not active.
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   248
    Returns status of working directory.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   249
    if kwt:
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   250
        match = cmdutil.match(repo, pats, opts)
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   251
        return repo.status(match=match, unknown=unknown, clean=True)
271
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   252
    if ui.configitems('keyword'):
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   253
        raise util.Abort(_('[keyword] patterns cannot match'))
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   254
    raise util.Abort(_('no [keyword] patterns configured'))
263
fc7f60b109b6 kwfiles notifies if there are no files configured for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 262
diff changeset
   255
275
cb2b11e63906 _overwrite method for kwrepo.commit, kwexpand, kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 274
diff changeset
   256
def _kwfwrite(ui, repo, expand, *pats, **opts):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   257
    '''Selects files and passes them to kwtemplater.overwrite.'''
465
2f017ca736ce (stable) mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 463
diff changeset
   258
    if repo.dirstate.parents()[1] != nullid:
2f017ca736ce (stable) mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 463
diff changeset
   259
        raise util.Abort(_('outstanding uncommitted merge'))
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   260
    kwt = kwtools['templater']
474
644b640cb3d0 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 473
diff changeset
   261
    status = _status(ui, repo, kwt, False, *pats, **opts)
644b640cb3d0 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 473
diff changeset
   262
    modified, added, removed, deleted = status[:4]
280
2088e409d360 Revert to using status for kw-commands
Christian Ebert <blacktrash@gmx.net>
parents: 278
diff changeset
   263
    if modified or added or removed or deleted:
465
2f017ca736ce (stable) mimic cmdutil.bail_if_changed even more
Christian Ebert <blacktrash@gmx.net>
parents: 463
diff changeset
   264
        raise util.Abort(_('outstanding uncommitted changes'))
209
430837dbe7f4 Adapt to recent changes in Hg (locks handling, dirstate.update gone)
Christian Ebert <blacktrash@gmx.net>
parents: 208
diff changeset
   265
    wlock = lock = None
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   266
    try:
206
8d16b70359da Treat wlock the recommended way
Christian Ebert <blacktrash@gmx.net>
parents: 205
diff changeset
   267
        wlock = repo.wlock()
209
430837dbe7f4 Adapt to recent changes in Hg (locks handling, dirstate.update gone)
Christian Ebert <blacktrash@gmx.net>
parents: 208
diff changeset
   268
        lock = repo.lock()
474
644b640cb3d0 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 473
diff changeset
   269
        kwt.overwrite(None, expand, status[6])
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   270
    finally:
534
43d8c042ca20 switch lock releasing in the extensions from gc to explicit
Ronny Pfannschmidt <Ronny.Pfannschmidt@gmx.de>
parents: 532
diff changeset
   271
        release(lock, wlock)
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   272
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   273
def demo(ui, repo, *args, **opts):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   274
    '''print [keywordmaps] configuration and an expansion example
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   275
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   276
    Show current, custom, or default keyword template maps and their
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   277
    expansions.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   278
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   279
    Extend current configuration by specifying maps as arguments and
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   280
    optionally by reading from an additional hgrc file.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   281
260
af9ddafeeb96 Unlowercase command help
Christian Ebert <blacktrash@gmx.net>
parents: 258
diff changeset
   282
    Override current keyword template maps with "default" option.
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   283
    '''
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   284
    def demoitems(section, items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   285
        ui.write('[%s]\n' % section)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   286
        for k, v in items:
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   287
            ui.write('%s = %s\n' % (k, v))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   288
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   289
    msg = 'hg keyword config and expansion example'
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   290
    kwstatus = 'current'
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   291
    fn = 'demo.txt'
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   292
    branchname = 'demobranch'
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   293
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
529
7197324dfa4d expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 527
diff changeset
   294
    ui.note(_('creating temporary repository at %s\n') % tmpdir)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   295
    repo = localrepo.localrepository(ui, tmpdir, True)
184
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   296
    ui.setconfig('keyword', fn, '')
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   297
    if args or opts.get('rcfile'):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   298
        kwstatus = 'custom'
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   299
    if opts.get('rcfile'):
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   300
        ui.readconfig(opts.get('rcfile'))
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   301
    if opts.get('default'):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   302
        kwstatus = 'default'
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   303
        kwmaps = kwtemplater.templates
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   304
        if ui.configitems('keywordmaps'):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   305
            # override maps from optional rcfile
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   306
            for k, v in kwmaps.iteritems():
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   307
                ui.setconfig('keywordmaps', k, v)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   308
    elif args:
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   309
        # simulate hgrc parsing
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   310
        rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   311
        fp = repo.opener('hgrc', 'w')
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   312
        fp.writelines(rcmaps)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   313
        fp.close()
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   314
        ui.readconfig(repo.join('hgrc'))
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   315
    if not opts.get('default'):
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   316
        kwmaps = dict(ui.configitems('keywordmaps')) or kwtemplater.templates
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   317
    uisetup(ui)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   318
    reposetup(ui, repo)
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   319
    for k, v in ui.configitems('extensions'):
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   320
        if k.endswith('keyword'):
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   321
            extension = '%s = %s' % (k, v)
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   322
            break
590
527257649f20 Make kwdemo more translation friendly
Christian Ebert <blacktrash@gmx.net>
parents: 584
diff changeset
   323
    ui.status(_('\n\tconfig using %s keyword template maps\n') % kwstatus)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   324
    ui.write('[extensions]\n%s\n' % extension)
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   325
    demoitems('keyword', ui.configitems('keyword'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   326
    demoitems('keywordmaps', kwmaps.iteritems())
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   327
    keywords = '$' + '$\n$'.join(kwmaps.keys()) + '$\n'
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   328
    repo.wopener(fn, 'w').write(keywords)
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   329
    repo.add([fn])
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   330
    path = repo.wjoin(fn)
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   331
    ui.note(_('\n%s keywords written to %s:\n') % (kwstatus, path))
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   332
    ui.note(keywords)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   333
    ui.note('\nhg -R "%s" branch "%s"\n' % (tmpdir, branchname))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   334
    # silence branch command if not verbose
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   335
    quiet = ui.quiet
327
06f3c6b3dd93 Simplify temporary ui.quiet setting in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 320
diff changeset
   336
    ui.quiet = not ui.verbose
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   337
    commands.branch(ui, repo, branchname)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   338
    ui.quiet = quiet
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   339
    for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   340
        if name.split('.', 1)[0].find('commit') > -1:
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   341
            repo.ui.setconfig('hooks', name, '')
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   342
    ui.note(_('unhooked all commit hooks\n'))
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   343
    ui.note('hg -R "%s" ci -m "%s"\n' % (tmpdir, msg))
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   344
    repo.commit(text=msg)
509
16b690351c0d Do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 507
diff changeset
   345
    fmt = ui.verbose and ' in %s' % path or ''
590
527257649f20 Make kwdemo more translation friendly
Christian Ebert <blacktrash@gmx.net>
parents: 584
diff changeset
   346
    ui.status(_('\n\t%s keywords expanded%s\n') % (kwstatus, fmt))
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   347
    ui.write(repo.wread(fn))
529
7197324dfa4d expand "repo" to "repository" in help texts
Martin Geisler <mg@lazybytes.net>
parents: 527
diff changeset
   348
    ui.debug(_('\nremoving temporary repository %s\n') % tmpdir)
251
b37f2f065a9c Ignore errors when removing temp dir in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 250
diff changeset
   349
    shutil.rmtree(tmpdir, ignore_errors=True)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   350
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   351
def expand(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   352
    '''expand keywords in the working directory
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   353
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   354
    Run after (re)enabling keyword expansion.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   355
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   356
    kwexpand refuses to run if given files contain local changes.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   357
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   358
    # 3rd argument sets expansion to True
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   359
    _kwfwrite(ui, repo, True, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   360
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   361
def files(ui, repo, *pats, **opts):
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   362
    '''print filenames configured for keyword expansion
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   363
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   364
    Check which filenames in the working directory are matched by the
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   365
    [keyword] configuration patterns.
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   366
593
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   367
    Useful to prevent inadvertent keyword expansion and to speed up
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   368
    execution by including only filenames that are actual candidates
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   369
    for expansion.
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   370
23da65f04361 keyword: improve help for kwfiles
Christian Ebert <blacktrash@gmx.net>
parents: 590
diff changeset
   371
    Use -u/--untracked to display untracked filenames as well.
596
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   372
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   373
    With -a/--all and -v/--verbose the codes used to show the status
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   374
    of files are:
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   375
    K = keyword expansion candidate
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   376
    k = keyword expansion candidate (untracked)
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   377
    I = ignored
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   378
    i = ignored (untracked)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   379
    '''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   380
    kwt = kwtools['templater']
474
644b640cb3d0 status: clean up all users for unknown files
Matt Mackall <mpm@selenic.com>
parents: 473
diff changeset
   381
    status = _status(ui, repo, kwt, opts.get('untracked'), *pats, **opts)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   382
    modified, added, removed, deleted, unknown, ignored, clean = status
596
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   383
    files = sorted(modified + added + clean)
470
2c530e5df1d4 use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 469
diff changeset
   384
    wctx = repo[None]
471
2c2f35f8501f manifest: remove execf/linkf methods
Matt Mackall <mpm@selenic.com>
parents: 470
diff changeset
   385
    kwfiles = [f for f in files if kwt.iskwfile(f, wctx.flags)]
596
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   386
    kwuntracked = [f for f in unknown if kwt.iskwfile(f, wctx.flags)]
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   387
    cwd = pats and repo.getcwd() or ''
596
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   388
    kwfstats = (not opts.get('ignore') and
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   389
                (('K', kwfiles), ('k', kwuntracked),) or ())
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   390
    if opts.get('all') or opts.get('ignore'):
596
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   391
        kwfstats += (('I', [f for f in files if f not in kwfiles]),
2de4e2be005c Lowercase status flags of untracked files in kwfile output
Christian Ebert <blacktrash@gmx.net>
parents: 595
diff changeset
   392
                     ('i', [f for f in unknown if f not in kwuntracked]),)
298
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   393
    for char, filenames in kwfstats:
509
16b690351c0d Do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 507
diff changeset
   394
        fmt = (opts.get('all') or ui.verbose) and '%s %%s\n' % char or '%s\n'
298
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   395
        for f in filenames:
509
16b690351c0d Do not shadow builtin format (detected by pychecker)
Christian Ebert <blacktrash@gmx.net>
parents: 507
diff changeset
   396
            ui.write(fmt % repo.pathto(f, cwd))
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   397
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   398
def shrink(ui, repo, *pats, **opts):
573
197aeca9108a keyword: improve English
timeless <timeless@gmail.com>
parents: 569
diff changeset
   399
    '''revert expanded keywords in the working directory
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   400
527
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   401
    Run before changing/disabling active keywords or if you experience
59cb740ebf83 keyword: word-wrap help texts at 70 characters
Martin Geisler <mg@daimi.au.dk>
parents: 525
diff changeset
   402
    problems with "hg import" or "hg merge".
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   403
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   404
    kwshrink refuses to run if given files contain local changes.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   405
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   406
    # 3rd argument sets expansion to False
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   407
    _kwfwrite(ui, repo, False, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   408
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   409
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   410
def uisetup(ui):
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   411
    '''Collects [keyword] config in kwtools.
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   412
    Monkeypatches dispatch._parse if needed.'''
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   413
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   414
    for pat, opt in ui.configitems('keyword'):
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   415
        if opt != 'ignore':
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   416
            kwtools['inc'].append(pat)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   417
        else:
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   418
            kwtools['exc'].append(pat)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   419
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   420
    if kwtools['inc']:
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   421
        def kwdispatch_parse(orig, ui, args):
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   422
            '''Monkeypatch dispatch._parse to obtain running hg command.'''
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   423
            cmd, func, args, options, cmdoptions = orig(ui, args)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   424
            kwtools['hgcmd'] = cmd
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   425
            return cmd, func, args, options, cmdoptions
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   426
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   427
        extensions.wrapfunction(dispatch, '_parse', kwdispatch_parse)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   428
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   429
def reposetup(ui, repo):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   430
    '''Sets up repo as kwrepo for keyword substitution.
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   431
    Overrides file method to return kwfilelog instead of filelog
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   432
    if file matches user configuration.
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   433
    Wraps commit to overwrite configured files with updated
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   434
    keyword substitutions.
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   435
    Monkeypatches patch and webcommands.'''
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
   436
525
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   437
    try:
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   438
        if (not repo.local() or not kwtools['inc']
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   439
            or kwtools['hgcmd'] in nokwcommands.split()
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   440
            or '.hg' in util.splitpath(repo.root)
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   441
            or repo._url.startswith('bundle:')):
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   442
            return
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   443
    except AttributeError:
6028e8046c14 bundlerepo: reintroduce dirstate
Matt Mackall <mpm@selenic.com>
parents: 523
diff changeset
   444
        pass
292
783c1310e20f Avoid dispatch import, revert to simple argument parser
Christian Ebert <blacktrash@gmx.net>
parents: 290
diff changeset
   445
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   446
    kwtools['templater'] = kwt = kwtemplater(ui, repo)
261
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   447
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   448
    class kwrepo(repo.__class__):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   449
        def file(self, f):
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   450
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   451
                f = f[1:]
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   452
            return kwfilelog(self.sopener, kwt, f)
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   453
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   454
        def wread(self, filename):
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   455
            data = super(kwrepo, self).wread(filename)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   456
            return kwt.wread(filename, data)
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   457
556
a2bf4f77dbec commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 554
diff changeset
   458
        def commit(self, text='', user=None, date=None, match=None,
a2bf4f77dbec commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 554
diff changeset
   459
                   force=False, editor=None, extra={}):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   460
            wlock = lock = None
297
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   461
            _p1 = _p2 = None
230
9fe9a9839387 Move backwards compatible commit fork into private kwrepo function
Christian Ebert <blacktrash@gmx.net>
parents: 229
diff changeset
   462
            try:
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   463
                wlock = self.wlock()
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   464
                lock = self.lock()
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   465
                # store and postpone commit hooks
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   466
                commithooks = {}
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   467
                for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   468
                    if name.split('.', 1)[0] == 'commit':
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   469
                        commithooks[name] = cmd
304
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   470
                        ui.setconfig('hooks', name, None)
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   471
                if commithooks:
296
869b16d09eec Commit hook handling entirely into if-condition
Christian Ebert <blacktrash@gmx.net>
parents: 293
diff changeset
   472
                    # store parents for commit hook environment
542
057f4a64df03 commit: drop unused p1 and p2 args
Matt Mackall <mpm@selenic.com>
parents: 540
diff changeset
   473
                    _p1, _p2 = repo.dirstate.parents()
297
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   474
                    _p1 = hex(_p1)
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   475
                    if _p2 == nullid:
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   476
                        _p2 = ''
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   477
                    else:
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   478
                        _p2 = hex(_p2)
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   479
556
a2bf4f77dbec commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 554
diff changeset
   480
                n = super(kwrepo, self).commit(text, user, date, match, force,
a2bf4f77dbec commit: drop the now-unused files parameter
Matt Mackall <mpm@selenic.com>
parents: 554
diff changeset
   481
                                               editor, extra)
304
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   482
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   483
                # restore commit hooks
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   484
                for name, cmd in commithooks.iteritems():
304
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   485
                    ui.setconfig('hooks', name, cmd)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   486
                if n is not None:
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   487
                    kwt.overwrite(n, True, None)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   488
                    repo.hook('commit', node=n, parent1=_p1, parent2=_p2)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   489
                return n
143
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   490
            finally:
563
353fad43ad99 (stable) fix import gone wrong in 43d8c042ca20
Christian Ebert <blacktrash@gmx.net>
parents: 556
diff changeset
   491
                release(lock, wlock)
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   492
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   493
    # monkeypatches
577
0cdbdf79d5e9 Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents: 573
diff changeset
   494
    def kwpatchfile_init(orig, self, ui, fname, opener, missing=False, eol=None):
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   495
        '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   496
        rejects or conflicts due to expanded keywords in working dir.'''
577
0cdbdf79d5e9 Add patch.eol to ignore EOLs when patching (issue1019)
Patrick Mezard <pmezard@gmail.com>
parents: 573
diff changeset
   497
        orig(self, ui, fname, opener, missing, eol)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   498
        # shrink keywords read from working dir
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   499
        self.lines = kwt.shrinklines(self.fname, self.lines)
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   500
502
6fccffd4059a patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 500
diff changeset
   501
    def kw_diff(orig, repo, node1=None, node2=None, match=None, changes=None,
6fccffd4059a patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 500
diff changeset
   502
                opts=None):
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   503
        '''Monkeypatch patch.diff to avoid expansion except when
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   504
        comparing against working dir.'''
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   505
        if node2 is not None:
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   506
            kwt.match = util.never
470
2c530e5df1d4 use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 469
diff changeset
   507
        elif node1 is not None and node1 != repo['.'].node():
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   508
            kwt.restrict = True
502
6fccffd4059a patch: turn patch.diff() into a generator
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 500
diff changeset
   509
        return orig(repo, node1, node2, match, changes, opts)
463
55f535bc13bc keyword: disable expansion for annotate
Christian Ebert <blacktrash@gmx.net>
parents: 452
diff changeset
   510
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   511
    def kwweb_skip(orig, web, req, tmpl):
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   512
        '''Wraps webcommands.x turning off keyword expansion.'''
552
baee5f7bfd32 keyword: rename matcher() to match() mimicking changes in main
Christian Ebert <blacktrash@gmx.net>
parents: 550
diff changeset
   513
        kwt.match = util.never
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   514
        return orig(web, req, tmpl)
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   515
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   516
    repo.__class__ = kwrepo
445
0c91995647e9 (stable) patches from default in 4b2c266bf059
Christian Ebert <blacktrash@gmx.net>
parents: 431
diff changeset
   517
500
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   518
    extensions.wrapfunction(patch.patchfile, '__init__', kwpatchfile_init)
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   519
    extensions.wrapfunction(patch, 'diff', kw_diff)
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   520
    for c in 'annotate changeset rev filediff diff'.split():
bc63f54d577a extensions: use new wrapper functions
Matt Mackall <mpm@selenic.com>
parents: 485
diff changeset
   521
        extensions.wrapfunction(webcommands, c, kwweb_skip)
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   522
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   523
cmdtable = {
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   524
    'kwdemo':
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   525
        (demo,
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   526
         [('d', 'default', None, _('show default keyword template maps')),
283
071bfbd482b4 Respect Mercurial conventions in kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 282
diff changeset
   527
          ('f', 'rcfile', [], _('read maps from rcfile'))],
071bfbd482b4 Respect Mercurial conventions in kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 282
diff changeset
   528
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...')),
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   529
    'kwexpand': (expand, commands.walkopts,
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   530
                 _('hg kwexpand [OPTION]... [FILE]...')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   531
    'kwfiles':
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   532
        (files,
270
371ce7fe5f13 kwfiles: change option "ignored" to "ignore", add option "untracked"
Christian Ebert <blacktrash@gmx.net>
parents: 269
diff changeset
   533
         [('a', 'all', None, _('show keyword status flags of all files')),
371ce7fe5f13 kwfiles: change option "ignored" to "ignore", add option "untracked"
Christian Ebert <blacktrash@gmx.net>
parents: 269
diff changeset
   534
          ('i', 'ignore', None, _('show files excluded from expansion')),
371ce7fe5f13 kwfiles: change option "ignored" to "ignore", add option "untracked"
Christian Ebert <blacktrash@gmx.net>
parents: 269
diff changeset
   535
          ('u', 'untracked', None, _('additionally show untracked files')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   536
         ] + commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   537
         _('hg kwfiles [OPTION]... [FILE]...')),
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   538
    'kwshrink': (shrink, commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   539
                 _('hg kwshrink [OPTION]... [FILE]...')),
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   540
}