hgkw/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Wed, 14 Feb 2007 03:03:16 +0100
branchkwmap-templates
changeset 144 19b3d1de3db0
parent 143 3485b0ef99c4
child 145 1c2cefa97b96
permissions -rw-r--r--
Move kwfilelog out of reposetup; only use kwfilelog if file matches Again: Message-ID: <20070213102701.GC30656@cecm.usp.br> This foremost obsoletes ugly attribute checks for kwfmatcher. We check whether we need kwfilelog in kwrepo's file(). That way kwtemplater is always an attribute of kwfilelog. Repo references are gone from kwfilelog. reposetup doc more verbose.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
     1
# keyword.py - keyword expansion for Mercurial
120
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     2
#
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     3
# Copyright 2007 Christian Ebert <blacktrash@gmx.net>
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     4
#
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     5
# This software may be used and distributed according to the terms
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     6
# of the GNU General Public License, incorporated herein by reference.
4a8a861da58c Add licence (again)
Christian Ebert <blacktrash@gmx.net>
parents: 119
diff changeset
     7
#
82
9bf0f7db5928 Add keyword; comment backwards compatible import
Christian Ebert <blacktrash@gmx.net>
parents: 81
diff changeset
     8
# $Id$
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
     9
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    10
# Keyword expansion hack against the grain of a DSCM
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    11
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    12
# There are many good reasons why this is not needed in a distributed
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    13
# SCM, still it may be useful in very small projects based on single
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    14
# files (like LaTeX packages), that are mostly addressed to an audience
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    15
# not running a version control system.
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    16
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    17
# For in-depth discussion refer to
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    18
# <http://www.selenic.com/mercurial/wiki/index.cgi/KeywordPlan>.
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    19
#
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    20
# Keyword expansion is based on Mercurial's changeset template mappings.
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    21
# The extension provides an additional UTC-date filter ({date|utcdate}).
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    22
#
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    23
# The user has the choice either to create his own keywords and their
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    24
# expansions or to use the CVS-like default ones.
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    25
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    26
# Default $keywords$ and their $keyword: substition $ are:
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    27
#     Revision: changeset id
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    28
#     Author:   username
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    29
#     Date:     %Y/%m/%d %H:%M:%S [UTC]
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    30
#     RCSFile:  basename,v
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    31
#     Source:   /path/to/basename,v
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    32
#     Id:       basename,v csetid %Y/%m/%d %H:%M:%S username
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    33
#     Header:   /path/to/basename,v csetid %Y/%m/%d %H:%M:%S username
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    34
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    35
# Expansions spanning more than one line are truncated to their first line.
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    36
# Incremental expansion (like CVS' $Log$) is not supported.
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    37
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    38
# Simple setup in hgrc:
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    39
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    40
#     # enable extension
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    41
#     keyword = /full/path/to/keyword.py
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    42
#     # or, if script in hgext folder:
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    43
#     # hgext.keyword =
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    44
#
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    45
#     # filename patterns for expansion are configured in this section
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    46
#     # files matching patterns with value 'ignore' are ignored
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    47
#     [keyword]
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    48
#     **.py =
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    49
#     x* = ignore
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    50
#     ...
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    51
#     # in case you prefer your own keyword maps over the cvs-like defaults:
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    52
#     [keywordmaps]
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    53
#     HGdate = {date|rfc822date}
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    54
#     lastlog = {desc} ## same as {desc|firstline} in this context
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    55
#     checked in by = {author}
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    56
#     ...
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    57
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    58
'''keyword expansion in local repositories
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    59
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    60
This extension expands RCS/CVS-like or self-customized keywords in
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    61
the text files selected by your configuration.
102
393d6f8ea83c More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents: 101
diff changeset
    62
114
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    63
Keywords are only expanded in local repositories and not logged by
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    64
Mercurial internally. The mechanism can be regarded as a convenience
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    65
for the current user and may be turned off anytime.
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    66
114
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    67
Substitution takes place on every commit and update of the working
09847a7eb5d7 Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents: 113
diff changeset
    68
repository.
108
25dac950a1f0 Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents: 107
diff changeset
    69
118
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    70
Configuration is done in the [keyword] and [keywordmaps] sections of
d9cea05cb74c Prepare test: split doc into help and comment
Christian Ebert <blacktrash@gmx.net>
parents: 117
diff changeset
    71
hgrc files.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    72
'''
128
fe37939db543 Remove spurious spaces at EOL
Christian Ebert <blacktrash@gmx.net>
parents: 126
diff changeset
    73
