hgkw/keyword.py
author Adrian Buehlmann <adrian@cadifra.com>
Fri, 21 Mar 2008 14:52:24 +0100
branchstable
changeset 427 39fef460b62c
parent 421 439a24d34a13
child 431 4fb8a2e526ff
child 436 ca455dfc5c80
permissions -rw-r--r--
clone: print "updating working directory" status message With this change, "hg clone" looks like this: % hg clone http://example.com/repo/big big requesting all changes adding changesets adding manifests adding file changes added XXX changesets with XXX changes to XXX files updating working directory XXX files updated, XXX files merged, XXX files removed, XXX files unresolved So the user sees % hg clone http://example.com/repo/big big requesting all changes adding changesets adding manifests adding file changes added XXX changesets with XXX changes to XXX files updating working directory while Mercurial is writing to disk to populate the working directory With this change, "hg clone" looks like this: % hg clone big big-work updating working directory XXX files updated, XXX files merged, XXX files removed, XXX files unresolved [ original upstream description ]
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
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     5
# This software may be used and distributed according to the terms
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
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
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an audience
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    15
# not running a version control system.
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
#
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    24
# Setup in hgrc:
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    25
#
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    26
#   [extensions]
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    27
#   # enable extension
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    28
#   keyword = /full/path/to/hgkw/keyword.py
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    29
#   # or, if script in canonical hgext folder:
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    30
#   # hgext.keyword =
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    31
#
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    32
# 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
    33
# 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
    34
#
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    35
# 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
    36
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    37
'''keyword expansion in local repositories
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    38
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    39
This extension expands RCS/CVS-like or self-customized $Keywords$
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    40
in tracked text files selected by your configuration.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    41
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    42
Keywords are only expanded in local repositories and not stored in
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    43
the change history. The mechanism can be regarded as a convenience
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    44
for the current user or for archive distribution.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    45
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    46
Configuration is done in the [keyword] and [keywordmaps] sections
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    47
of hgrc files.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    48
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    49
Example:
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    50
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    51
    [keyword]
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    52
    # expand keywords in every python file except those matching "x*"
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
    53
    **.py =
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    54
    x*    = ignore
146
df9de07ce002 Move config examples into help
Christian Ebert <blacktrash@gmx.net>
parents: 145
diff changeset
    55
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    56
Note: the more specific you are in your filename patterns
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    57
      the less you lose speed in huge repos.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    58
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    59
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
    60
control run "hg kwdemo".
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    61
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    62
An additional date template filter {date|utcdate} is provided.
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    63
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    64
The default template mappings (view with "hg kwdemo -d") can be replaced
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    65
with customized keywords and templates.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    66
Again, run "hg kwdemo" to control the results of your config changes.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
    67
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    68
Before changing/disabling active keywords, run "hg kwshrink" to avoid
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    69
the risk of inadvertedly storing expanded keywords in the change history.
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    70
211
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    71
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
    72
"hg kwexpand".
110c76a94d1c help: no need for kwexpand after import, but after config change
Christian Ebert <blacktrash@gmx.net>
parents: 210
diff changeset
    73
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
    74
Also, when committing with the record extension or using mq's qrecord, be aware
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
    75
that keywords cannot be updated. Again, run "hg kwexpand" on the files in
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
    76
question to update keyword expansions after all changes have been checked in.
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
    77
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
    78
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
    79
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
    80
"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
    81
'''
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    82
363
263b3b10c55f templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents: 347
diff changeset
    83
from mercurial import commands, cmdutil, context, dispatch, filelog, revlog
263b3b10c55f templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents: 347
diff changeset
    84
from mercurial import patch, localrepo, templater, templatefilters, util
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
    85
from mercurial.hgweb import webcommands
421
439a24d34a13 Expand import * to allow Pyflakes to find problems
Joel Rosdahl <joel@rosdahl.net>
parents: 419
diff changeset
    86
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
    87
from mercurial.i18n import _
394
fe13fe09ba2e keyword: avoid os import by using util.splitpath
Christian Ebert <blacktrash@gmx.net>
parents: 391
diff changeset
    88
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
    89
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
    90
commands.optionalrepo += ' kwdemo'
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    91
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    92
# hg commands that do not act on keywords
419
2f179ea3a9aa keyword: remove "identify" and "remove" from nokwcommands
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 416
diff changeset
    93
nokwcommands = ('add addremove bundle copy export grep incoming init'
2f179ea3a9aa keyword: remove "identify" and "remove" from nokwcommands
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 416
diff changeset
    94
                ' log outgoing push rename rollback tip'
401
05d0c3e4efdc Add glog to nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 398
diff changeset
    95
                ' convert email glog')
374
03fc5e667518 Make nokwcommands, restricted string variables at top level
Christian Ebert <blacktrash@gmx.net>
parents: 373
diff changeset
    96
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
    97
# 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
    98
# not when reading filelog, and unexpand when reading from working dir
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
    99
