author | Christian Ebert <blacktrash@gmx.net> |
Fri, 05 Jan 2007 14:51:58 +0100 | |
branch | solo-extension |
changeset 68 | b285ab731fff |
parent 67 | 7311b30cdb58 |
child 69 | 4c5d9635b517 |
permissions | -rw-r--r-- |
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 |
|
60
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
13 |
Supported keywords are (changeset 000000000000): |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
14 |
$Revision: 000000000000 $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
15 |
$Author: Your Name <address@example.com> $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
16 |
$Date: %a %b %d %H:%M:%S %Y %z $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
17 |
$RCSFile: basename,v $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
18 |
$Source: /path/to/basename,v $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
19 |
$Id: basename,v 000000000000 %Y-%m-%d %H:%M:%S %z shortname $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
20 |
$Header: /path/to/basename,v 000000000000 %Y-%m-%d %H:%M:%S %z shortname $ |
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
21 |
|
54
ac67adabce13
Cleanup comments; refer to hybridity of script in doc
Christian Ebert <blacktrash@gmx.net>
parents:
53
diff
changeset
|
22 |
The extension, according to its hackish nature, is a hybrid and consists |
ac67adabce13
Cleanup comments; refer to hybridity of script in doc
Christian Ebert <blacktrash@gmx.net>
parents:
53
diff
changeset
|
23 |
actually in 2 parts: |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
24 |
|
54
ac67adabce13
Cleanup comments; refer to hybridity of script in doc
Christian Ebert <blacktrash@gmx.net>
parents:
53
diff
changeset
|
25 |
1. pure extension code (reposetup) that is triggered on checkout and |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
26 |
logging of changes. |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
27 |
2. a pretxncommit hook (hgrc (5)) that expands keywords immediately |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
28 |
at commit time in the working directory. |
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 |
Simple setup in hgrc: |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
31 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
32 |
# enable extension |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
33 |
hgext.keyword = |
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 |
# filename patterns for expansion are configured in this section |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
36 |
[keyword] |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
37 |
*.sty = expand |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
38 |
... |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
39 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
40 |
# set up pretxncommit hook |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
41 |
[hooks] |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
42 |
pretxncommit = |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
43 |
pretxncommit.keyword = python:hgext.keyword.pretxnkw |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
44 |
''' |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
45 |
|
65
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
46 |
from mercurial.i18n import _ |
64
4cd7b993c5f8
Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents:
63
diff
changeset
|
47 |
from mercurial import context, util |
4cd7b993c5f8
Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents:
63
diff
changeset
|
48 |
import os.path, re |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
49 |
|
59
94b26168791d
Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents:
58
diff
changeset
|
50 |
|
94b26168791d
Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents:
58
diff
changeset
|
51 |
re_kw = re.compile( |
94b26168791d
Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents:
58
diff
changeset
|
52 |
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
|
53 |
|
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
54 |
|
57
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
55 |
def kwexpand(matchobj, repo, path, changeid=None, fileid=None, filelog=None): |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
56 |
'''Called by kwfilelog.read and pretxnkw. |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
57 |
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
|
58 |
their expansion if matchobj is equal to string representation.''' |
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
59 |
|
57
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
60 |
c = context.filectx(repo, path, |
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
61 |
changeid=changeid, fileid=fileid, filelog=filelog) |
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
62 |
date = c.date() |
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
63 |
|
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
64 |
Revision = c.changectx() |
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
65 |
Author = c.user() |
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
66 |
RCSFile = os.path.basename(path)+',v' |
f95c21f87e9c
Extract all information in kwexpand()
Christian Ebert <blacktrash@gmx.net>
parents:
56
diff
changeset
|
67 |
Source = repo.wjoin(path)+',v' |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
68 |
Date = util.datestr(date=date) |
53
b0db8ec7ac78
Change location of date format comment
Christian Ebert <blacktrash@gmx.net>
parents:
52
diff
changeset
|
69 |
revdateauth = '%s %s %s' % (Revision, |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
70 |
util.datestr(date=date, format=util.defaultdateformats[0]), |
60
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
71 |
util.shortuser(Author)) |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
72 |
Header = '%s %s' % (Source, revdateauth) |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
73 |
Id = '%s %s' % (RCSFile, revdateauth) |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
74 |
|
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
75 |
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
|
76 |
|
65
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
77 |
def kwfmatchers(ui, repo): |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
78 |
'''Returns filename matchers from ui keyword section.''' |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
79 |
return [util.matcher(repo.root, '', [pat], [], [])[1] |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
80 |
for pat, opt in ui.configitems('keyword') |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
81 |
if opt == 'expand'] |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
82 |
|
42
ba000e29ecf3
Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents:
41
diff
changeset
|
83 |
|
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
84 |
def reposetup(ui, repo): |
64
4cd7b993c5f8
Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents:
63
diff
changeset
|
85 |
from mercurial import filelog, revlog |
4cd7b993c5f8
Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents:
63
diff
changeset
|
86 |
|
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
87 |
if not repo.local(): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
88 |
return |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
89 |
|
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
90 |
class kwrepo(repo.__class__): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
91 |
def file(self, f): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
92 |
if f[0] == '/': |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
93 |
f = f[1:] |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
94 |
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
|
95 |
|
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
96 |
class kwfilelog(filelog.filelog): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
97 |
def __init__(self, opener, path, repo, |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
98 |
defversion=revlog.REVLOG_DEFAULT_VERSION): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
99 |
super(kwfilelog, self).__init__(opener, path, defversion) |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
100 |
self._repo = repo |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
101 |
self._path = path |
36
b3ace8cc5a33
Change config opt "expand" to accept filename patterns
Christian Ebert <blacktrash@gmx.net>
parents:
34
diff
changeset
|
102 |
|
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
103 |
def read(self, node): |
42
ba000e29ecf3
Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents:
41
diff
changeset
|
104 |
data = super(kwfilelog, self).read(node) |
51
1ecb6ec5d16b
Reintroduce simpler kwfilelog.add(); simplify kwfilelog.read()
Christian Ebert <blacktrash@gmx.net>
parents:
50
diff
changeset
|
105 |
if not self._path.startswith('.hg') and not util.binary(data): |
65
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
106 |
for mf in kwfmatchers(ui, self._repo): |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
107 |
if mf(self._path): |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
108 |
ui.debug(_('expanding keywords in %s\n' % self._path)) |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
109 |
return re_kw.sub(lambda m: |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
110 |
kwexpand(m, self._repo, self._path, |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
111 |
fileid=node, filelog=self), |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
112 |
data) |
51
1ecb6ec5d16b
Reintroduce simpler kwfilelog.add(); simplify kwfilelog.read()
Christian Ebert <blacktrash@gmx.net>
parents:
50
diff
changeset
|
113 |
return data |
42
ba000e29ecf3
Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents:
41
diff
changeset
|
114 |
|
49
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
115 |
def size(self, rev): |
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
116 |
'''Overrides filelog's size() to use kwfilelog.read().''' |
52
7783eb22de30
Make inheritance clearer in size() and add()
Christian Ebert <blacktrash@gmx.net>
parents:
51
diff
changeset
|
117 |
node = revlog.node(self, rev) |
7783eb22de30
Make inheritance clearer in size() and add()
Christian Ebert <blacktrash@gmx.net>
parents:
51
diff
changeset
|
118 |
if super(kwfilelog, self).renamed(node): |
49
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
119 |
return len(self.read(node)) |
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
120 |
return revlog.size(self, rev) |
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
121 |
|
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
122 |
def cmp(self, node, text): |
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
123 |
'''Overrides filelog's cmp() to use kwfilelog.read().''' |
52
7783eb22de30
Make inheritance clearer in size() and add()
Christian Ebert <blacktrash@gmx.net>
parents:
51
diff
changeset
|
124 |
if super(kwfilelog, self).renamed(node): |
49
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
125 |
t2 = self.read(node) |
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
126 |
return t2 != text |
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
127 |
|
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
128 |
filelog.filelog = kwfilelog |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
129 |
repo.__class__ = kwrepo |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
130 |
|
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
131 |
|
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
132 |
def pretxnkw(ui, repo, hooktype, **args): |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
133 |
'''pretxncommit hook that collects candidates for keyword expansion |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
134 |
on commit and expands keywords in working dir.''' |
64
4cd7b993c5f8
Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents:
63
diff
changeset
|
135 |
from mercurial import cmdutil, commands |
4cd7b993c5f8
Imports specific to functions
Christian Ebert <blacktrash@gmx.net>
parents:
63
diff
changeset
|
136 |
import sys |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
137 |
|
60
9771775ef322
List supported keywords in doc
Christian Ebert <blacktrash@gmx.net>
parents:
59
diff
changeset
|
138 |
if hooktype != 'pretxncommit': |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
139 |
return True |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
140 |
|
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
141 |
cmd, sysargs, globalopts, cmdopts = commands.parse(ui, sys.argv[1:])[1:] |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
142 |
if repr(cmd).split()[1] in ('tag', 'import_'): |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
143 |
return False |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
144 |
|
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
145 |
files, match, anypats = cmdutil.matchpats(repo, sysargs, cmdopts) |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
146 |
modified, added = repo.status(files=files, match=match)[:2] |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
147 |
candidates = [f for f in modified + added if not f.startswith('.hg')] |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
148 |
if not candidates: |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
149 |
return False |
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
150 |
|
65
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
151 |
fmatchers = kwfmatchers(ui, repo) |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
152 |
for f in candidates: |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
153 |
for mf in fmatchers: |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
154 |
if mf(f): |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
155 |
data = repo.wfile(f).read() |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
156 |
if not util.binary(data): |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
157 |
data, kwct = re_kw.subn(lambda m: |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
158 |
kwexpand(m, repo, f, changeid=args['node']), |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
159 |
data) |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
160 |
if kwct: |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
161 |
ui.debug(_('overwriting %s expanding keywords\n' % f)) |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
162 |
repo.wfile(f, 'w').write(data) |
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
163 |
break |