135
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    74
try:
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    75
    from mercurial.demandload import * # stable
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    76
    from mercurial.i18n import gettext as _
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    77
    demandload(globals(), 'mercurial:cmdutil,templater,util')
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    78
    demandload(globals(), 'mercurial:context,filelog,revlog')
142
aedce5bcc9eb commit: weed out removed w/o recurring to os.path, weed out symlinks
Christian Ebert <blacktrash@gmx.net>
parents: 141
diff changeset
    79
    demandload(globals(), 're time')
135
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    80
except ImportError: # demandimport
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    81
    from mercurial.i18n import _
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    82
    from mercurial import cmdutil, templater, util
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
    83
    from mercurial import context, filelog, revlog
142
aedce5bcc9eb commit: weed out removed w/o recurring to os.path, weed out symlinks
Christian Ebert <blacktrash@gmx.net>
parents: 141
diff changeset
    84
    import re, time
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    85
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    86
deftemplates = {
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    87
        'Revision': '{node|short}',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    88
        'Author': '{author|user}',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    89
        'Date': '{date|utcdate}',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    90
        'RCSFile': '{file|basename},v',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    91
        'Source': '{root}/{file},v',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    92
        'Id': '{file|basename},v {node|short} {date|utcdate} {author|user}',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    93
        'Header': '{root}/{file},v {node|short} {date|utcdate} {author|user}',
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    94
        }
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    95
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    96
def utcdate(date):
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    97
    '''Returns hgdate in cvs-like UTC format.'''
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    98
    return time.strftime('%Y/%m/%d %H:%M:%S', time.gmtime(date[0]))
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
    99
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   100
class kwtemplater(object):
92
3c7c187e4001 Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents: 90
diff changeset
   101
    '''
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   102
    Sets up keyword templates, corresponding keyword regex, and
139
0ea07bb56ff6 Move context into kwtemplater.expand
Christian Ebert <blacktrash@gmx.net>
parents: 138
diff changeset
   103
    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
   104
    '''
101
98a65d978098 No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents: 100
diff changeset
   105
    def __init__(self, ui, repo):
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   106
        self.ui = ui
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   107
        self.repo = repo
136
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   108
        templates = dict(ui.configitems('keywordmaps'))
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   109
        if templates:
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   110
            # parse templates here for less overhead in kwsub matchfunc
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   111
            for k in templates.keys():
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   112
                templates[k] = templater.parsestring(templates[k],
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   113
                        quoted=False)
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   114
        self.templates = templates or deftemplates
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   115
        self.re_kw = re.compile(r'\$(%s)[^$]*?\$' %
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   116
                '|'.join(re.escape(k) for k in self.templates.keys()))
109
b2cc6a8d4a18 Extend templater.common_filters in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 108
diff changeset
   117
        templater.common_filters['utcdate'] = utcdate
135
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   118
        try:
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   119
            self.t = cmdutil.changeset_templater(ui, repo,
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   120
                    False, '', False)
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   121
        except TypeError:
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   122
            # depending on hg rev changeset_templater has extra "brinfo" arg
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   123
            self.t = cmdutil.changeset_templater(ui, repo,
a4c748fc7e00 Standalone compatibility fixes: demandload, changeset_templater
Christian Ebert <blacktrash@gmx.net>
parents: 134
diff changeset
   124
                    False, None, '', False)
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   125
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   126
    def kwsub(self, mobj, path, node):
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   127
        '''Substitutes keyword using corresponding template.'''
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   128
        kw = mobj.group(1)
136
5e9d6c57d679 Parse templates at kwtemplater init for less overhead in matchfunction
Christian Ebert <blacktrash@gmx.net>
parents: 135
diff changeset
   129
        self.t.use_template(self.templates[kw])
95
9e4cbe64fb4f Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents: 93
diff changeset
   130
        self.ui.pushbuffer()
