hgkw/keyword.py
author Christian Ebert <blacktrash@gmx.net>
Mon, 08 Jan 2007 18:27:18 +0100
branchself_initializing_hook
changeset 81 fd5d3a974ea7
parent 80 cee5fef33cf8
child 82 9bf0f7db5928
permissions -rw-r--r--
Implement self initializing pretxncommit hook This is more expensive than overriding commit(), but a) uses more "official" interface b) less code c) easier to maintain Get all changes up to cee5fef33cf8 in here as well.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     1
# keyword.py - keyword expansion for mercurial
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     2
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     3
'''keyword expansion hack against the grain of a DSCM
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     4
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     5
This extension lets you expand RCS/CVS-like keywords in a Mercurial
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     6
repository.
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     7
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     8
There are many good reasons why this is not needed in a distributed
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
     9
SCM, still it may be useful in very small projects based on single
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    10
files (like LaTeX packages), that are mostly addressed to an audience
52
7783eb22de30 Make inheritance clearer in size() and add()
Christian Ebert <blacktrash@gmx.net>
parents: 51
diff changeset
    11
not running a version control system.
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    12
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    13
Supported $keywords$ and their $keyword: substition $ are:
69
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    14
    Revision: changeset id
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    15
    Author:   full username
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    16
    Date:     %a %b %d %H:%M:%S %Y %z $
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    17
    RCSFile:  basename,v
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    18
    Source:   /path/to/basename,v
80
cee5fef33cf8 Fix timezone expando in doc
Christian Ebert <blacktrash@gmx.net>
parents: 79
diff changeset
    19
    Id:       basename,v csetid %Y-%m-%d %H:%M:%S %z shortname
cee5fef33cf8 Fix timezone expando in doc
Christian Ebert <blacktrash@gmx.net>
parents: 79
diff changeset
    20
    Header:   /path/to/basename,v csetid %Y-%m-%d %H:%M:%S %z shortname
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    21
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    22
Install:
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    23
    Copy keyword.py in hgext folder.
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    24
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    25
Simple setup in hgrc:
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    26
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    27
    # enable extension
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    28
    hgext.keyword =
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    29
    
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    30
    # filename patterns for expansion are configured in this section
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    31
    [keyword]
69
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    32
    **.py = expand
48
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    33
    ...
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    34
'''
59fedb6b41da add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents: 47
diff changeset
    35
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    36
from mercurial import context, util
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
    37
import os.path, re
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    38
59
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    39
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    40
re_kw = re.compile(
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    41
        r'\$(Id|Header|Author|Date|Revision|RCSFile|Source)[^$]*?\$')
94b26168791d Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents: 58
diff changeset
    42
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    43
57
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    44
def kwexpand(matchobj, repo, path, changeid=None, fileid=None, filelog=None):
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    45
    '''Called by kwfilelog.read and pretxnkw.
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    46
    Sets supported keywords as local variables and evaluates them to
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    47
    their expansion if matchobj is equal to string representation.'''
57
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    48
    c = context.filectx(repo, path,
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    49
            changeid=changeid, fileid=fileid, filelog=filelog)
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    50
    date = c.date()
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    51
    Revision = c.changectx()
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    52
    Author = c.user()
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    53
    RCSFile = os.path.basename(path)+',v'
f95c21f87e9c Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents: 56
diff changeset
    54
    Source = repo.wjoin(path)+',v'
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    55
    Date = util.datestr(date=date)
53
b0db8ec7ac78 Change location of date format comment
Christian Ebert <blacktrash@gmx.net>
parents: 52
diff changeset
    56
    revdateauth = '%s %s %s' % (Revision,
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    57
            util.datestr(date=date, format=util.defaultdateformats[0]),
60
9771775ef322 List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents: 59
diff changeset
    58
            util.shortuser(Author))
47
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    59
    Header = '%s %s' % (Source, revdateauth)
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    60
    Id = '%s %s' % (RCSFile, revdateauth)
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    61
    return '$%s: %s $' % (matchobj.group(1), eval(matchobj.group(1)))
0617e7d497f6 Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents: 44
diff changeset
    62
69
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    63
def kwfmatches(ui, repo, files):
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    64
    '''Selects candidates for keyword substitution
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    65
    configured in keyword section in hgrc.'''
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    66
    files = [f for f in files if not f.startswith('.hg')]
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    67
    if not files:
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    68
        return []
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    69
    candidates = []
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    70
    fmatchers = [util.matcher(repo.root, '', [pat], [], [])[1]
65
188849659487 Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents: 64
diff changeset
    71
            for pat, opt in ui.configitems('keyword')
188849659487 Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents: 64
diff changeset
    72
            if opt == 'expand']
69
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    73
    for f in files:
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    74
        for mf in fmatchers:
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    75
            if mf(f):
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    76
                candidates.append(f)
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    77
                break
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
    78
    return candidates