restricted = 'record qfold qimport qnew qpush qrefresh qrecord'
347
c912b8c3f3ff Detect restricted commands thru variable
Christian Ebert <blacktrash@gmx.net>
parents: 346
diff changeset
   100
93
9f70f953dd3b Clean keyword arg assignment in kwfilelog.add; rename utc() to utcdate()
Christian Ebert <blacktrash@gmx.net>
parents: 92
diff changeset
   101
def utcdate(date):
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   102
    '''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
   103
    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
   104
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   105
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   106
# make keyword tools accessible
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   107
kwtools = {'templater': None, 'hgcmd': None}
413
1b6610abf538 Remove whitespace at eol
Christian Ebert <blacktrash@gmx.net>
parents: 410
diff changeset
   108
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   109
# store originals of monkeypatches
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   110
_patchfile_init = patch.patchfile.__init__
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   111
_patch_diff = patch.diff
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   112
_dispatch_parse = dispatch._parse
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   113
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   114
def _kwpatchfile_init(self, ui, fname, missing=False):
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   115
    '''Monkeypatch/wrap patch.patchfile.__init__ to avoid
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   116
    rejects or conflicts due to expanded keywords in working dir.'''
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   117
    _patchfile_init(self, ui, fname, missing=missing)
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   118
    # shrink keywords read from working dir
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   119
    kwt = kwtools['templater']
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   120
    self.lines = kwt.shrinklines(self.fname, self.lines)
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   121
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   122
def _kw_diff(repo, node1=None, node2=None, files=None, match=util.always,
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   123
             fp=None, changes=None, opts=None):
415
d1026365eff6 Fix getnode doc, add doc for patch.diff monkey
Christian Ebert <blacktrash@gmx.net>
parents: 413
diff changeset
   124
    '''Monkeypatch patch.diff to avoid expansion except when
d1026365eff6 Fix getnode doc, add doc for patch.diff monkey
Christian Ebert <blacktrash@gmx.net>
parents: 413
diff changeset
   125
    comparing against working dir.'''
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   126
    if node2 is not None:
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   127
        kwtools['templater'].matcher = util.never
410
64cd77f6f7f1 Do not inspect node1 for diff if node2 is given
Christian Ebert <blacktrash@gmx.net>
parents: 408
diff changeset
   128
    elif node1 is not None and node1 != repo.changectx().node():
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   129
        kwtools['templater'].restrict = True
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   130
    _patch_diff(repo, node1=node1, node2=node2, files=files, match=match,
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   131
                fp=fp, changes=changes, opts=opts)
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   132
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   133
def _kwweb_changeset(web, req, tmpl):
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   134
    '''Wraps webcommands.changeset turning off keyword expansion.'''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   135
    kwtools['templater'].matcher = util.never
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   136
    return web.changeset(tmpl, web.changectx(req))
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   137
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   138
def _kwweb_filediff(web, req, tmpl):
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   139
    '''Wraps webcommands.filediff turning off keyword expansion.'''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   140
    kwtools['templater'].matcher = util.never
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   141
    return web.filediff(tmpl, web.filectx(req))
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   142
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   143
def _kwdispatch_parse(ui, args):
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   144
    '''Monkeypatch dispatch._parse to obtain running hg command.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   145
    cmd, func, args, options, cmdoptions = _dispatch_parse(ui, args)
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   146
    kwtools['hgcmd'] = cmd
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   147
    return cmd, func, args, options, cmdoptions
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   148
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   149
# dispatch._parse is run before reposetup, so wrap it here
385
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   150
dispatch._parse = _kwdispatch_parse
e93c63004ec2 Monkeypatch dispatch._parse to avoid running it twice
Christian Ebert <blacktrash@gmx.net>
parents: 384
diff changeset
   151
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   152
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   153
class kwtemplater(object):
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   154
    '''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   155
    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
   156
    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
   157
    '''
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   158
    templates = {
204
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   159
        'Revision': '{node|short}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   160
        'Author': '{author|user}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   161
        'Date': '{date|utcdate}',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   162
        'RCSFile': '{file|basename},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   163
        'Source': '{root}/{file},v',
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   164
        '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
   165
        '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
   166
    }
2d089b691b31 Add grep, init to nokwcommands; make variables, getcmd local
Christian Ebert <blacktrash@gmx.net>
parents: 203
diff changeset
   167
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   168
    def __init__(self, ui, repo, inc, exc):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   169
        self.ui = ui
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   170
        self.repo = repo
310
574128f982a2 Reintroduce _iskwfile with link method as argument
Christian Ebert <blacktrash@gmx.net>
parents: 309
diff changeset
   171
        self.matcher = util.matcher(repo.root, inc=inc, exc=exc)[1]
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   172
        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
   173
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   174
        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
   175
        if kwmaps: # override default templates