101
98a65d978098 No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents: 100
diff changeset
   131
        self.t.show(changenode=node, root=self.repo.root, file=path)
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   132
        keywordsub = templater.firstline(self.ui.popbuffer())
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   133
        return '$%s: %s $' % (kw, keywordsub)
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   134
139
0ea07bb56ff6 Move context into kwtemplater.expand
Christian Ebert <blacktrash@gmx.net>
parents: 138
diff changeset
   135
    def expand(self, path, node, filelog, data):
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   136
        '''Returns data with expanded keywords.'''
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   137
        if util.binary(data):
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   138
            return data
139
0ea07bb56ff6 Move context into kwtemplater.expand
Christian Ebert <blacktrash@gmx.net>
parents: 138
diff changeset
   139
        c = context.filectx(self.repo, path, fileid=node, filelog=filelog)
0ea07bb56ff6 Move context into kwtemplater.expand
Christian Ebert <blacktrash@gmx.net>
parents: 138
diff changeset
   140
        cnode = c.node()
0ea07bb56ff6 Move context into kwtemplater.expand
Christian Ebert <blacktrash@gmx.net>
parents: 138
diff changeset
   141
        return self.re_kw.sub(lambda m: self.kwsub(m, path, cnode), data)
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   142
133
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   143
    def shrink(self, text):
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   144
        '''Returns text with all keyword substitutions removed.'''
134
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   145
        if util.binary(text):
f869c65156f7 2 expand methods including binary check in kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 133
diff changeset
   146
            return text
133
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   147
        return self.re_kw.sub(r'$\1$', text)
cb60196a500b Keyword substitution removal into kwtemplater
Christian Ebert <blacktrash@gmx.net>
parents: 129
diff changeset
   148
138
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   149
    def overwrite(self, candidates, node):
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   150
        '''Overwrites candidates in working dir expanding keywords.'''
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   151
        files = []
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   152
        for f in candidates:
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   153
            data = self.repo.wfile(f).read()
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   154
            if not util.binary(data):
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   155
                data, kwct = self.re_kw.subn(lambda m:
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   156
                        self.kwsub(m, f, node), data)
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   157
                if kwct:
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   158
                    self.ui.debug(_('overwriting %s expanding keywords\n') % f)
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   159
                    self.repo.wfile(f, 'w').write(data)
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   160
                    files.append(f)
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   161
        if files:
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   162
            self.repo.dirstate.update(files, 'n')
bf8622c50309 Overwrite files inside kwtemplater method
Christian Ebert <blacktrash@gmx.net>
parents: 137
diff changeset
   163
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   164
class kwfilelog(filelog.filelog):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   165
    '''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   166
    Superclass over filelog to customize its read, add, cmp methods.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   167
    Keywords are "stored" unexpanded, and expanded on reading.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   168
    '''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   169
    def __init__(self, opener, path, kwtemplater,
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   170
                 defversion=revlog.REVLOG_DEFAULT_VERSION):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   171
        super(kwfilelog, self).__init__(opener, path, defversion)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   172
        self.path = path
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   173
        self.kwtemplater = kwtemplater
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   174
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   175
    def read(self, node):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   176
        '''Substitutes keywords when reading filelog.'''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   177
        data = super(kwfilelog, self).read(node)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   178
        return self.kwtemplater.expand(self.path, node, self, data)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   179
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   180
    def add(self, text, meta, tr, link, p1=None, p2=None):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   181
        '''Removes keyword substitutions when adding to filelog.'''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   182
        text = self.kwtemplater.shrink(text)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   183
        return super(kwfilelog, self).add(text,
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   184
                        meta, tr, link, p1=p1, p2=p2)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   185
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   186
    def cmp(self, node, text):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   187
        '''Removes keyword substitutions for comparison.'''
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   188
        text = self.kwtemplater.shrink(text)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   189
        return super(kwfilelog, self).cmp(node, text)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   190
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   191
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   192
def reposetup(ui, repo):
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   193
    '''Sets up repo as kwrepo for keyword substitution.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   194
    Overrides file method to return kwfilelog instead of filelog
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   195
    if file matches user configuration.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   196
    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
   197
    keyword substitutions.
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   198
    This is done for local repos only, and only if there are
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   199
    files configured at all for keyword substitution.'''
