author | Christian Ebert <blacktrash@gmx.net> |
Sat, 20 Jan 2007 22:18:57 +0100 | |
branch | kwmap-templates |
changeset 117 | 201e9affcf0f |
parent 116 | 265714c59607 |
child 118 | d9cea05cb74c |
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 |
82
9bf0f7db5928
Add keyword; comment backwards compatible import
Christian Ebert <blacktrash@gmx.net>
parents:
81
diff
changeset
|
2 |
# $Id$ |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
3 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
4 |
'''keyword expansion hack against the grain of a DSCM |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
5 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
6 |
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
|
7 |
repository. |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
8 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
9 |
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
|
10 |
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
|
11 |
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
|
12 |
not running a version control system. |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
13 |
|
102
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
14 |
For in-depth discussion refer to |
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
15 |
<http://www.selenic.com/mercurial/wiki/index.cgi/KeywordPlan>. |
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
16 |
|
114
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
17 |
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
|
18 |
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
|
19 |
for the current user and may be turned off anytime. |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
20 |
|
114
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
21 |
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
|
22 |
repository. |
108
25dac950a1f0
Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents:
107
diff
changeset
|
23 |
|
114
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
24 |
Keyword expansion is based on Mercurial's changeset template mappings. |
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
25 |
The extension provides an additional UTC-date filter. |
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
26 |
|
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
27 |
The user has the choice either to create his own keywords and their |
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
28 |
expansions or to use the CVS-like default ones. |
103
e086f7eb0198
Emergency brake against multiline expansion
Christian Ebert <blacktrash@gmx.net>
parents:
102
diff
changeset
|
29 |
|
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
30 |
Default $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
|
31 |
Revision: changeset id |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
32 |
Author: username |
90 | 33 |
Date: %Y/%m/%d %H:%M:%S [UTC] |
69
4c5d9635b517
Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents:
68
diff
changeset
|
34 |
RCSFile: basename,v |
4c5d9635b517
Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents:
68
diff
changeset
|
35 |
Source: /path/to/basename,v |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
36 |
Id: basename,v csetid %Y/%m/%d %H:%M:%S username |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
37 |
Header: /path/to/basename,v csetid %Y/%m/%d %H:%M:%S username |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
38 |
|
114
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
39 |
Expansions spanning more than one line are truncated to their first line. |
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
40 |
Incremental expansion (like CVS' $Log$) is not supported. |
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
41 |
|
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
42 |
Simple setup in hgrc: |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
43 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
44 |
# enable extension |
114
09847a7eb5d7
Describe substitution mechanism in doc
Christian Ebert <blacktrash@gmx.net>
parents:
113
diff
changeset
|
45 |
keyword = /full/path/to/keyword.py |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
46 |
# or, if script in hgext folder: |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
47 |
# hgext.keyword = |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
48 |
|
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
49 |
# filename patterns for expansion are configured in this section |
107
fe4a0495eca8
Implement configurable exclusion of files from expansion
Christian Ebert <blacktrash@gmx.net>
parents:
106
diff
changeset
|
50 |
# files matching patterns with value 'ignore' are ignored |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
51 |
[keyword] |
107
fe4a0495eca8
Implement configurable exclusion of files from expansion
Christian Ebert <blacktrash@gmx.net>
parents:
106
diff
changeset
|
52 |
**.py = |
fe4a0495eca8
Implement configurable exclusion of files from expansion
Christian Ebert <blacktrash@gmx.net>
parents:
106
diff
changeset
|
53 |
x* = ignore |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
54 |
... |
102
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
55 |
# in case you prefer your own keyword maps over the cvs-like defaults: |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
56 |
[keywordmaps] |
102
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
57 |
HGdate = {date|rfc822date} |
103
e086f7eb0198
Emergency brake against multiline expansion
Christian Ebert <blacktrash@gmx.net>
parents:
102
diff
changeset
|
58 |
lastlog = {desc} ## same as {desc|firstline} in this context |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
59 |
checked in by = {author} |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
60 |
... |
48
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
61 |
''' |
59fedb6b41da
add header and start documentation
Christian Ebert <blacktrash@gmx.net>
parents:
47
diff
changeset
|
62 |
|
105
2a8b0a71c2ec
Use full power of util.matcher for kwfmatches()
Christian Ebert <blacktrash@gmx.net>
parents:
104
diff
changeset
|
63 |
from mercurial.i18n import gettext as _ |
2a8b0a71c2ec
Use full power of util.matcher for kwfmatches()
Christian Ebert <blacktrash@gmx.net>
parents:
104
diff
changeset
|
64 |
# above line for backwards compatibility; can be changed to |
2a8b0a71c2ec
Use full power of util.matcher for kwfmatches()
Christian Ebert <blacktrash@gmx.net>
parents:
104
diff
changeset
|
65 |
# from mercurial.i18n import _ |
2a8b0a71c2ec
Use full power of util.matcher for kwfmatches()
Christian Ebert <blacktrash@gmx.net>
parents:
104
diff
changeset
|
66 |
# some day |
110
b0b85b383f36
Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
67 |
from mercurial import context, filelog, revlog |
b0b85b383f36
Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
68 |
from mercurial import commands, cmdutil, templater, util |
115
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
69 |
from mercurial.node import bin |
90 | 70 |
import os.path, re, sys, time |
47
0617e7d497f6
Branch standalone extension, including pretxncommit hook function
Christian Ebert <blacktrash@gmx.net>
parents:
44
diff
changeset
|
71 |
|
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
72 |
deftemplates = { |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
73 |
'Revision': '{node|short}', |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
74 |
'Author': '{author|user}', |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
75 |
'Date': '{date|utcdate}', |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
76 |
'RCSFile': '{file|basename},v', |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
77 |
'Source': '{root}/{file},v', |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
78 |
'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
|
79 |
'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
|
80 |
} |
59
94b26168791d
Only 1 all-purpose regex, compiled at load
Christian Ebert <blacktrash@gmx.net>
parents:
58
diff
changeset
|
81 |
|
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
82 |
def utcdate(date): |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
83 |
'''Returns hgdate in cvs-like UTC format.''' |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
84 |
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
|
85 |
|
111
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
86 |
def getmodulename(): |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
87 |
'''Makes sure pretxncommit-hook can import keyword module |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
88 |
regardless of where its located.''' |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
89 |
for k, v in sys.modules.iteritems(): |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
90 |
if v is None: |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
91 |
continue |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
92 |
if not hasattr(v, '__file__'): |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
93 |
continue |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
94 |
if v.__file__.startswith(__file__): |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
95 |
return k |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
96 |
else: |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
97 |
sys.path.insert(0, os.path.abspath(os.path.dirname(__file__))) |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
98 |
return os.path.splitext(os.path.basename(__file__))[0] |
65
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
99 |
|
69
4c5d9635b517
Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents:
68
diff
changeset
|
100 |
def kwfmatches(ui, repo, files): |
4c5d9635b517
Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents:
68
diff
changeset
|
101 |
'''Selects candidates for keyword substitution |
4c5d9635b517
Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents:
68
diff
changeset
|
102 |
configured in keyword section in hgrc.''' |
115
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
103 |
inc, exc = [], [] |
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
104 |
for pat, opt in ui.configitems('keyword'): |
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
105 |
if opt != 'ignore': |
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
106 |
inc.append(pat) |
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
107 |
else: |
520818841684
FIX: no appending of attributes to repo, back to b2cc6a8d4a18
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
108 |
exc.append(pat) |
107
fe4a0495eca8
Implement configurable exclusion of files from expansion
Christian Ebert <blacktrash@gmx.net>
parents:
106
diff
changeset
|
109 |
if not inc: |
69
4c5d9635b517
Pure extension by inserting keyword expansion localrepo.localrepository.commit
Christian Ebert <blacktrash@gmx.net>
parents:
68
diff
changeset
|
110 |
return [] |
107
fe4a0495eca8
Implement configurable exclusion of files from expansion
Christian Ebert <blacktrash@gmx.net>
parents:
106
diff
changeset
|
111 |
kwfmatcher = util.matcher(repo.root, inc=inc, exc=['.hg*']+exc)[1] |
105
2a8b0a71c2ec
Use full power of util.matcher for kwfmatches()
Christian Ebert <blacktrash@gmx.net>
parents:
104
diff
changeset
|
112 |
return [f for f in files if kwfmatcher(f)] |
65
188849659487
Unify obtaining filename matchers; only debug messages
Christian Ebert <blacktrash@gmx.net>
parents:
64
diff
changeset
|
113 |
|
92
3c7c187e4001
Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents:
90
diff
changeset
|
114 |
|
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
115 |
class kwtemplater(object): |
92
3c7c187e4001
Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents:
90
diff
changeset
|
116 |
''' |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
117 |
Sets up keyword templates, corresponding keyword regex, and |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
118 |
provides keyword expansion function. |
92
3c7c187e4001
Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents:
90
diff
changeset
|
119 |
''' |
101
98a65d978098
No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents:
100
diff
changeset
|
120 |
def __init__(self, ui, repo): |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
121 |
self.ui = ui |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
122 |
self.repo = repo |
106
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
123 |
self.templates = dict(ui.configitems('keywordmaps')) or deftemplates |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
124 |
self.re_kw = re.compile(r'\$(%s)[^$]*?\$' % |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
125 |
'|'.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
|
126 |
templater.common_filters['utcdate'] = utcdate |
106
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
127 |
self.t = cmdutil.changeset_templater(ui, repo, False, '', False) |
107
fe4a0495eca8
Implement configurable exclusion of files from expansion
Christian Ebert <blacktrash@gmx.net>
parents:
106
diff
changeset
|
128 |
|
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
129 |
|
101
98a65d978098
No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents:
100
diff
changeset
|
130 |
def expand(self, mobj, path, node): |
102
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
131 |
'''Expands keyword with corresponding template.''' |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
132 |
kw = mobj.group(1) |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
133 |
template = templater.parsestring(self.templates[kw], quoted=False) |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
134 |
self.t.use_template(template) |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
135 |
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
|
136 |
self.t.show(changenode=node, root=self.repo.root, file=path) |
110
b0b85b383f36
Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
137 |
kwsub = templater.firstline(self.ui.popbuffer()) |
b0b85b383f36
Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
138 |
return '$%s: %s $' % (kw, kwsub) |
92
3c7c187e4001
Init context.filectx only once per file with class kwfilectx
Christian Ebert <blacktrash@gmx.net>
parents:
90
diff
changeset
|
139 |
|
42
ba000e29ecf3
Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents:
41
diff
changeset
|
140 |
|
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
141 |
def reposetup(ui, repo): |
108
25dac950a1f0
Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents:
107
diff
changeset
|
142 |
'''Sets up repo, and filelog especially, as kwrepo and kwfilelog |
25dac950a1f0
Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents:
107
diff
changeset
|
143 |
for keyword substitution. This is done for local repos only.''' |
25dac950a1f0
Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents:
107
diff
changeset
|
144 |
|
110
b0b85b383f36
Move all that can be done only once per repo into reposetup
Christian Ebert <blacktrash@gmx.net>
parents:
109
diff
changeset
|
145 |
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
|
146 |
return |
108
25dac950a1f0
Document reposetup; recommend loading on per-repo basis
Christian Ebert <blacktrash@gmx.net>
parents:
107
diff
changeset
|
147 |
|
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
148 |
|
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
149 |
class kwrepo(repo.__class__): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
150 |
def file(self, f): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
151 |
if f[0] == '/': |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
152 |
f = f[1:] |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
153 |
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
|
154 |
|
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
155 |
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
|
156 |
''' |
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
157 |
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
|
158 |
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
|
159 |
''' |
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
160 |
def __init__(self, opener, path, repo, |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
161 |
defversion=revlog.REVLOG_DEFAULT_VERSION): |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
162 |
super(kwfilelog, self).__init__(opener, path, defversion) |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
163 |
self._repo = repo |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
164 |
self._path = path |
106
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
165 |
# only init kwtemplater if needed |
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
166 |
if not isinstance(repo, int) and kwfmatches(ui, repo, [path]): |
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
167 |
self.kwt = kwtemplater(ui, repo) |
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
168 |
else: |
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
169 |
self.kwt = None |
36
b3ace8cc5a33
Change config opt "expand" to accept filename patterns
Christian Ebert <blacktrash@gmx.net>
parents:
34
diff
changeset
|
170 |
|
78
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
171 |
def iskwcandidate(self, data): |
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
172 |
'''Decides whether to act on keywords.''' |
106
61afa140949e
Only initialize kwtemplater in kwfilelog if needed
Christian Ebert <blacktrash@gmx.net>
parents:
105
diff
changeset
|
173 |
return self.kwt is not None and not util.binary(data) |
78
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
174 |
|
33
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
175 |
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
|
176 |
'''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
|
177 |
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
|
178 |
if self.iskwcandidate(data): |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
179 |
c = context.filectx(self._repo, self._path, |
100
4f1129ddbdb8
Just re-bin the node kwarg of the hook, instead of using changelog
Christian Ebert <blacktrash@gmx.net>
parents:
99
diff
changeset
|
180 |
fileid=node, filelog=self) |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
181 |
return self.kwt.re_kw.sub(lambda m: |
101
98a65d978098
No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents:
100
diff
changeset
|
182 |
self.kwt.expand(m, self._path, c.node()), data) |
51
1ecb6ec5d16b
Reintroduce simpler kwfilelog.add(); simplify kwfilelog.read()
Christian Ebert <blacktrash@gmx.net>
parents:
50
diff
changeset
|
183 |
return data |
42
ba000e29ecf3
Implement near CVS compability with more than one keyword
Christian Ebert <blacktrash@gmx.net>
parents:
41
diff
changeset
|
184 |
|
78
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
185 |
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
|
186 |
'''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
|
187 |
if self.iskwcandidate(text): |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
188 |
text = self.kwt.re_kw.sub(r'$\1$', text) |
78
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
189 |
return super(kwfilelog, self).add(text, |
102
393d6f8ea83c
More doc, link to KeywordPlan
Christian Ebert <blacktrash@gmx.net>
parents:
101
diff
changeset
|
190 |
meta, tr, link, p1=p1, p2=p2) |
78
474b415433a1
Unexpanded storage hopefully covered now by adding kwfilelog.add (again!)
Christian Ebert <blacktrash@gmx.net>
parents:
77
diff
changeset
|
191 |
|
49
5acfe7dc3086
Override filelog's size(), cmp() as well; remove add()
Christian Ebert <blacktrash@gmx.net>
parents:
48
diff
changeset
|
192 |
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
|
193 |
'''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
|
194 |
if self.iskwcandidate(text): |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
195 |
text = self.kwt.re_kw.sub(r'$\1$', text) |
71
f7a2a246740c
No keyword substitution in cmp(); no overriding of size() ATM
Christian Ebert <blacktrash@gmx.net>
parents:
69
diff
changeset
|
196 |
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
|
197 |
|
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
198 |
filelog.filelog = kwfilelog |
ebb39c6a1476
Add original keyword extension by Thomas Arendsen Hain
Christian Ebert <blacktrash@gmx.net>
parents:
diff
changeset
|
199 |
repo.__class__ = kwrepo |
111
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
200 |
# configure pretxncommit hook |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
201 |
ui.setconfig('hooks', 'pretxncommit.keyword', |
94315baadcaf
Get modulename via function; set kwrepo attribs via direct reference
Christian Ebert <blacktrash@gmx.net>
parents:
110
diff
changeset
|
202 |
'python:%s.pretxnkw' % getmodulename()) |
81
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
203 |
|
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
204 |
|
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
205 |
def pretxnkw(ui, repo, hooktype, **args): |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
206 |
'''pretxncommit hook that collects candidates for keyword expansion |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
207 |
on commit and expands keywords in working dir.''' |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
208 |
|
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
209 |
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
|
210 |
if repr(cmd).split()[1] in ('tag', 'import_'): |
99
f881ecdcdec9
Same as for hardcoded branch: omit hooktype test, return w/o explicit value
Christian Ebert <blacktrash@gmx.net>
parents:
97
diff
changeset
|
211 |
return |
81
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
212 |
|
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
213 |
files, match, anypats = cmdutil.matchpats(repo, sysargs, cmdopts) |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
214 |
modified, added = repo.status(files=files, match=match)[:2] |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
215 |
candidates = kwfmatches(ui, repo, modified+added) |
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
216 |
if not candidates: |
99
f881ecdcdec9
Same as for hardcoded branch: omit hooktype test, return w/o explicit value
Christian Ebert <blacktrash@gmx.net>
parents:
97
diff
changeset
|
217 |
return |
81
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
218 |
|
101
98a65d978098
No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents:
100
diff
changeset
|
219 |
kwt = kwtemplater(ui, repo) |
98a65d978098
No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents:
100
diff
changeset
|
220 |
node = bin(args['node']) |
95
9e4cbe64fb4f
Implement custom keyword map templates in hgrc
Christian Ebert <blacktrash@gmx.net>
parents:
93
diff
changeset
|
221 |
for f in candidates: |
81
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
222 |
data = repo.wfile(f).read() |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
223 |
if not util.binary(data): |
101
98a65d978098
No need to read changelog in show(); node mandatory arg for expand()
Christian Ebert <blacktrash@gmx.net>
parents:
100
diff
changeset
|
224 |
data, kwct = kwt.re_kw.subn(lambda m: kwt.expand(m, f, node), data) |
81
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
225 |
if kwct: |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
226 |
ui.debug(_('overwriting %s expanding keywords\n' % f)) |
fd5d3a974ea7
Implement self initializing pretxncommit hook
Christian Ebert <blacktrash@gmx.net>
parents:
80
diff
changeset
|
227 |
repo.wfile(f, 'w').write(data) |