22e08d0f25dc List comprehension instead of loop to create ui template dictionary
Christian Ebert <blacktrash@gmx.net>
parents: 252
diff changeset
   176
            kwmaps = [(k, templater.parsestring(v, quoted=False))
22e08d0f25dc List comprehension instead of loop to create ui template dictionary
Christian Ebert <blacktrash@gmx.net>
parents: 252
diff changeset
   177
                      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
   178
            self.templates = dict(kwmaps)
254
474eccf2964f Map re.escape
Christian Ebert <blacktrash@gmx.net>
parents: 253
diff changeset
   179
        escaped = map(re.escape, self.templates.keys())
252
001902b60bdd String format keyword pattern before compilation
Christian Ebert <blacktrash@gmx.net>
parents: 251
diff changeset
   180
        kwpat = r'\$(%s)(: [^$\n\r]*? )??\$' % '|'.join(escaped)
001902b60bdd String format keyword pattern before compilation
Christian Ebert <blacktrash@gmx.net>
parents: 251
diff changeset
   181
        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
   182
363
263b3b10c55f templates: move filters to their own module
Matt Mackall <mpm@selenic.com>
parents: 347
diff changeset
   183
        templatefilters.filters['utcdate'] = utcdate
307
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   184
        self.ct = cmdutil.changeset_templater(self.ui, self.repo,
32061d23db14 Refactor to initialize kwtemplater only once during reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 306
diff changeset
   185
                                              False, '', False)
235
baef9dcfb219 Compatible repo.dirstate.normal/update into own function
Christian Ebert <blacktrash@gmx.net>
parents: 234
diff changeset
   186
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   187
    def getnode(self, path, fnode):
415
d1026365eff6 Fix getnode doc, add doc for patch.diff monkey
Christian Ebert <blacktrash@gmx.net>
parents: 413
diff changeset
   188
        '''Derives changenode from file path and filenode.'''
d1026365eff6 Fix getnode doc, add doc for patch.diff monkey
Christian Ebert <blacktrash@gmx.net>
parents: 413
diff changeset
   189
        # used by kwfilelog.read and kwexpand
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   190
        c = context.filectx(self.repo, path, fileid=fnode)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   191
        return c.node()
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   192
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   193
    def substitute(self, data, path, node, subfunc):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   194
        '''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
   195
        def kwsub(mobj):
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   196
            kw = mobj.group(1)
306
78b80b2511de Rename kwtemplater.t to kwtemplater.ct
Christian Ebert <blacktrash@gmx.net>
parents: 304
diff changeset
   197
            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
   198
            self.ui.pushbuffer()
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   199
            self.ct.show(changenode=node, root=self.repo.root, file=path)
373
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   200
            ekw = templatefilters.firstline(self.ui.popbuffer())
56573f49772c Split line continuation in 2 steps (style)
Christian Ebert <blacktrash@gmx.net>
parents: 372
diff changeset
   201
            return '$%s: %s $' % (kw, ekw)
301
e92c6762e2be Make match object function private to kwtemplater.substitute
Christian Ebert <blacktrash@gmx.net>
parents: 300
diff changeset
   202
        return subfunc(kwsub, data)
255
c4f37735be9b Turn off debug while expanding
Christian Ebert <blacktrash@gmx.net>
parents: 254
diff changeset
   203
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   204
    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
   205
        '''Returns data with keywords expanded.'''
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   206
        if not self.restrict and self.matcher(path) and not util.binary(data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   207
            changenode = self.getnode(path, node)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   208
            return self.substitute(data, path, changenode, self.re_kw.sub)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   209
        return data
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   210
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   211
    def iskwfile(self, path, islink):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   212
        '''Returns true if path matches [keyword] pattern
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   213
        and is not a symbolic link.
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   214
        Caveat: localrepository._link fails on Windows.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   215
        return self.matcher(path) and not islink(path)
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   216
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   217
    def overwrite(self, node=None, expand=True, files=None):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   218
        '''Overwrites selected files expanding/shrinking keywords.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   219
        ctx = self.repo.changectx(node)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   220
        mf = ctx.manifest()
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   221
        if node is not None:     # commit
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   222
            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
   223
            notify = self.ui.debug
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   224
        else:                    # kwexpand/kwshrink
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   225
            notify = self.ui.note
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   226
        candidates = [f for f in files if self.iskwfile(f, mf.linkf)]
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   227
        if candidates:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   228
            self.restrict = True # do not expand when reading
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   229
            candidates.sort()
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   230
            action = expand and 'expanding' or 'shrinking'
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   231
            for f in candidates:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   232
                fp = self.repo.file(f)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   233
                data = fp.read(mf[f])
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   234
                if util.binary(data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   235
                    continue
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   236
                if expand:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   237
                    changenode = node or self.getnode(f, mf[f])
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   238
                    data, found = self.substitute(data, f, changenode,
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   239
                                                  self.re_kw.subn)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   240
                else:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   241
                    found = self.re_kw.search(data)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   242
                if found:
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   243
                    notify(_('overwriting %s %s keywords\n') % (f, action))
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   244
                    self.repo.wwrite(f, data, mf.flags(f))
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   245
                    self.repo.dirstate.normal(f)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   246
            self.restrict = False
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   247
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   248
    def shrinktext(self, text):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   249
        '''Unconditionally removes all keyword substitutions from text.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   250
        return self.re_kw.sub(r'$\1$', text)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   251
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   252
    def shrink(self, fname, text):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   253
        '''Returns text with all keyword substitutions removed.'''
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   254
        if self.matcher(fname) and not util.binary(text):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   255
            return self.shrinktext(text)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   256
        return text
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   257
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   258
    def shrinklines(self, fname, lines):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   259
        '''Returns lines with keyword substitutions removed.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   260
        if self.matcher(fname):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   261
            text = ''.join(lines)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   262
            if not util.binary(text):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   263
                return self.shrinktext(text).splitlines(True)
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   264
        return lines
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   265
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   266
    def wread(self, fname, data):
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   267
        '''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
   268
        keyword substitutions removed.'''
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   269
        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
   270
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   271
class kwfilelog(filelog.filelog):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   272
    '''
173
5329863fb64e filectx does not need filelog; more nokwcommands
Christian Ebert <blacktrash@gmx.net>
parents: 172
diff changeset
   273
    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
   274
    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
   275
    '''
314
d9f84b36de26 Do not pass global _kwtemplater around in arguments
Christian Ebert <blacktrash@gmx.net>
parents: 310
diff changeset
   276
    def __init__(self, opener, path):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   277
        super(kwfilelog, self).__init__(opener, path)
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   278
        self.kwt = kwtools['templater']
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   279
        self.path = path
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   280
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   281
    def read(self, node):
265
1b6b7835e3f9 Count keywords in a customized kwfilelog read method
Christian Ebert <blacktrash@gmx.net>
parents: 264
diff changeset
   282
        '''Expands keywords when reading filelog.'''
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   283
        data = super(kwfilelog, self).read(node)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   284
        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
   285
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   286
    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
   287
        '''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
   288
        text = self.kwt.shrink(self.path, text)
166
849e28e03fb4 Obey Mercurial line continuation convention
Christian Ebert <blacktrash@gmx.net>
parents: 165
diff changeset
   289
        return super(kwfilelog, self).add(text, meta, tr, link, p1=p1, p2=p2)
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   290
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   291
    def cmp(self, node, text):
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   292
        '''Removes keyword substitutions for comparison.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   293
        text = self.kwt.shrink(self.path, text)
174
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   294
        if self.renamed(node):
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   295
            t2 = super(kwfilelog, self).read(node)
c5f655d5d8b4 Handle rename and copy properly
Christian Ebert <blacktrash@gmx.net>
parents: 173
diff changeset
   296
            return t2 != text
248
2c222367dab3 Use revlog.cmp to avoid checking for rename twice
Christian Ebert <blacktrash@gmx.net>
parents: 246
diff changeset
   297
        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
   298
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   299
def _status(ui, repo, kwt, *pats, **opts):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   300
    '''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
   301
    Returns status of working directory.'''
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   302
    if kwt:
280
2088e409d360 Revert to using status for kw-commands
Christian Ebert <blacktrash@gmx.net>
parents: 278
diff changeset
   303
        files, match, anypats = cmdutil.matchpats(repo, pats, opts)
2088e409d360 Revert to using status for kw-commands
Christian Ebert <blacktrash@gmx.net>
parents: 278
diff changeset
   304
        return repo.status(files=files, match=match, list_clean=True)
271
35f43e2ce5b6 For overwriting commands use node and manifest to speed up walk
Christian Ebert <blacktrash@gmx.net>
parents: 270
diff changeset
   305
    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
   306
        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
   307
    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
   308
275
cb2b11e63906 _overwrite method for kwrepo.commit, kwexpand, kwshrink
Christian Ebert <blacktrash@gmx.net>
parents: 274
diff changeset
   309
def _kwfwrite(ui, repo, expand, *pats, **opts):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   310
    '''Selects files and passes them to kwtemplater.overwrite.'''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   311
    kwt = kwtools['templater']
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   312
    status = _status(ui, repo, kwt, *pats, **opts)
280
2088e409d360 Revert to using status for kw-commands
Christian Ebert <blacktrash@gmx.net>
parents: 278
diff changeset
   313
    modified, added, removed, deleted, unknown, ignored, clean = status
2088e409d360 Revert to using status for kw-commands
Christian Ebert <blacktrash@gmx.net>
parents: 278
diff changeset
   314
    if modified or added or removed or deleted:
2088e409d360 Revert to using status for kw-commands
Christian Ebert <blacktrash@gmx.net>
parents: 278
diff changeset
   315
        raise util.Abort(_('outstanding uncommitted changes in given files'))
209
430837dbe7f4 Adapt to recent changes in Hg (locks handling, dirstate.update gone)
Christian Ebert <blacktrash@gmx.net>
parents: 208
diff changeset
   316
    wlock = lock = None
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   317
    try:
206
8d16b70359da Treat wlock the recommended way
Christian Ebert <blacktrash@gmx.net>
parents: 205
diff changeset
   318
        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
   319
        lock = repo.lock()
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   320
        kwt.overwrite(expand=expand, files=clean)
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   321
    finally:
209
430837dbe7f4 Adapt to recent changes in Hg (locks handling, dirstate.update gone)
Christian Ebert <blacktrash@gmx.net>
parents: 208
diff changeset
   322
        del wlock, lock
185
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   323
bc5cd6cf69bc Implement kwshrink/kwexpand commands to deal with config, import issues
Christian Ebert <blacktrash@gmx.net>
parents: 184
diff changeset
   324
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   325
def demo(ui, repo, *args, **opts):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   326
    '''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
   327
260
af9ddafeeb96 Unlowercase command help
Christian Ebert <blacktrash@gmx.net>
parents: 258
diff changeset
   328
    Show current, custom, or default keyword template maps
af9ddafeeb96 Unlowercase command help
Christian Ebert <blacktrash@gmx.net>
parents: 258
diff changeset
   329
    and their expansion.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   330
260
af9ddafeeb96 Unlowercase command help
Christian Ebert <blacktrash@gmx.net>
parents: 258
diff changeset
   331
    Extend current configuration by specifying maps as arguments
af9ddafeeb96 Unlowercase command help
Christian Ebert <blacktrash@gmx.net>
parents: 258
diff changeset
   332
    and optionally by reading from an additional hgrc file.
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   333
260
af9ddafeeb96 Unlowercase command help
Christian Ebert <blacktrash@gmx.net>
parents: 258
diff changeset
   334
    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
   335
    '''
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   336
    def demostatus(stat):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   337
        ui.status(_('\n\t%s\n') % stat)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   338
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   339
    def demoitems(section, items):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   340
        ui.write('[%s]\n' % section)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   341
        for k, v in items:
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   342
            ui.write('%s = %s\n' % (k, v))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   343
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   344
    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
   345
    kwstatus = 'current'
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   346
    fn = 'demo.txt'
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   347
    branchname = 'demobranch'
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   348
    tmpdir = tempfile.mkdtemp('', 'kwdemo.')
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   349
    ui.note(_('creating temporary repo at %s\n') % tmpdir)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   350
    repo = localrepo.localrepository(ui, path=tmpdir, create=True)
184
30b3e6a09a9d Set ui to repo.ui at once where needed for backwards compatibility
Christian Ebert <blacktrash@gmx.net>
parents: 183
diff changeset
   351
    ui.setconfig('keyword', fn, '')
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   352
    if args or opts.get('rcfile'):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   353
        kwstatus = 'custom'
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   354
    if opts.get('rcfile'):
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   355
        ui.readconfig(opts.get('rcfile'))
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   356
    if opts.get('default'):
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   357
        kwstatus = 'default'
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   358
        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
   359
        if ui.configitems('keywordmaps'):
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   360
            # override maps from optional rcfile
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   361
            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
   362
                ui.setconfig('keywordmaps', k, v)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   363
    elif args:
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   364
        # simulate hgrc parsing
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   365
        rcmaps = ['[keywordmaps]\n'] + [a + '\n' for a in args]
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   366
        fp = repo.opener('hgrc', 'w')
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   367
        fp.writelines(rcmaps)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   368
        fp.close()
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   369
        ui.readconfig(repo.join('hgrc'))
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   370
    if not opts.get('default'):
222
f956a8301c25 Shorten template setup
Christian Ebert <blacktrash@gmx.net>
parents: 221
diff changeset
   371
        kwmaps = dict(ui.configitems('keywordmaps')) or kwtemplater.templates
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   372
    reposetup(ui, repo)
208
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   373
    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
   374
        if k.endswith('keyword'):
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   375
            extension = '%s = %s' % (k, v)
5afdcec8a01f Show extension in kwdemo; flag helpers; rephrase doc
Christian Ebert <blacktrash@gmx.net>
parents: 207
diff changeset
   376
            break
266
50ce25f8c676 Underscore prefixes only for names at top level, or compatibility wrappers
Christian Ebert <blacktrash@gmx.net>
parents: 265
diff changeset
   377
    demostatus('config using %s keyword template maps' % kwstatus)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   378
    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
   379
    demoitems('keyword', ui.configitems('keyword'))
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   380
    demoitems('keywordmaps', kwmaps.iteritems())
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   381
    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
   382
    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
   383
    repo.add([fn])
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   384
    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
   385
    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
   386
    ui.note(keywords)
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   387
    ui.note('\nhg -R "%s" branch "%s"\n' % (tmpdir, branchname))
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   388
    # silence branch command if not verbose
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   389
    quiet = ui.quiet
327
06f3c6b3dd93 Simplify temporary ui.quiet setting in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 320
diff changeset
   390
    ui.quiet = not ui.verbose
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   391
    commands.branch(ui, repo, branchname)
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   392
    ui.quiet = quiet
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   393
    for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   394
        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
   395
            repo.ui.setconfig('hooks', name, '')
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   396
    ui.note(_('unhooked all commit hooks\n'))
210
304f9ac35869 kwdemo fixes and tweaks
Christian Ebert <blacktrash@gmx.net>
parents: 209
diff changeset
   397
    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
   398
    repo.commit(text=msg)
309
a5f5bbf4a668 Make path format output switches more compact
Christian Ebert <blacktrash@gmx.net>
parents: 308
diff changeset
   399
    format = ui.verbose and ' in %s' % path or ''
a5f5bbf4a668 Make path format output switches more compact
Christian Ebert <blacktrash@gmx.net>
parents: 308
diff changeset
   400
    demostatus('%s keywords expanded%s' % (kwstatus, format))
205
f2d2e36053f9 kwdemo: clear up repo, ui inheritance; show commit log in debug output
Christian Ebert <blacktrash@gmx.net>
parents: 204
diff changeset
   401
    ui.write(repo.wread(fn))
183
80fa00250c6d Use ui.note to get verbosity switch; tweak kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 182
diff changeset
   402
    ui.debug(_('\nremoving temporary repo %s\n') % tmpdir)
251
b37f2f065a9c Ignore errors when removing temp dir in kwdemo
Christian Ebert <blacktrash@gmx.net>
parents: 250
diff changeset
   403
    shutil.rmtree(tmpdir, ignore_errors=True)
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   404
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   405
def expand(ui, repo, *pats, **opts):
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   406
    '''expand keywords in working directory
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   407
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   408
    Run after (re)enabling keyword expansion.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   409
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   410
    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
   411
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   412
    # 3rd argument sets expansion to True
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   413
    _kwfwrite(ui, repo, True, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   414
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   415
def files(ui, repo, *pats, **opts):
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   416
    '''print files currently configured for keyword expansion
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   417
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   418
    Crosscheck which files in working directory are potential targets for
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   419
    keyword expansion.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   420
    That is, files matched by [keyword] config patterns but not symlinks.
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   421
    '''
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   422
    kwt = kwtools['templater']
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   423
    status = _status(ui, repo, kwt, *pats, **opts)
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   424
    modified, added, removed, deleted, unknown, ignored, clean = status
328
f5154819a11b Just add unknown kwfiles candidates when untracked option is given
Christian Ebert <blacktrash@gmx.net>
parents: 327
diff changeset
   425
    files = modified + added + clean
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   426
    if opts.get('untracked'):
328
f5154819a11b Just add unknown kwfiles candidates when untracked option is given
Christian Ebert <blacktrash@gmx.net>
parents: 327
diff changeset
   427
        files += unknown
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   428
    files.sort()
391
d3f114c111ff keyword: fix symlink detection under Windows
Patrick Mezard <pmezard@gmail.com>
parents: 390
diff changeset
   429
    wctx = repo.workingctx()
d3f114c111ff keyword: fix symlink detection under Windows
Patrick Mezard <pmezard@gmail.com>
parents: 390
diff changeset
   430
    islink = lambda p: 'l' in wctx.fileflags(p)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   431
    kwfiles = [f for f in files if kwt.iskwfile(f, islink)]
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   432
    cwd = pats and repo.getcwd() or ''
320
83dad6b67ed9 Compress kwfstats intitialization
Christian Ebert <blacktrash@gmx.net>
parents: 319
diff changeset
   433
    kwfstats = not opts.get('ignore') and (('K', kwfiles),) or ()
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   434
    if opts.get('all') or opts.get('ignore'):
298
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   435
        kwfstats += (('I', [f for f in files if f not in kwfiles]),)
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   436
    for char, filenames in kwfstats:
319
2da9ab0bc400 Always opts.get to be on safe side
Christian Ebert <blacktrash@gmx.net>
parents: 318
diff changeset
   437
        format = (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
   438
        for f in filenames:
c8afb99bb70f kwfiles print code similar to commands.status
Christian Ebert <blacktrash@gmx.net>
parents: 297
diff changeset
   439
            ui.write(format % repo.pathto(f, cwd))
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   440
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   441
def shrink(ui, repo, *pats, **opts):
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   442
    '''revert expanded keywords in working directory
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   443
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   444
    Run before changing/disabling active keywords
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   445
    or if you experience problems with "hg import" or "hg merge".
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   446
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   447
    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
   448
    '''
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   449
    # 3rd argument sets expansion to False
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   450
    _kwfwrite(ui, repo, False, *pats, **opts)
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   451
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   452
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   453
def reposetup(ui, repo):
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   454
    '''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
   455
    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
   456
    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
   457
    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
   458
    keyword substitutions.
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   459
    This is done for local repos only, and only if there are
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   460
    files configured at all for keyword substitution.'''
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
   461
384
482c91f8c230 Do not set up kwrepo when pulling from bundlerepo
Christian Ebert <blacktrash@gmx.net>
parents: 383
diff changeset
   462
    try:
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   463
        if (not repo.local() or kwtools['hgcmd'] in nokwcommands.split()
394
fe13fe09ba2e keyword: avoid os import by using util.splitpath
Christian Ebert <blacktrash@gmx.net>
parents: 391
diff changeset
   464
            or '.hg' in util.splitpath(repo.root)
384
482c91f8c230 Do not set up kwrepo when pulling from bundlerepo
Christian Ebert <blacktrash@gmx.net>
parents: 383
diff changeset
   465
            or repo._url.startswith('bundle:')):
482c91f8c230 Do not set up kwrepo when pulling from bundlerepo
Christian Ebert <blacktrash@gmx.net>
parents: 383
diff changeset
   466
            return
482c91f8c230 Do not set up kwrepo when pulling from bundlerepo
Christian Ebert <blacktrash@gmx.net>
parents: 383
diff changeset
   467
    except AttributeError:
482c91f8c230 Do not set up kwrepo when pulling from bundlerepo
Christian Ebert <blacktrash@gmx.net>
parents: 383
diff changeset
   468
        pass
292
783c1310e20f Avoid dispatch import, revert to simple argument parser
Christian Ebert <blacktrash@gmx.net>
parents: 290
diff changeset
   469
386
c27209bf8385 Ignore everything starting with .hg
Christian Ebert <blacktrash@gmx.net>
parents: 385
diff changeset
   470
    inc, exc = [], ['.hg*']
261
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   471
    for pat, opt in ui.configitems('keyword'):
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   472
        if opt != 'ignore':
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   473
            inc.append(pat)
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   474
        else:
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   475
            exc.append(pat)
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   476
    if not inc:
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   477
        return
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   478
416
b69dca43ef08 Rename kwx to kwtools
Christian Ebert <blacktrash@gmx.net>
parents: 415
diff changeset
   479
    kwtools['templater'] = kwt = kwtemplater(ui, repo, inc, exc)
261
28e64bebc298 Make kwfmatcher an ui attribute
Christian Ebert <blacktrash@gmx.net>
parents: 260
diff changeset
   480
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   481
    class kwrepo(repo.__class__):
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   482
        def file(self, f):
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   483
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   484
                f = f[1:]
407
60c993ce6acb Move expand/shrink decisions into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 406
diff changeset
   485
            return kwfilelog(self.sopener, f)
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   486
340
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   487
        def wread(self, filename):
9e9f6cbcf20b Implement support for mq; handle (q)record more gracefully
Christian Ebert <blacktrash@gmx.net>
parents: 335
diff changeset
   488
            data = super(kwrepo, self).wread(filename)
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   489
            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
   490
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   491
        def commit(self, files=None, text='', user=None, date=None,
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   492
                   match=util.always, force=False, force_editor=False,
372
d5588b31bcad Add empty_ok argument to kwrepo.commit
Christian Ebert <blacktrash@gmx.net>
parents: 371
diff changeset
   493
                   p1=None, p2=None, extra={}, empty_ok=False):
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   494
            wlock = lock = None
297
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   495
            _p1 = _p2 = None
230
9fe9a9839387 Move backwards compatible commit fork into private kwrepo function
Christian Ebert <blacktrash@gmx.net>
parents: 229
diff changeset
   496
            try:
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   497
                wlock = self.wlock()
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   498
                lock = self.lock()
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   499
                # store and postpone commit hooks
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   500
                commithooks = {}
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   501
                for name, cmd in ui.configitems('hooks'):
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   502
                    if name.split('.', 1)[0] == 'commit':
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   503
                        commithooks[name] = cmd
304
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   504
                        ui.setconfig('hooks', name, None)
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   505
                if commithooks:
296
869b16d09eec Commit hook handling entirely into if-condition
Christian Ebert <blacktrash@gmx.net>
parents: 293
diff changeset
   506
                    # store parents for commit hook environment
869b16d09eec Commit hook handling entirely into if-condition
Christian Ebert <blacktrash@gmx.net>
parents: 293
diff changeset
   507
                    if p1 is None:
869b16d09eec Commit hook handling entirely into if-condition
Christian Ebert <blacktrash@gmx.net>
parents: 293
diff changeset
   508
                        _p1, _p2 = repo.dirstate.parents()
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   509
                    else:
296
869b16d09eec Commit hook handling entirely into if-condition
Christian Ebert <blacktrash@gmx.net>
parents: 293
diff changeset
   510
                        _p1, _p2 = p1, p2 or nullid
297
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   511
                    _p1 = hex(_p1)
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   512
                    if _p2 == nullid:
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   513
                        _p2 = ''
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   514
                    else:
9e29992343a1 Rearrange commit hook hack
Christian Ebert <blacktrash@gmx.net>
parents: 296
diff changeset
   515
                        _p2 = hex(_p2)
293
a7d568671575 Postpone commit hooks until keywords are expanded
Christian Ebert <blacktrash@gmx.net>
parents: 292
diff changeset
   516
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   517
                node = super(kwrepo,
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   518
                             self).commit(files=files, text=text, user=user,
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   519
                                          date=date, match=match, force=force,
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   520
                                          force_editor=force_editor,
372
d5588b31bcad Add empty_ok argument to kwrepo.commit
Christian Ebert <blacktrash@gmx.net>
parents: 371
diff changeset
   521
                                          p1=p1, p2=p2, extra=extra,
d5588b31bcad Add empty_ok argument to kwrepo.commit
Christian Ebert <blacktrash@gmx.net>
parents: 371
diff changeset
   522
                                          empty_ok=empty_ok)
304
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   523
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   524
                # restore commit hooks
346
2c2b49def9d8 Improve use of dictionaries
Christian Ebert <blacktrash@gmx.net>
parents: 345
diff changeset
   525
                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
   526
                    ui.setconfig('hooks', name, cmd)
206
8d16b70359da Treat wlock the recommended way
Christian Ebert <blacktrash@gmx.net>
parents: 205
diff changeset
   527
                if node is not None:
408
33e5b8a51e47 Make main class and hg command accessible
Christian Ebert <blacktrash@gmx.net>
parents: 407
diff changeset
   528
                    kwt.overwrite(node=node)
304
815dc4a04296 Do not run commit hooks if there is no node
Christian Ebert <blacktrash@gmx.net>
parents: 301
diff changeset
   529
                    repo.hook('commit', node=node, parent1=_p1, parent2=_p2)
145
1c2cefa97b96 Wrap entire commit in wlock
Christian Ebert <blacktrash@gmx.net>
parents: 144
diff changeset
   530
                return node
143
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   531
            finally:
290
b05795ad5632 Make keyword against current Mercurial available as standalone extension
Christian Ebert <blacktrash@gmx.net>
parents: 288
diff changeset
   532
                del wlock, lock
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   533
157
64dce6787d82 Incorporate changes in self_initializing_hook branch
Christian Ebert <blacktrash@gmx.net>
parents: 98
diff changeset
   534
    repo.__class__ = kwrepo
315
c1ec4ffd1279 Avoid import and merge conflicts caused by expanded keywords
Christian Ebert <blacktrash@gmx.net>
parents: 314
diff changeset
   535
    patch.patchfile.__init__ = _kwpatchfile_init
404
45d3ea301c03 Monkeypatch patch.diff for non-interactive diffs
Christian Ebert <blacktrash@gmx.net>
parents: 401
diff changeset
   536
    patch.diff = _kw_diff
398
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   537
    webcommands.changeset = webcommands.rev = _kwweb_changeset
257da73e109f Switch off expansion for web diffs
Christian Ebert <blacktrash@gmx.net>
parents: 396
diff changeset
   538
    webcommands.filediff = webcommands.diff = _kwweb_filediff
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   539
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   540
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   541
cmdtable = {
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   542
    'kwdemo':
181
8019554adbb2 kwdemo is demo internally; rearrange code
Christian Ebert <blacktrash@gmx.net>
parents: 180
diff changeset
   543
        (demo,
187
a01a0392f648 kwdemo accepts maps as arguments, reads from optional rcfile
Christian Ebert <blacktrash@gmx.net>
parents: 186
diff changeset
   544
         [('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
   545
          ('f', 'rcfile', [], _('read maps from rcfile'))],
071bfbd482b4 Respect Mercurial conventions in kwdemo help
Christian Ebert <blacktrash@gmx.net>
parents: 282
diff changeset
   546
         _('hg kwdemo [-d] [-f RCFILE] [TEMPLATEMAP]...')),
285
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   547
    'kwexpand': (expand, commands.walkopts,
0aa02d36b3b1 Arrange commands and cmdtable in alphabetical order
Christian Ebert <blacktrash@gmx.net>
parents: 284
diff changeset
   548
                 _('hg kwexpand [OPTION]... [FILE]...')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   549
    'kwfiles':
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   550
        (files,
270
371ce7fe5f13 kwfiles: change option "ignored" to "ignore", add option "untracked"
Christian Ebert <blacktrash@gmx.net>
parents: 269
diff changeset
   551
         [('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
   552
          ('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
   553
          ('u', 'untracked', None, _('additionally show untracked files')),
264
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   554
         ] + commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   555
         _('hg kwfiles [OPTION]... [FILE]...')),
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   556
    'kwshrink': (shrink, commands.walkopts,
7c637046c0e2 walkopts for kwexpand, kwshrink, kwfiles commands
Christian Ebert <blacktrash@gmx.net>
parents: 263
diff changeset
   557
                 _('hg kwshrink [OPTION]... [FILE]...')),
178
4a27c306c6a2 Add kwdemo command as online config help
Christian Ebert <blacktrash@gmx.net>
parents: 177
diff changeset
   558
}