108
25dac950a1f0 Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents: 107
diff changeset
   200
110
b0b85b383f36 Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 109
diff changeset
   201
    if not repo.local():
b0b85b383f36 Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents: 109
diff changeset
   202
        return
108
25dac950a1f0 Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents: 107
diff changeset
   203
122
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   204
    inc, exc = [], ['.hg*']
123
6cf933de685a Make all ui config and kwfmatcher a local repo attribute
Christian Ebert <blacktrash@gmx.net>
parents: 122
diff changeset
   205
    for pat, opt in repo.ui.configitems('keyword'):
122
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   206
        if opt != 'ignore':
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   207
            inc.append(pat)
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   208
        else:
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   209
            exc.append(pat)
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   210
    if not inc:
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   211
        return
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   212
123
6cf933de685a Make all ui config and kwfmatcher a local repo attribute
Christian Ebert <blacktrash@gmx.net>
parents: 122
diff changeset
   213
    repo.kwfmatcher = util.matcher(repo.root, inc=inc, exc=exc)[1]
122
d5c80df59655 No reposetup when no filenames are specified for expansion
Christian Ebert <blacktrash@gmx.net>
parents: 120
diff changeset
   214
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   215
    class kwrepo(repo.__class__):
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   216
        def file(self, f):
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   217
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   218
                f = f[1:]
144
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   219
            # only use kwfilelog when needed
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   220
            if self.kwfmatcher(f):
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   221
                kwt = kwtemplater(self.ui, self)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   222
                return kwfilelog(self.sopener, f, kwt, self.revlogversion)
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   223
            else:
19b3d1de3db0 Move kwfilelog out of reposetup; only use kwfilelog if file matches
Christian Ebert <blacktrash@gmx.net>
parents: 143
diff changeset
   224
                return filelog.filelog(self.sopener, f, self.revlogversion)
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   225
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   226
        def commit(self, files=None, text="", user=None, date=None,
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   227
                match=util.always, force=False, lock=None, wlock=None,
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   228
                force_editor=False, p1=None, p2=None, extra={}):
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   229
            '''Wraps commit, expanding keywords of committed and
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   230
            configured files in working directory.'''
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   231
142
aedce5bcc9eb commit: weed out removed w/o recurring to os.path, weed out symlinks
Christian Ebert <blacktrash@gmx.net>
parents: 141
diff changeset
   232
            removed = self.status()[2]
aedce5bcc9eb commit: weed out removed w/o recurring to os.path, weed out symlinks
Christian Ebert <blacktrash@gmx.net>
parents: 141
diff changeset
   233
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   234
            node = super(kwrepo, self).commit(files=files,
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   235
                    text=text, user=user, date=date,
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   236
                    match=match, force=force, lock=lock, wlock=wlock,
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   237
                    force_editor=force_editor, p1=p1, p2=p2, extra=extra)
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   238
            if node is None:
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   239
                return node
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   240
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   241
            candidates = self.changelog.read(node)[3]
142
aedce5bcc9eb commit: weed out removed w/o recurring to os.path, weed out symlinks
Christian Ebert <blacktrash@gmx.net>
parents: 141
diff changeset
   242
            candidates = [f for f in candidates if f not in removed
aedce5bcc9eb commit: weed out removed w/o recurring to os.path, weed out symlinks
Christian Ebert <blacktrash@gmx.net>
parents: 141
diff changeset
   243
                    and not self._link(f) and self.kwfmatcher(f)]
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   244
            if not candidates:
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   245
                return node
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   246
143
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   247
            wrelease = False
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   248
            if not wlock:
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   249
                wlock = self.wlock()
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   250
                wrelease = True
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   251
            try:
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   252
                kwt = kwtemplater(self.ui, self)
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   253
                kwt.overwrite(candidates, node)
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   254
            finally:
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   255
                if wrelease:
3485b0ef99c4 Add wlock during overwrite
Christian Ebert <blacktrash@gmx.net>
parents: 142
diff changeset
   256
                    wlock.release()
129
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   257
            return node
15e8cd7f5295 Wrap commit instead of calling pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 128
diff changeset
   258
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   259
    repo.__class__ = kwrepo