65
188849659487 Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents: 64
diff changeset
    79
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
    80
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    81
def reposetup(ui, repo):
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
    82
    from mercurial import filelog, revlog
64
4cd7b993c5f8 Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents: 63
diff changeset
    83
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    84
    if not repo.local():
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    85
        return
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    86
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    87
    class kwrepo(repo.__class__):
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    88
        def file(self, f):
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    89
            if f[0] == '/':
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    90
                f = f[1:]
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    91
            return filelog.filelog(self.sopener, f, self, self.revlogversion)
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    92
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    93
    class kwfilelog(filelog.filelog):
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
    94
        '''
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
    95
        Superclass over filelog to customize it's read, add, cmp methods.
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
    96
        Keywords are "stored" unexpanded, and expanded on reading.
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
    97
        '''
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    98
        def __init__(self, opener, path, repo,
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
    99
                     defversion=revlog.REVLOG_DEFAULT_VERSION):
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   100
            super(kwfilelog, self).__init__(opener, path, defversion)
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   101
            self._repo = repo
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   102
            self._path = path
36
b3ace8cc5a33 Change config opt "expand" to accept filename patterns
Christian Ebert <blacktrash@gmx.net>
parents: 34
diff changeset
   103
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   104
        def iskwcandidate(self, data):
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   105
            '''Decides whether to act on keywords.'''
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   106
            return (kwfmatches(ui, self._repo, [self._path])
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   107
                    and not util.binary(data))
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   108
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   109
        def read(self, node):
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   110
            '''Substitutes keywords when reading filelog.'''
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   111
            data = super(kwfilelog, self).read(node)
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   112
            if self.iskwcandidate(data):
69
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
   113
                return re_kw.sub(lambda m:
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
   114
                        kwexpand(m, self._repo, self._path,
4c5d9635b517 Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents: 68
diff changeset
   115
                            fileid=node, filelog=self), data)
51
1ecb6ec5d16b Reintroduce simpler kwfilelog.add(); simplify kwfilelog.read()
Christian Ebert <blacktrash@gmx.net>
parents: 50
diff changeset
   116
            return data
42
ba000e29ecf3 Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents: 41
diff changeset
   117
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   118
        def add(self, text, meta, tr, link, p1=None, p2=None):
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   119
            '''Removes keyword substitutions when adding to filelog.'''
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   120
            if self.iskwcandidate(text):
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   121
                text = re_kw.sub(r'$\1$', text)
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   122
            return super(kwfilelog, self).add(text,
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   123
                    meta, tr, link, p1=None, p2=None)
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   124
49
5acfe7dc3086 Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents: 48
diff changeset
   125
        def cmp(self, node, text):
78
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   126
            '''Removes keyword substitutions for comparison.'''
474b415433a1 Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents: 77
diff changeset
   127
            if self.iskwcandidate(text):
71
f7a2a246740c No keyword substitution in cmp(); no overriding of size() ATM
Christian Ebert <blacktrash@gmx.net>
parents: 69
diff changeset
   128
                text = re_kw.sub(r'$\1$', text)
f7a2a246740c No keyword substitution in cmp(); no overriding of size() ATM
Christian Ebert <blacktrash@gmx.net>
parents: 69
diff changeset
   129
            return super(kwfilelog, self).cmp(node, text)
33
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   130
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   131
    filelog.filelog = kwfilelog
ebb39c6a1476 Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff changeset
   132
    repo.__class__ = kwrepo
81
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   133
    ui.setconfig('hooks',
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   134
            'pretxncommit.keyword', 'python:hgext.keyword.pretxnkw')
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   135
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   136
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   137
def pretxnkw(ui, repo, hooktype, **args):
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   138
    '''pretxncommit hook that collects candidates for keyword expansion
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   139
    on commit and expands keywords in working dir.'''
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   140
    from mercurial.i18n import gettext as _
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   141
    from mercurial import cmdutil, commands
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   142
    import sys
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   143
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   144
    if hooktype != 'pretxncommit':
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   145
        return True
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   146
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   147
    cmd, sysargs, globalopts, cmdopts = commands.parse(ui, sys.argv[1:])[1:]
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   148
    if repr(cmd).split()[1] in ('tag', 'import_'):
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   149
        return False
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   150
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   151
    files, match, anypats = cmdutil.matchpats(repo, sysargs, cmdopts)
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   152
    modified, added = repo.status(files=files, match=match)[:2]
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   153
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   154
    for f in kwfmatches(ui, repo, modified+added):
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   155
        data = repo.wfile(f).read()
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   156
        if not util.binary(data):
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   157
            data, kwct = re_kw.subn(lambda m:
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   158
                    kwexpand(m, repo, f, changeid=args['node']),
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   159
                    data)
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   160
            if kwct:
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   161
                ui.debug(_('overwriting %s expanding keywords\n' % f))
fd5d3a974ea7 Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents: 80
diff changeset
   162
                repo.wfile(f, 'w').write(data)