2
# This program is free software; you can redistribute it and/or modify
3
# it under the terms of the GNU General Public License as published by
4
# the Free Software Foundation; either version 2 of the License, or
5
# (at your option) any later version.
7
# This program is distributed in the hope that it will be useful,
8
# but WITHOUT ANY WARRANTY; without even the implied warranty of
9
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10
# GNU General Public License for more details.
12
# You should have received a copy of the GNU General Public License
13
# along with this program; if not, write to the Free Software
14
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
2
25
from loggerhead.zptsupport import zpt
26
from loggerhead.util import html_format
4
29
templatefunctions = {}
5
32
def templatefunc(func):
6
33
templatefunctions[func.__name__] = func
10
37
_base = os.path.dirname(__file__)
12
41
return zpt(os.path.join(_base, 'templates', name + '.pt'))
15
44
templatefunctions['macros'] = _pt('macros').macros
45
templatefunctions['breadcrumbs'] = _pt('breadcrumbs').macros
18
def file_change_summary(url, entry, modified_file_link):
49
def file_change_summary(url, entry, file_changes, style='normal', currently_showing=None):
50
if style == 'fragment':
51
def file_link(filename):
52
if currently_showing and filename == currently_showing:
54
'<b><a href="#%s">%s</a></b>',
55
urllib.quote(filename.encode('utf-8')), filename)
58
url, entry.revno, filename,
59
'#' + urllib.quote(filename.encode('utf-8')))
61
def file_link(filename):
63
'<a href="%s%s" title="View changes to %s in revision %s">'
65
url(['/revision', entry.revno]),
66
'#' + urllib.quote(filename.encode('utf-8')),
67
filename, entry.revno, filename)
19
68
return _pt('revisionfilechanges').expand(
20
url=url, entry=entry, modified_file_link=modified_file_link,
69
entry=entry, file_changes=file_changes, file_link=file_link, **templatefunctions)
24
def revisioninfo(url, branch, entry, modified_file_link=None):
73
def revisioninfo(url, branch, entry, file_changes=None, currently_showing=None, merged_in=None):
25
74
from loggerhead import util
26
75
return _pt('revisioninfo').expand(
27
76
url=url, change=entry, branch=branch, util=util,
28
modified_file_link=modified_file_link,
77
file_changes=file_changes, currently_showing=currently_showing,
78
merged_in=merged_in, **templatefunctions)
82
def branchinfo(branch):
83
if branch.served_url is not None:
84
return _pt('branchinfo').expand(branch=branch, **templatefunctions)
32
90
def collapse_button(group, name, branch, normal='block'):
34
92
group=group, name=name, normal=normal, branch=branch,
35
93
**templatefunctions)
38
97
def collapse_all_button(group, branch, normal='block'):
39
98
return _pt('collapse-all-button').expand(
40
99
group=group, normal=normal, branch=branch,
41
100
**templatefunctions)
44
104
def revno_with_nick(entry):
45
105
if entry.branch_nick:
46
106
extra = ' ' + entry.branch_nick
49
return '(%s%s)'%(entry.revno, extra)
52
def modified_file_link_rev(url, entry, item):
53
return _pt('modified-file-link-rev').expand(
54
url=url, entry=entry, item=item,
58
def modified_file_link_log(url, entry, item):
59
return _pt('modified-file-link-log').expand(
60
url=url, entry=entry, item=item,
109
return '(%s%s)' % (entry.revno, extra)
113
def search_box(branch, navigation):
114
return _pt('search-box').expand(branch=branch, navigation=navigation,
119
def feed_link(branch, url):
120
return _pt('feed-link').expand(branch=branch, url=url, **templatefunctions)
124
def menu(branch, url, fileview_active=False):
125
return _pt('menu').expand(branch=branch, url=url,
126
fileview_active=fileview_active, **templatefunctions)
130
def view_link(url, revno, path):
132
'<a href="%s" title="Annotate %s">%s</a>',
133
url(['/view', revno, path]), path, path)
137
def revision_link(url, revno, path, frag=''):
139
'<a href="%s%s" title="View changes to %s in revision %s">%s</a>',
140
url(['/revision', revno, path]), frag, path, revno, path)
144
def loggerhead_version():
145
return loggerhead.__version__
147
_cached_generator_string = None
150
def generator_string():
151
global _cached_generator_string
152
if _cached_generator_string is None:
155
# TODO: Errors -- e.g. from a missing/invalid __version__ attribute, or
156
# ValueError accessing Distribution.version -- should be non-fatal.
158
versions.append(('Loggerhead', loggerhead.__version__))
161
python_version = bzrlib._format_version_tuple(sys.version_info)
162
versions.append(('Python', python_version))
164
versions.append(('Bazaar', bzrlib.__version__))
166
Paste = pkg_resources.get_distribution('Paste')
167
versions.append(('Paste', Paste.version))
170
PasteDeploy = pkg_resources.get_distribution('PasteDeploy')
171
except pkg_resources.DistributionNotFound:
174
versions.append(('PasteDeploy', PasteDeploy.version))
177
versions.append(('SimpleTAL', simpletal.__version__))
184
versions.append(('Pygments', pygments.__version__))
187
from bzrlib.plugins import search
191
bzr_search_version = bzrlib._format_version_tuple(
193
versions.append(('bzr-search', bzr_search_version))
195
# TODO: On old Python versions, elementtree may be used.
198
versions.append(('simplejson', simplejson.__version__))
201
Dozer = pkg_resources.get_distribution('Dozer')
202
except pkg_resources.DistributionNotFound:
205
versions.append(('Dozer', Dozer.version))
207
version_strings = ("%s/%s" % t for t in versions)
208
_cached_generator_string = ' '.join(version_strings)
209
return _cached_generator_string