##// END OF EJS Templates
lib: change ' to ' to satisfy Outlook HTML rendering...
Thomas De Schampheleire -
r7077:494c793c default
parent child Browse files
Show More
@@ -1,1266 +1,1266 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2 # This program is free software: you can redistribute it and/or modify
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
3 # it under the terms of the GNU General Public License as published by
4 # the Free Software Foundation, either version 3 of the License, or
4 # the Free Software Foundation, either version 3 of the License, or
5 # (at your option) any later version.
5 # (at your option) any later version.
6 #
6 #
7 # This program is distributed in the hope that it will be useful,
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
10 # GNU General Public License for more details.
11 #
11 #
12 # You should have received a copy of the GNU General Public License
12 # You should have received a copy of the GNU General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 """
14 """
15 Helper functions
15 Helper functions
16
16
17 Consists of functions to typically be used within templates, but also
17 Consists of functions to typically be used within templates, but also
18 available to Controllers. This module is available to both as 'h'.
18 available to Controllers. This module is available to both as 'h'.
19 """
19 """
20 import hashlib
20 import hashlib
21 import json
21 import json
22 import StringIO
22 import StringIO
23 import logging
23 import logging
24 import re
24 import re
25 import urlparse
25 import urlparse
26 import textwrap
26 import textwrap
27
27
28 from beaker.cache import cache_region
28 from beaker.cache import cache_region
29 from pygments.formatters.html import HtmlFormatter
29 from pygments.formatters.html import HtmlFormatter
30 from pygments import highlight as code_highlight
30 from pygments import highlight as code_highlight
31 from tg.i18n import ugettext as _
31 from tg.i18n import ugettext as _
32
32
33 from webhelpers.html import literal, HTML, escape
33 from webhelpers.html import literal, HTML, escape
34 from webhelpers.html.tags import checkbox, end_form, hidden, link_to, \
34 from webhelpers.html.tags import checkbox, end_form, hidden, link_to, \
35 select, submit, text, password, textarea, radio, form as insecure_form
35 select, submit, text, password, textarea, radio, form as insecure_form
36 from webhelpers.number import format_byte_size
36 from webhelpers.number import format_byte_size
37 from webhelpers.pylonslib import Flash as _Flash
37 from webhelpers.pylonslib import Flash as _Flash
38 from webhelpers.pylonslib.secure_form import secure_form, authentication_token
38 from webhelpers.pylonslib.secure_form import secure_form, authentication_token
39 from webhelpers.text import chop_at, truncate, wrap_paragraphs
39 from webhelpers.text import chop_at, truncate, wrap_paragraphs
40 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
40 from webhelpers.html.tags import _set_input_attrs, _set_id_attr, \
41 convert_boolean_attrs, NotGiven, _make_safe_id_component
41 convert_boolean_attrs, NotGiven, _make_safe_id_component
42
42
43 from kallithea.config.routing import url
43 from kallithea.config.routing import url
44 from kallithea.lib.annotate import annotate_highlight
44 from kallithea.lib.annotate import annotate_highlight
45 from kallithea.lib.pygmentsutils import get_custom_lexer
45 from kallithea.lib.pygmentsutils import get_custom_lexer
46 from kallithea.lib.utils2 import str2bool, safe_unicode, safe_str, \
46 from kallithea.lib.utils2 import str2bool, safe_unicode, safe_str, \
47 time_to_datetime, AttributeDict, safe_int, MENTIONS_REGEX
47 time_to_datetime, AttributeDict, safe_int, MENTIONS_REGEX
48 from kallithea.lib.markup_renderer import url_re
48 from kallithea.lib.markup_renderer import url_re
49 from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError
49 from kallithea.lib.vcs.exceptions import ChangesetDoesNotExistError
50 from kallithea.lib.vcs.backends.base import BaseChangeset, EmptyChangeset
50 from kallithea.lib.vcs.backends.base import BaseChangeset, EmptyChangeset
51
51
52 log = logging.getLogger(__name__)
52 log = logging.getLogger(__name__)
53
53
54
54
55 def canonical_url(*args, **kargs):
55 def canonical_url(*args, **kargs):
56 '''Like url(x, qualified=True), but returns url that not only is qualified
56 '''Like url(x, qualified=True), but returns url that not only is qualified
57 but also canonical, as configured in canonical_url'''
57 but also canonical, as configured in canonical_url'''
58 from kallithea import CONFIG
58 from kallithea import CONFIG
59 try:
59 try:
60 parts = CONFIG.get('canonical_url', '').split('://', 1)
60 parts = CONFIG.get('canonical_url', '').split('://', 1)
61 kargs['host'] = parts[1].split('/', 1)[0]
61 kargs['host'] = parts[1].split('/', 1)[0]
62 kargs['protocol'] = parts[0]
62 kargs['protocol'] = parts[0]
63 except IndexError:
63 except IndexError:
64 kargs['qualified'] = True
64 kargs['qualified'] = True
65 return url(*args, **kargs)
65 return url(*args, **kargs)
66
66
67
67
68 def canonical_hostname():
68 def canonical_hostname():
69 '''Return canonical hostname of system'''
69 '''Return canonical hostname of system'''
70 from kallithea import CONFIG
70 from kallithea import CONFIG
71 try:
71 try:
72 parts = CONFIG.get('canonical_url', '').split('://', 1)
72 parts = CONFIG.get('canonical_url', '').split('://', 1)
73 return parts[1].split('/', 1)[0]
73 return parts[1].split('/', 1)[0]
74 except IndexError:
74 except IndexError:
75 parts = url('home', qualified=True).split('://', 1)
75 parts = url('home', qualified=True).split('://', 1)
76 return parts[1].split('/', 1)[0]
76 return parts[1].split('/', 1)[0]
77
77
78
78
79 def html_escape(s):
79 def html_escape(s):
80 """Return string with all html escaped.
80 """Return string with all html escaped.
81 This is also safe for javascript in html but not necessarily correct.
81 This is also safe for javascript in html but not necessarily correct.
82 """
82 """
83 return (s
83 return (s
84 .replace('&', '&amp;')
84 .replace('&', '&amp;')
85 .replace(">", "&gt;")
85 .replace(">", "&gt;")
86 .replace("<", "&lt;")
86 .replace("<", "&lt;")
87 .replace('"', "&quot;")
87 .replace('"', "&quot;")
88 .replace("'", "&apos;")
88 .replace("'", "&#39;") # some mail readers use HTML 4 and doesn't support &apos;
89 )
89 )
90
90
91 def js(value):
91 def js(value):
92 """Convert Python value to the corresponding JavaScript representation.
92 """Convert Python value to the corresponding JavaScript representation.
93
93
94 This is necessary to safely insert arbitrary values into HTML <script>
94 This is necessary to safely insert arbitrary values into HTML <script>
95 sections e.g. using Mako template expression substitution.
95 sections e.g. using Mako template expression substitution.
96
96
97 Note: Rather than using this function, it's preferable to avoid the
97 Note: Rather than using this function, it's preferable to avoid the
98 insertion of values into HTML <script> sections altogether. Instead,
98 insertion of values into HTML <script> sections altogether. Instead,
99 data should (to the extent possible) be passed to JavaScript using
99 data should (to the extent possible) be passed to JavaScript using
100 data attributes or AJAX calls, eliminating the need for JS specific
100 data attributes or AJAX calls, eliminating the need for JS specific
101 escaping.
101 escaping.
102
102
103 Note: This is not safe for use in attributes (e.g. onclick), because
103 Note: This is not safe for use in attributes (e.g. onclick), because
104 quotes are not escaped.
104 quotes are not escaped.
105
105
106 Because the rules for parsing <script> varies between XHTML (where
106 Because the rules for parsing <script> varies between XHTML (where
107 normal rules apply for any special characters) and HTML (where
107 normal rules apply for any special characters) and HTML (where
108 entities are not interpreted, but the literal string "</script>"
108 entities are not interpreted, but the literal string "</script>"
109 is forbidden), the function ensures that the result never contains
109 is forbidden), the function ensures that the result never contains
110 '&', '<' and '>', thus making it safe in both those contexts (but
110 '&', '<' and '>', thus making it safe in both those contexts (but
111 not in attributes).
111 not in attributes).
112 """
112 """
113 return literal(
113 return literal(
114 ('(' + json.dumps(value) + ')')
114 ('(' + json.dumps(value) + ')')
115 # In JSON, the following can only appear in string literals.
115 # In JSON, the following can only appear in string literals.
116 .replace('&', r'\x26')
116 .replace('&', r'\x26')
117 .replace('<', r'\x3c')
117 .replace('<', r'\x3c')
118 .replace('>', r'\x3e')
118 .replace('>', r'\x3e')
119 )
119 )
120
120
121
121
122 def jshtml(val):
122 def jshtml(val):
123 """HTML escapes a string value, then converts the resulting string
123 """HTML escapes a string value, then converts the resulting string
124 to its corresponding JavaScript representation (see `js`).
124 to its corresponding JavaScript representation (see `js`).
125
125
126 This is used when a plain-text string (possibly containing special
126 This is used when a plain-text string (possibly containing special
127 HTML characters) will be used by a script in an HTML context (e.g.
127 HTML characters) will be used by a script in an HTML context (e.g.
128 element.innerHTML or jQuery's 'html' method).
128 element.innerHTML or jQuery's 'html' method).
129
129
130 If in doubt, err on the side of using `jshtml` over `js`, since it's
130 If in doubt, err on the side of using `jshtml` over `js`, since it's
131 better to escape too much than too little.
131 better to escape too much than too little.
132 """
132 """
133 return js(escape(val))
133 return js(escape(val))
134
134
135
135
136 def shorter(s, size=20, firstline=False, postfix='...'):
136 def shorter(s, size=20, firstline=False, postfix='...'):
137 """Truncate s to size, including the postfix string if truncating.
137 """Truncate s to size, including the postfix string if truncating.
138 If firstline, truncate at newline.
138 If firstline, truncate at newline.
139 """
139 """
140 if firstline:
140 if firstline:
141 s = s.split('\n', 1)[0].rstrip()
141 s = s.split('\n', 1)[0].rstrip()
142 if len(s) > size:
142 if len(s) > size:
143 return s[:size - len(postfix)] + postfix
143 return s[:size - len(postfix)] + postfix
144 return s
144 return s
145
145
146
146
147 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
147 def _reset(name, value=None, id=NotGiven, type="reset", **attrs):
148 """
148 """
149 Reset button
149 Reset button
150 """
150 """
151 _set_input_attrs(attrs, type, name, value)
151 _set_input_attrs(attrs, type, name, value)
152 _set_id_attr(attrs, id, name)
152 _set_id_attr(attrs, id, name)
153 convert_boolean_attrs(attrs, ["disabled"])
153 convert_boolean_attrs(attrs, ["disabled"])
154 return HTML.input(**attrs)
154 return HTML.input(**attrs)
155
155
156
156
157 reset = _reset
157 reset = _reset
158 safeid = _make_safe_id_component
158 safeid = _make_safe_id_component
159
159
160
160
161 def FID(raw_id, path):
161 def FID(raw_id, path):
162 """
162 """
163 Creates a unique ID for filenode based on it's hash of path and revision
163 Creates a unique ID for filenode based on it's hash of path and revision
164 it's safe to use in urls
164 it's safe to use in urls
165
165
166 :param raw_id:
166 :param raw_id:
167 :param path:
167 :param path:
168 """
168 """
169
169
170 return 'C-%s-%s' % (short_id(raw_id), hashlib.md5(safe_str(path)).hexdigest()[:12])
170 return 'C-%s-%s' % (short_id(raw_id), hashlib.md5(safe_str(path)).hexdigest()[:12])
171
171
172
172
173 class _FilesBreadCrumbs(object):
173 class _FilesBreadCrumbs(object):
174
174
175 def __call__(self, repo_name, rev, paths):
175 def __call__(self, repo_name, rev, paths):
176 if isinstance(paths, str):
176 if isinstance(paths, str):
177 paths = safe_unicode(paths)
177 paths = safe_unicode(paths)
178 url_l = [link_to(repo_name, url('files_home',
178 url_l = [link_to(repo_name, url('files_home',
179 repo_name=repo_name,
179 repo_name=repo_name,
180 revision=rev, f_path=''),
180 revision=rev, f_path=''),
181 class_='ypjax-link')]
181 class_='ypjax-link')]
182 paths_l = paths.split('/')
182 paths_l = paths.split('/')
183 for cnt, p in enumerate(paths_l):
183 for cnt, p in enumerate(paths_l):
184 if p != '':
184 if p != '':
185 url_l.append(link_to(p,
185 url_l.append(link_to(p,
186 url('files_home',
186 url('files_home',
187 repo_name=repo_name,
187 repo_name=repo_name,
188 revision=rev,
188 revision=rev,
189 f_path='/'.join(paths_l[:cnt + 1])
189 f_path='/'.join(paths_l[:cnt + 1])
190 ),
190 ),
191 class_='ypjax-link'
191 class_='ypjax-link'
192 )
192 )
193 )
193 )
194
194
195 return literal('/'.join(url_l))
195 return literal('/'.join(url_l))
196
196
197
197
198 files_breadcrumbs = _FilesBreadCrumbs()
198 files_breadcrumbs = _FilesBreadCrumbs()
199
199
200
200
201 class CodeHtmlFormatter(HtmlFormatter):
201 class CodeHtmlFormatter(HtmlFormatter):
202 """
202 """
203 My code Html Formatter for source codes
203 My code Html Formatter for source codes
204 """
204 """
205
205
206 def wrap(self, source, outfile):
206 def wrap(self, source, outfile):
207 return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
207 return self._wrap_div(self._wrap_pre(self._wrap_code(source)))
208
208
209 def _wrap_code(self, source):
209 def _wrap_code(self, source):
210 for cnt, it in enumerate(source):
210 for cnt, it in enumerate(source):
211 i, t = it
211 i, t = it
212 t = '<span id="L%s">%s</span>' % (cnt + 1, t)
212 t = '<span id="L%s">%s</span>' % (cnt + 1, t)
213 yield i, t
213 yield i, t
214
214
215 def _wrap_tablelinenos(self, inner):
215 def _wrap_tablelinenos(self, inner):
216 dummyoutfile = StringIO.StringIO()
216 dummyoutfile = StringIO.StringIO()
217 lncount = 0
217 lncount = 0
218 for t, line in inner:
218 for t, line in inner:
219 if t:
219 if t:
220 lncount += 1
220 lncount += 1
221 dummyoutfile.write(line)
221 dummyoutfile.write(line)
222
222
223 fl = self.linenostart
223 fl = self.linenostart
224 mw = len(str(lncount + fl - 1))
224 mw = len(str(lncount + fl - 1))
225 sp = self.linenospecial
225 sp = self.linenospecial
226 st = self.linenostep
226 st = self.linenostep
227 la = self.lineanchors
227 la = self.lineanchors
228 aln = self.anchorlinenos
228 aln = self.anchorlinenos
229 nocls = self.noclasses
229 nocls = self.noclasses
230 if sp:
230 if sp:
231 lines = []
231 lines = []
232
232
233 for i in range(fl, fl + lncount):
233 for i in range(fl, fl + lncount):
234 if i % st == 0:
234 if i % st == 0:
235 if i % sp == 0:
235 if i % sp == 0:
236 if aln:
236 if aln:
237 lines.append('<a href="#%s%d" class="special">%*d</a>' %
237 lines.append('<a href="#%s%d" class="special">%*d</a>' %
238 (la, i, mw, i))
238 (la, i, mw, i))
239 else:
239 else:
240 lines.append('<span class="special">%*d</span>' % (mw, i))
240 lines.append('<span class="special">%*d</span>' % (mw, i))
241 else:
241 else:
242 if aln:
242 if aln:
243 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
243 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
244 else:
244 else:
245 lines.append('%*d' % (mw, i))
245 lines.append('%*d' % (mw, i))
246 else:
246 else:
247 lines.append('')
247 lines.append('')
248 ls = '\n'.join(lines)
248 ls = '\n'.join(lines)
249 else:
249 else:
250 lines = []
250 lines = []
251 for i in range(fl, fl + lncount):
251 for i in range(fl, fl + lncount):
252 if i % st == 0:
252 if i % st == 0:
253 if aln:
253 if aln:
254 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
254 lines.append('<a href="#%s%d">%*d</a>' % (la, i, mw, i))
255 else:
255 else:
256 lines.append('%*d' % (mw, i))
256 lines.append('%*d' % (mw, i))
257 else:
257 else:
258 lines.append('')
258 lines.append('')
259 ls = '\n'.join(lines)
259 ls = '\n'.join(lines)
260
260
261 # in case you wonder about the seemingly redundant <div> here: since the
261 # in case you wonder about the seemingly redundant <div> here: since the
262 # content in the other cell also is wrapped in a div, some browsers in
262 # content in the other cell also is wrapped in a div, some browsers in
263 # some configurations seem to mess up the formatting...
263 # some configurations seem to mess up the formatting...
264 if nocls:
264 if nocls:
265 yield 0, ('<table class="%stable">' % self.cssclass +
265 yield 0, ('<table class="%stable">' % self.cssclass +
266 '<tr><td><div class="linenodiv">'
266 '<tr><td><div class="linenodiv">'
267 '<pre>' + ls + '</pre></div></td>'
267 '<pre>' + ls + '</pre></div></td>'
268 '<td id="hlcode" class="code">')
268 '<td id="hlcode" class="code">')
269 else:
269 else:
270 yield 0, ('<table class="%stable">' % self.cssclass +
270 yield 0, ('<table class="%stable">' % self.cssclass +
271 '<tr><td class="linenos"><div class="linenodiv">'
271 '<tr><td class="linenos"><div class="linenodiv">'
272 '<pre>' + ls + '</pre></div></td>'
272 '<pre>' + ls + '</pre></div></td>'
273 '<td id="hlcode" class="code">')
273 '<td id="hlcode" class="code">')
274 yield 0, dummyoutfile.getvalue()
274 yield 0, dummyoutfile.getvalue()
275 yield 0, '</td></tr></table>'
275 yield 0, '</td></tr></table>'
276
276
277
277
278 _whitespace_re = re.compile(r'(\t)|( )(?=\n|</div>)')
278 _whitespace_re = re.compile(r'(\t)|( )(?=\n|</div>)')
279
279
280
280
281 def _markup_whitespace(m):
281 def _markup_whitespace(m):
282 groups = m.groups()
282 groups = m.groups()
283 if groups[0]:
283 if groups[0]:
284 return '<u>\t</u>'
284 return '<u>\t</u>'
285 if groups[1]:
285 if groups[1]:
286 return ' <i></i>'
286 return ' <i></i>'
287
287
288
288
289 def markup_whitespace(s):
289 def markup_whitespace(s):
290 return _whitespace_re.sub(_markup_whitespace, s)
290 return _whitespace_re.sub(_markup_whitespace, s)
291
291
292
292
293 def pygmentize(filenode, **kwargs):
293 def pygmentize(filenode, **kwargs):
294 """
294 """
295 pygmentize function using pygments
295 pygmentize function using pygments
296
296
297 :param filenode:
297 :param filenode:
298 """
298 """
299 lexer = get_custom_lexer(filenode.extension) or filenode.lexer
299 lexer = get_custom_lexer(filenode.extension) or filenode.lexer
300 return literal(markup_whitespace(
300 return literal(markup_whitespace(
301 code_highlight(filenode.content, lexer, CodeHtmlFormatter(**kwargs))))
301 code_highlight(filenode.content, lexer, CodeHtmlFormatter(**kwargs))))
302
302
303
303
304 def pygmentize_annotation(repo_name, filenode, **kwargs):
304 def pygmentize_annotation(repo_name, filenode, **kwargs):
305 """
305 """
306 pygmentize function for annotation
306 pygmentize function for annotation
307
307
308 :param filenode:
308 :param filenode:
309 """
309 """
310
310
311 color_dict = {}
311 color_dict = {}
312
312
313 def gen_color(n=10000):
313 def gen_color(n=10000):
314 """generator for getting n of evenly distributed colors using
314 """generator for getting n of evenly distributed colors using
315 hsv color and golden ratio. It always return same order of colors
315 hsv color and golden ratio. It always return same order of colors
316
316
317 :returns: RGB tuple
317 :returns: RGB tuple
318 """
318 """
319
319
320 def hsv_to_rgb(h, s, v):
320 def hsv_to_rgb(h, s, v):
321 if s == 0.0:
321 if s == 0.0:
322 return v, v, v
322 return v, v, v
323 i = int(h * 6.0) # XXX assume int() truncates!
323 i = int(h * 6.0) # XXX assume int() truncates!
324 f = (h * 6.0) - i
324 f = (h * 6.0) - i
325 p = v * (1.0 - s)
325 p = v * (1.0 - s)
326 q = v * (1.0 - s * f)
326 q = v * (1.0 - s * f)
327 t = v * (1.0 - s * (1.0 - f))
327 t = v * (1.0 - s * (1.0 - f))
328 i = i % 6
328 i = i % 6
329 if i == 0:
329 if i == 0:
330 return v, t, p
330 return v, t, p
331 if i == 1:
331 if i == 1:
332 return q, v, p
332 return q, v, p
333 if i == 2:
333 if i == 2:
334 return p, v, t
334 return p, v, t
335 if i == 3:
335 if i == 3:
336 return p, q, v
336 return p, q, v
337 if i == 4:
337 if i == 4:
338 return t, p, v
338 return t, p, v
339 if i == 5:
339 if i == 5:
340 return v, p, q
340 return v, p, q
341
341
342 golden_ratio = 0.618033988749895
342 golden_ratio = 0.618033988749895
343 h = 0.22717784590367374
343 h = 0.22717784590367374
344
344
345 for _unused in xrange(n):
345 for _unused in xrange(n):
346 h += golden_ratio
346 h += golden_ratio
347 h %= 1
347 h %= 1
348 HSV_tuple = [h, 0.95, 0.95]
348 HSV_tuple = [h, 0.95, 0.95]
349 RGB_tuple = hsv_to_rgb(*HSV_tuple)
349 RGB_tuple = hsv_to_rgb(*HSV_tuple)
350 yield map(lambda x: str(int(x * 256)), RGB_tuple)
350 yield map(lambda x: str(int(x * 256)), RGB_tuple)
351
351
352 cgenerator = gen_color()
352 cgenerator = gen_color()
353
353
354 def get_color_string(cs):
354 def get_color_string(cs):
355 if cs in color_dict:
355 if cs in color_dict:
356 col = color_dict[cs]
356 col = color_dict[cs]
357 else:
357 else:
358 col = color_dict[cs] = cgenerator.next()
358 col = color_dict[cs] = cgenerator.next()
359 return "color: rgb(%s)! important;" % (', '.join(col))
359 return "color: rgb(%s)! important;" % (', '.join(col))
360
360
361 def url_func(repo_name):
361 def url_func(repo_name):
362
362
363 def _url_func(changeset):
363 def _url_func(changeset):
364 author = escape(changeset.author)
364 author = escape(changeset.author)
365 date = changeset.date
365 date = changeset.date
366 message = escape(changeset.message)
366 message = escape(changeset.message)
367 tooltip_html = ("<b>Author:</b> %s<br/>"
367 tooltip_html = ("<b>Author:</b> %s<br/>"
368 "<b>Date:</b> %s</b><br/>"
368 "<b>Date:</b> %s</b><br/>"
369 "<b>Message:</b> %s") % (author, date, message)
369 "<b>Message:</b> %s") % (author, date, message)
370
370
371 lnk_format = show_id(changeset)
371 lnk_format = show_id(changeset)
372 uri = link_to(
372 uri = link_to(
373 lnk_format,
373 lnk_format,
374 url('changeset_home', repo_name=repo_name,
374 url('changeset_home', repo_name=repo_name,
375 revision=changeset.raw_id),
375 revision=changeset.raw_id),
376 style=get_color_string(changeset.raw_id),
376 style=get_color_string(changeset.raw_id),
377 **{'data-toggle': 'popover',
377 **{'data-toggle': 'popover',
378 'data-content': tooltip_html}
378 'data-content': tooltip_html}
379 )
379 )
380
380
381 uri += '\n'
381 uri += '\n'
382 return uri
382 return uri
383 return _url_func
383 return _url_func
384
384
385 return literal(markup_whitespace(annotate_highlight(filenode, url_func(repo_name), **kwargs)))
385 return literal(markup_whitespace(annotate_highlight(filenode, url_func(repo_name), **kwargs)))
386
386
387
387
388 class _Message(object):
388 class _Message(object):
389 """A message returned by ``Flash.pop_messages()``.
389 """A message returned by ``Flash.pop_messages()``.
390
390
391 Converting the message to a string returns the message text. Instances
391 Converting the message to a string returns the message text. Instances
392 also have the following attributes:
392 also have the following attributes:
393
393
394 * ``message``: the message text.
394 * ``message``: the message text.
395 * ``category``: the category specified when the message was created.
395 * ``category``: the category specified when the message was created.
396 """
396 """
397
397
398 def __init__(self, category, message):
398 def __init__(self, category, message):
399 self.category = category
399 self.category = category
400 self.message = message
400 self.message = message
401
401
402 def __str__(self):
402 def __str__(self):
403 return self.message
403 return self.message
404
404
405 __unicode__ = __str__
405 __unicode__ = __str__
406
406
407 def __html__(self):
407 def __html__(self):
408 return escape(safe_unicode(self.message))
408 return escape(safe_unicode(self.message))
409
409
410
410
411 class Flash(_Flash):
411 class Flash(_Flash):
412
412
413 def __call__(self, message, category=None, ignore_duplicate=False, logf=None):
413 def __call__(self, message, category=None, ignore_duplicate=False, logf=None):
414 """
414 """
415 Show a message to the user _and_ log it through the specified function
415 Show a message to the user _and_ log it through the specified function
416
416
417 category: notice (default), warning, error, success
417 category: notice (default), warning, error, success
418 logf: a custom log function - such as log.debug
418 logf: a custom log function - such as log.debug
419
419
420 logf defaults to log.info, unless category equals 'success', in which
420 logf defaults to log.info, unless category equals 'success', in which
421 case logf defaults to log.debug.
421 case logf defaults to log.debug.
422 """
422 """
423 if logf is None:
423 if logf is None:
424 logf = log.info
424 logf = log.info
425 if category == 'success':
425 if category == 'success':
426 logf = log.debug
426 logf = log.debug
427
427
428 logf('Flash %s: %s', category, message)
428 logf('Flash %s: %s', category, message)
429
429
430 super(Flash, self).__call__(message, category, ignore_duplicate)
430 super(Flash, self).__call__(message, category, ignore_duplicate)
431
431
432 def pop_messages(self):
432 def pop_messages(self):
433 """Return all accumulated messages and delete them from the session.
433 """Return all accumulated messages and delete them from the session.
434
434
435 The return value is a list of ``Message`` objects.
435 The return value is a list of ``Message`` objects.
436 """
436 """
437 from tg import session
437 from tg import session
438 messages = session.pop(self.session_key, [])
438 messages = session.pop(self.session_key, [])
439 session.save()
439 session.save()
440 return [_Message(*m) for m in messages]
440 return [_Message(*m) for m in messages]
441
441
442
442
443 flash = Flash()
443 flash = Flash()
444
444
445 #==============================================================================
445 #==============================================================================
446 # SCM FILTERS available via h.
446 # SCM FILTERS available via h.
447 #==============================================================================
447 #==============================================================================
448 from kallithea.lib.vcs.utils import author_name, author_email
448 from kallithea.lib.vcs.utils import author_name, author_email
449 from kallithea.lib.utils2 import credentials_filter, age as _age
449 from kallithea.lib.utils2 import credentials_filter, age as _age
450
450
451 age = lambda x, y=False: _age(x, y)
451 age = lambda x, y=False: _age(x, y)
452 capitalize = lambda x: x.capitalize()
452 capitalize = lambda x: x.capitalize()
453 email = author_email
453 email = author_email
454 short_id = lambda x: x[:12]
454 short_id = lambda x: x[:12]
455 hide_credentials = lambda x: ''.join(credentials_filter(x))
455 hide_credentials = lambda x: ''.join(credentials_filter(x))
456
456
457
457
458 def show_id(cs):
458 def show_id(cs):
459 """
459 """
460 Configurable function that shows ID
460 Configurable function that shows ID
461 by default it's r123:fffeeefffeee
461 by default it's r123:fffeeefffeee
462
462
463 :param cs: changeset instance
463 :param cs: changeset instance
464 """
464 """
465 from kallithea import CONFIG
465 from kallithea import CONFIG
466 def_len = safe_int(CONFIG.get('show_sha_length', 12))
466 def_len = safe_int(CONFIG.get('show_sha_length', 12))
467 show_rev = str2bool(CONFIG.get('show_revision_number', False))
467 show_rev = str2bool(CONFIG.get('show_revision_number', False))
468
468
469 raw_id = cs.raw_id[:def_len]
469 raw_id = cs.raw_id[:def_len]
470 if show_rev:
470 if show_rev:
471 return 'r%s:%s' % (cs.revision, raw_id)
471 return 'r%s:%s' % (cs.revision, raw_id)
472 else:
472 else:
473 return raw_id
473 return raw_id
474
474
475
475
476 def fmt_date(date):
476 def fmt_date(date):
477 if date:
477 if date:
478 return date.strftime("%Y-%m-%d %H:%M:%S").decode('utf8')
478 return date.strftime("%Y-%m-%d %H:%M:%S").decode('utf8')
479
479
480 return ""
480 return ""
481
481
482
482
483 def is_git(repository):
483 def is_git(repository):
484 if hasattr(repository, 'alias'):
484 if hasattr(repository, 'alias'):
485 _type = repository.alias
485 _type = repository.alias
486 elif hasattr(repository, 'repo_type'):
486 elif hasattr(repository, 'repo_type'):
487 _type = repository.repo_type
487 _type = repository.repo_type
488 else:
488 else:
489 _type = repository
489 _type = repository
490 return _type == 'git'
490 return _type == 'git'
491
491
492
492
493 def is_hg(repository):
493 def is_hg(repository):
494 if hasattr(repository, 'alias'):
494 if hasattr(repository, 'alias'):
495 _type = repository.alias
495 _type = repository.alias
496 elif hasattr(repository, 'repo_type'):
496 elif hasattr(repository, 'repo_type'):
497 _type = repository.repo_type
497 _type = repository.repo_type
498 else:
498 else:
499 _type = repository
499 _type = repository
500 return _type == 'hg'
500 return _type == 'hg'
501
501
502
502
503 @cache_region('long_term', 'user_or_none')
503 @cache_region('long_term', 'user_or_none')
504 def user_or_none(author):
504 def user_or_none(author):
505 """Try to match email part of VCS committer string with a local user - or return None"""
505 """Try to match email part of VCS committer string with a local user - or return None"""
506 from kallithea.model.db import User
506 from kallithea.model.db import User
507 email = author_email(author)
507 email = author_email(author)
508 if email:
508 if email:
509 return User.get_by_email(email, cache=True) # cache will only use sql_cache_short
509 return User.get_by_email(email, cache=True) # cache will only use sql_cache_short
510 return None
510 return None
511
511
512
512
513 def email_or_none(author):
513 def email_or_none(author):
514 """Try to match email part of VCS committer string with a local user.
514 """Try to match email part of VCS committer string with a local user.
515 Return primary email of user, email part of the specified author name, or None."""
515 Return primary email of user, email part of the specified author name, or None."""
516 if not author:
516 if not author:
517 return None
517 return None
518 user = user_or_none(author)
518 user = user_or_none(author)
519 if user is not None:
519 if user is not None:
520 return user.email # always use main email address - not necessarily the one used to find user
520 return user.email # always use main email address - not necessarily the one used to find user
521
521
522 # extract email from the commit string
522 # extract email from the commit string
523 email = author_email(author)
523 email = author_email(author)
524 if email:
524 if email:
525 return email
525 return email
526
526
527 # No valid email, not a valid user in the system, none!
527 # No valid email, not a valid user in the system, none!
528 return None
528 return None
529
529
530
530
531 def person(author, show_attr="username"):
531 def person(author, show_attr="username"):
532 """Find the user identified by 'author', return one of the users attributes,
532 """Find the user identified by 'author', return one of the users attributes,
533 default to the username attribute, None if there is no user"""
533 default to the username attribute, None if there is no user"""
534 from kallithea.model.db import User
534 from kallithea.model.db import User
535 # attr to return from fetched user
535 # attr to return from fetched user
536 person_getter = lambda usr: getattr(usr, show_attr)
536 person_getter = lambda usr: getattr(usr, show_attr)
537
537
538 # if author is already an instance use it for extraction
538 # if author is already an instance use it for extraction
539 if isinstance(author, User):
539 if isinstance(author, User):
540 return person_getter(author)
540 return person_getter(author)
541
541
542 user = user_or_none(author)
542 user = user_or_none(author)
543 if user is not None:
543 if user is not None:
544 return person_getter(user)
544 return person_getter(user)
545
545
546 # Still nothing? Just pass back the author name if any, else the email
546 # Still nothing? Just pass back the author name if any, else the email
547 return author_name(author) or email(author)
547 return author_name(author) or email(author)
548
548
549
549
550 def person_by_id(id_, show_attr="username"):
550 def person_by_id(id_, show_attr="username"):
551 from kallithea.model.db import User
551 from kallithea.model.db import User
552 # attr to return from fetched user
552 # attr to return from fetched user
553 person_getter = lambda usr: getattr(usr, show_attr)
553 person_getter = lambda usr: getattr(usr, show_attr)
554
554
555 # maybe it's an ID ?
555 # maybe it's an ID ?
556 if str(id_).isdigit() or isinstance(id_, int):
556 if str(id_).isdigit() or isinstance(id_, int):
557 id_ = int(id_)
557 id_ = int(id_)
558 user = User.get(id_)
558 user = User.get(id_)
559 if user is not None:
559 if user is not None:
560 return person_getter(user)
560 return person_getter(user)
561 return id_
561 return id_
562
562
563
563
564 def boolicon(value):
564 def boolicon(value):
565 """Returns boolean value of a value, represented as small html image of true/false
565 """Returns boolean value of a value, represented as small html image of true/false
566 icons
566 icons
567
567
568 :param value: value
568 :param value: value
569 """
569 """
570
570
571 if value:
571 if value:
572 return HTML.tag('i', class_="icon-ok")
572 return HTML.tag('i', class_="icon-ok")
573 else:
573 else:
574 return HTML.tag('i', class_="icon-minus-circled")
574 return HTML.tag('i', class_="icon-minus-circled")
575
575
576
576
577 def action_parser(user_log, feed=False, parse_cs=False):
577 def action_parser(user_log, feed=False, parse_cs=False):
578 """
578 """
579 This helper will action_map the specified string action into translated
579 This helper will action_map the specified string action into translated
580 fancy names with icons and links
580 fancy names with icons and links
581
581
582 :param user_log: user log instance
582 :param user_log: user log instance
583 :param feed: use output for feeds (no html and fancy icons)
583 :param feed: use output for feeds (no html and fancy icons)
584 :param parse_cs: parse Changesets into VCS instances
584 :param parse_cs: parse Changesets into VCS instances
585 """
585 """
586
586
587 action = user_log.action
587 action = user_log.action
588 action_params = ' '
588 action_params = ' '
589
589
590 x = action.split(':')
590 x = action.split(':')
591
591
592 if len(x) > 1:
592 if len(x) > 1:
593 action, action_params = x
593 action, action_params = x
594
594
595 def get_cs_links():
595 def get_cs_links():
596 revs_limit = 3 # display this amount always
596 revs_limit = 3 # display this amount always
597 revs_top_limit = 50 # show upto this amount of changesets hidden
597 revs_top_limit = 50 # show upto this amount of changesets hidden
598 revs_ids = action_params.split(',')
598 revs_ids = action_params.split(',')
599 deleted = user_log.repository is None
599 deleted = user_log.repository is None
600 if deleted:
600 if deleted:
601 return ','.join(revs_ids)
601 return ','.join(revs_ids)
602
602
603 repo_name = user_log.repository.repo_name
603 repo_name = user_log.repository.repo_name
604
604
605 def lnk(rev, repo_name):
605 def lnk(rev, repo_name):
606 lazy_cs = False
606 lazy_cs = False
607 title_ = None
607 title_ = None
608 url_ = '#'
608 url_ = '#'
609 if isinstance(rev, BaseChangeset) or isinstance(rev, AttributeDict):
609 if isinstance(rev, BaseChangeset) or isinstance(rev, AttributeDict):
610 if rev.op and rev.ref_name:
610 if rev.op and rev.ref_name:
611 if rev.op == 'delete_branch':
611 if rev.op == 'delete_branch':
612 lbl = _('Deleted branch: %s') % rev.ref_name
612 lbl = _('Deleted branch: %s') % rev.ref_name
613 elif rev.op == 'tag':
613 elif rev.op == 'tag':
614 lbl = _('Created tag: %s') % rev.ref_name
614 lbl = _('Created tag: %s') % rev.ref_name
615 else:
615 else:
616 lbl = 'Unknown operation %s' % rev.op
616 lbl = 'Unknown operation %s' % rev.op
617 else:
617 else:
618 lazy_cs = True
618 lazy_cs = True
619 lbl = rev.short_id[:8]
619 lbl = rev.short_id[:8]
620 url_ = url('changeset_home', repo_name=repo_name,
620 url_ = url('changeset_home', repo_name=repo_name,
621 revision=rev.raw_id)
621 revision=rev.raw_id)
622 else:
622 else:
623 # changeset cannot be found - it might have been stripped or removed
623 # changeset cannot be found - it might have been stripped or removed
624 lbl = rev[:12]
624 lbl = rev[:12]
625 title_ = _('Changeset %s not found') % lbl
625 title_ = _('Changeset %s not found') % lbl
626 if parse_cs:
626 if parse_cs:
627 return link_to(lbl, url_, title=title_, **{'data-toggle': 'tooltip'})
627 return link_to(lbl, url_, title=title_, **{'data-toggle': 'tooltip'})
628 return link_to(lbl, url_, class_='lazy-cs' if lazy_cs else '',
628 return link_to(lbl, url_, class_='lazy-cs' if lazy_cs else '',
629 **{'data-raw_id': rev.raw_id, 'data-repo_name': repo_name})
629 **{'data-raw_id': rev.raw_id, 'data-repo_name': repo_name})
630
630
631 def _get_op(rev_txt):
631 def _get_op(rev_txt):
632 _op = None
632 _op = None
633 _name = rev_txt
633 _name = rev_txt
634 if len(rev_txt.split('=>')) == 2:
634 if len(rev_txt.split('=>')) == 2:
635 _op, _name = rev_txt.split('=>')
635 _op, _name = rev_txt.split('=>')
636 return _op, _name
636 return _op, _name
637
637
638 revs = []
638 revs = []
639 if len(filter(lambda v: v != '', revs_ids)) > 0:
639 if len(filter(lambda v: v != '', revs_ids)) > 0:
640 repo = None
640 repo = None
641 for rev in revs_ids[:revs_top_limit]:
641 for rev in revs_ids[:revs_top_limit]:
642 _op, _name = _get_op(rev)
642 _op, _name = _get_op(rev)
643
643
644 # we want parsed changesets, or new log store format is bad
644 # we want parsed changesets, or new log store format is bad
645 if parse_cs:
645 if parse_cs:
646 try:
646 try:
647 if repo is None:
647 if repo is None:
648 repo = user_log.repository.scm_instance
648 repo = user_log.repository.scm_instance
649 _rev = repo.get_changeset(rev)
649 _rev = repo.get_changeset(rev)
650 revs.append(_rev)
650 revs.append(_rev)
651 except ChangesetDoesNotExistError:
651 except ChangesetDoesNotExistError:
652 log.error('cannot find revision %s in this repo', rev)
652 log.error('cannot find revision %s in this repo', rev)
653 revs.append(rev)
653 revs.append(rev)
654 else:
654 else:
655 _rev = AttributeDict({
655 _rev = AttributeDict({
656 'short_id': rev[:12],
656 'short_id': rev[:12],
657 'raw_id': rev,
657 'raw_id': rev,
658 'message': '',
658 'message': '',
659 'op': _op,
659 'op': _op,
660 'ref_name': _name
660 'ref_name': _name
661 })
661 })
662 revs.append(_rev)
662 revs.append(_rev)
663 cs_links = [" " + ', '.join(
663 cs_links = [" " + ', '.join(
664 [lnk(rev, repo_name) for rev in revs[:revs_limit]]
664 [lnk(rev, repo_name) for rev in revs[:revs_limit]]
665 )]
665 )]
666 _op1, _name1 = _get_op(revs_ids[0])
666 _op1, _name1 = _get_op(revs_ids[0])
667 _op2, _name2 = _get_op(revs_ids[-1])
667 _op2, _name2 = _get_op(revs_ids[-1])
668
668
669 _rev = '%s...%s' % (_name1, _name2)
669 _rev = '%s...%s' % (_name1, _name2)
670
670
671 compare_view = (
671 compare_view = (
672 ' <div class="compare_view" data-toggle="tooltip" title="%s">'
672 ' <div class="compare_view" data-toggle="tooltip" title="%s">'
673 '<a href="%s">%s</a> </div>' % (
673 '<a href="%s">%s</a> </div>' % (
674 _('Show all combined changesets %s->%s') % (
674 _('Show all combined changesets %s->%s') % (
675 revs_ids[0][:12], revs_ids[-1][:12]
675 revs_ids[0][:12], revs_ids[-1][:12]
676 ),
676 ),
677 url('changeset_home', repo_name=repo_name,
677 url('changeset_home', repo_name=repo_name,
678 revision=_rev
678 revision=_rev
679 ),
679 ),
680 _('Compare view')
680 _('Compare view')
681 )
681 )
682 )
682 )
683
683
684 # if we have exactly one more than normally displayed
684 # if we have exactly one more than normally displayed
685 # just display it, takes less space than displaying
685 # just display it, takes less space than displaying
686 # "and 1 more revisions"
686 # "and 1 more revisions"
687 if len(revs_ids) == revs_limit + 1:
687 if len(revs_ids) == revs_limit + 1:
688 cs_links.append(", " + lnk(revs[revs_limit], repo_name))
688 cs_links.append(", " + lnk(revs[revs_limit], repo_name))
689
689
690 # hidden-by-default ones
690 # hidden-by-default ones
691 if len(revs_ids) > revs_limit + 1:
691 if len(revs_ids) > revs_limit + 1:
692 uniq_id = revs_ids[0]
692 uniq_id = revs_ids[0]
693 html_tmpl = (
693 html_tmpl = (
694 '<span> %s <a class="show_more" id="_%s" '
694 '<span> %s <a class="show_more" id="_%s" '
695 'href="#more">%s</a> %s</span>'
695 'href="#more">%s</a> %s</span>'
696 )
696 )
697 if not feed:
697 if not feed:
698 cs_links.append(html_tmpl % (
698 cs_links.append(html_tmpl % (
699 _('and'),
699 _('and'),
700 uniq_id, _('%s more') % (len(revs_ids) - revs_limit),
700 uniq_id, _('%s more') % (len(revs_ids) - revs_limit),
701 _('revisions')
701 _('revisions')
702 )
702 )
703 )
703 )
704
704
705 if not feed:
705 if not feed:
706 html_tmpl = '<span id="%s" style="display:none">, %s </span>'
706 html_tmpl = '<span id="%s" style="display:none">, %s </span>'
707 else:
707 else:
708 html_tmpl = '<span id="%s"> %s </span>'
708 html_tmpl = '<span id="%s"> %s </span>'
709
709
710 morelinks = ', '.join(
710 morelinks = ', '.join(
711 [lnk(rev, repo_name) for rev in revs[revs_limit:]]
711 [lnk(rev, repo_name) for rev in revs[revs_limit:]]
712 )
712 )
713
713
714 if len(revs_ids) > revs_top_limit:
714 if len(revs_ids) > revs_top_limit:
715 morelinks += ', ...'
715 morelinks += ', ...'
716
716
717 cs_links.append(html_tmpl % (uniq_id, morelinks))
717 cs_links.append(html_tmpl % (uniq_id, morelinks))
718 if len(revs) > 1:
718 if len(revs) > 1:
719 cs_links.append(compare_view)
719 cs_links.append(compare_view)
720 return ''.join(cs_links)
720 return ''.join(cs_links)
721
721
722 def get_fork_name():
722 def get_fork_name():
723 repo_name = action_params
723 repo_name = action_params
724 url_ = url('summary_home', repo_name=repo_name)
724 url_ = url('summary_home', repo_name=repo_name)
725 return _('Fork name %s') % link_to(action_params, url_)
725 return _('Fork name %s') % link_to(action_params, url_)
726
726
727 def get_user_name():
727 def get_user_name():
728 user_name = action_params
728 user_name = action_params
729 return user_name
729 return user_name
730
730
731 def get_users_group():
731 def get_users_group():
732 group_name = action_params
732 group_name = action_params
733 return group_name
733 return group_name
734
734
735 def get_pull_request():
735 def get_pull_request():
736 from kallithea.model.db import PullRequest
736 from kallithea.model.db import PullRequest
737 pull_request_id = action_params
737 pull_request_id = action_params
738 nice_id = PullRequest.make_nice_id(pull_request_id)
738 nice_id = PullRequest.make_nice_id(pull_request_id)
739
739
740 deleted = user_log.repository is None
740 deleted = user_log.repository is None
741 if deleted:
741 if deleted:
742 repo_name = user_log.repository_name
742 repo_name = user_log.repository_name
743 else:
743 else:
744 repo_name = user_log.repository.repo_name
744 repo_name = user_log.repository.repo_name
745
745
746 return link_to(_('Pull request %s') % nice_id,
746 return link_to(_('Pull request %s') % nice_id,
747 url('pullrequest_show', repo_name=repo_name,
747 url('pullrequest_show', repo_name=repo_name,
748 pull_request_id=pull_request_id))
748 pull_request_id=pull_request_id))
749
749
750 def get_archive_name():
750 def get_archive_name():
751 archive_name = action_params
751 archive_name = action_params
752 return archive_name
752 return archive_name
753
753
754 # action : translated str, callback(extractor), icon
754 # action : translated str, callback(extractor), icon
755 action_map = {
755 action_map = {
756 'user_deleted_repo': (_('[deleted] repository'),
756 'user_deleted_repo': (_('[deleted] repository'),
757 None, 'icon-trashcan'),
757 None, 'icon-trashcan'),
758 'user_created_repo': (_('[created] repository'),
758 'user_created_repo': (_('[created] repository'),
759 None, 'icon-plus'),
759 None, 'icon-plus'),
760 'user_created_fork': (_('[created] repository as fork'),
760 'user_created_fork': (_('[created] repository as fork'),
761 None, 'icon-fork'),
761 None, 'icon-fork'),
762 'user_forked_repo': (_('[forked] repository'),
762 'user_forked_repo': (_('[forked] repository'),
763 get_fork_name, 'icon-fork'),
763 get_fork_name, 'icon-fork'),
764 'user_updated_repo': (_('[updated] repository'),
764 'user_updated_repo': (_('[updated] repository'),
765 None, 'icon-pencil'),
765 None, 'icon-pencil'),
766 'user_downloaded_archive': (_('[downloaded] archive from repository'),
766 'user_downloaded_archive': (_('[downloaded] archive from repository'),
767 get_archive_name, 'icon-download-cloud'),
767 get_archive_name, 'icon-download-cloud'),
768 'admin_deleted_repo': (_('[delete] repository'),
768 'admin_deleted_repo': (_('[delete] repository'),
769 None, 'icon-trashcan'),
769 None, 'icon-trashcan'),
770 'admin_created_repo': (_('[created] repository'),
770 'admin_created_repo': (_('[created] repository'),
771 None, 'icon-plus'),
771 None, 'icon-plus'),
772 'admin_forked_repo': (_('[forked] repository'),
772 'admin_forked_repo': (_('[forked] repository'),
773 None, 'icon-fork'),
773 None, 'icon-fork'),
774 'admin_updated_repo': (_('[updated] repository'),
774 'admin_updated_repo': (_('[updated] repository'),
775 None, 'icon-pencil'),
775 None, 'icon-pencil'),
776 'admin_created_user': (_('[created] user'),
776 'admin_created_user': (_('[created] user'),
777 get_user_name, 'icon-user'),
777 get_user_name, 'icon-user'),
778 'admin_updated_user': (_('[updated] user'),
778 'admin_updated_user': (_('[updated] user'),
779 get_user_name, 'icon-user'),
779 get_user_name, 'icon-user'),
780 'admin_created_users_group': (_('[created] user group'),
780 'admin_created_users_group': (_('[created] user group'),
781 get_users_group, 'icon-pencil'),
781 get_users_group, 'icon-pencil'),
782 'admin_updated_users_group': (_('[updated] user group'),
782 'admin_updated_users_group': (_('[updated] user group'),
783 get_users_group, 'icon-pencil'),
783 get_users_group, 'icon-pencil'),
784 'user_commented_revision': (_('[commented] on revision in repository'),
784 'user_commented_revision': (_('[commented] on revision in repository'),
785 get_cs_links, 'icon-comment'),
785 get_cs_links, 'icon-comment'),
786 'user_commented_pull_request': (_('[commented] on pull request for'),
786 'user_commented_pull_request': (_('[commented] on pull request for'),
787 get_pull_request, 'icon-comment'),
787 get_pull_request, 'icon-comment'),
788 'user_closed_pull_request': (_('[closed] pull request for'),
788 'user_closed_pull_request': (_('[closed] pull request for'),
789 get_pull_request, 'icon-ok'),
789 get_pull_request, 'icon-ok'),
790 'push': (_('[pushed] into'),
790 'push': (_('[pushed] into'),
791 get_cs_links, 'icon-move-up'),
791 get_cs_links, 'icon-move-up'),
792 'push_local': (_('[committed via Kallithea] into repository'),
792 'push_local': (_('[committed via Kallithea] into repository'),
793 get_cs_links, 'icon-pencil'),
793 get_cs_links, 'icon-pencil'),
794 'push_remote': (_('[pulled from remote] into repository'),
794 'push_remote': (_('[pulled from remote] into repository'),
795 get_cs_links, 'icon-move-up'),
795 get_cs_links, 'icon-move-up'),
796 'pull': (_('[pulled] from'),
796 'pull': (_('[pulled] from'),
797 None, 'icon-move-down'),
797 None, 'icon-move-down'),
798 'started_following_repo': (_('[started following] repository'),
798 'started_following_repo': (_('[started following] repository'),
799 None, 'icon-heart'),
799 None, 'icon-heart'),
800 'stopped_following_repo': (_('[stopped following] repository'),
800 'stopped_following_repo': (_('[stopped following] repository'),
801 None, 'icon-heart-empty'),
801 None, 'icon-heart-empty'),
802 }
802 }
803
803
804 action_str = action_map.get(action, action)
804 action_str = action_map.get(action, action)
805 if feed:
805 if feed:
806 action = action_str[0].replace('[', '').replace(']', '')
806 action = action_str[0].replace('[', '').replace(']', '')
807 else:
807 else:
808 action = action_str[0] \
808 action = action_str[0] \
809 .replace('[', '<b>') \
809 .replace('[', '<b>') \
810 .replace(']', '</b>')
810 .replace(']', '</b>')
811
811
812 action_params_func = lambda: ""
812 action_params_func = lambda: ""
813
813
814 if callable(action_str[1]):
814 if callable(action_str[1]):
815 action_params_func = action_str[1]
815 action_params_func = action_str[1]
816
816
817 def action_parser_icon():
817 def action_parser_icon():
818 action = user_log.action
818 action = user_log.action
819 action_params = None
819 action_params = None
820 x = action.split(':')
820 x = action.split(':')
821
821
822 if len(x) > 1:
822 if len(x) > 1:
823 action, action_params = x
823 action, action_params = x
824
824
825 ico = action_map.get(action, ['', '', ''])[2]
825 ico = action_map.get(action, ['', '', ''])[2]
826 html = """<i class="%s"></i>""" % ico
826 html = """<i class="%s"></i>""" % ico
827 return literal(html)
827 return literal(html)
828
828
829 # returned callbacks we need to call to get
829 # returned callbacks we need to call to get
830 return [lambda: literal(action), action_params_func, action_parser_icon]
830 return [lambda: literal(action), action_params_func, action_parser_icon]
831
831
832
832
833
833
834 #==============================================================================
834 #==============================================================================
835 # PERMS
835 # PERMS
836 #==============================================================================
836 #==============================================================================
837 from kallithea.lib.auth import HasPermissionAny, \
837 from kallithea.lib.auth import HasPermissionAny, \
838 HasRepoPermissionLevel, HasRepoGroupPermissionLevel
838 HasRepoPermissionLevel, HasRepoGroupPermissionLevel
839
839
840
840
841 #==============================================================================
841 #==============================================================================
842 # GRAVATAR URL
842 # GRAVATAR URL
843 #==============================================================================
843 #==============================================================================
844 def gravatar_div(email_address, cls='', size=30, **div_attributes):
844 def gravatar_div(email_address, cls='', size=30, **div_attributes):
845 """Return an html literal with a span around a gravatar if they are enabled.
845 """Return an html literal with a span around a gravatar if they are enabled.
846 Extra keyword parameters starting with 'div_' will get the prefix removed
846 Extra keyword parameters starting with 'div_' will get the prefix removed
847 and '_' changed to '-' and be used as attributes on the div. The default
847 and '_' changed to '-' and be used as attributes on the div. The default
848 class is 'gravatar'.
848 class is 'gravatar'.
849 """
849 """
850 from tg import tmpl_context as c
850 from tg import tmpl_context as c
851 if not c.visual.use_gravatar:
851 if not c.visual.use_gravatar:
852 return ''
852 return ''
853 if 'div_class' not in div_attributes:
853 if 'div_class' not in div_attributes:
854 div_attributes['div_class'] = "gravatar"
854 div_attributes['div_class'] = "gravatar"
855 attributes = []
855 attributes = []
856 for k, v in sorted(div_attributes.items()):
856 for k, v in sorted(div_attributes.items()):
857 assert k.startswith('div_'), k
857 assert k.startswith('div_'), k
858 attributes.append(' %s="%s"' % (k[4:].replace('_', '-'), escape(v)))
858 attributes.append(' %s="%s"' % (k[4:].replace('_', '-'), escape(v)))
859 return literal("""<span%s>%s</span>""" %
859 return literal("""<span%s>%s</span>""" %
860 (''.join(attributes),
860 (''.join(attributes),
861 gravatar(email_address, cls=cls, size=size)))
861 gravatar(email_address, cls=cls, size=size)))
862
862
863
863
864 def gravatar(email_address, cls='', size=30):
864 def gravatar(email_address, cls='', size=30):
865 """return html element of the gravatar
865 """return html element of the gravatar
866
866
867 This method will return an <img> with the resolution double the size (for
867 This method will return an <img> with the resolution double the size (for
868 retina screens) of the image. If the url returned from gravatar_url is
868 retina screens) of the image. If the url returned from gravatar_url is
869 empty then we fallback to using an icon.
869 empty then we fallback to using an icon.
870
870
871 """
871 """
872 from tg import tmpl_context as c
872 from tg import tmpl_context as c
873 if not c.visual.use_gravatar:
873 if not c.visual.use_gravatar:
874 return ''
874 return ''
875
875
876 src = gravatar_url(email_address, size * 2)
876 src = gravatar_url(email_address, size * 2)
877
877
878 if src:
878 if src:
879 # here it makes sense to use style="width: ..." (instead of, say, a
879 # here it makes sense to use style="width: ..." (instead of, say, a
880 # stylesheet) because we using this to generate a high-res (retina) size
880 # stylesheet) because we using this to generate a high-res (retina) size
881 html = ('<i class="icon-gravatar {cls}"'
881 html = ('<i class="icon-gravatar {cls}"'
882 ' style="font-size: {size}px;background-size: {size}px;background-image: url(\'{src}\')"'
882 ' style="font-size: {size}px;background-size: {size}px;background-image: url(\'{src}\')"'
883 '></i>').format(cls=cls, size=size, src=src)
883 '></i>').format(cls=cls, size=size, src=src)
884
884
885 else:
885 else:
886 # if src is empty then there was no gravatar, so we use a font icon
886 # if src is empty then there was no gravatar, so we use a font icon
887 html = ("""<i class="icon-user {cls}" style="font-size: {size}px;"></i>"""
887 html = ("""<i class="icon-user {cls}" style="font-size: {size}px;"></i>"""
888 .format(cls=cls, size=size, src=src))
888 .format(cls=cls, size=size, src=src))
889
889
890 return literal(html)
890 return literal(html)
891
891
892
892
893 def gravatar_url(email_address, size=30, default=''):
893 def gravatar_url(email_address, size=30, default=''):
894 # doh, we need to re-import those to mock it later
894 # doh, we need to re-import those to mock it later
895 from kallithea.config.routing import url
895 from kallithea.config.routing import url
896 from kallithea.model.db import User
896 from kallithea.model.db import User
897 from tg import tmpl_context as c
897 from tg import tmpl_context as c
898 if not c.visual.use_gravatar:
898 if not c.visual.use_gravatar:
899 return ""
899 return ""
900
900
901 _def = 'anonymous@kallithea-scm.org' # default gravatar
901 _def = 'anonymous@kallithea-scm.org' # default gravatar
902 email_address = email_address or _def
902 email_address = email_address or _def
903
903
904 if email_address == _def:
904 if email_address == _def:
905 return default
905 return default
906
906
907 parsed_url = urlparse.urlparse(url.current(qualified=True))
907 parsed_url = urlparse.urlparse(url.current(qualified=True))
908 url = (c.visual.gravatar_url or User.DEFAULT_GRAVATAR_URL ) \
908 url = (c.visual.gravatar_url or User.DEFAULT_GRAVATAR_URL ) \
909 .replace('{email}', email_address) \
909 .replace('{email}', email_address) \
910 .replace('{md5email}', hashlib.md5(safe_str(email_address).lower()).hexdigest()) \
910 .replace('{md5email}', hashlib.md5(safe_str(email_address).lower()).hexdigest()) \
911 .replace('{netloc}', parsed_url.netloc) \
911 .replace('{netloc}', parsed_url.netloc) \
912 .replace('{scheme}', parsed_url.scheme) \
912 .replace('{scheme}', parsed_url.scheme) \
913 .replace('{size}', safe_str(size))
913 .replace('{size}', safe_str(size))
914 return url
914 return url
915
915
916
916
917 def changed_tooltip(nodes):
917 def changed_tooltip(nodes):
918 """
918 """
919 Generates a html string for changed nodes in changeset page.
919 Generates a html string for changed nodes in changeset page.
920 It limits the output to 30 entries
920 It limits the output to 30 entries
921
921
922 :param nodes: LazyNodesGenerator
922 :param nodes: LazyNodesGenerator
923 """
923 """
924 if nodes:
924 if nodes:
925 pref = ': <br/> '
925 pref = ': <br/> '
926 suf = ''
926 suf = ''
927 if len(nodes) > 30:
927 if len(nodes) > 30:
928 suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
928 suf = '<br/>' + _(' and %s more') % (len(nodes) - 30)
929 return literal(pref + '<br/> '.join([safe_unicode(x.path)
929 return literal(pref + '<br/> '.join([safe_unicode(x.path)
930 for x in nodes[:30]]) + suf)
930 for x in nodes[:30]]) + suf)
931 else:
931 else:
932 return ': ' + _('No files')
932 return ': ' + _('No files')
933
933
934
934
935 def fancy_file_stats(stats):
935 def fancy_file_stats(stats):
936 """
936 """
937 Displays a fancy two colored bar for number of added/deleted
937 Displays a fancy two colored bar for number of added/deleted
938 lines of code on file
938 lines of code on file
939
939
940 :param stats: two element list of added/deleted lines of code
940 :param stats: two element list of added/deleted lines of code
941 """
941 """
942 from kallithea.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
942 from kallithea.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
943 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
943 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE
944
944
945 a, d = stats['added'], stats['deleted']
945 a, d = stats['added'], stats['deleted']
946 width = 100
946 width = 100
947
947
948 if stats['binary']:
948 if stats['binary']:
949 # binary mode
949 # binary mode
950 lbl = ''
950 lbl = ''
951 bin_op = 1
951 bin_op = 1
952
952
953 if BIN_FILENODE in stats['ops']:
953 if BIN_FILENODE in stats['ops']:
954 lbl = 'bin+'
954 lbl = 'bin+'
955
955
956 if NEW_FILENODE in stats['ops']:
956 if NEW_FILENODE in stats['ops']:
957 lbl += _('new file')
957 lbl += _('new file')
958 bin_op = NEW_FILENODE
958 bin_op = NEW_FILENODE
959 elif MOD_FILENODE in stats['ops']:
959 elif MOD_FILENODE in stats['ops']:
960 lbl += _('mod')
960 lbl += _('mod')
961 bin_op = MOD_FILENODE
961 bin_op = MOD_FILENODE
962 elif DEL_FILENODE in stats['ops']:
962 elif DEL_FILENODE in stats['ops']:
963 lbl += _('del')
963 lbl += _('del')
964 bin_op = DEL_FILENODE
964 bin_op = DEL_FILENODE
965 elif RENAMED_FILENODE in stats['ops']:
965 elif RENAMED_FILENODE in stats['ops']:
966 lbl += _('rename')
966 lbl += _('rename')
967 bin_op = RENAMED_FILENODE
967 bin_op = RENAMED_FILENODE
968
968
969 # chmod can go with other operations
969 # chmod can go with other operations
970 if CHMOD_FILENODE in stats['ops']:
970 if CHMOD_FILENODE in stats['ops']:
971 _org_lbl = _('chmod')
971 _org_lbl = _('chmod')
972 lbl += _org_lbl if lbl.endswith('+') else '+%s' % _org_lbl
972 lbl += _org_lbl if lbl.endswith('+') else '+%s' % _org_lbl
973
973
974 #import ipdb;ipdb.set_trace()
974 #import ipdb;ipdb.set_trace()
975 b_d = '<div class="bin bin%s progress-bar" style="width:100%%">%s</div>' % (bin_op, lbl)
975 b_d = '<div class="bin bin%s progress-bar" style="width:100%%">%s</div>' % (bin_op, lbl)
976 b_a = '<div class="bin bin1" style="width:0%"></div>'
976 b_a = '<div class="bin bin1" style="width:0%"></div>'
977 return literal('<div style="width:%spx" class="progress">%s%s</div>' % (width, b_a, b_d))
977 return literal('<div style="width:%spx" class="progress">%s%s</div>' % (width, b_a, b_d))
978
978
979 t = stats['added'] + stats['deleted']
979 t = stats['added'] + stats['deleted']
980 unit = float(width) / (t or 1)
980 unit = float(width) / (t or 1)
981
981
982 # needs > 9% of width to be visible or 0 to be hidden
982 # needs > 9% of width to be visible or 0 to be hidden
983 a_p = max(9, unit * a) if a > 0 else 0
983 a_p = max(9, unit * a) if a > 0 else 0
984 d_p = max(9, unit * d) if d > 0 else 0
984 d_p = max(9, unit * d) if d > 0 else 0
985 p_sum = a_p + d_p
985 p_sum = a_p + d_p
986
986
987 if p_sum > width:
987 if p_sum > width:
988 # adjust the percentage to be == 100% since we adjusted to 9
988 # adjust the percentage to be == 100% since we adjusted to 9
989 if a_p > d_p:
989 if a_p > d_p:
990 a_p = a_p - (p_sum - width)
990 a_p = a_p - (p_sum - width)
991 else:
991 else:
992 d_p = d_p - (p_sum - width)
992 d_p = d_p - (p_sum - width)
993
993
994 a_v = a if a > 0 else ''
994 a_v = a if a > 0 else ''
995 d_v = d if d > 0 else ''
995 d_v = d if d > 0 else ''
996
996
997 d_a = '<div class="added progress-bar" style="width:%s%%">%s</div>' % (
997 d_a = '<div class="added progress-bar" style="width:%s%%">%s</div>' % (
998 a_p, a_v
998 a_p, a_v
999 )
999 )
1000 d_d = '<div class="deleted progress-bar" style="width:%s%%">%s</div>' % (
1000 d_d = '<div class="deleted progress-bar" style="width:%s%%">%s</div>' % (
1001 d_p, d_v
1001 d_p, d_v
1002 )
1002 )
1003 return literal('<div class="progress" style="width:%spx">%s%s</div>' % (width, d_a, d_d))
1003 return literal('<div class="progress" style="width:%spx">%s%s</div>' % (width, d_a, d_d))
1004
1004
1005
1005
1006 _URLIFY_RE = re.compile(r'''
1006 _URLIFY_RE = re.compile(r'''
1007 # URL markup
1007 # URL markup
1008 (?P<url>%s) |
1008 (?P<url>%s) |
1009 # @mention markup
1009 # @mention markup
1010 (?P<mention>%s) |
1010 (?P<mention>%s) |
1011 # Changeset hash markup
1011 # Changeset hash markup
1012 (?<!\w|[-_])
1012 (?<!\w|[-_])
1013 (?P<hash>[0-9a-f]{12,40})
1013 (?P<hash>[0-9a-f]{12,40})
1014 (?!\w|[-_]) |
1014 (?!\w|[-_]) |
1015 # Markup of *bold text*
1015 # Markup of *bold text*
1016 (?:
1016 (?:
1017 (?:^|(?<=\s))
1017 (?:^|(?<=\s))
1018 (?P<bold> [*] (?!\s) [^*\n]* (?<!\s) [*] )
1018 (?P<bold> [*] (?!\s) [^*\n]* (?<!\s) [*] )
1019 (?![*\w])
1019 (?![*\w])
1020 ) |
1020 ) |
1021 # "Stylize" markup
1021 # "Stylize" markup
1022 \[see\ \=&gt;\ *(?P<seen>[a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\] |
1022 \[see\ \=&gt;\ *(?P<seen>[a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\] |
1023 \[license\ \=&gt;\ *(?P<license>[a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\] |
1023 \[license\ \=&gt;\ *(?P<license>[a-zA-Z0-9\/\=\?\&\ \:\/\.\-]*)\] |
1024 \[(?P<tagtype>requires|recommends|conflicts|base)\ \=&gt;\ *(?P<tagvalue>[a-zA-Z0-9\-\/]*)\] |
1024 \[(?P<tagtype>requires|recommends|conflicts|base)\ \=&gt;\ *(?P<tagvalue>[a-zA-Z0-9\-\/]*)\] |
1025 \[(?:lang|language)\ \=&gt;\ *(?P<lang>[a-zA-Z\-\/\#\+]*)\] |
1025 \[(?:lang|language)\ \=&gt;\ *(?P<lang>[a-zA-Z\-\/\#\+]*)\] |
1026 \[(?P<tag>[a-z]+)\]
1026 \[(?P<tag>[a-z]+)\]
1027 ''' % (url_re.pattern, MENTIONS_REGEX.pattern),
1027 ''' % (url_re.pattern, MENTIONS_REGEX.pattern),
1028 re.VERBOSE | re.MULTILINE | re.IGNORECASE)
1028 re.VERBOSE | re.MULTILINE | re.IGNORECASE)
1029
1029
1030
1030
1031 def urlify_text(s, repo_name=None, link_=None, truncate=None, stylize=False, truncatef=truncate):
1031 def urlify_text(s, repo_name=None, link_=None, truncate=None, stylize=False, truncatef=truncate):
1032 """
1032 """
1033 Parses given text message and make literal html with markup.
1033 Parses given text message and make literal html with markup.
1034 The text will be truncated to the specified length.
1034 The text will be truncated to the specified length.
1035 Hashes are turned into changeset links to specified repository.
1035 Hashes are turned into changeset links to specified repository.
1036 URLs links to what they say.
1036 URLs links to what they say.
1037 Issues are linked to given issue-server.
1037 Issues are linked to given issue-server.
1038 If link_ is provided, all text not already linking somewhere will link there.
1038 If link_ is provided, all text not already linking somewhere will link there.
1039 """
1039 """
1040
1040
1041 def _replace(match_obj):
1041 def _replace(match_obj):
1042 url = match_obj.group('url')
1042 url = match_obj.group('url')
1043 if url is not None:
1043 if url is not None:
1044 return '<a href="%(url)s">%(url)s</a>' % {'url': url}
1044 return '<a href="%(url)s">%(url)s</a>' % {'url': url}
1045 mention = match_obj.group('mention')
1045 mention = match_obj.group('mention')
1046 if mention is not None:
1046 if mention is not None:
1047 return '<b>%s</b>' % mention
1047 return '<b>%s</b>' % mention
1048 hash_ = match_obj.group('hash')
1048 hash_ = match_obj.group('hash')
1049 if hash_ is not None and repo_name is not None:
1049 if hash_ is not None and repo_name is not None:
1050 from kallithea.config.routing import url # doh, we need to re-import url to mock it later
1050 from kallithea.config.routing import url # doh, we need to re-import url to mock it later
1051 return '<a class="changeset_hash" href="%(url)s">%(hash)s</a>' % {
1051 return '<a class="changeset_hash" href="%(url)s">%(hash)s</a>' % {
1052 'url': url('changeset_home', repo_name=repo_name, revision=hash_),
1052 'url': url('changeset_home', repo_name=repo_name, revision=hash_),
1053 'hash': hash_,
1053 'hash': hash_,
1054 }
1054 }
1055 bold = match_obj.group('bold')
1055 bold = match_obj.group('bold')
1056 if bold is not None:
1056 if bold is not None:
1057 return '<b>*%s*</b>' % _urlify(bold[1:-1])
1057 return '<b>*%s*</b>' % _urlify(bold[1:-1])
1058 if stylize:
1058 if stylize:
1059 seen = match_obj.group('seen')
1059 seen = match_obj.group('seen')
1060 if seen:
1060 if seen:
1061 return '<div class="label label-meta" data-tag="see">see =&gt; %s</div>' % seen
1061 return '<div class="label label-meta" data-tag="see">see =&gt; %s</div>' % seen
1062 license = match_obj.group('license')
1062 license = match_obj.group('license')
1063 if license:
1063 if license:
1064 return '<div class="label label-meta" data-tag="license"><a href="http:\/\/www.opensource.org/licenses/%s">%s</a></div>' % (license, license)
1064 return '<div class="label label-meta" data-tag="license"><a href="http:\/\/www.opensource.org/licenses/%s">%s</a></div>' % (license, license)
1065 tagtype = match_obj.group('tagtype')
1065 tagtype = match_obj.group('tagtype')
1066 if tagtype:
1066 if tagtype:
1067 tagvalue = match_obj.group('tagvalue')
1067 tagvalue = match_obj.group('tagvalue')
1068 return '<div class="label label-meta" data-tag="%s">%s =&gt; <a href="/%s">%s</a></div>' % (tagtype, tagtype, tagvalue, tagvalue)
1068 return '<div class="label label-meta" data-tag="%s">%s =&gt; <a href="/%s">%s</a></div>' % (tagtype, tagtype, tagvalue, tagvalue)
1069 lang = match_obj.group('lang')
1069 lang = match_obj.group('lang')
1070 if lang:
1070 if lang:
1071 return '<div class="label label-meta" data-tag="lang">%s</div>' % lang
1071 return '<div class="label label-meta" data-tag="lang">%s</div>' % lang
1072 tag = match_obj.group('tag')
1072 tag = match_obj.group('tag')
1073 if tag:
1073 if tag:
1074 return '<div class="label label-meta" data-tag="%s">%s</div>' % (tag, tag)
1074 return '<div class="label label-meta" data-tag="%s">%s</div>' % (tag, tag)
1075 return match_obj.group(0)
1075 return match_obj.group(0)
1076
1076
1077 def _urlify(s):
1077 def _urlify(s):
1078 """
1078 """
1079 Extract urls from text and make html links out of them
1079 Extract urls from text and make html links out of them
1080 """
1080 """
1081 return _URLIFY_RE.sub(_replace, s)
1081 return _URLIFY_RE.sub(_replace, s)
1082
1082
1083 if truncate is None:
1083 if truncate is None:
1084 s = s.rstrip()
1084 s = s.rstrip()
1085 else:
1085 else:
1086 s = truncatef(s, truncate, whole_word=True)
1086 s = truncatef(s, truncate, whole_word=True)
1087 s = html_escape(s)
1087 s = html_escape(s)
1088 s = _urlify(s)
1088 s = _urlify(s)
1089 if repo_name is not None:
1089 if repo_name is not None:
1090 s = urlify_issues(s, repo_name)
1090 s = urlify_issues(s, repo_name)
1091 if link_ is not None:
1091 if link_ is not None:
1092 # make href around everything that isn't a href already
1092 # make href around everything that isn't a href already
1093 s = linkify_others(s, link_)
1093 s = linkify_others(s, link_)
1094 s = s.replace('\r\n', '<br/>').replace('\n', '<br/>')
1094 s = s.replace('\r\n', '<br/>').replace('\n', '<br/>')
1095 return literal(s)
1095 return literal(s)
1096
1096
1097
1097
1098 def linkify_others(t, l):
1098 def linkify_others(t, l):
1099 """Add a default link to html with links.
1099 """Add a default link to html with links.
1100 HTML doesn't allow nesting of links, so the outer link must be broken up
1100 HTML doesn't allow nesting of links, so the outer link must be broken up
1101 in pieces and give space for other links.
1101 in pieces and give space for other links.
1102 """
1102 """
1103 urls = re.compile(r'(\<a.*?\<\/a\>)',)
1103 urls = re.compile(r'(\<a.*?\<\/a\>)',)
1104 links = []
1104 links = []
1105 for e in urls.split(t):
1105 for e in urls.split(t):
1106 if e.strip() and not urls.match(e):
1106 if e.strip() and not urls.match(e):
1107 links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
1107 links.append('<a class="message-link" href="%s">%s</a>' % (l, e))
1108 else:
1108 else:
1109 links.append(e)
1109 links.append(e)
1110
1110
1111 return ''.join(links)
1111 return ''.join(links)
1112
1112
1113
1113
1114 # Global variable that will hold the actual urlify_issues function body.
1114 # Global variable that will hold the actual urlify_issues function body.
1115 # Will be set on first use when the global configuration has been read.
1115 # Will be set on first use when the global configuration has been read.
1116 _urlify_issues_f = None
1116 _urlify_issues_f = None
1117
1117
1118
1118
1119 def urlify_issues(newtext, repo_name):
1119 def urlify_issues(newtext, repo_name):
1120 """Urlify issue references according to .ini configuration"""
1120 """Urlify issue references according to .ini configuration"""
1121 global _urlify_issues_f
1121 global _urlify_issues_f
1122 if _urlify_issues_f is None:
1122 if _urlify_issues_f is None:
1123 from kallithea import CONFIG
1123 from kallithea import CONFIG
1124 from kallithea.model.db import URL_SEP
1124 from kallithea.model.db import URL_SEP
1125 assert CONFIG['sqlalchemy.url'] # make sure config has been loaded
1125 assert CONFIG['sqlalchemy.url'] # make sure config has been loaded
1126
1126
1127 # Build chain of urlify functions, starting with not doing any transformation
1127 # Build chain of urlify functions, starting with not doing any transformation
1128 tmp_urlify_issues_f = lambda s: s
1128 tmp_urlify_issues_f = lambda s: s
1129
1129
1130 issue_pat_re = re.compile(r'issue_pat(.*)')
1130 issue_pat_re = re.compile(r'issue_pat(.*)')
1131 for k in CONFIG.keys():
1131 for k in CONFIG.keys():
1132 # Find all issue_pat* settings that also have corresponding server_link and prefix configuration
1132 # Find all issue_pat* settings that also have corresponding server_link and prefix configuration
1133 m = issue_pat_re.match(k)
1133 m = issue_pat_re.match(k)
1134 if m is None:
1134 if m is None:
1135 continue
1135 continue
1136 suffix = m.group(1)
1136 suffix = m.group(1)
1137 issue_pat = CONFIG.get(k)
1137 issue_pat = CONFIG.get(k)
1138 issue_server_link = CONFIG.get('issue_server_link%s' % suffix)
1138 issue_server_link = CONFIG.get('issue_server_link%s' % suffix)
1139 issue_prefix = CONFIG.get('issue_prefix%s' % suffix)
1139 issue_prefix = CONFIG.get('issue_prefix%s' % suffix)
1140 if issue_pat and issue_server_link and issue_prefix:
1140 if issue_pat and issue_server_link and issue_prefix:
1141 log.debug('issue pattern %r: %r -> %r %r', suffix, issue_pat, issue_server_link, issue_prefix)
1141 log.debug('issue pattern %r: %r -> %r %r', suffix, issue_pat, issue_server_link, issue_prefix)
1142 else:
1142 else:
1143 log.error('skipping incomplete issue pattern %r: %r -> %r %r', suffix, issue_pat, issue_server_link, issue_prefix)
1143 log.error('skipping incomplete issue pattern %r: %r -> %r %r', suffix, issue_pat, issue_server_link, issue_prefix)
1144 continue
1144 continue
1145
1145
1146 # Wrap tmp_urlify_issues_f with substitution of this pattern, while making sure all loop variables (and compiled regexpes) are bound
1146 # Wrap tmp_urlify_issues_f with substitution of this pattern, while making sure all loop variables (and compiled regexpes) are bound
1147 issue_re = re.compile(issue_pat)
1147 issue_re = re.compile(issue_pat)
1148
1148
1149 def issues_replace(match_obj,
1149 def issues_replace(match_obj,
1150 issue_server_link=issue_server_link, issue_prefix=issue_prefix):
1150 issue_server_link=issue_server_link, issue_prefix=issue_prefix):
1151 leadingspace = ' ' if match_obj.group().startswith(' ') else ''
1151 leadingspace = ' ' if match_obj.group().startswith(' ') else ''
1152 issue_id = ''.join(match_obj.groups())
1152 issue_id = ''.join(match_obj.groups())
1153 issue_url = issue_server_link.replace('{id}', issue_id)
1153 issue_url = issue_server_link.replace('{id}', issue_id)
1154 issue_url = issue_url.replace('{repo}', repo_name)
1154 issue_url = issue_url.replace('{repo}', repo_name)
1155 issue_url = issue_url.replace('{repo_name}', repo_name.split(URL_SEP)[-1])
1155 issue_url = issue_url.replace('{repo_name}', repo_name.split(URL_SEP)[-1])
1156 return (
1156 return (
1157 '%(leadingspace)s<a class="issue-tracker-link" href="%(url)s">'
1157 '%(leadingspace)s<a class="issue-tracker-link" href="%(url)s">'
1158 '%(issue-prefix)s%(id-repr)s'
1158 '%(issue-prefix)s%(id-repr)s'
1159 '</a>'
1159 '</a>'
1160 ) % {
1160 ) % {
1161 'leadingspace': leadingspace,
1161 'leadingspace': leadingspace,
1162 'url': issue_url,
1162 'url': issue_url,
1163 'id-repr': issue_id,
1163 'id-repr': issue_id,
1164 'issue-prefix': issue_prefix,
1164 'issue-prefix': issue_prefix,
1165 'serv': issue_server_link,
1165 'serv': issue_server_link,
1166 }
1166 }
1167 tmp_urlify_issues_f = (lambda s,
1167 tmp_urlify_issues_f = (lambda s,
1168 issue_re=issue_re, issues_replace=issues_replace, chain_f=tmp_urlify_issues_f:
1168 issue_re=issue_re, issues_replace=issues_replace, chain_f=tmp_urlify_issues_f:
1169 issue_re.sub(issues_replace, chain_f(s)))
1169 issue_re.sub(issues_replace, chain_f(s)))
1170
1170
1171 # Set tmp function globally - atomically
1171 # Set tmp function globally - atomically
1172 _urlify_issues_f = tmp_urlify_issues_f
1172 _urlify_issues_f = tmp_urlify_issues_f
1173
1173
1174 return _urlify_issues_f(newtext)
1174 return _urlify_issues_f(newtext)
1175
1175
1176
1176
1177 def render_w_mentions(source, repo_name=None):
1177 def render_w_mentions(source, repo_name=None):
1178 """
1178 """
1179 Render plain text with revision hashes and issue references urlified
1179 Render plain text with revision hashes and issue references urlified
1180 and with @mention highlighting.
1180 and with @mention highlighting.
1181 """
1181 """
1182 s = safe_unicode(source)
1182 s = safe_unicode(source)
1183 s = urlify_text(s, repo_name=repo_name)
1183 s = urlify_text(s, repo_name=repo_name)
1184 return literal('<div class="formatted-fixed">%s</div>' % s)
1184 return literal('<div class="formatted-fixed">%s</div>' % s)
1185
1185
1186
1186
1187 def short_ref(ref_type, ref_name):
1187 def short_ref(ref_type, ref_name):
1188 if ref_type == 'rev':
1188 if ref_type == 'rev':
1189 return short_id(ref_name)
1189 return short_id(ref_name)
1190 return ref_name
1190 return ref_name
1191
1191
1192
1192
1193 def link_to_ref(repo_name, ref_type, ref_name, rev=None):
1193 def link_to_ref(repo_name, ref_type, ref_name, rev=None):
1194 """
1194 """
1195 Return full markup for a href to changeset_home for a changeset.
1195 Return full markup for a href to changeset_home for a changeset.
1196 If ref_type is branch it will link to changelog.
1196 If ref_type is branch it will link to changelog.
1197 ref_name is shortened if ref_type is 'rev'.
1197 ref_name is shortened if ref_type is 'rev'.
1198 if rev is specified show it too, explicitly linking to that revision.
1198 if rev is specified show it too, explicitly linking to that revision.
1199 """
1199 """
1200 txt = short_ref(ref_type, ref_name)
1200 txt = short_ref(ref_type, ref_name)
1201 if ref_type == 'branch':
1201 if ref_type == 'branch':
1202 u = url('changelog_home', repo_name=repo_name, branch=ref_name)
1202 u = url('changelog_home', repo_name=repo_name, branch=ref_name)
1203 else:
1203 else:
1204 u = url('changeset_home', repo_name=repo_name, revision=ref_name)
1204 u = url('changeset_home', repo_name=repo_name, revision=ref_name)
1205 l = link_to(repo_name + '#' + txt, u)
1205 l = link_to(repo_name + '#' + txt, u)
1206 if rev and ref_type != 'rev':
1206 if rev and ref_type != 'rev':
1207 l = literal('%s (%s)' % (l, link_to(short_id(rev), url('changeset_home', repo_name=repo_name, revision=rev))))
1207 l = literal('%s (%s)' % (l, link_to(short_id(rev), url('changeset_home', repo_name=repo_name, revision=rev))))
1208 return l
1208 return l
1209
1209
1210
1210
1211 def changeset_status(repo, revision):
1211 def changeset_status(repo, revision):
1212 from kallithea.model.changeset_status import ChangesetStatusModel
1212 from kallithea.model.changeset_status import ChangesetStatusModel
1213 return ChangesetStatusModel().get_status(repo, revision)
1213 return ChangesetStatusModel().get_status(repo, revision)
1214
1214
1215
1215
1216 def changeset_status_lbl(changeset_status):
1216 def changeset_status_lbl(changeset_status):
1217 from kallithea.model.db import ChangesetStatus
1217 from kallithea.model.db import ChangesetStatus
1218 return ChangesetStatus.get_status_lbl(changeset_status)
1218 return ChangesetStatus.get_status_lbl(changeset_status)
1219
1219
1220
1220
1221 def get_permission_name(key):
1221 def get_permission_name(key):
1222 from kallithea.model.db import Permission
1222 from kallithea.model.db import Permission
1223 return dict(Permission.PERMS).get(key)
1223 return dict(Permission.PERMS).get(key)
1224
1224
1225
1225
1226 def journal_filter_help():
1226 def journal_filter_help():
1227 return _(textwrap.dedent('''
1227 return _(textwrap.dedent('''
1228 Example filter terms:
1228 Example filter terms:
1229 repository:vcs
1229 repository:vcs
1230 username:developer
1230 username:developer
1231 action:*push*
1231 action:*push*
1232 ip:127.0.0.1
1232 ip:127.0.0.1
1233 date:20120101
1233 date:20120101
1234 date:[20120101100000 TO 20120102]
1234 date:[20120101100000 TO 20120102]
1235
1235
1236 Generate wildcards using '*' character:
1236 Generate wildcards using '*' character:
1237 "repository:vcs*" - search everything starting with 'vcs'
1237 "repository:vcs*" - search everything starting with 'vcs'
1238 "repository:*vcs*" - search for repository containing 'vcs'
1238 "repository:*vcs*" - search for repository containing 'vcs'
1239
1239
1240 Optional AND / OR operators in queries
1240 Optional AND / OR operators in queries
1241 "repository:vcs OR repository:test"
1241 "repository:vcs OR repository:test"
1242 "username:test AND repository:test*"
1242 "username:test AND repository:test*"
1243 '''))
1243 '''))
1244
1244
1245
1245
1246 def not_mapped_error(repo_name):
1246 def not_mapped_error(repo_name):
1247 flash(_('%s repository is not mapped to db perhaps'
1247 flash(_('%s repository is not mapped to db perhaps'
1248 ' it was created or renamed from the filesystem'
1248 ' it was created or renamed from the filesystem'
1249 ' please run the application again'
1249 ' please run the application again'
1250 ' in order to rescan repositories') % repo_name, category='error')
1250 ' in order to rescan repositories') % repo_name, category='error')
1251
1251
1252
1252
1253 def ip_range(ip_addr):
1253 def ip_range(ip_addr):
1254 from kallithea.model.db import UserIpMap
1254 from kallithea.model.db import UserIpMap
1255 s, e = UserIpMap._get_ip_range(ip_addr)
1255 s, e = UserIpMap._get_ip_range(ip_addr)
1256 return '%s - %s' % (s, e)
1256 return '%s - %s' % (s, e)
1257
1257
1258
1258
1259 def form(url, method="post", **attrs):
1259 def form(url, method="post", **attrs):
1260 """Like webhelpers.html.tags.form but automatically using secure_form with
1260 """Like webhelpers.html.tags.form but automatically using secure_form with
1261 authentication_token for POST. authentication_token is thus never leaked
1261 authentication_token for POST. authentication_token is thus never leaked
1262 in the URL."""
1262 in the URL."""
1263 if method.lower() == 'get':
1263 if method.lower() == 'get':
1264 return insecure_form(url, method=method, **attrs)
1264 return insecure_form(url, method=method, **attrs)
1265 # webhelpers will turn everything but GET into POST
1265 # webhelpers will turn everything but GET into POST
1266 return secure_form(url, method=method, **attrs)
1266 return secure_form(url, method=method, **attrs)
@@ -1,2785 +1,2785 b''
1 <!doctype html>
1 <!doctype html>
2 <html lang="en">
2 <html lang="en">
3 <head><title>Notifications</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
3 <head><title>Notifications</title><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"></head>
4 <body>
4 <body>
5 <hr/>
5 <hr/>
6 <h1>cs_comment, is_mention=False, status_change=None</h1>
6 <h1>cs_comment, is_mention=False, status_change=None</h1>
7 <pre>
7 <pre>
8 From: u1
8 From: u1
9 To: u2@example.com
9 To: u2@example.com
10 Subject: [Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
10 Subject: [Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
11 </pre>
11 </pre>
12 <hr/>
12 <hr/>
13 <pre>http://comment.org
13 <pre>http://comment.org
14
14
15 Comment on Changeset "This changeset did something clever which is hard to explain"
15 Comment on Changeset "This changeset did something clever which is hard to explain"
16
16
17
17
18 Opinionated User (jsmith):
18 Opinionated User (jsmith):
19
19
20 This is the new 'comment'.
20 This is the new 'comment'.
21
21
22 - and here it ends indented.
22 - and here it ends indented.
23
23
24
24
25 Changeset on http://example.com/repo_target branch brunch:
25 Changeset on http://example.com/repo_target branch brunch:
26 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
26 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
27
27
28
28
29 View Comment: http://comment.org
29 View Comment: http://comment.org
30 </pre>
30 </pre>
31 <hr/>
31 <hr/>
32 <!--!doctype html-->
32 <!--!doctype html-->
33 <!--html lang="en"-->
33 <!--html lang="en"-->
34 <!--head-->
34 <!--head-->
35 <!--title--><!--/title-->
35 <!--title--><!--/title-->
36 <!--meta name="viewport" content="width=device-width"-->
36 <!--meta name="viewport" content="width=device-width"-->
37 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
37 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
38 <!--/head-->
38 <!--/head-->
39 <!--body-->
39 <!--body-->
40 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
40 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
41 <tr>
41 <tr>
42 <td width="30px" style="width:30px"></td>
42 <td width="30px" style="width:30px"></td>
43 <td>
43 <td>
44 <table width="100%" cellpadding="0" cellspacing="0" border="0"
44 <table width="100%" cellpadding="0" cellspacing="0" border="0"
45 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
45 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
46 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
46 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
47 <tr>
47 <tr>
48 <td colspan="3">
48 <td colspan="3">
49 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
49 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
50 style="border-bottom:1px solid #ddd">
50 style="border-bottom:1px solid #ddd">
51 <tr>
51 <tr>
52 <td height="20px" style="height:20px" colspan="3"></td>
52 <td height="20px" style="height:20px" colspan="3"></td>
53 </tr>
53 </tr>
54 <tr>
54 <tr>
55 <td width="30px" style="width:30px"></td>
55 <td width="30px" style="width:30px"></td>
56 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
56 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
57 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
57 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
58 target="_blank">Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
58 target="_blank">Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
59 </td>
59 </td>
60 <td width="30px" style="width:30px"></td>
60 <td width="30px" style="width:30px"></td>
61 </tr>
61 </tr>
62 <tr>
62 <tr>
63 <td height="20px" style="height:20px" colspan="3"></td>
63 <td height="20px" style="height:20px" colspan="3"></td>
64 </tr>
64 </tr>
65 </table>
65 </table>
66 </td>
66 </td>
67 </tr>
67 </tr>
68 <tr>
68 <tr>
69 <td height="30px" style="height:30px" colspan="3"></td>
69 <td height="30px" style="height:30px" colspan="3"></td>
70 </tr>
70 </tr>
71 <tr>
71 <tr>
72 <td></td>
72 <td></td>
73 <td>
73 <td>
74 <table cellpadding="0" cellspacing="0" border="0" width="100%">
74 <table cellpadding="0" cellspacing="0" border="0" width="100%">
75 <tr>
75 <tr>
76 <td>
76 <td>
77 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
77 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
78 <tr>
78 <tr>
79 <td height="10px" style="height:10px" colspan="3"></td>
79 <td height="10px" style="height:10px" colspan="3"></td>
80 </tr>
80 </tr>
81 <tr>
81 <tr>
82 <td width="20px" style="width:20px"></td>
82 <td width="20px" style="width:20px"></td>
83 <td>
83 <td>
84 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
84 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
85 </td>
85 </td>
86 <td width="20px" style="width:20px"></td>
86 <td width="20px" style="width:20px"></td>
87 </tr>
87 </tr>
88 <tr>
88 <tr>
89 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
89 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
90 </tr>
90 </tr>
91 <tr>
91 <tr>
92 <td height="10px" style="height:10px" colspan="3"></td>
92 <td height="10px" style="height:10px" colspan="3"></td>
93 </tr>
93 </tr>
94 <tr>
94 <tr>
95 <td width="20px" style="width:20px"></td>
95 <td width="20px" style="width:20px"></td>
96 <td>
96 <td>
97 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &apos;comment&apos;.<br/><br/> - and here it ends indented.</div></div>
97 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &#39;comment&#39;.<br/><br/> - and here it ends indented.</div></div>
98 </td>
98 </td>
99 <td width="20px" style="width:20px"></td>
99 <td width="20px" style="width:20px"></td>
100 </tr>
100 </tr>
101 <tr>
101 <tr>
102 <td height="10px" style="height:10px" colspan="3"></td>
102 <td height="10px" style="height:10px" colspan="3"></td>
103 </tr>
103 </tr>
104 </table>
104 </table>
105 </td>
105 </td>
106 </tr>
106 </tr>
107 <tr>
107 <tr>
108 <td height="30px" style="height:30px"></td>
108 <td height="30px" style="height:30px"></td>
109 </tr>
109 </tr>
110 <tr>
110 <tr>
111 <td>
111 <td>
112 <div>
112 <div>
113 Changeset on
113 Changeset on
114 <a style="color:#395fa0;text-decoration:none"
114 <a style="color:#395fa0;text-decoration:none"
115 href="http://example.com/repo_target">http://example.com/repo_target</a>
115 href="http://example.com/repo_target">http://example.com/repo_target</a>
116 branch
116 branch
117 <span style="color:#395fa0">brunch</span>:
117 <span style="color:#395fa0">brunch</span>:
118 </div>
118 </div>
119 <div>
119 <div>
120 "<a style="color:#395fa0;text-decoration:none"
120 "<a style="color:#395fa0;text-decoration:none"
121 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
121 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
122 by
122 by
123 <span style="color:#395fa0">u2 u3 (u2)</span>.
123 <span style="color:#395fa0">u2 u3 (u2)</span>.
124 </div>
124 </div>
125 </td>
125 </td>
126 </tr>
126 </tr>
127 <tr>
127 <tr>
128 <td>
128 <td>
129 <center>
129 <center>
130 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
130 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
131 <tr>
131 <tr>
132 <td height="25px" style="height:25px"></td>
132 <td height="25px" style="height:25px"></td>
133 </tr>
133 </tr>
134 <tr>
134 <tr>
135 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
135 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
136 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
136 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
137 <center>
137 <center>
138 <font size="3">
138 <font size="3">
139 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
139 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
140 </font>
140 </font>
141 </center>
141 </center>
142 </a>
142 </a>
143 </td>
143 </td>
144 </tr>
144 </tr>
145 </table>
145 </table>
146 </center>
146 </center>
147 </td>
147 </td>
148 </tr>
148 </tr>
149 </table>
149 </table>
150 </td>
150 </td>
151 <td></td>
151 <td></td>
152 </tr>
152 </tr>
153 <tr>
153 <tr>
154 <td height="30px" style="height:30px" colspan="3"></td>
154 <td height="30px" style="height:30px" colspan="3"></td>
155 </tr>
155 </tr>
156 </table>
156 </table>
157 </td>
157 </td>
158 <td width="30px" style="width:30px"></td>
158 <td width="30px" style="width:30px"></td>
159 </tr>
159 </tr>
160 </table>
160 </table>
161 <!--/body-->
161 <!--/body-->
162 <!--/html-->
162 <!--/html-->
163 <hr/>
163 <hr/>
164 <hr/>
164 <hr/>
165 <h1>cs_comment, is_mention=True, status_change=None</h1>
165 <h1>cs_comment, is_mention=True, status_change=None</h1>
166 <pre>
166 <pre>
167 From: u1
167 From: u1
168 To: u2@example.com
168 To: u2@example.com
169 Subject: [Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
169 Subject: [Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
170 </pre>
170 </pre>
171 <hr/>
171 <hr/>
172 <pre>http://comment.org
172 <pre>http://comment.org
173
173
174 Mention in Comment on Changeset "This changeset did something clever which is hard to explain"
174 Mention in Comment on Changeset "This changeset did something clever which is hard to explain"
175
175
176
176
177 Opinionated User (jsmith):
177 Opinionated User (jsmith):
178
178
179 This is the new 'comment'.
179 This is the new 'comment'.
180
180
181 - and here it ends indented.
181 - and here it ends indented.
182
182
183
183
184 Changeset on http://example.com/repo_target branch brunch:
184 Changeset on http://example.com/repo_target branch brunch:
185 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
185 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
186
186
187
187
188 View Comment: http://comment.org
188 View Comment: http://comment.org
189 </pre>
189 </pre>
190 <hr/>
190 <hr/>
191 <!--!doctype html-->
191 <!--!doctype html-->
192 <!--html lang="en"-->
192 <!--html lang="en"-->
193 <!--head-->
193 <!--head-->
194 <!--title--><!--/title-->
194 <!--title--><!--/title-->
195 <!--meta name="viewport" content="width=device-width"-->
195 <!--meta name="viewport" content="width=device-width"-->
196 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
196 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
197 <!--/head-->
197 <!--/head-->
198 <!--body-->
198 <!--body-->
199 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
199 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
200 <tr>
200 <tr>
201 <td width="30px" style="width:30px"></td>
201 <td width="30px" style="width:30px"></td>
202 <td>
202 <td>
203 <table width="100%" cellpadding="0" cellspacing="0" border="0"
203 <table width="100%" cellpadding="0" cellspacing="0" border="0"
204 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
204 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
205 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
205 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
206 <tr>
206 <tr>
207 <td colspan="3">
207 <td colspan="3">
208 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
208 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
209 style="border-bottom:1px solid #ddd">
209 style="border-bottom:1px solid #ddd">
210 <tr>
210 <tr>
211 <td height="20px" style="height:20px" colspan="3"></td>
211 <td height="20px" style="height:20px" colspan="3"></td>
212 </tr>
212 </tr>
213 <tr>
213 <tr>
214 <td width="30px" style="width:30px"></td>
214 <td width="30px" style="width:30px"></td>
215 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
215 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
216 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
216 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
217 target="_blank">Mention in Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
217 target="_blank">Mention in Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
218 </td>
218 </td>
219 <td width="30px" style="width:30px"></td>
219 <td width="30px" style="width:30px"></td>
220 </tr>
220 </tr>
221 <tr>
221 <tr>
222 <td height="20px" style="height:20px" colspan="3"></td>
222 <td height="20px" style="height:20px" colspan="3"></td>
223 </tr>
223 </tr>
224 </table>
224 </table>
225 </td>
225 </td>
226 </tr>
226 </tr>
227 <tr>
227 <tr>
228 <td height="30px" style="height:30px" colspan="3"></td>
228 <td height="30px" style="height:30px" colspan="3"></td>
229 </tr>
229 </tr>
230 <tr>
230 <tr>
231 <td></td>
231 <td></td>
232 <td>
232 <td>
233 <table cellpadding="0" cellspacing="0" border="0" width="100%">
233 <table cellpadding="0" cellspacing="0" border="0" width="100%">
234 <tr>
234 <tr>
235 <td>
235 <td>
236 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
236 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
237 <tr>
237 <tr>
238 <td height="10px" style="height:10px" colspan="3"></td>
238 <td height="10px" style="height:10px" colspan="3"></td>
239 </tr>
239 </tr>
240 <tr>
240 <tr>
241 <td width="20px" style="width:20px"></td>
241 <td width="20px" style="width:20px"></td>
242 <td>
242 <td>
243 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
243 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
244 </td>
244 </td>
245 <td width="20px" style="width:20px"></td>
245 <td width="20px" style="width:20px"></td>
246 </tr>
246 </tr>
247 <tr>
247 <tr>
248 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
248 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
249 </tr>
249 </tr>
250 <tr>
250 <tr>
251 <td height="10px" style="height:10px" colspan="3"></td>
251 <td height="10px" style="height:10px" colspan="3"></td>
252 </tr>
252 </tr>
253 <tr>
253 <tr>
254 <td width="20px" style="width:20px"></td>
254 <td width="20px" style="width:20px"></td>
255 <td>
255 <td>
256 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &apos;comment&apos;.<br/><br/> - and here it ends indented.</div></div>
256 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &#39;comment&#39;.<br/><br/> - and here it ends indented.</div></div>
257 </td>
257 </td>
258 <td width="20px" style="width:20px"></td>
258 <td width="20px" style="width:20px"></td>
259 </tr>
259 </tr>
260 <tr>
260 <tr>
261 <td height="10px" style="height:10px" colspan="3"></td>
261 <td height="10px" style="height:10px" colspan="3"></td>
262 </tr>
262 </tr>
263 </table>
263 </table>
264 </td>
264 </td>
265 </tr>
265 </tr>
266 <tr>
266 <tr>
267 <td height="30px" style="height:30px"></td>
267 <td height="30px" style="height:30px"></td>
268 </tr>
268 </tr>
269 <tr>
269 <tr>
270 <td>
270 <td>
271 <div>
271 <div>
272 Changeset on
272 Changeset on
273 <a style="color:#395fa0;text-decoration:none"
273 <a style="color:#395fa0;text-decoration:none"
274 href="http://example.com/repo_target">http://example.com/repo_target</a>
274 href="http://example.com/repo_target">http://example.com/repo_target</a>
275 branch
275 branch
276 <span style="color:#395fa0">brunch</span>:
276 <span style="color:#395fa0">brunch</span>:
277 </div>
277 </div>
278 <div>
278 <div>
279 "<a style="color:#395fa0;text-decoration:none"
279 "<a style="color:#395fa0;text-decoration:none"
280 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
280 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
281 by
281 by
282 <span style="color:#395fa0">u2 u3 (u2)</span>.
282 <span style="color:#395fa0">u2 u3 (u2)</span>.
283 </div>
283 </div>
284 </td>
284 </td>
285 </tr>
285 </tr>
286 <tr>
286 <tr>
287 <td>
287 <td>
288 <center>
288 <center>
289 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
289 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
290 <tr>
290 <tr>
291 <td height="25px" style="height:25px"></td>
291 <td height="25px" style="height:25px"></td>
292 </tr>
292 </tr>
293 <tr>
293 <tr>
294 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
294 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
295 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
295 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
296 <center>
296 <center>
297 <font size="3">
297 <font size="3">
298 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
298 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
299 </font>
299 </font>
300 </center>
300 </center>
301 </a>
301 </a>
302 </td>
302 </td>
303 </tr>
303 </tr>
304 </table>
304 </table>
305 </center>
305 </center>
306 </td>
306 </td>
307 </tr>
307 </tr>
308 </table>
308 </table>
309 </td>
309 </td>
310 <td></td>
310 <td></td>
311 </tr>
311 </tr>
312 <tr>
312 <tr>
313 <td height="30px" style="height:30px" colspan="3"></td>
313 <td height="30px" style="height:30px" colspan="3"></td>
314 </tr>
314 </tr>
315 </table>
315 </table>
316 </td>
316 </td>
317 <td width="30px" style="width:30px"></td>
317 <td width="30px" style="width:30px"></td>
318 </tr>
318 </tr>
319 </table>
319 </table>
320 <!--/body-->
320 <!--/body-->
321 <!--/html-->
321 <!--/html-->
322 <hr/>
322 <hr/>
323 <hr/>
323 <hr/>
324 <h1>cs_comment, is_mention=False, status_change='Approved'</h1>
324 <h1>cs_comment, is_mention=False, status_change='Approved'</h1>
325 <pre>
325 <pre>
326 From: u1
326 From: u1
327 To: u2@example.com
327 To: u2@example.com
328 Subject: [Approved: Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
328 Subject: [Approved: Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
329 </pre>
329 </pre>
330 <hr/>
330 <hr/>
331 <pre>http://comment.org
331 <pre>http://comment.org
332
332
333 Comment on Changeset "This changeset did something clever which is hard to explain"
333 Comment on Changeset "This changeset did something clever which is hard to explain"
334
334
335
335
336 Opinionated User (jsmith):
336 Opinionated User (jsmith):
337
337
338 Status change: Approved
338 Status change: Approved
339
339
340 This is the new 'comment'.
340 This is the new 'comment'.
341
341
342 - and here it ends indented.
342 - and here it ends indented.
343
343
344
344
345 Changeset on http://example.com/repo_target branch brunch:
345 Changeset on http://example.com/repo_target branch brunch:
346 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
346 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
347
347
348
348
349 View Comment: http://comment.org
349 View Comment: http://comment.org
350 </pre>
350 </pre>
351 <hr/>
351 <hr/>
352 <!--!doctype html-->
352 <!--!doctype html-->
353 <!--html lang="en"-->
353 <!--html lang="en"-->
354 <!--head-->
354 <!--head-->
355 <!--title--><!--/title-->
355 <!--title--><!--/title-->
356 <!--meta name="viewport" content="width=device-width"-->
356 <!--meta name="viewport" content="width=device-width"-->
357 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
357 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
358 <!--/head-->
358 <!--/head-->
359 <!--body-->
359 <!--body-->
360 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
360 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
361 <tr>
361 <tr>
362 <td width="30px" style="width:30px"></td>
362 <td width="30px" style="width:30px"></td>
363 <td>
363 <td>
364 <table width="100%" cellpadding="0" cellspacing="0" border="0"
364 <table width="100%" cellpadding="0" cellspacing="0" border="0"
365 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
365 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
366 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
366 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
367 <tr>
367 <tr>
368 <td colspan="3">
368 <td colspan="3">
369 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
369 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
370 style="border-bottom:1px solid #ddd">
370 style="border-bottom:1px solid #ddd">
371 <tr>
371 <tr>
372 <td height="20px" style="height:20px" colspan="3"></td>
372 <td height="20px" style="height:20px" colspan="3"></td>
373 </tr>
373 </tr>
374 <tr>
374 <tr>
375 <td width="30px" style="width:30px"></td>
375 <td width="30px" style="width:30px"></td>
376 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
376 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
377 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
377 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
378 target="_blank">Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
378 target="_blank">Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
379 </td>
379 </td>
380 <td width="30px" style="width:30px"></td>
380 <td width="30px" style="width:30px"></td>
381 </tr>
381 </tr>
382 <tr>
382 <tr>
383 <td height="20px" style="height:20px" colspan="3"></td>
383 <td height="20px" style="height:20px" colspan="3"></td>
384 </tr>
384 </tr>
385 </table>
385 </table>
386 </td>
386 </td>
387 </tr>
387 </tr>
388 <tr>
388 <tr>
389 <td height="30px" style="height:30px" colspan="3"></td>
389 <td height="30px" style="height:30px" colspan="3"></td>
390 </tr>
390 </tr>
391 <tr>
391 <tr>
392 <td></td>
392 <td></td>
393 <td>
393 <td>
394 <table cellpadding="0" cellspacing="0" border="0" width="100%">
394 <table cellpadding="0" cellspacing="0" border="0" width="100%">
395 <tr>
395 <tr>
396 <td>
396 <td>
397 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
397 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
398 <tr>
398 <tr>
399 <td height="10px" style="height:10px" colspan="3"></td>
399 <td height="10px" style="height:10px" colspan="3"></td>
400 </tr>
400 </tr>
401 <tr>
401 <tr>
402 <td width="20px" style="width:20px"></td>
402 <td width="20px" style="width:20px"></td>
403 <td>
403 <td>
404 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
404 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
405 </td>
405 </td>
406 <td width="20px" style="width:20px"></td>
406 <td width="20px" style="width:20px"></td>
407 </tr>
407 </tr>
408 <tr>
408 <tr>
409 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
409 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
410 </tr>
410 </tr>
411 <tr>
411 <tr>
412 <td height="10px" style="height:10px" colspan="3"></td>
412 <td height="10px" style="height:10px" colspan="3"></td>
413 </tr>
413 </tr>
414 <tr>
414 <tr>
415 <td width="20px" style="width:20px"></td>
415 <td width="20px" style="width:20px"></td>
416 <td>
416 <td>
417 <div style="font-weight:600">
417 <div style="font-weight:600">
418 Status change:
418 Status change:
419 Approved
419 Approved
420 </div>
420 </div>
421 </td>
421 </td>
422 <td width="20px" style="width:20px"></td>
422 <td width="20px" style="width:20px"></td>
423 </tr>
423 </tr>
424 <tr>
424 <tr>
425 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
425 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
426 </tr>
426 </tr>
427 <tr>
427 <tr>
428 <td height="10px" style="height:10px" colspan="3"></td>
428 <td height="10px" style="height:10px" colspan="3"></td>
429 </tr>
429 </tr>
430 <tr>
430 <tr>
431 <td width="20px" style="width:20px"></td>
431 <td width="20px" style="width:20px"></td>
432 <td>
432 <td>
433 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &apos;comment&apos;.<br/><br/> - and here it ends indented.</div></div>
433 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &#39;comment&#39;.<br/><br/> - and here it ends indented.</div></div>
434 </td>
434 </td>
435 <td width="20px" style="width:20px"></td>
435 <td width="20px" style="width:20px"></td>
436 </tr>
436 </tr>
437 <tr>
437 <tr>
438 <td height="10px" style="height:10px" colspan="3"></td>
438 <td height="10px" style="height:10px" colspan="3"></td>
439 </tr>
439 </tr>
440 </table>
440 </table>
441 </td>
441 </td>
442 </tr>
442 </tr>
443 <tr>
443 <tr>
444 <td height="30px" style="height:30px"></td>
444 <td height="30px" style="height:30px"></td>
445 </tr>
445 </tr>
446 <tr>
446 <tr>
447 <td>
447 <td>
448 <div>
448 <div>
449 Changeset on
449 Changeset on
450 <a style="color:#395fa0;text-decoration:none"
450 <a style="color:#395fa0;text-decoration:none"
451 href="http://example.com/repo_target">http://example.com/repo_target</a>
451 href="http://example.com/repo_target">http://example.com/repo_target</a>
452 branch
452 branch
453 <span style="color:#395fa0">brunch</span>:
453 <span style="color:#395fa0">brunch</span>:
454 </div>
454 </div>
455 <div>
455 <div>
456 "<a style="color:#395fa0;text-decoration:none"
456 "<a style="color:#395fa0;text-decoration:none"
457 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
457 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
458 by
458 by
459 <span style="color:#395fa0">u2 u3 (u2)</span>.
459 <span style="color:#395fa0">u2 u3 (u2)</span>.
460 </div>
460 </div>
461 </td>
461 </td>
462 </tr>
462 </tr>
463 <tr>
463 <tr>
464 <td>
464 <td>
465 <center>
465 <center>
466 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
466 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
467 <tr>
467 <tr>
468 <td height="25px" style="height:25px"></td>
468 <td height="25px" style="height:25px"></td>
469 </tr>
469 </tr>
470 <tr>
470 <tr>
471 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
471 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
472 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
472 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
473 <center>
473 <center>
474 <font size="3">
474 <font size="3">
475 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
475 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
476 </font>
476 </font>
477 </center>
477 </center>
478 </a>
478 </a>
479 </td>
479 </td>
480 </tr>
480 </tr>
481 </table>
481 </table>
482 </center>
482 </center>
483 </td>
483 </td>
484 </tr>
484 </tr>
485 </table>
485 </table>
486 </td>
486 </td>
487 <td></td>
487 <td></td>
488 </tr>
488 </tr>
489 <tr>
489 <tr>
490 <td height="30px" style="height:30px" colspan="3"></td>
490 <td height="30px" style="height:30px" colspan="3"></td>
491 </tr>
491 </tr>
492 </table>
492 </table>
493 </td>
493 </td>
494 <td width="30px" style="width:30px"></td>
494 <td width="30px" style="width:30px"></td>
495 </tr>
495 </tr>
496 </table>
496 </table>
497 <!--/body-->
497 <!--/body-->
498 <!--/html-->
498 <!--/html-->
499 <hr/>
499 <hr/>
500 <hr/>
500 <hr/>
501 <h1>cs_comment, is_mention=True, status_change='Approved'</h1>
501 <h1>cs_comment, is_mention=True, status_change='Approved'</h1>
502 <pre>
502 <pre>
503 From: u1
503 From: u1
504 To: u2@example.com
504 To: u2@example.com
505 Subject: [Approved: Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
505 Subject: [Approved: Comment] repo/name changeset cafe1234 "This changeset did something cl..." on brunch
506 </pre>
506 </pre>
507 <hr/>
507 <hr/>
508 <pre>http://comment.org
508 <pre>http://comment.org
509
509
510 Mention in Comment on Changeset "This changeset did something clever which is hard to explain"
510 Mention in Comment on Changeset "This changeset did something clever which is hard to explain"
511
511
512
512
513 Opinionated User (jsmith):
513 Opinionated User (jsmith):
514
514
515 Status change: Approved
515 Status change: Approved
516
516
517 This is the new 'comment'.
517 This is the new 'comment'.
518
518
519 - and here it ends indented.
519 - and here it ends indented.
520
520
521
521
522 Changeset on http://example.com/repo_target branch brunch:
522 Changeset on http://example.com/repo_target branch brunch:
523 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
523 "This changeset did something clever which is hard to explain" by u2 u3 (u2).
524
524
525
525
526 View Comment: http://comment.org
526 View Comment: http://comment.org
527 </pre>
527 </pre>
528 <hr/>
528 <hr/>
529 <!--!doctype html-->
529 <!--!doctype html-->
530 <!--html lang="en"-->
530 <!--html lang="en"-->
531 <!--head-->
531 <!--head-->
532 <!--title--><!--/title-->
532 <!--title--><!--/title-->
533 <!--meta name="viewport" content="width=device-width"-->
533 <!--meta name="viewport" content="width=device-width"-->
534 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
534 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
535 <!--/head-->
535 <!--/head-->
536 <!--body-->
536 <!--body-->
537 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
537 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
538 <tr>
538 <tr>
539 <td width="30px" style="width:30px"></td>
539 <td width="30px" style="width:30px"></td>
540 <td>
540 <td>
541 <table width="100%" cellpadding="0" cellspacing="0" border="0"
541 <table width="100%" cellpadding="0" cellspacing="0" border="0"
542 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
542 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
543 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
543 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
544 <tr>
544 <tr>
545 <td colspan="3">
545 <td colspan="3">
546 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
546 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
547 style="border-bottom:1px solid #ddd">
547 style="border-bottom:1px solid #ddd">
548 <tr>
548 <tr>
549 <td height="20px" style="height:20px" colspan="3"></td>
549 <td height="20px" style="height:20px" colspan="3"></td>
550 </tr>
550 </tr>
551 <tr>
551 <tr>
552 <td width="30px" style="width:30px"></td>
552 <td width="30px" style="width:30px"></td>
553 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
553 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
554 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
554 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://comment.org"
555 target="_blank">Mention in Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
555 target="_blank">Mention in Comment on Changeset &#34;This changeset did something clever which is hard to explain&#34;</a>
556 </td>
556 </td>
557 <td width="30px" style="width:30px"></td>
557 <td width="30px" style="width:30px"></td>
558 </tr>
558 </tr>
559 <tr>
559 <tr>
560 <td height="20px" style="height:20px" colspan="3"></td>
560 <td height="20px" style="height:20px" colspan="3"></td>
561 </tr>
561 </tr>
562 </table>
562 </table>
563 </td>
563 </td>
564 </tr>
564 </tr>
565 <tr>
565 <tr>
566 <td height="30px" style="height:30px" colspan="3"></td>
566 <td height="30px" style="height:30px" colspan="3"></td>
567 </tr>
567 </tr>
568 <tr>
568 <tr>
569 <td></td>
569 <td></td>
570 <td>
570 <td>
571 <table cellpadding="0" cellspacing="0" border="0" width="100%">
571 <table cellpadding="0" cellspacing="0" border="0" width="100%">
572 <tr>
572 <tr>
573 <td>
573 <td>
574 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
574 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
575 <tr>
575 <tr>
576 <td height="10px" style="height:10px" colspan="3"></td>
576 <td height="10px" style="height:10px" colspan="3"></td>
577 </tr>
577 </tr>
578 <tr>
578 <tr>
579 <td width="20px" style="width:20px"></td>
579 <td width="20px" style="width:20px"></td>
580 <td>
580 <td>
581 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
581 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
582 </td>
582 </td>
583 <td width="20px" style="width:20px"></td>
583 <td width="20px" style="width:20px"></td>
584 </tr>
584 </tr>
585 <tr>
585 <tr>
586 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
586 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
587 </tr>
587 </tr>
588 <tr>
588 <tr>
589 <td height="10px" style="height:10px" colspan="3"></td>
589 <td height="10px" style="height:10px" colspan="3"></td>
590 </tr>
590 </tr>
591 <tr>
591 <tr>
592 <td width="20px" style="width:20px"></td>
592 <td width="20px" style="width:20px"></td>
593 <td>
593 <td>
594 <div style="font-weight:600">
594 <div style="font-weight:600">
595 Status change:
595 Status change:
596 Approved
596 Approved
597 </div>
597 </div>
598 </td>
598 </td>
599 <td width="20px" style="width:20px"></td>
599 <td width="20px" style="width:20px"></td>
600 </tr>
600 </tr>
601 <tr>
601 <tr>
602 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
602 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
603 </tr>
603 </tr>
604 <tr>
604 <tr>
605 <td height="10px" style="height:10px" colspan="3"></td>
605 <td height="10px" style="height:10px" colspan="3"></td>
606 </tr>
606 </tr>
607 <tr>
607 <tr>
608 <td width="20px" style="width:20px"></td>
608 <td width="20px" style="width:20px"></td>
609 <td>
609 <td>
610 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &apos;comment&apos;.<br/><br/> - and here it ends indented.</div></div>
610 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the new &#39;comment&#39;.<br/><br/> - and here it ends indented.</div></div>
611 </td>
611 </td>
612 <td width="20px" style="width:20px"></td>
612 <td width="20px" style="width:20px"></td>
613 </tr>
613 </tr>
614 <tr>
614 <tr>
615 <td height="10px" style="height:10px" colspan="3"></td>
615 <td height="10px" style="height:10px" colspan="3"></td>
616 </tr>
616 </tr>
617 </table>
617 </table>
618 </td>
618 </td>
619 </tr>
619 </tr>
620 <tr>
620 <tr>
621 <td height="30px" style="height:30px"></td>
621 <td height="30px" style="height:30px"></td>
622 </tr>
622 </tr>
623 <tr>
623 <tr>
624 <td>
624 <td>
625 <div>
625 <div>
626 Changeset on
626 Changeset on
627 <a style="color:#395fa0;text-decoration:none"
627 <a style="color:#395fa0;text-decoration:none"
628 href="http://example.com/repo_target">http://example.com/repo_target</a>
628 href="http://example.com/repo_target">http://example.com/repo_target</a>
629 branch
629 branch
630 <span style="color:#395fa0">brunch</span>:
630 <span style="color:#395fa0">brunch</span>:
631 </div>
631 </div>
632 <div>
632 <div>
633 "<a style="color:#395fa0;text-decoration:none"
633 "<a style="color:#395fa0;text-decoration:none"
634 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
634 href="http://changeset.com">This changeset did something clever which is hard to explain</a>"
635 by
635 by
636 <span style="color:#395fa0">u2 u3 (u2)</span>.
636 <span style="color:#395fa0">u2 u3 (u2)</span>.
637 </div>
637 </div>
638 </td>
638 </td>
639 </tr>
639 </tr>
640 <tr>
640 <tr>
641 <td>
641 <td>
642 <center>
642 <center>
643 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
643 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
644 <tr>
644 <tr>
645 <td height="25px" style="height:25px"></td>
645 <td height="25px" style="height:25px"></td>
646 </tr>
646 </tr>
647 <tr>
647 <tr>
648 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
648 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
649 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
649 <a href="http://comment.org" style="text-decoration:none;display:block" target="_blank">
650 <center>
650 <center>
651 <font size="3">
651 <font size="3">
652 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
652 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
653 </font>
653 </font>
654 </center>
654 </center>
655 </a>
655 </a>
656 </td>
656 </td>
657 </tr>
657 </tr>
658 </table>
658 </table>
659 </center>
659 </center>
660 </td>
660 </td>
661 </tr>
661 </tr>
662 </table>
662 </table>
663 </td>
663 </td>
664 <td></td>
664 <td></td>
665 </tr>
665 </tr>
666 <tr>
666 <tr>
667 <td height="30px" style="height:30px" colspan="3"></td>
667 <td height="30px" style="height:30px" colspan="3"></td>
668 </tr>
668 </tr>
669 </table>
669 </table>
670 </td>
670 </td>
671 <td width="30px" style="width:30px"></td>
671 <td width="30px" style="width:30px"></td>
672 </tr>
672 </tr>
673 </table>
673 </table>
674 <!--/body-->
674 <!--/body-->
675 <!--/html-->
675 <!--/html-->
676 <hr/>
676 <hr/>
677 <hr/>
677 <hr/>
678 <h1>message</h1>
678 <h1>message</h1>
679 <pre>
679 <pre>
680 From: u1
680 From: u1
681 To: u2@example.com
681 To: u2@example.com
682 Subject: Test Message
682 Subject: Test Message
683 </pre>
683 </pre>
684 <hr/>
684 <hr/>
685 <pre>This is the 'body' of the "test" message
685 <pre>This is the 'body' of the "test" message
686 - nothing interesting here except indentation.</pre>
686 - nothing interesting here except indentation.</pre>
687 <hr/>
687 <hr/>
688 <!--!doctype html-->
688 <!--!doctype html-->
689 <!--html lang="en"-->
689 <!--html lang="en"-->
690 <!--head-->
690 <!--head-->
691 <!--title--><!--/title-->
691 <!--title--><!--/title-->
692 <!--meta name="viewport" content="width=device-width"-->
692 <!--meta name="viewport" content="width=device-width"-->
693 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
693 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
694 <!--/head-->
694 <!--/head-->
695 <!--body-->
695 <!--body-->
696 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
696 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
697 <tr>
697 <tr>
698 <td width="30px" style="width:30px"></td>
698 <td width="30px" style="width:30px"></td>
699 <td>
699 <td>
700 <table width="100%" cellpadding="0" cellspacing="0" border="0"
700 <table width="100%" cellpadding="0" cellspacing="0" border="0"
701 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
701 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
702 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
702 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
703 <tr>
703 <tr>
704 <td colspan="3">
704 <td colspan="3">
705 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
705 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
706 style="border-bottom:1px solid #ddd">
706 style="border-bottom:1px solid #ddd">
707 <tr>
707 <tr>
708 <td height="20px" style="height:20px" colspan="3"></td>
708 <td height="20px" style="height:20px" colspan="3"></td>
709 </tr>
709 </tr>
710 <tr>
710 <tr>
711 <td width="30px" style="width:30px"></td>
711 <td width="30px" style="width:30px"></td>
712 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
712 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
713 <span style="font-weight:600;color:#395fa0">Message</span>
713 <span style="font-weight:600;color:#395fa0">Message</span>
714 </td>
714 </td>
715 <td width="30px" style="width:30px"></td>
715 <td width="30px" style="width:30px"></td>
716 </tr>
716 </tr>
717 <tr>
717 <tr>
718 <td height="20px" style="height:20px" colspan="3"></td>
718 <td height="20px" style="height:20px" colspan="3"></td>
719 </tr>
719 </tr>
720 </table>
720 </table>
721 </td>
721 </td>
722 </tr>
722 </tr>
723 <tr>
723 <tr>
724 <td height="30px" style="height:30px" colspan="3"></td>
724 <td height="30px" style="height:30px" colspan="3"></td>
725 </tr>
725 </tr>
726 <tr>
726 <tr>
727 <td></td>
727 <td></td>
728 <td>
728 <td>
729 <table cellpadding="0" cellspacing="0" border="0" width="100%">
729 <table cellpadding="0" cellspacing="0" border="0" width="100%">
730 <tr>
730 <tr>
731 <td style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the &apos;body&apos; of the &quot;test&quot; message<br/> - nothing interesting here except indentation.</div></td>
731 <td style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">This is the &#39;body&#39; of the &quot;test&quot; message<br/> - nothing interesting here except indentation.</div></td>
732 </tr>
732 </tr>
733 </table>
733 </table>
734 </td>
734 </td>
735 <td></td>
735 <td></td>
736 </tr>
736 </tr>
737 <tr>
737 <tr>
738 <td height="30px" style="height:30px" colspan="3"></td>
738 <td height="30px" style="height:30px" colspan="3"></td>
739 </tr>
739 </tr>
740 </table>
740 </table>
741 </td>
741 </td>
742 <td width="30px" style="width:30px"></td>
742 <td width="30px" style="width:30px"></td>
743 </tr>
743 </tr>
744 </table>
744 </table>
745 <!--/body-->
745 <!--/body-->
746 <!--/html-->
746 <!--/html-->
747 <hr/>
747 <hr/>
748 <hr/>
748 <hr/>
749 <h1>registration</h1>
749 <h1>registration</h1>
750 <pre>
750 <pre>
751 From: u1
751 From: u1
752 To: u2@example.com
752 To: u2@example.com
753 Subject: New user newbie registered
753 Subject: New user newbie registered
754 </pre>
754 </pre>
755 <hr/>
755 <hr/>
756 <pre>http://newbie.org
756 <pre>http://newbie.org
757
757
758 New User Registration
758 New User Registration
759
759
760
760
761 Username: newbie
761 Username: newbie
762
762
763 Full Name: New Full Name
763 Full Name: New Full Name
764
764
765 Email: new@email.com
765 Email: new@email.com
766
766
767
767
768 View User Profile: http://newbie.org
768 View User Profile: http://newbie.org
769 </pre>
769 </pre>
770 <hr/>
770 <hr/>
771 <!--!doctype html-->
771 <!--!doctype html-->
772 <!--html lang="en"-->
772 <!--html lang="en"-->
773 <!--head-->
773 <!--head-->
774 <!--title--><!--/title-->
774 <!--title--><!--/title-->
775 <!--meta name="viewport" content="width=device-width"-->
775 <!--meta name="viewport" content="width=device-width"-->
776 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
776 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
777 <!--/head-->
777 <!--/head-->
778 <!--body-->
778 <!--body-->
779 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
779 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
780 <tr>
780 <tr>
781 <td width="30px" style="width:30px"></td>
781 <td width="30px" style="width:30px"></td>
782 <td>
782 <td>
783 <table width="100%" cellpadding="0" cellspacing="0" border="0"
783 <table width="100%" cellpadding="0" cellspacing="0" border="0"
784 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
784 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
785 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
785 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
786 <tr>
786 <tr>
787 <td colspan="3">
787 <td colspan="3">
788 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
788 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
789 style="border-bottom:1px solid #ddd">
789 style="border-bottom:1px solid #ddd">
790 <tr>
790 <tr>
791 <td height="20px" style="height:20px" colspan="3"></td>
791 <td height="20px" style="height:20px" colspan="3"></td>
792 </tr>
792 </tr>
793 <tr>
793 <tr>
794 <td width="30px" style="width:30px"></td>
794 <td width="30px" style="width:30px"></td>
795 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
795 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
796 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://newbie.org"
796 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://newbie.org"
797 target="_blank">New User Registration</a>
797 target="_blank">New User Registration</a>
798 </td>
798 </td>
799 <td width="30px" style="width:30px"></td>
799 <td width="30px" style="width:30px"></td>
800 </tr>
800 </tr>
801 <tr>
801 <tr>
802 <td height="20px" style="height:20px" colspan="3"></td>
802 <td height="20px" style="height:20px" colspan="3"></td>
803 </tr>
803 </tr>
804 </table>
804 </table>
805 </td>
805 </td>
806 </tr>
806 </tr>
807 <tr>
807 <tr>
808 <td height="30px" style="height:30px" colspan="3"></td>
808 <td height="30px" style="height:30px" colspan="3"></td>
809 </tr>
809 </tr>
810 <tr>
810 <tr>
811 <td></td>
811 <td></td>
812 <td>
812 <td>
813 <table cellpadding="0" cellspacing="0" border="0" width="100%">
813 <table cellpadding="0" cellspacing="0" border="0" width="100%">
814 <tr>
814 <tr>
815 <td>
815 <td>
816 Username:
816 Username:
817 </td>
817 </td>
818 <td style="color:#395fa0">
818 <td style="color:#395fa0">
819 newbie
819 newbie
820 </td>
820 </td>
821 </tr>
821 </tr>
822 <tr>
822 <tr>
823 <td height="10px" style="height:10px" colspan="2"></td>
823 <td height="10px" style="height:10px" colspan="2"></td>
824 </tr>
824 </tr>
825 <tr>
825 <tr>
826 <td>
826 <td>
827 Full Name:
827 Full Name:
828 </td>
828 </td>
829 <td style="color:#395fa0">
829 <td style="color:#395fa0">
830 New Full Name
830 New Full Name
831 </td>
831 </td>
832 </tr>
832 </tr>
833 <tr>
833 <tr>
834 <td height="10px" style="height:10px" colspan="2"></td>
834 <td height="10px" style="height:10px" colspan="2"></td>
835 </tr>
835 </tr>
836 <tr>
836 <tr>
837 <td>
837 <td>
838 Email:
838 Email:
839 </td>
839 </td>
840 <td style="color:#395fa0">
840 <td style="color:#395fa0">
841 new@email.com
841 new@email.com
842 </td>
842 </td>
843 </tr>
843 </tr>
844 <tr>
844 <tr>
845 <td colspan="2">
845 <td colspan="2">
846 <center>
846 <center>
847 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
847 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
848 <tr>
848 <tr>
849 <td height="25px" style="height:25px"></td>
849 <td height="25px" style="height:25px"></td>
850 </tr>
850 </tr>
851 <tr>
851 <tr>
852 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
852 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
853 <a href="http://newbie.org" style="text-decoration:none;display:block" target="_blank">
853 <a href="http://newbie.org" style="text-decoration:none;display:block" target="_blank">
854 <center>
854 <center>
855 <font size="3">
855 <font size="3">
856 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View User Profile</span>
856 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View User Profile</span>
857 </font>
857 </font>
858 </center>
858 </center>
859 </a>
859 </a>
860 </td>
860 </td>
861 </tr>
861 </tr>
862 </table>
862 </table>
863 </center>
863 </center>
864 </td>
864 </td>
865 </tr>
865 </tr>
866 </table>
866 </table>
867 </td>
867 </td>
868 <td></td>
868 <td></td>
869 </tr>
869 </tr>
870 <tr>
870 <tr>
871 <td height="30px" style="height:30px" colspan="3"></td>
871 <td height="30px" style="height:30px" colspan="3"></td>
872 </tr>
872 </tr>
873 </table>
873 </table>
874 </td>
874 </td>
875 <td width="30px" style="width:30px"></td>
875 <td width="30px" style="width:30px"></td>
876 </tr>
876 </tr>
877 </table>
877 </table>
878 <!--/body-->
878 <!--/body-->
879 <!--/html-->
879 <!--/html-->
880 <hr/>
880 <hr/>
881 <hr/>
881 <hr/>
882 <h1>pull_request, is_mention=False</h1>
882 <h1>pull_request, is_mention=False</h1>
883 <pre>
883 <pre>
884 From: u1
884 From: u1
885 To: u2@example.com
885 To: u2@example.com
886 Subject: [Review] repo/name PR #7 "The Title" from devbranch by u2
886 Subject: [Review] repo/name PR #7 "The Title" from devbranch by u2
887 </pre>
887 </pre>
888 <hr/>
888 <hr/>
889 <pre>http://pr.org/7
889 <pre>http://pr.org/7
890
890
891 Added as Reviewer of Pull Request #7 "The Title" by Requesting User (root)
891 Added as Reviewer of Pull Request #7 "The Title" by Requesting User (root)
892
892
893
893
894 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
894 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
895 #7 "The Title" by u2 u3 (u2).
895 #7 "The Title" by u2 u3 (u2).
896
896
897
897
898 Description:
898 Description:
899
899
900 This PR is 'awesome' because it does <stuff>
900 This PR is 'awesome' because it does <stuff>
901 - please approve indented!
901 - please approve indented!
902
902
903
903
904 Changesets:
904 Changesets:
905
905
906 Introduce one and two
906 Introduce one and two
907 Make one plus two equal tree
907 Make one plus two equal tree
908
908
909
909
910 View Pull Request: http://pr.org/7
910 View Pull Request: http://pr.org/7
911 </pre>
911 </pre>
912 <hr/>
912 <hr/>
913 <!--!doctype html-->
913 <!--!doctype html-->
914 <!--html lang="en"-->
914 <!--html lang="en"-->
915 <!--head-->
915 <!--head-->
916 <!--title--><!--/title-->
916 <!--title--><!--/title-->
917 <!--meta name="viewport" content="width=device-width"-->
917 <!--meta name="viewport" content="width=device-width"-->
918 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
918 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
919 <!--/head-->
919 <!--/head-->
920 <!--body-->
920 <!--body-->
921 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
921 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
922 <tr>
922 <tr>
923 <td width="30px" style="width:30px"></td>
923 <td width="30px" style="width:30px"></td>
924 <td>
924 <td>
925 <table width="100%" cellpadding="0" cellspacing="0" border="0"
925 <table width="100%" cellpadding="0" cellspacing="0" border="0"
926 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
926 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
927 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
927 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
928 <tr>
928 <tr>
929 <td colspan="3">
929 <td colspan="3">
930 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
930 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
931 style="border-bottom:1px solid #ddd">
931 style="border-bottom:1px solid #ddd">
932 <tr>
932 <tr>
933 <td height="20px" style="height:20px" colspan="3"></td>
933 <td height="20px" style="height:20px" colspan="3"></td>
934 </tr>
934 </tr>
935 <tr>
935 <tr>
936 <td width="30px" style="width:30px"></td>
936 <td width="30px" style="width:30px"></td>
937 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
937 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
938 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/7"
938 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/7"
939 target="_blank">Added as Reviewer of Pull Request #7 &#34;The Title&#34; by Requesting User (root)</a>
939 target="_blank">Added as Reviewer of Pull Request #7 &#34;The Title&#34; by Requesting User (root)</a>
940 </td>
940 </td>
941 <td width="30px" style="width:30px"></td>
941 <td width="30px" style="width:30px"></td>
942 </tr>
942 </tr>
943 <tr>
943 <tr>
944 <td height="20px" style="height:20px" colspan="3"></td>
944 <td height="20px" style="height:20px" colspan="3"></td>
945 </tr>
945 </tr>
946 </table>
946 </table>
947 </td>
947 </td>
948 </tr>
948 </tr>
949 <tr>
949 <tr>
950 <td height="30px" style="height:30px" colspan="3"></td>
950 <td height="30px" style="height:30px" colspan="3"></td>
951 </tr>
951 </tr>
952 <tr>
952 <tr>
953 <td></td>
953 <td></td>
954 <td>
954 <td>
955 <table cellpadding="0" cellspacing="0" border="0" width="100%">
955 <table cellpadding="0" cellspacing="0" border="0" width="100%">
956 <tr>
956 <tr>
957 <td>
957 <td>
958 <div>
958 <div>
959 Pull request from
959 Pull request from
960 <a style="color:#395fa0;text-decoration:none"
960 <a style="color:#395fa0;text-decoration:none"
961 href="https://dev.org/repo">https://dev.org/repo</a>
961 href="https://dev.org/repo">https://dev.org/repo</a>
962 at
962 at
963 <span style="color:#395fa0">devbranch</span>
963 <span style="color:#395fa0">devbranch</span>
964 to
964 to
965 <a style="color:#395fa0;text-decoration:none"
965 <a style="color:#395fa0;text-decoration:none"
966 href="http://mainline.com/repo">http://mainline.com/repo</a>
966 href="http://mainline.com/repo">http://mainline.com/repo</a>
967 at
967 at
968 <span style="color:#395fa0">trunk</span>:
968 <span style="color:#395fa0">trunk</span>:
969 </div>
969 </div>
970 <div>
970 <div>
971 <a style="color:#395fa0;text-decoration:none"
971 <a style="color:#395fa0;text-decoration:none"
972 href="http://pr.org/7">#7</a>
972 href="http://pr.org/7">#7</a>
973 "<span style="color:#395fa0">The Title</span>"
973 "<span style="color:#395fa0">The Title</span>"
974 by
974 by
975 <span style="color:#395fa0">u2 u3 (u2)</span>.
975 <span style="color:#395fa0">u2 u3 (u2)</span>.
976 </div>
976 </div>
977 </td>
977 </td>
978 </tr>
978 </tr>
979 <tr><td height="10px" style="height:10px"></td></tr>
979 <tr><td height="10px" style="height:10px"></td></tr>
980 <tr>
980 <tr>
981 <td>
981 <td>
982 <div>
982 <div>
983 Description:
983 Description:
984 </div>
984 </div>
985 </td>
985 </td>
986 </tr>
986 </tr>
987 <tr><td height="10px" style="height:10px"></td></tr>
987 <tr><td height="10px" style="height:10px"></td></tr>
988 <tr>
988 <tr>
989 <td>
989 <td>
990 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap;color:#395fa0"><div class="formatted-fixed">This PR is &apos;awesome&apos; because it does &lt;stuff&gt;<br/> - please approve indented!</div></div>
990 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap;color:#395fa0"><div class="formatted-fixed">This PR is &#39;awesome&#39; because it does &lt;stuff&gt;<br/> - please approve indented!</div></div>
991 </td>
991 </td>
992 </tr>
992 </tr>
993 <tr><td height="15px" style="height:15px"></td></tr>
993 <tr><td height="15px" style="height:15px"></td></tr>
994 <tr>
994 <tr>
995 <td>
995 <td>
996 <div>Changesets:</div>
996 <div>Changesets:</div>
997 </td>
997 </td>
998 </tr>
998 </tr>
999 <tr><td height="10px" style="height:10px"></td></tr>
999 <tr><td height="10px" style="height:10px"></td></tr>
1000
1000
1001 <tr>
1001 <tr>
1002 <td style="font-family:Helvetica,Arial,sans-serif">
1002 <td style="font-family:Helvetica,Arial,sans-serif">
1003 <ul style="color:#395fa0;padding-left:15px;margin:0">
1003 <ul style="color:#395fa0;padding-left:15px;margin:0">
1004 <li style="mso-special-format:bullet">
1004 <li style="mso-special-format:bullet">
1005 <a style="color:#395fa0;text-decoration:none"
1005 <a style="color:#395fa0;text-decoration:none"
1006 href="http://changeset_home/?repo_name=repo_org&amp;revision=123abc123abc123abc123abc123abc123abc123abc">
1006 href="http://changeset_home/?repo_name=repo_org&amp;revision=123abc123abc123abc123abc123abc123abc123abc">
1007 Introduce one and two
1007 Introduce one and two
1008 </a>
1008 </a>
1009 </li>
1009 </li>
1010 <li style="mso-special-format:bullet">
1010 <li style="mso-special-format:bullet">
1011 <a style="color:#395fa0;text-decoration:none"
1011 <a style="color:#395fa0;text-decoration:none"
1012 href="http://changeset_home/?repo_name=repo_org&amp;revision=567fed567fed567fed567fed567fed567fed567fed">
1012 href="http://changeset_home/?repo_name=repo_org&amp;revision=567fed567fed567fed567fed567fed567fed567fed">
1013 Make one plus two equal tree
1013 Make one plus two equal tree
1014 </a>
1014 </a>
1015 </li>
1015 </li>
1016 </ul>
1016 </ul>
1017 </td>
1017 </td>
1018 </tr>
1018 </tr>
1019 <tr>
1019 <tr>
1020 <td>
1020 <td>
1021 <center>
1021 <center>
1022 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1022 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1023 <tr>
1023 <tr>
1024 <td height="25px" style="height:25px"></td>
1024 <td height="25px" style="height:25px"></td>
1025 </tr>
1025 </tr>
1026 <tr>
1026 <tr>
1027 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1027 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1028 <a href="http://pr.org/7" style="text-decoration:none;display:block" target="_blank">
1028 <a href="http://pr.org/7" style="text-decoration:none;display:block" target="_blank">
1029 <center>
1029 <center>
1030 <font size="3">
1030 <font size="3">
1031 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Pull Request</span>
1031 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Pull Request</span>
1032 </font>
1032 </font>
1033 </center>
1033 </center>
1034 </a>
1034 </a>
1035 </td>
1035 </td>
1036 </tr>
1036 </tr>
1037 </table>
1037 </table>
1038 </center>
1038 </center>
1039 </td>
1039 </td>
1040 </tr>
1040 </tr>
1041 </table>
1041 </table>
1042 </td>
1042 </td>
1043 <td></td>
1043 <td></td>
1044 </tr>
1044 </tr>
1045 <tr>
1045 <tr>
1046 <td height="30px" style="height:30px" colspan="3"></td>
1046 <td height="30px" style="height:30px" colspan="3"></td>
1047 </tr>
1047 </tr>
1048 </table>
1048 </table>
1049 </td>
1049 </td>
1050 <td width="30px" style="width:30px"></td>
1050 <td width="30px" style="width:30px"></td>
1051 </tr>
1051 </tr>
1052 </table>
1052 </table>
1053 <!--/body-->
1053 <!--/body-->
1054 <!--/html-->
1054 <!--/html-->
1055 <hr/>
1055 <hr/>
1056 <hr/>
1056 <hr/>
1057 <h1>pull_request, is_mention=True</h1>
1057 <h1>pull_request, is_mention=True</h1>
1058 <pre>
1058 <pre>
1059 From: u1
1059 From: u1
1060 To: u2@example.com
1060 To: u2@example.com
1061 Subject: [Review] repo/name PR #7 "The Title" from devbranch by u2
1061 Subject: [Review] repo/name PR #7 "The Title" from devbranch by u2
1062 </pre>
1062 </pre>
1063 <hr/>
1063 <hr/>
1064 <pre>http://pr.org/7
1064 <pre>http://pr.org/7
1065
1065
1066 Mention on Pull Request #7 "The Title" by Requesting User (root)
1066 Mention on Pull Request #7 "The Title" by Requesting User (root)
1067
1067
1068
1068
1069 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1069 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1070 #7 "The Title" by u2 u3 (u2).
1070 #7 "The Title" by u2 u3 (u2).
1071
1071
1072
1072
1073 Description:
1073 Description:
1074
1074
1075 This PR is 'awesome' because it does <stuff>
1075 This PR is 'awesome' because it does <stuff>
1076 - please approve indented!
1076 - please approve indented!
1077
1077
1078
1078
1079 Changesets:
1079 Changesets:
1080
1080
1081 Introduce one and two
1081 Introduce one and two
1082 Make one plus two equal tree
1082 Make one plus two equal tree
1083
1083
1084
1084
1085 View Pull Request: http://pr.org/7
1085 View Pull Request: http://pr.org/7
1086 </pre>
1086 </pre>
1087 <hr/>
1087 <hr/>
1088 <!--!doctype html-->
1088 <!--!doctype html-->
1089 <!--html lang="en"-->
1089 <!--html lang="en"-->
1090 <!--head-->
1090 <!--head-->
1091 <!--title--><!--/title-->
1091 <!--title--><!--/title-->
1092 <!--meta name="viewport" content="width=device-width"-->
1092 <!--meta name="viewport" content="width=device-width"-->
1093 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1093 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1094 <!--/head-->
1094 <!--/head-->
1095 <!--body-->
1095 <!--body-->
1096 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1096 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1097 <tr>
1097 <tr>
1098 <td width="30px" style="width:30px"></td>
1098 <td width="30px" style="width:30px"></td>
1099 <td>
1099 <td>
1100 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1100 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1101 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1101 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1102 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1102 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1103 <tr>
1103 <tr>
1104 <td colspan="3">
1104 <td colspan="3">
1105 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1105 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1106 style="border-bottom:1px solid #ddd">
1106 style="border-bottom:1px solid #ddd">
1107 <tr>
1107 <tr>
1108 <td height="20px" style="height:20px" colspan="3"></td>
1108 <td height="20px" style="height:20px" colspan="3"></td>
1109 </tr>
1109 </tr>
1110 <tr>
1110 <tr>
1111 <td width="30px" style="width:30px"></td>
1111 <td width="30px" style="width:30px"></td>
1112 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1112 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1113 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/7"
1113 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/7"
1114 target="_blank">Mention on Pull Request #7 &#34;The Title&#34; by Requesting User (root)</a>
1114 target="_blank">Mention on Pull Request #7 &#34;The Title&#34; by Requesting User (root)</a>
1115 </td>
1115 </td>
1116 <td width="30px" style="width:30px"></td>
1116 <td width="30px" style="width:30px"></td>
1117 </tr>
1117 </tr>
1118 <tr>
1118 <tr>
1119 <td height="20px" style="height:20px" colspan="3"></td>
1119 <td height="20px" style="height:20px" colspan="3"></td>
1120 </tr>
1120 </tr>
1121 </table>
1121 </table>
1122 </td>
1122 </td>
1123 </tr>
1123 </tr>
1124 <tr>
1124 <tr>
1125 <td height="30px" style="height:30px" colspan="3"></td>
1125 <td height="30px" style="height:30px" colspan="3"></td>
1126 </tr>
1126 </tr>
1127 <tr>
1127 <tr>
1128 <td></td>
1128 <td></td>
1129 <td>
1129 <td>
1130 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1130 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1131 <tr>
1131 <tr>
1132 <td>
1132 <td>
1133 <div>
1133 <div>
1134 Pull request from
1134 Pull request from
1135 <a style="color:#395fa0;text-decoration:none"
1135 <a style="color:#395fa0;text-decoration:none"
1136 href="https://dev.org/repo">https://dev.org/repo</a>
1136 href="https://dev.org/repo">https://dev.org/repo</a>
1137 at
1137 at
1138 <span style="color:#395fa0">devbranch</span>
1138 <span style="color:#395fa0">devbranch</span>
1139 to
1139 to
1140 <a style="color:#395fa0;text-decoration:none"
1140 <a style="color:#395fa0;text-decoration:none"
1141 href="http://mainline.com/repo">http://mainline.com/repo</a>
1141 href="http://mainline.com/repo">http://mainline.com/repo</a>
1142 at
1142 at
1143 <span style="color:#395fa0">trunk</span>:
1143 <span style="color:#395fa0">trunk</span>:
1144 </div>
1144 </div>
1145 <div>
1145 <div>
1146 <a style="color:#395fa0;text-decoration:none"
1146 <a style="color:#395fa0;text-decoration:none"
1147 href="http://pr.org/7">#7</a>
1147 href="http://pr.org/7">#7</a>
1148 "<span style="color:#395fa0">The Title</span>"
1148 "<span style="color:#395fa0">The Title</span>"
1149 by
1149 by
1150 <span style="color:#395fa0">u2 u3 (u2)</span>.
1150 <span style="color:#395fa0">u2 u3 (u2)</span>.
1151 </div>
1151 </div>
1152 </td>
1152 </td>
1153 </tr>
1153 </tr>
1154 <tr><td height="10px" style="height:10px"></td></tr>
1154 <tr><td height="10px" style="height:10px"></td></tr>
1155 <tr>
1155 <tr>
1156 <td>
1156 <td>
1157 <div>
1157 <div>
1158 Description:
1158 Description:
1159 </div>
1159 </div>
1160 </td>
1160 </td>
1161 </tr>
1161 </tr>
1162 <tr><td height="10px" style="height:10px"></td></tr>
1162 <tr><td height="10px" style="height:10px"></td></tr>
1163 <tr>
1163 <tr>
1164 <td>
1164 <td>
1165 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap;color:#395fa0"><div class="formatted-fixed">This PR is &apos;awesome&apos; because it does &lt;stuff&gt;<br/> - please approve indented!</div></div>
1165 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap;color:#395fa0"><div class="formatted-fixed">This PR is &#39;awesome&#39; because it does &lt;stuff&gt;<br/> - please approve indented!</div></div>
1166 </td>
1166 </td>
1167 </tr>
1167 </tr>
1168 <tr><td height="15px" style="height:15px"></td></tr>
1168 <tr><td height="15px" style="height:15px"></td></tr>
1169 <tr>
1169 <tr>
1170 <td>
1170 <td>
1171 <div>Changesets:</div>
1171 <div>Changesets:</div>
1172 </td>
1172 </td>
1173 </tr>
1173 </tr>
1174 <tr><td height="10px" style="height:10px"></td></tr>
1174 <tr><td height="10px" style="height:10px"></td></tr>
1175
1175
1176 <tr>
1176 <tr>
1177 <td style="font-family:Helvetica,Arial,sans-serif">
1177 <td style="font-family:Helvetica,Arial,sans-serif">
1178 <ul style="color:#395fa0;padding-left:15px;margin:0">
1178 <ul style="color:#395fa0;padding-left:15px;margin:0">
1179 <li style="mso-special-format:bullet">
1179 <li style="mso-special-format:bullet">
1180 <a style="color:#395fa0;text-decoration:none"
1180 <a style="color:#395fa0;text-decoration:none"
1181 href="http://changeset_home/?repo_name=repo_org&amp;revision=123abc123abc123abc123abc123abc123abc123abc">
1181 href="http://changeset_home/?repo_name=repo_org&amp;revision=123abc123abc123abc123abc123abc123abc123abc">
1182 Introduce one and two
1182 Introduce one and two
1183 </a>
1183 </a>
1184 </li>
1184 </li>
1185 <li style="mso-special-format:bullet">
1185 <li style="mso-special-format:bullet">
1186 <a style="color:#395fa0;text-decoration:none"
1186 <a style="color:#395fa0;text-decoration:none"
1187 href="http://changeset_home/?repo_name=repo_org&amp;revision=567fed567fed567fed567fed567fed567fed567fed">
1187 href="http://changeset_home/?repo_name=repo_org&amp;revision=567fed567fed567fed567fed567fed567fed567fed">
1188 Make one plus two equal tree
1188 Make one plus two equal tree
1189 </a>
1189 </a>
1190 </li>
1190 </li>
1191 </ul>
1191 </ul>
1192 </td>
1192 </td>
1193 </tr>
1193 </tr>
1194 <tr>
1194 <tr>
1195 <td>
1195 <td>
1196 <center>
1196 <center>
1197 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1197 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1198 <tr>
1198 <tr>
1199 <td height="25px" style="height:25px"></td>
1199 <td height="25px" style="height:25px"></td>
1200 </tr>
1200 </tr>
1201 <tr>
1201 <tr>
1202 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1202 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1203 <a href="http://pr.org/7" style="text-decoration:none;display:block" target="_blank">
1203 <a href="http://pr.org/7" style="text-decoration:none;display:block" target="_blank">
1204 <center>
1204 <center>
1205 <font size="3">
1205 <font size="3">
1206 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Pull Request</span>
1206 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Pull Request</span>
1207 </font>
1207 </font>
1208 </center>
1208 </center>
1209 </a>
1209 </a>
1210 </td>
1210 </td>
1211 </tr>
1211 </tr>
1212 </table>
1212 </table>
1213 </center>
1213 </center>
1214 </td>
1214 </td>
1215 </tr>
1215 </tr>
1216 </table>
1216 </table>
1217 </td>
1217 </td>
1218 <td></td>
1218 <td></td>
1219 </tr>
1219 </tr>
1220 <tr>
1220 <tr>
1221 <td height="30px" style="height:30px" colspan="3"></td>
1221 <td height="30px" style="height:30px" colspan="3"></td>
1222 </tr>
1222 </tr>
1223 </table>
1223 </table>
1224 </td>
1224 </td>
1225 <td width="30px" style="width:30px"></td>
1225 <td width="30px" style="width:30px"></td>
1226 </tr>
1226 </tr>
1227 </table>
1227 </table>
1228 <!--/body-->
1228 <!--/body-->
1229 <!--/html-->
1229 <!--/html-->
1230 <hr/>
1230 <hr/>
1231 <hr/>
1231 <hr/>
1232 <h1>pull_request_comment, is_mention=False, status_change=None, closing_pr=False</h1>
1232 <h1>pull_request_comment, is_mention=False, status_change=None, closing_pr=False</h1>
1233 <pre>
1233 <pre>
1234 From: u1
1234 From: u1
1235 To: u2@example.com
1235 To: u2@example.com
1236 Subject: [Comment] repo/name PR #7 "The Title" from devbranch by u2
1236 Subject: [Comment] repo/name PR #7 "The Title" from devbranch by u2
1237 </pre>
1237 </pre>
1238 <hr/>
1238 <hr/>
1239 <pre>http://pr.org/comment
1239 <pre>http://pr.org/comment
1240
1240
1241 Comment on Pull Request #7 "The Title"
1241 Comment on Pull Request #7 "The Title"
1242
1242
1243
1243
1244 Opinionated User (jsmith):
1244 Opinionated User (jsmith):
1245
1245
1246 Me too!
1246 Me too!
1247
1247
1248 - and indented on second line
1248 - and indented on second line
1249
1249
1250
1250
1251 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1251 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1252 #7 "The Title" by u2 u3 (u2).
1252 #7 "The Title" by u2 u3 (u2).
1253
1253
1254
1254
1255 View Comment: http://pr.org/comment
1255 View Comment: http://pr.org/comment
1256 </pre>
1256 </pre>
1257 <hr/>
1257 <hr/>
1258 <!--!doctype html-->
1258 <!--!doctype html-->
1259 <!--html lang="en"-->
1259 <!--html lang="en"-->
1260 <!--head-->
1260 <!--head-->
1261 <!--title--><!--/title-->
1261 <!--title--><!--/title-->
1262 <!--meta name="viewport" content="width=device-width"-->
1262 <!--meta name="viewport" content="width=device-width"-->
1263 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1263 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1264 <!--/head-->
1264 <!--/head-->
1265 <!--body-->
1265 <!--body-->
1266 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1266 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1267 <tr>
1267 <tr>
1268 <td width="30px" style="width:30px"></td>
1268 <td width="30px" style="width:30px"></td>
1269 <td>
1269 <td>
1270 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1270 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1271 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1271 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1272 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1272 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1273 <tr>
1273 <tr>
1274 <td colspan="3">
1274 <td colspan="3">
1275 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1275 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1276 style="border-bottom:1px solid #ddd">
1276 style="border-bottom:1px solid #ddd">
1277 <tr>
1277 <tr>
1278 <td height="20px" style="height:20px" colspan="3"></td>
1278 <td height="20px" style="height:20px" colspan="3"></td>
1279 </tr>
1279 </tr>
1280 <tr>
1280 <tr>
1281 <td width="30px" style="width:30px"></td>
1281 <td width="30px" style="width:30px"></td>
1282 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1282 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1283 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1283 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1284 target="_blank">Comment on Pull Request #7 &#34;The Title&#34;</a>
1284 target="_blank">Comment on Pull Request #7 &#34;The Title&#34;</a>
1285 </td>
1285 </td>
1286 <td width="30px" style="width:30px"></td>
1286 <td width="30px" style="width:30px"></td>
1287 </tr>
1287 </tr>
1288 <tr>
1288 <tr>
1289 <td height="20px" style="height:20px" colspan="3"></td>
1289 <td height="20px" style="height:20px" colspan="3"></td>
1290 </tr>
1290 </tr>
1291 </table>
1291 </table>
1292 </td>
1292 </td>
1293 </tr>
1293 </tr>
1294 <tr>
1294 <tr>
1295 <td height="30px" style="height:30px" colspan="3"></td>
1295 <td height="30px" style="height:30px" colspan="3"></td>
1296 </tr>
1296 </tr>
1297 <tr>
1297 <tr>
1298 <td></td>
1298 <td></td>
1299 <td>
1299 <td>
1300 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1300 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1301 <tr>
1301 <tr>
1302 <td>
1302 <td>
1303 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1303 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1304 <tr>
1304 <tr>
1305 <td height="10px" style="height:10px" colspan="3"></td>
1305 <td height="10px" style="height:10px" colspan="3"></td>
1306 </tr>
1306 </tr>
1307 <tr>
1307 <tr>
1308 <td width="20px" style="width:20px"></td>
1308 <td width="20px" style="width:20px"></td>
1309 <td>
1309 <td>
1310 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1310 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1311 </td>
1311 </td>
1312 <td width="20px" style="width:20px"></td>
1312 <td width="20px" style="width:20px"></td>
1313 </tr>
1313 </tr>
1314 <tr>
1314 <tr>
1315 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1315 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1316 </tr>
1316 </tr>
1317 <tr>
1317 <tr>
1318 <td height="10px" style="height:10px" colspan="3"></td>
1318 <td height="10px" style="height:10px" colspan="3"></td>
1319 </tr>
1319 </tr>
1320 <tr>
1320 <tr>
1321 <td width="20px" style="width:20px"></td>
1321 <td width="20px" style="width:20px"></td>
1322 <td>
1322 <td>
1323 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1323 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1324 </td>
1324 </td>
1325 <td width="20px" style="width:20px"></td>
1325 <td width="20px" style="width:20px"></td>
1326 </tr>
1326 </tr>
1327 <tr>
1327 <tr>
1328 <td height="10px" style="height:10px" colspan="3"></td>
1328 <td height="10px" style="height:10px" colspan="3"></td>
1329 </tr>
1329 </tr>
1330 </table>
1330 </table>
1331 </td>
1331 </td>
1332 </tr>
1332 </tr>
1333 <tr>
1333 <tr>
1334 <td height="30px" style="height:30px"></td>
1334 <td height="30px" style="height:30px"></td>
1335 </tr>
1335 </tr>
1336 <tr>
1336 <tr>
1337 <td>
1337 <td>
1338 <div>
1338 <div>
1339 Pull request from
1339 Pull request from
1340 <a style="color:#395fa0;text-decoration:none"
1340 <a style="color:#395fa0;text-decoration:none"
1341 href="https://dev.org/repo">https://dev.org/repo</a>
1341 href="https://dev.org/repo">https://dev.org/repo</a>
1342 branch
1342 branch
1343 <span style="color:#395fa0">devbranch</span>
1343 <span style="color:#395fa0">devbranch</span>
1344 to
1344 to
1345 <a style="color:#395fa0;text-decoration:none"
1345 <a style="color:#395fa0;text-decoration:none"
1346 href="http://mainline.com/repo">http://mainline.com/repo</a>
1346 href="http://mainline.com/repo">http://mainline.com/repo</a>
1347 branch
1347 branch
1348 <span style="color:#395fa0">trunk</span>:
1348 <span style="color:#395fa0">trunk</span>:
1349 </div>
1349 </div>
1350 <div>
1350 <div>
1351 <a style="color:#395fa0;text-decoration:none"
1351 <a style="color:#395fa0;text-decoration:none"
1352 href="http://pr.org/7">#7</a>
1352 href="http://pr.org/7">#7</a>
1353 "<span style="color:#395fa0">The Title</span>"
1353 "<span style="color:#395fa0">The Title</span>"
1354 by
1354 by
1355 <span style="color:#395fa0">u2 u3 (u2)</span>.
1355 <span style="color:#395fa0">u2 u3 (u2)</span>.
1356 </div>
1356 </div>
1357 </td>
1357 </td>
1358 </tr>
1358 </tr>
1359 <tr>
1359 <tr>
1360 <td>
1360 <td>
1361 <center>
1361 <center>
1362 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1362 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1363 <tr>
1363 <tr>
1364 <td height="25px" style="height:25px"></td>
1364 <td height="25px" style="height:25px"></td>
1365 </tr>
1365 </tr>
1366 <tr>
1366 <tr>
1367 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1367 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1368 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1368 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1369 <center>
1369 <center>
1370 <font size="3">
1370 <font size="3">
1371 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1371 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1372 </font>
1372 </font>
1373 </center>
1373 </center>
1374 </a>
1374 </a>
1375 </td>
1375 </td>
1376 </tr>
1376 </tr>
1377 </table>
1377 </table>
1378 </center>
1378 </center>
1379 </td>
1379 </td>
1380 </tr>
1380 </tr>
1381 </table>
1381 </table>
1382 </td>
1382 </td>
1383 <td></td>
1383 <td></td>
1384 </tr>
1384 </tr>
1385 <tr>
1385 <tr>
1386 <td height="30px" style="height:30px" colspan="3"></td>
1386 <td height="30px" style="height:30px" colspan="3"></td>
1387 </tr>
1387 </tr>
1388 </table>
1388 </table>
1389 </td>
1389 </td>
1390 <td width="30px" style="width:30px"></td>
1390 <td width="30px" style="width:30px"></td>
1391 </tr>
1391 </tr>
1392 </table>
1392 </table>
1393 <!--/body-->
1393 <!--/body-->
1394 <!--/html-->
1394 <!--/html-->
1395 <hr/>
1395 <hr/>
1396 <hr/>
1396 <hr/>
1397 <h1>pull_request_comment, is_mention=True, status_change=None, closing_pr=False</h1>
1397 <h1>pull_request_comment, is_mention=True, status_change=None, closing_pr=False</h1>
1398 <pre>
1398 <pre>
1399 From: u1
1399 From: u1
1400 To: u2@example.com
1400 To: u2@example.com
1401 Subject: [Comment] repo/name PR #7 "The Title" from devbranch by u2
1401 Subject: [Comment] repo/name PR #7 "The Title" from devbranch by u2
1402 </pre>
1402 </pre>
1403 <hr/>
1403 <hr/>
1404 <pre>http://pr.org/comment
1404 <pre>http://pr.org/comment
1405
1405
1406 Mention in Comment on Pull Request #7 "The Title"
1406 Mention in Comment on Pull Request #7 "The Title"
1407
1407
1408
1408
1409 Opinionated User (jsmith):
1409 Opinionated User (jsmith):
1410
1410
1411 Me too!
1411 Me too!
1412
1412
1413 - and indented on second line
1413 - and indented on second line
1414
1414
1415
1415
1416 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1416 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1417 #7 "The Title" by u2 u3 (u2).
1417 #7 "The Title" by u2 u3 (u2).
1418
1418
1419
1419
1420 View Comment: http://pr.org/comment
1420 View Comment: http://pr.org/comment
1421 </pre>
1421 </pre>
1422 <hr/>
1422 <hr/>
1423 <!--!doctype html-->
1423 <!--!doctype html-->
1424 <!--html lang="en"-->
1424 <!--html lang="en"-->
1425 <!--head-->
1425 <!--head-->
1426 <!--title--><!--/title-->
1426 <!--title--><!--/title-->
1427 <!--meta name="viewport" content="width=device-width"-->
1427 <!--meta name="viewport" content="width=device-width"-->
1428 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1428 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1429 <!--/head-->
1429 <!--/head-->
1430 <!--body-->
1430 <!--body-->
1431 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1431 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1432 <tr>
1432 <tr>
1433 <td width="30px" style="width:30px"></td>
1433 <td width="30px" style="width:30px"></td>
1434 <td>
1434 <td>
1435 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1435 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1436 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1436 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1437 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1437 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1438 <tr>
1438 <tr>
1439 <td colspan="3">
1439 <td colspan="3">
1440 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1440 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1441 style="border-bottom:1px solid #ddd">
1441 style="border-bottom:1px solid #ddd">
1442 <tr>
1442 <tr>
1443 <td height="20px" style="height:20px" colspan="3"></td>
1443 <td height="20px" style="height:20px" colspan="3"></td>
1444 </tr>
1444 </tr>
1445 <tr>
1445 <tr>
1446 <td width="30px" style="width:30px"></td>
1446 <td width="30px" style="width:30px"></td>
1447 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1447 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1448 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1448 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1449 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
1449 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
1450 </td>
1450 </td>
1451 <td width="30px" style="width:30px"></td>
1451 <td width="30px" style="width:30px"></td>
1452 </tr>
1452 </tr>
1453 <tr>
1453 <tr>
1454 <td height="20px" style="height:20px" colspan="3"></td>
1454 <td height="20px" style="height:20px" colspan="3"></td>
1455 </tr>
1455 </tr>
1456 </table>
1456 </table>
1457 </td>
1457 </td>
1458 </tr>
1458 </tr>
1459 <tr>
1459 <tr>
1460 <td height="30px" style="height:30px" colspan="3"></td>
1460 <td height="30px" style="height:30px" colspan="3"></td>
1461 </tr>
1461 </tr>
1462 <tr>
1462 <tr>
1463 <td></td>
1463 <td></td>
1464 <td>
1464 <td>
1465 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1465 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1466 <tr>
1466 <tr>
1467 <td>
1467 <td>
1468 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1468 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1469 <tr>
1469 <tr>
1470 <td height="10px" style="height:10px" colspan="3"></td>
1470 <td height="10px" style="height:10px" colspan="3"></td>
1471 </tr>
1471 </tr>
1472 <tr>
1472 <tr>
1473 <td width="20px" style="width:20px"></td>
1473 <td width="20px" style="width:20px"></td>
1474 <td>
1474 <td>
1475 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1475 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1476 </td>
1476 </td>
1477 <td width="20px" style="width:20px"></td>
1477 <td width="20px" style="width:20px"></td>
1478 </tr>
1478 </tr>
1479 <tr>
1479 <tr>
1480 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1480 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1481 </tr>
1481 </tr>
1482 <tr>
1482 <tr>
1483 <td height="10px" style="height:10px" colspan="3"></td>
1483 <td height="10px" style="height:10px" colspan="3"></td>
1484 </tr>
1484 </tr>
1485 <tr>
1485 <tr>
1486 <td width="20px" style="width:20px"></td>
1486 <td width="20px" style="width:20px"></td>
1487 <td>
1487 <td>
1488 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1488 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1489 </td>
1489 </td>
1490 <td width="20px" style="width:20px"></td>
1490 <td width="20px" style="width:20px"></td>
1491 </tr>
1491 </tr>
1492 <tr>
1492 <tr>
1493 <td height="10px" style="height:10px" colspan="3"></td>
1493 <td height="10px" style="height:10px" colspan="3"></td>
1494 </tr>
1494 </tr>
1495 </table>
1495 </table>
1496 </td>
1496 </td>
1497 </tr>
1497 </tr>
1498 <tr>
1498 <tr>
1499 <td height="30px" style="height:30px"></td>
1499 <td height="30px" style="height:30px"></td>
1500 </tr>
1500 </tr>
1501 <tr>
1501 <tr>
1502 <td>
1502 <td>
1503 <div>
1503 <div>
1504 Pull request from
1504 Pull request from
1505 <a style="color:#395fa0;text-decoration:none"
1505 <a style="color:#395fa0;text-decoration:none"
1506 href="https://dev.org/repo">https://dev.org/repo</a>
1506 href="https://dev.org/repo">https://dev.org/repo</a>
1507 branch
1507 branch
1508 <span style="color:#395fa0">devbranch</span>
1508 <span style="color:#395fa0">devbranch</span>
1509 to
1509 to
1510 <a style="color:#395fa0;text-decoration:none"
1510 <a style="color:#395fa0;text-decoration:none"
1511 href="http://mainline.com/repo">http://mainline.com/repo</a>
1511 href="http://mainline.com/repo">http://mainline.com/repo</a>
1512 branch
1512 branch
1513 <span style="color:#395fa0">trunk</span>:
1513 <span style="color:#395fa0">trunk</span>:
1514 </div>
1514 </div>
1515 <div>
1515 <div>
1516 <a style="color:#395fa0;text-decoration:none"
1516 <a style="color:#395fa0;text-decoration:none"
1517 href="http://pr.org/7">#7</a>
1517 href="http://pr.org/7">#7</a>
1518 "<span style="color:#395fa0">The Title</span>"
1518 "<span style="color:#395fa0">The Title</span>"
1519 by
1519 by
1520 <span style="color:#395fa0">u2 u3 (u2)</span>.
1520 <span style="color:#395fa0">u2 u3 (u2)</span>.
1521 </div>
1521 </div>
1522 </td>
1522 </td>
1523 </tr>
1523 </tr>
1524 <tr>
1524 <tr>
1525 <td>
1525 <td>
1526 <center>
1526 <center>
1527 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1527 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1528 <tr>
1528 <tr>
1529 <td height="25px" style="height:25px"></td>
1529 <td height="25px" style="height:25px"></td>
1530 </tr>
1530 </tr>
1531 <tr>
1531 <tr>
1532 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1532 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1533 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1533 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1534 <center>
1534 <center>
1535 <font size="3">
1535 <font size="3">
1536 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1536 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1537 </font>
1537 </font>
1538 </center>
1538 </center>
1539 </a>
1539 </a>
1540 </td>
1540 </td>
1541 </tr>
1541 </tr>
1542 </table>
1542 </table>
1543 </center>
1543 </center>
1544 </td>
1544 </td>
1545 </tr>
1545 </tr>
1546 </table>
1546 </table>
1547 </td>
1547 </td>
1548 <td></td>
1548 <td></td>
1549 </tr>
1549 </tr>
1550 <tr>
1550 <tr>
1551 <td height="30px" style="height:30px" colspan="3"></td>
1551 <td height="30px" style="height:30px" colspan="3"></td>
1552 </tr>
1552 </tr>
1553 </table>
1553 </table>
1554 </td>
1554 </td>
1555 <td width="30px" style="width:30px"></td>
1555 <td width="30px" style="width:30px"></td>
1556 </tr>
1556 </tr>
1557 </table>
1557 </table>
1558 <!--/body-->
1558 <!--/body-->
1559 <!--/html-->
1559 <!--/html-->
1560 <hr/>
1560 <hr/>
1561 <hr/>
1561 <hr/>
1562 <h1>pull_request_comment, is_mention=False, status_change='Under Review', closing_pr=False</h1>
1562 <h1>pull_request_comment, is_mention=False, status_change='Under Review', closing_pr=False</h1>
1563 <pre>
1563 <pre>
1564 From: u1
1564 From: u1
1565 To: u2@example.com
1565 To: u2@example.com
1566 Subject: [Under Review: Comment] repo/name PR #7 "The Title" from devbranch by u2
1566 Subject: [Under Review: Comment] repo/name PR #7 "The Title" from devbranch by u2
1567 </pre>
1567 </pre>
1568 <hr/>
1568 <hr/>
1569 <pre>http://pr.org/comment
1569 <pre>http://pr.org/comment
1570
1570
1571 Comment on Pull Request #7 "The Title"
1571 Comment on Pull Request #7 "The Title"
1572
1572
1573
1573
1574 Opinionated User (jsmith):
1574 Opinionated User (jsmith):
1575
1575
1576 Status change: Under Review
1576 Status change: Under Review
1577
1577
1578 Me too!
1578 Me too!
1579
1579
1580 - and indented on second line
1580 - and indented on second line
1581
1581
1582
1582
1583 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1583 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1584 #7 "The Title" by u2 u3 (u2).
1584 #7 "The Title" by u2 u3 (u2).
1585
1585
1586
1586
1587 View Comment: http://pr.org/comment
1587 View Comment: http://pr.org/comment
1588 </pre>
1588 </pre>
1589 <hr/>
1589 <hr/>
1590 <!--!doctype html-->
1590 <!--!doctype html-->
1591 <!--html lang="en"-->
1591 <!--html lang="en"-->
1592 <!--head-->
1592 <!--head-->
1593 <!--title--><!--/title-->
1593 <!--title--><!--/title-->
1594 <!--meta name="viewport" content="width=device-width"-->
1594 <!--meta name="viewport" content="width=device-width"-->
1595 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1595 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1596 <!--/head-->
1596 <!--/head-->
1597 <!--body-->
1597 <!--body-->
1598 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1598 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1599 <tr>
1599 <tr>
1600 <td width="30px" style="width:30px"></td>
1600 <td width="30px" style="width:30px"></td>
1601 <td>
1601 <td>
1602 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1602 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1603 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1603 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1604 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1604 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1605 <tr>
1605 <tr>
1606 <td colspan="3">
1606 <td colspan="3">
1607 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1607 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1608 style="border-bottom:1px solid #ddd">
1608 style="border-bottom:1px solid #ddd">
1609 <tr>
1609 <tr>
1610 <td height="20px" style="height:20px" colspan="3"></td>
1610 <td height="20px" style="height:20px" colspan="3"></td>
1611 </tr>
1611 </tr>
1612 <tr>
1612 <tr>
1613 <td width="30px" style="width:30px"></td>
1613 <td width="30px" style="width:30px"></td>
1614 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1614 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1615 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1615 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1616 target="_blank">Comment on Pull Request #7 &#34;The Title&#34;</a>
1616 target="_blank">Comment on Pull Request #7 &#34;The Title&#34;</a>
1617 </td>
1617 </td>
1618 <td width="30px" style="width:30px"></td>
1618 <td width="30px" style="width:30px"></td>
1619 </tr>
1619 </tr>
1620 <tr>
1620 <tr>
1621 <td height="20px" style="height:20px" colspan="3"></td>
1621 <td height="20px" style="height:20px" colspan="3"></td>
1622 </tr>
1622 </tr>
1623 </table>
1623 </table>
1624 </td>
1624 </td>
1625 </tr>
1625 </tr>
1626 <tr>
1626 <tr>
1627 <td height="30px" style="height:30px" colspan="3"></td>
1627 <td height="30px" style="height:30px" colspan="3"></td>
1628 </tr>
1628 </tr>
1629 <tr>
1629 <tr>
1630 <td></td>
1630 <td></td>
1631 <td>
1631 <td>
1632 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1632 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1633 <tr>
1633 <tr>
1634 <td>
1634 <td>
1635 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1635 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1636 <tr>
1636 <tr>
1637 <td height="10px" style="height:10px" colspan="3"></td>
1637 <td height="10px" style="height:10px" colspan="3"></td>
1638 </tr>
1638 </tr>
1639 <tr>
1639 <tr>
1640 <td width="20px" style="width:20px"></td>
1640 <td width="20px" style="width:20px"></td>
1641 <td>
1641 <td>
1642 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1642 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1643 </td>
1643 </td>
1644 <td width="20px" style="width:20px"></td>
1644 <td width="20px" style="width:20px"></td>
1645 </tr>
1645 </tr>
1646 <tr>
1646 <tr>
1647 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1647 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1648 </tr>
1648 </tr>
1649 <tr>
1649 <tr>
1650 <td height="10px" style="height:10px" colspan="3"></td>
1650 <td height="10px" style="height:10px" colspan="3"></td>
1651 </tr>
1651 </tr>
1652 <tr>
1652 <tr>
1653 <td width="20px" style="width:20px"></td>
1653 <td width="20px" style="width:20px"></td>
1654 <td>
1654 <td>
1655 <div style="font-weight:600">
1655 <div style="font-weight:600">
1656 Status change:
1656 Status change:
1657 Under Review
1657 Under Review
1658 </div>
1658 </div>
1659 </td>
1659 </td>
1660 <td width="20px" style="width:20px"></td>
1660 <td width="20px" style="width:20px"></td>
1661 </tr>
1661 </tr>
1662 <tr>
1662 <tr>
1663 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1663 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1664 </tr>
1664 </tr>
1665 <tr>
1665 <tr>
1666 <td height="10px" style="height:10px" colspan="3"></td>
1666 <td height="10px" style="height:10px" colspan="3"></td>
1667 </tr>
1667 </tr>
1668 <tr>
1668 <tr>
1669 <td width="20px" style="width:20px"></td>
1669 <td width="20px" style="width:20px"></td>
1670 <td>
1670 <td>
1671 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1671 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1672 </td>
1672 </td>
1673 <td width="20px" style="width:20px"></td>
1673 <td width="20px" style="width:20px"></td>
1674 </tr>
1674 </tr>
1675 <tr>
1675 <tr>
1676 <td height="10px" style="height:10px" colspan="3"></td>
1676 <td height="10px" style="height:10px" colspan="3"></td>
1677 </tr>
1677 </tr>
1678 </table>
1678 </table>
1679 </td>
1679 </td>
1680 </tr>
1680 </tr>
1681 <tr>
1681 <tr>
1682 <td height="30px" style="height:30px"></td>
1682 <td height="30px" style="height:30px"></td>
1683 </tr>
1683 </tr>
1684 <tr>
1684 <tr>
1685 <td>
1685 <td>
1686 <div>
1686 <div>
1687 Pull request from
1687 Pull request from
1688 <a style="color:#395fa0;text-decoration:none"
1688 <a style="color:#395fa0;text-decoration:none"
1689 href="https://dev.org/repo">https://dev.org/repo</a>
1689 href="https://dev.org/repo">https://dev.org/repo</a>
1690 branch
1690 branch
1691 <span style="color:#395fa0">devbranch</span>
1691 <span style="color:#395fa0">devbranch</span>
1692 to
1692 to
1693 <a style="color:#395fa0;text-decoration:none"
1693 <a style="color:#395fa0;text-decoration:none"
1694 href="http://mainline.com/repo">http://mainline.com/repo</a>
1694 href="http://mainline.com/repo">http://mainline.com/repo</a>
1695 branch
1695 branch
1696 <span style="color:#395fa0">trunk</span>:
1696 <span style="color:#395fa0">trunk</span>:
1697 </div>
1697 </div>
1698 <div>
1698 <div>
1699 <a style="color:#395fa0;text-decoration:none"
1699 <a style="color:#395fa0;text-decoration:none"
1700 href="http://pr.org/7">#7</a>
1700 href="http://pr.org/7">#7</a>
1701 "<span style="color:#395fa0">The Title</span>"
1701 "<span style="color:#395fa0">The Title</span>"
1702 by
1702 by
1703 <span style="color:#395fa0">u2 u3 (u2)</span>.
1703 <span style="color:#395fa0">u2 u3 (u2)</span>.
1704 </div>
1704 </div>
1705 </td>
1705 </td>
1706 </tr>
1706 </tr>
1707 <tr>
1707 <tr>
1708 <td>
1708 <td>
1709 <center>
1709 <center>
1710 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1710 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1711 <tr>
1711 <tr>
1712 <td height="25px" style="height:25px"></td>
1712 <td height="25px" style="height:25px"></td>
1713 </tr>
1713 </tr>
1714 <tr>
1714 <tr>
1715 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1715 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1716 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1716 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1717 <center>
1717 <center>
1718 <font size="3">
1718 <font size="3">
1719 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1719 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1720 </font>
1720 </font>
1721 </center>
1721 </center>
1722 </a>
1722 </a>
1723 </td>
1723 </td>
1724 </tr>
1724 </tr>
1725 </table>
1725 </table>
1726 </center>
1726 </center>
1727 </td>
1727 </td>
1728 </tr>
1728 </tr>
1729 </table>
1729 </table>
1730 </td>
1730 </td>
1731 <td></td>
1731 <td></td>
1732 </tr>
1732 </tr>
1733 <tr>
1733 <tr>
1734 <td height="30px" style="height:30px" colspan="3"></td>
1734 <td height="30px" style="height:30px" colspan="3"></td>
1735 </tr>
1735 </tr>
1736 </table>
1736 </table>
1737 </td>
1737 </td>
1738 <td width="30px" style="width:30px"></td>
1738 <td width="30px" style="width:30px"></td>
1739 </tr>
1739 </tr>
1740 </table>
1740 </table>
1741 <!--/body-->
1741 <!--/body-->
1742 <!--/html-->
1742 <!--/html-->
1743 <hr/>
1743 <hr/>
1744 <hr/>
1744 <hr/>
1745 <h1>pull_request_comment, is_mention=True, status_change='Under Review', closing_pr=False</h1>
1745 <h1>pull_request_comment, is_mention=True, status_change='Under Review', closing_pr=False</h1>
1746 <pre>
1746 <pre>
1747 From: u1
1747 From: u1
1748 To: u2@example.com
1748 To: u2@example.com
1749 Subject: [Under Review: Comment] repo/name PR #7 "The Title" from devbranch by u2
1749 Subject: [Under Review: Comment] repo/name PR #7 "The Title" from devbranch by u2
1750 </pre>
1750 </pre>
1751 <hr/>
1751 <hr/>
1752 <pre>http://pr.org/comment
1752 <pre>http://pr.org/comment
1753
1753
1754 Mention in Comment on Pull Request #7 "The Title"
1754 Mention in Comment on Pull Request #7 "The Title"
1755
1755
1756
1756
1757 Opinionated User (jsmith):
1757 Opinionated User (jsmith):
1758
1758
1759 Status change: Under Review
1759 Status change: Under Review
1760
1760
1761 Me too!
1761 Me too!
1762
1762
1763 - and indented on second line
1763 - and indented on second line
1764
1764
1765
1765
1766 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1766 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1767 #7 "The Title" by u2 u3 (u2).
1767 #7 "The Title" by u2 u3 (u2).
1768
1768
1769
1769
1770 View Comment: http://pr.org/comment
1770 View Comment: http://pr.org/comment
1771 </pre>
1771 </pre>
1772 <hr/>
1772 <hr/>
1773 <!--!doctype html-->
1773 <!--!doctype html-->
1774 <!--html lang="en"-->
1774 <!--html lang="en"-->
1775 <!--head-->
1775 <!--head-->
1776 <!--title--><!--/title-->
1776 <!--title--><!--/title-->
1777 <!--meta name="viewport" content="width=device-width"-->
1777 <!--meta name="viewport" content="width=device-width"-->
1778 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1778 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1779 <!--/head-->
1779 <!--/head-->
1780 <!--body-->
1780 <!--body-->
1781 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1781 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1782 <tr>
1782 <tr>
1783 <td width="30px" style="width:30px"></td>
1783 <td width="30px" style="width:30px"></td>
1784 <td>
1784 <td>
1785 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1785 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1786 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1786 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1787 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1787 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1788 <tr>
1788 <tr>
1789 <td colspan="3">
1789 <td colspan="3">
1790 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1790 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1791 style="border-bottom:1px solid #ddd">
1791 style="border-bottom:1px solid #ddd">
1792 <tr>
1792 <tr>
1793 <td height="20px" style="height:20px" colspan="3"></td>
1793 <td height="20px" style="height:20px" colspan="3"></td>
1794 </tr>
1794 </tr>
1795 <tr>
1795 <tr>
1796 <td width="30px" style="width:30px"></td>
1796 <td width="30px" style="width:30px"></td>
1797 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1797 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1798 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1798 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1799 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
1799 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
1800 </td>
1800 </td>
1801 <td width="30px" style="width:30px"></td>
1801 <td width="30px" style="width:30px"></td>
1802 </tr>
1802 </tr>
1803 <tr>
1803 <tr>
1804 <td height="20px" style="height:20px" colspan="3"></td>
1804 <td height="20px" style="height:20px" colspan="3"></td>
1805 </tr>
1805 </tr>
1806 </table>
1806 </table>
1807 </td>
1807 </td>
1808 </tr>
1808 </tr>
1809 <tr>
1809 <tr>
1810 <td height="30px" style="height:30px" colspan="3"></td>
1810 <td height="30px" style="height:30px" colspan="3"></td>
1811 </tr>
1811 </tr>
1812 <tr>
1812 <tr>
1813 <td></td>
1813 <td></td>
1814 <td>
1814 <td>
1815 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1815 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1816 <tr>
1816 <tr>
1817 <td>
1817 <td>
1818 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1818 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
1819 <tr>
1819 <tr>
1820 <td height="10px" style="height:10px" colspan="3"></td>
1820 <td height="10px" style="height:10px" colspan="3"></td>
1821 </tr>
1821 </tr>
1822 <tr>
1822 <tr>
1823 <td width="20px" style="width:20px"></td>
1823 <td width="20px" style="width:20px"></td>
1824 <td>
1824 <td>
1825 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1825 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
1826 </td>
1826 </td>
1827 <td width="20px" style="width:20px"></td>
1827 <td width="20px" style="width:20px"></td>
1828 </tr>
1828 </tr>
1829 <tr>
1829 <tr>
1830 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1830 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1831 </tr>
1831 </tr>
1832 <tr>
1832 <tr>
1833 <td height="10px" style="height:10px" colspan="3"></td>
1833 <td height="10px" style="height:10px" colspan="3"></td>
1834 </tr>
1834 </tr>
1835 <tr>
1835 <tr>
1836 <td width="20px" style="width:20px"></td>
1836 <td width="20px" style="width:20px"></td>
1837 <td>
1837 <td>
1838 <div style="font-weight:600">
1838 <div style="font-weight:600">
1839 Status change:
1839 Status change:
1840 Under Review
1840 Under Review
1841 </div>
1841 </div>
1842 </td>
1842 </td>
1843 <td width="20px" style="width:20px"></td>
1843 <td width="20px" style="width:20px"></td>
1844 </tr>
1844 </tr>
1845 <tr>
1845 <tr>
1846 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1846 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
1847 </tr>
1847 </tr>
1848 <tr>
1848 <tr>
1849 <td height="10px" style="height:10px" colspan="3"></td>
1849 <td height="10px" style="height:10px" colspan="3"></td>
1850 </tr>
1850 </tr>
1851 <tr>
1851 <tr>
1852 <td width="20px" style="width:20px"></td>
1852 <td width="20px" style="width:20px"></td>
1853 <td>
1853 <td>
1854 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1854 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
1855 </td>
1855 </td>
1856 <td width="20px" style="width:20px"></td>
1856 <td width="20px" style="width:20px"></td>
1857 </tr>
1857 </tr>
1858 <tr>
1858 <tr>
1859 <td height="10px" style="height:10px" colspan="3"></td>
1859 <td height="10px" style="height:10px" colspan="3"></td>
1860 </tr>
1860 </tr>
1861 </table>
1861 </table>
1862 </td>
1862 </td>
1863 </tr>
1863 </tr>
1864 <tr>
1864 <tr>
1865 <td height="30px" style="height:30px"></td>
1865 <td height="30px" style="height:30px"></td>
1866 </tr>
1866 </tr>
1867 <tr>
1867 <tr>
1868 <td>
1868 <td>
1869 <div>
1869 <div>
1870 Pull request from
1870 Pull request from
1871 <a style="color:#395fa0;text-decoration:none"
1871 <a style="color:#395fa0;text-decoration:none"
1872 href="https://dev.org/repo">https://dev.org/repo</a>
1872 href="https://dev.org/repo">https://dev.org/repo</a>
1873 branch
1873 branch
1874 <span style="color:#395fa0">devbranch</span>
1874 <span style="color:#395fa0">devbranch</span>
1875 to
1875 to
1876 <a style="color:#395fa0;text-decoration:none"
1876 <a style="color:#395fa0;text-decoration:none"
1877 href="http://mainline.com/repo">http://mainline.com/repo</a>
1877 href="http://mainline.com/repo">http://mainline.com/repo</a>
1878 branch
1878 branch
1879 <span style="color:#395fa0">trunk</span>:
1879 <span style="color:#395fa0">trunk</span>:
1880 </div>
1880 </div>
1881 <div>
1881 <div>
1882 <a style="color:#395fa0;text-decoration:none"
1882 <a style="color:#395fa0;text-decoration:none"
1883 href="http://pr.org/7">#7</a>
1883 href="http://pr.org/7">#7</a>
1884 "<span style="color:#395fa0">The Title</span>"
1884 "<span style="color:#395fa0">The Title</span>"
1885 by
1885 by
1886 <span style="color:#395fa0">u2 u3 (u2)</span>.
1886 <span style="color:#395fa0">u2 u3 (u2)</span>.
1887 </div>
1887 </div>
1888 </td>
1888 </td>
1889 </tr>
1889 </tr>
1890 <tr>
1890 <tr>
1891 <td>
1891 <td>
1892 <center>
1892 <center>
1893 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1893 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
1894 <tr>
1894 <tr>
1895 <td height="25px" style="height:25px"></td>
1895 <td height="25px" style="height:25px"></td>
1896 </tr>
1896 </tr>
1897 <tr>
1897 <tr>
1898 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1898 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
1899 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1899 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
1900 <center>
1900 <center>
1901 <font size="3">
1901 <font size="3">
1902 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1902 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
1903 </font>
1903 </font>
1904 </center>
1904 </center>
1905 </a>
1905 </a>
1906 </td>
1906 </td>
1907 </tr>
1907 </tr>
1908 </table>
1908 </table>
1909 </center>
1909 </center>
1910 </td>
1910 </td>
1911 </tr>
1911 </tr>
1912 </table>
1912 </table>
1913 </td>
1913 </td>
1914 <td></td>
1914 <td></td>
1915 </tr>
1915 </tr>
1916 <tr>
1916 <tr>
1917 <td height="30px" style="height:30px" colspan="3"></td>
1917 <td height="30px" style="height:30px" colspan="3"></td>
1918 </tr>
1918 </tr>
1919 </table>
1919 </table>
1920 </td>
1920 </td>
1921 <td width="30px" style="width:30px"></td>
1921 <td width="30px" style="width:30px"></td>
1922 </tr>
1922 </tr>
1923 </table>
1923 </table>
1924 <!--/body-->
1924 <!--/body-->
1925 <!--/html-->
1925 <!--/html-->
1926 <hr/>
1926 <hr/>
1927 <hr/>
1927 <hr/>
1928 <h1>pull_request_comment, is_mention=False, status_change=None, closing_pr=True</h1>
1928 <h1>pull_request_comment, is_mention=False, status_change=None, closing_pr=True</h1>
1929 <pre>
1929 <pre>
1930 From: u1
1930 From: u1
1931 To: u2@example.com
1931 To: u2@example.com
1932 Subject: [Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
1932 Subject: [Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
1933 </pre>
1933 </pre>
1934 <hr/>
1934 <hr/>
1935 <pre>http://pr.org/comment
1935 <pre>http://pr.org/comment
1936
1936
1937 Pull Request #7 "The Title" Closed
1937 Pull Request #7 "The Title" Closed
1938
1938
1939
1939
1940 Opinionated User (jsmith):
1940 Opinionated User (jsmith):
1941
1941
1942 The pull request has been closed.
1942 The pull request has been closed.
1943
1943
1944 Me too!
1944 Me too!
1945
1945
1946 - and indented on second line
1946 - and indented on second line
1947
1947
1948
1948
1949 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1949 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
1950 #7 "The Title" by u2 u3 (u2).
1950 #7 "The Title" by u2 u3 (u2).
1951
1951
1952
1952
1953 View Comment: http://pr.org/comment
1953 View Comment: http://pr.org/comment
1954 </pre>
1954 </pre>
1955 <hr/>
1955 <hr/>
1956 <!--!doctype html-->
1956 <!--!doctype html-->
1957 <!--html lang="en"-->
1957 <!--html lang="en"-->
1958 <!--head-->
1958 <!--head-->
1959 <!--title--><!--/title-->
1959 <!--title--><!--/title-->
1960 <!--meta name="viewport" content="width=device-width"-->
1960 <!--meta name="viewport" content="width=device-width"-->
1961 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1961 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
1962 <!--/head-->
1962 <!--/head-->
1963 <!--body-->
1963 <!--body-->
1964 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1964 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
1965 <tr>
1965 <tr>
1966 <td width="30px" style="width:30px"></td>
1966 <td width="30px" style="width:30px"></td>
1967 <td>
1967 <td>
1968 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1968 <table width="100%" cellpadding="0" cellspacing="0" border="0"
1969 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1969 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
1970 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1970 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
1971 <tr>
1971 <tr>
1972 <td colspan="3">
1972 <td colspan="3">
1973 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1973 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
1974 style="border-bottom:1px solid #ddd">
1974 style="border-bottom:1px solid #ddd">
1975 <tr>
1975 <tr>
1976 <td height="20px" style="height:20px" colspan="3"></td>
1976 <td height="20px" style="height:20px" colspan="3"></td>
1977 </tr>
1977 </tr>
1978 <tr>
1978 <tr>
1979 <td width="30px" style="width:30px"></td>
1979 <td width="30px" style="width:30px"></td>
1980 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1980 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
1981 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1981 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
1982 target="_blank">Pull Request #7 &#34;The Title&#34; Closed</a>
1982 target="_blank">Pull Request #7 &#34;The Title&#34; Closed</a>
1983 </td>
1983 </td>
1984 <td width="30px" style="width:30px"></td>
1984 <td width="30px" style="width:30px"></td>
1985 </tr>
1985 </tr>
1986 <tr>
1986 <tr>
1987 <td height="20px" style="height:20px" colspan="3"></td>
1987 <td height="20px" style="height:20px" colspan="3"></td>
1988 </tr>
1988 </tr>
1989 </table>
1989 </table>
1990 </td>
1990 </td>
1991 </tr>
1991 </tr>
1992 <tr>
1992 <tr>
1993 <td height="30px" style="height:30px" colspan="3"></td>
1993 <td height="30px" style="height:30px" colspan="3"></td>
1994 </tr>
1994 </tr>
1995 <tr>
1995 <tr>
1996 <td></td>
1996 <td></td>
1997 <td>
1997 <td>
1998 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1998 <table cellpadding="0" cellspacing="0" border="0" width="100%">
1999 <tr>
1999 <tr>
2000 <td>
2000 <td>
2001 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2001 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2002 <tr>
2002 <tr>
2003 <td height="10px" style="height:10px" colspan="3"></td>
2003 <td height="10px" style="height:10px" colspan="3"></td>
2004 </tr>
2004 </tr>
2005 <tr>
2005 <tr>
2006 <td width="20px" style="width:20px"></td>
2006 <td width="20px" style="width:20px"></td>
2007 <td>
2007 <td>
2008 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2008 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2009 </td>
2009 </td>
2010 <td width="20px" style="width:20px"></td>
2010 <td width="20px" style="width:20px"></td>
2011 </tr>
2011 </tr>
2012 <tr>
2012 <tr>
2013 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2013 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2014 </tr>
2014 </tr>
2015 <tr>
2015 <tr>
2016 <td height="10px" style="height:10px" colspan="3"></td>
2016 <td height="10px" style="height:10px" colspan="3"></td>
2017 </tr>
2017 </tr>
2018 <tr>
2018 <tr>
2019 <td width="20px" style="width:20px"></td>
2019 <td width="20px" style="width:20px"></td>
2020 <td>
2020 <td>
2021 <div style="font-weight:600">
2021 <div style="font-weight:600">
2022 The pull request has been closed.
2022 The pull request has been closed.
2023 </div>
2023 </div>
2024 </td>
2024 </td>
2025 <td width="20px" style="width:20px"></td>
2025 <td width="20px" style="width:20px"></td>
2026 </tr>
2026 </tr>
2027 <tr>
2027 <tr>
2028 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2028 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2029 </tr>
2029 </tr>
2030 <tr>
2030 <tr>
2031 <td height="10px" style="height:10px" colspan="3"></td>
2031 <td height="10px" style="height:10px" colspan="3"></td>
2032 </tr>
2032 </tr>
2033 <tr>
2033 <tr>
2034 <td width="20px" style="width:20px"></td>
2034 <td width="20px" style="width:20px"></td>
2035 <td>
2035 <td>
2036 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2036 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2037 </td>
2037 </td>
2038 <td width="20px" style="width:20px"></td>
2038 <td width="20px" style="width:20px"></td>
2039 </tr>
2039 </tr>
2040 <tr>
2040 <tr>
2041 <td height="10px" style="height:10px" colspan="3"></td>
2041 <td height="10px" style="height:10px" colspan="3"></td>
2042 </tr>
2042 </tr>
2043 </table>
2043 </table>
2044 </td>
2044 </td>
2045 </tr>
2045 </tr>
2046 <tr>
2046 <tr>
2047 <td height="30px" style="height:30px"></td>
2047 <td height="30px" style="height:30px"></td>
2048 </tr>
2048 </tr>
2049 <tr>
2049 <tr>
2050 <td>
2050 <td>
2051 <div>
2051 <div>
2052 Pull request from
2052 Pull request from
2053 <a style="color:#395fa0;text-decoration:none"
2053 <a style="color:#395fa0;text-decoration:none"
2054 href="https://dev.org/repo">https://dev.org/repo</a>
2054 href="https://dev.org/repo">https://dev.org/repo</a>
2055 branch
2055 branch
2056 <span style="color:#395fa0">devbranch</span>
2056 <span style="color:#395fa0">devbranch</span>
2057 to
2057 to
2058 <a style="color:#395fa0;text-decoration:none"
2058 <a style="color:#395fa0;text-decoration:none"
2059 href="http://mainline.com/repo">http://mainline.com/repo</a>
2059 href="http://mainline.com/repo">http://mainline.com/repo</a>
2060 branch
2060 branch
2061 <span style="color:#395fa0">trunk</span>:
2061 <span style="color:#395fa0">trunk</span>:
2062 </div>
2062 </div>
2063 <div>
2063 <div>
2064 <a style="color:#395fa0;text-decoration:none"
2064 <a style="color:#395fa0;text-decoration:none"
2065 href="http://pr.org/7">#7</a>
2065 href="http://pr.org/7">#7</a>
2066 "<span style="color:#395fa0">The Title</span>"
2066 "<span style="color:#395fa0">The Title</span>"
2067 by
2067 by
2068 <span style="color:#395fa0">u2 u3 (u2)</span>.
2068 <span style="color:#395fa0">u2 u3 (u2)</span>.
2069 </div>
2069 </div>
2070 </td>
2070 </td>
2071 </tr>
2071 </tr>
2072 <tr>
2072 <tr>
2073 <td>
2073 <td>
2074 <center>
2074 <center>
2075 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2075 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2076 <tr>
2076 <tr>
2077 <td height="25px" style="height:25px"></td>
2077 <td height="25px" style="height:25px"></td>
2078 </tr>
2078 </tr>
2079 <tr>
2079 <tr>
2080 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2080 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2081 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2081 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2082 <center>
2082 <center>
2083 <font size="3">
2083 <font size="3">
2084 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2084 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2085 </font>
2085 </font>
2086 </center>
2086 </center>
2087 </a>
2087 </a>
2088 </td>
2088 </td>
2089 </tr>
2089 </tr>
2090 </table>
2090 </table>
2091 </center>
2091 </center>
2092 </td>
2092 </td>
2093 </tr>
2093 </tr>
2094 </table>
2094 </table>
2095 </td>
2095 </td>
2096 <td></td>
2096 <td></td>
2097 </tr>
2097 </tr>
2098 <tr>
2098 <tr>
2099 <td height="30px" style="height:30px" colspan="3"></td>
2099 <td height="30px" style="height:30px" colspan="3"></td>
2100 </tr>
2100 </tr>
2101 </table>
2101 </table>
2102 </td>
2102 </td>
2103 <td width="30px" style="width:30px"></td>
2103 <td width="30px" style="width:30px"></td>
2104 </tr>
2104 </tr>
2105 </table>
2105 </table>
2106 <!--/body-->
2106 <!--/body-->
2107 <!--/html-->
2107 <!--/html-->
2108 <hr/>
2108 <hr/>
2109 <hr/>
2109 <hr/>
2110 <h1>pull_request_comment, is_mention=True, status_change=None, closing_pr=True</h1>
2110 <h1>pull_request_comment, is_mention=True, status_change=None, closing_pr=True</h1>
2111 <pre>
2111 <pre>
2112 From: u1
2112 From: u1
2113 To: u2@example.com
2113 To: u2@example.com
2114 Subject: [Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
2114 Subject: [Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
2115 </pre>
2115 </pre>
2116 <hr/>
2116 <hr/>
2117 <pre>http://pr.org/comment
2117 <pre>http://pr.org/comment
2118
2118
2119 Mention in Comment on Pull Request #7 "The Title"
2119 Mention in Comment on Pull Request #7 "The Title"
2120
2120
2121
2121
2122 Opinionated User (jsmith):
2122 Opinionated User (jsmith):
2123
2123
2124 The pull request has been closed.
2124 The pull request has been closed.
2125
2125
2126 Me too!
2126 Me too!
2127
2127
2128 - and indented on second line
2128 - and indented on second line
2129
2129
2130
2130
2131 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
2131 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
2132 #7 "The Title" by u2 u3 (u2).
2132 #7 "The Title" by u2 u3 (u2).
2133
2133
2134
2134
2135 View Comment: http://pr.org/comment
2135 View Comment: http://pr.org/comment
2136 </pre>
2136 </pre>
2137 <hr/>
2137 <hr/>
2138 <!--!doctype html-->
2138 <!--!doctype html-->
2139 <!--html lang="en"-->
2139 <!--html lang="en"-->
2140 <!--head-->
2140 <!--head-->
2141 <!--title--><!--/title-->
2141 <!--title--><!--/title-->
2142 <!--meta name="viewport" content="width=device-width"-->
2142 <!--meta name="viewport" content="width=device-width"-->
2143 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2143 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2144 <!--/head-->
2144 <!--/head-->
2145 <!--body-->
2145 <!--body-->
2146 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2146 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2147 <tr>
2147 <tr>
2148 <td width="30px" style="width:30px"></td>
2148 <td width="30px" style="width:30px"></td>
2149 <td>
2149 <td>
2150 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2150 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2151 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2151 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2152 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2152 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2153 <tr>
2153 <tr>
2154 <td colspan="3">
2154 <td colspan="3">
2155 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2155 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2156 style="border-bottom:1px solid #ddd">
2156 style="border-bottom:1px solid #ddd">
2157 <tr>
2157 <tr>
2158 <td height="20px" style="height:20px" colspan="3"></td>
2158 <td height="20px" style="height:20px" colspan="3"></td>
2159 </tr>
2159 </tr>
2160 <tr>
2160 <tr>
2161 <td width="30px" style="width:30px"></td>
2161 <td width="30px" style="width:30px"></td>
2162 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2162 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2163 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
2163 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
2164 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
2164 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
2165 </td>
2165 </td>
2166 <td width="30px" style="width:30px"></td>
2166 <td width="30px" style="width:30px"></td>
2167 </tr>
2167 </tr>
2168 <tr>
2168 <tr>
2169 <td height="20px" style="height:20px" colspan="3"></td>
2169 <td height="20px" style="height:20px" colspan="3"></td>
2170 </tr>
2170 </tr>
2171 </table>
2171 </table>
2172 </td>
2172 </td>
2173 </tr>
2173 </tr>
2174 <tr>
2174 <tr>
2175 <td height="30px" style="height:30px" colspan="3"></td>
2175 <td height="30px" style="height:30px" colspan="3"></td>
2176 </tr>
2176 </tr>
2177 <tr>
2177 <tr>
2178 <td></td>
2178 <td></td>
2179 <td>
2179 <td>
2180 <table cellpadding="0" cellspacing="0" border="0" width="100%">
2180 <table cellpadding="0" cellspacing="0" border="0" width="100%">
2181 <tr>
2181 <tr>
2182 <td>
2182 <td>
2183 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2183 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2184 <tr>
2184 <tr>
2185 <td height="10px" style="height:10px" colspan="3"></td>
2185 <td height="10px" style="height:10px" colspan="3"></td>
2186 </tr>
2186 </tr>
2187 <tr>
2187 <tr>
2188 <td width="20px" style="width:20px"></td>
2188 <td width="20px" style="width:20px"></td>
2189 <td>
2189 <td>
2190 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2190 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2191 </td>
2191 </td>
2192 <td width="20px" style="width:20px"></td>
2192 <td width="20px" style="width:20px"></td>
2193 </tr>
2193 </tr>
2194 <tr>
2194 <tr>
2195 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2195 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2196 </tr>
2196 </tr>
2197 <tr>
2197 <tr>
2198 <td height="10px" style="height:10px" colspan="3"></td>
2198 <td height="10px" style="height:10px" colspan="3"></td>
2199 </tr>
2199 </tr>
2200 <tr>
2200 <tr>
2201 <td width="20px" style="width:20px"></td>
2201 <td width="20px" style="width:20px"></td>
2202 <td>
2202 <td>
2203 <div style="font-weight:600">
2203 <div style="font-weight:600">
2204 The pull request has been closed.
2204 The pull request has been closed.
2205 </div>
2205 </div>
2206 </td>
2206 </td>
2207 <td width="20px" style="width:20px"></td>
2207 <td width="20px" style="width:20px"></td>
2208 </tr>
2208 </tr>
2209 <tr>
2209 <tr>
2210 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2210 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2211 </tr>
2211 </tr>
2212 <tr>
2212 <tr>
2213 <td height="10px" style="height:10px" colspan="3"></td>
2213 <td height="10px" style="height:10px" colspan="3"></td>
2214 </tr>
2214 </tr>
2215 <tr>
2215 <tr>
2216 <td width="20px" style="width:20px"></td>
2216 <td width="20px" style="width:20px"></td>
2217 <td>
2217 <td>
2218 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2218 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2219 </td>
2219 </td>
2220 <td width="20px" style="width:20px"></td>
2220 <td width="20px" style="width:20px"></td>
2221 </tr>
2221 </tr>
2222 <tr>
2222 <tr>
2223 <td height="10px" style="height:10px" colspan="3"></td>
2223 <td height="10px" style="height:10px" colspan="3"></td>
2224 </tr>
2224 </tr>
2225 </table>
2225 </table>
2226 </td>
2226 </td>
2227 </tr>
2227 </tr>
2228 <tr>
2228 <tr>
2229 <td height="30px" style="height:30px"></td>
2229 <td height="30px" style="height:30px"></td>
2230 </tr>
2230 </tr>
2231 <tr>
2231 <tr>
2232 <td>
2232 <td>
2233 <div>
2233 <div>
2234 Pull request from
2234 Pull request from
2235 <a style="color:#395fa0;text-decoration:none"
2235 <a style="color:#395fa0;text-decoration:none"
2236 href="https://dev.org/repo">https://dev.org/repo</a>
2236 href="https://dev.org/repo">https://dev.org/repo</a>
2237 branch
2237 branch
2238 <span style="color:#395fa0">devbranch</span>
2238 <span style="color:#395fa0">devbranch</span>
2239 to
2239 to
2240 <a style="color:#395fa0;text-decoration:none"
2240 <a style="color:#395fa0;text-decoration:none"
2241 href="http://mainline.com/repo">http://mainline.com/repo</a>
2241 href="http://mainline.com/repo">http://mainline.com/repo</a>
2242 branch
2242 branch
2243 <span style="color:#395fa0">trunk</span>:
2243 <span style="color:#395fa0">trunk</span>:
2244 </div>
2244 </div>
2245 <div>
2245 <div>
2246 <a style="color:#395fa0;text-decoration:none"
2246 <a style="color:#395fa0;text-decoration:none"
2247 href="http://pr.org/7">#7</a>
2247 href="http://pr.org/7">#7</a>
2248 "<span style="color:#395fa0">The Title</span>"
2248 "<span style="color:#395fa0">The Title</span>"
2249 by
2249 by
2250 <span style="color:#395fa0">u2 u3 (u2)</span>.
2250 <span style="color:#395fa0">u2 u3 (u2)</span>.
2251 </div>
2251 </div>
2252 </td>
2252 </td>
2253 </tr>
2253 </tr>
2254 <tr>
2254 <tr>
2255 <td>
2255 <td>
2256 <center>
2256 <center>
2257 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2257 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2258 <tr>
2258 <tr>
2259 <td height="25px" style="height:25px"></td>
2259 <td height="25px" style="height:25px"></td>
2260 </tr>
2260 </tr>
2261 <tr>
2261 <tr>
2262 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2262 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2263 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2263 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2264 <center>
2264 <center>
2265 <font size="3">
2265 <font size="3">
2266 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2266 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2267 </font>
2267 </font>
2268 </center>
2268 </center>
2269 </a>
2269 </a>
2270 </td>
2270 </td>
2271 </tr>
2271 </tr>
2272 </table>
2272 </table>
2273 </center>
2273 </center>
2274 </td>
2274 </td>
2275 </tr>
2275 </tr>
2276 </table>
2276 </table>
2277 </td>
2277 </td>
2278 <td></td>
2278 <td></td>
2279 </tr>
2279 </tr>
2280 <tr>
2280 <tr>
2281 <td height="30px" style="height:30px" colspan="3"></td>
2281 <td height="30px" style="height:30px" colspan="3"></td>
2282 </tr>
2282 </tr>
2283 </table>
2283 </table>
2284 </td>
2284 </td>
2285 <td width="30px" style="width:30px"></td>
2285 <td width="30px" style="width:30px"></td>
2286 </tr>
2286 </tr>
2287 </table>
2287 </table>
2288 <!--/body-->
2288 <!--/body-->
2289 <!--/html-->
2289 <!--/html-->
2290 <hr/>
2290 <hr/>
2291 <hr/>
2291 <hr/>
2292 <h1>pull_request_comment, is_mention=False, status_change='Under Review', closing_pr=True</h1>
2292 <h1>pull_request_comment, is_mention=False, status_change='Under Review', closing_pr=True</h1>
2293 <pre>
2293 <pre>
2294 From: u1
2294 From: u1
2295 To: u2@example.com
2295 To: u2@example.com
2296 Subject: [Under Review, Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
2296 Subject: [Under Review, Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
2297 </pre>
2297 </pre>
2298 <hr/>
2298 <hr/>
2299 <pre>http://pr.org/comment
2299 <pre>http://pr.org/comment
2300
2300
2301 Pull Request #7 "The Title" Closed
2301 Pull Request #7 "The Title" Closed
2302
2302
2303
2303
2304 Opinionated User (jsmith):
2304 Opinionated User (jsmith):
2305
2305
2306 Status change: Under Review
2306 Status change: Under Review
2307
2307
2308 The pull request has been closed.
2308 The pull request has been closed.
2309
2309
2310 Me too!
2310 Me too!
2311
2311
2312 - and indented on second line
2312 - and indented on second line
2313
2313
2314
2314
2315 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
2315 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
2316 #7 "The Title" by u2 u3 (u2).
2316 #7 "The Title" by u2 u3 (u2).
2317
2317
2318
2318
2319 View Comment: http://pr.org/comment
2319 View Comment: http://pr.org/comment
2320 </pre>
2320 </pre>
2321 <hr/>
2321 <hr/>
2322 <!--!doctype html-->
2322 <!--!doctype html-->
2323 <!--html lang="en"-->
2323 <!--html lang="en"-->
2324 <!--head-->
2324 <!--head-->
2325 <!--title--><!--/title-->
2325 <!--title--><!--/title-->
2326 <!--meta name="viewport" content="width=device-width"-->
2326 <!--meta name="viewport" content="width=device-width"-->
2327 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2327 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2328 <!--/head-->
2328 <!--/head-->
2329 <!--body-->
2329 <!--body-->
2330 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2330 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2331 <tr>
2331 <tr>
2332 <td width="30px" style="width:30px"></td>
2332 <td width="30px" style="width:30px"></td>
2333 <td>
2333 <td>
2334 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2334 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2335 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2335 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2336 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2336 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2337 <tr>
2337 <tr>
2338 <td colspan="3">
2338 <td colspan="3">
2339 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2339 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2340 style="border-bottom:1px solid #ddd">
2340 style="border-bottom:1px solid #ddd">
2341 <tr>
2341 <tr>
2342 <td height="20px" style="height:20px" colspan="3"></td>
2342 <td height="20px" style="height:20px" colspan="3"></td>
2343 </tr>
2343 </tr>
2344 <tr>
2344 <tr>
2345 <td width="30px" style="width:30px"></td>
2345 <td width="30px" style="width:30px"></td>
2346 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2346 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2347 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
2347 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
2348 target="_blank">Pull Request #7 &#34;The Title&#34; Closed</a>
2348 target="_blank">Pull Request #7 &#34;The Title&#34; Closed</a>
2349 </td>
2349 </td>
2350 <td width="30px" style="width:30px"></td>
2350 <td width="30px" style="width:30px"></td>
2351 </tr>
2351 </tr>
2352 <tr>
2352 <tr>
2353 <td height="20px" style="height:20px" colspan="3"></td>
2353 <td height="20px" style="height:20px" colspan="3"></td>
2354 </tr>
2354 </tr>
2355 </table>
2355 </table>
2356 </td>
2356 </td>
2357 </tr>
2357 </tr>
2358 <tr>
2358 <tr>
2359 <td height="30px" style="height:30px" colspan="3"></td>
2359 <td height="30px" style="height:30px" colspan="3"></td>
2360 </tr>
2360 </tr>
2361 <tr>
2361 <tr>
2362 <td></td>
2362 <td></td>
2363 <td>
2363 <td>
2364 <table cellpadding="0" cellspacing="0" border="0" width="100%">
2364 <table cellpadding="0" cellspacing="0" border="0" width="100%">
2365 <tr>
2365 <tr>
2366 <td>
2366 <td>
2367 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2367 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2368 <tr>
2368 <tr>
2369 <td height="10px" style="height:10px" colspan="3"></td>
2369 <td height="10px" style="height:10px" colspan="3"></td>
2370 </tr>
2370 </tr>
2371 <tr>
2371 <tr>
2372 <td width="20px" style="width:20px"></td>
2372 <td width="20px" style="width:20px"></td>
2373 <td>
2373 <td>
2374 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2374 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2375 </td>
2375 </td>
2376 <td width="20px" style="width:20px"></td>
2376 <td width="20px" style="width:20px"></td>
2377 </tr>
2377 </tr>
2378 <tr>
2378 <tr>
2379 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2379 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2380 </tr>
2380 </tr>
2381 <tr>
2381 <tr>
2382 <td height="10px" style="height:10px" colspan="3"></td>
2382 <td height="10px" style="height:10px" colspan="3"></td>
2383 </tr>
2383 </tr>
2384 <tr>
2384 <tr>
2385 <td width="20px" style="width:20px"></td>
2385 <td width="20px" style="width:20px"></td>
2386 <td>
2386 <td>
2387 <div style="font-weight:600">
2387 <div style="font-weight:600">
2388 Status change:
2388 Status change:
2389 Under Review
2389 Under Review
2390 </div>
2390 </div>
2391 <div style="font-weight:600">
2391 <div style="font-weight:600">
2392 The pull request has been closed.
2392 The pull request has been closed.
2393 </div>
2393 </div>
2394 </td>
2394 </td>
2395 <td width="20px" style="width:20px"></td>
2395 <td width="20px" style="width:20px"></td>
2396 </tr>
2396 </tr>
2397 <tr>
2397 <tr>
2398 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2398 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2399 </tr>
2399 </tr>
2400 <tr>
2400 <tr>
2401 <td height="10px" style="height:10px" colspan="3"></td>
2401 <td height="10px" style="height:10px" colspan="3"></td>
2402 </tr>
2402 </tr>
2403 <tr>
2403 <tr>
2404 <td width="20px" style="width:20px"></td>
2404 <td width="20px" style="width:20px"></td>
2405 <td>
2405 <td>
2406 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2406 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2407 </td>
2407 </td>
2408 <td width="20px" style="width:20px"></td>
2408 <td width="20px" style="width:20px"></td>
2409 </tr>
2409 </tr>
2410 <tr>
2410 <tr>
2411 <td height="10px" style="height:10px" colspan="3"></td>
2411 <td height="10px" style="height:10px" colspan="3"></td>
2412 </tr>
2412 </tr>
2413 </table>
2413 </table>
2414 </td>
2414 </td>
2415 </tr>
2415 </tr>
2416 <tr>
2416 <tr>
2417 <td height="30px" style="height:30px"></td>
2417 <td height="30px" style="height:30px"></td>
2418 </tr>
2418 </tr>
2419 <tr>
2419 <tr>
2420 <td>
2420 <td>
2421 <div>
2421 <div>
2422 Pull request from
2422 Pull request from
2423 <a style="color:#395fa0;text-decoration:none"
2423 <a style="color:#395fa0;text-decoration:none"
2424 href="https://dev.org/repo">https://dev.org/repo</a>
2424 href="https://dev.org/repo">https://dev.org/repo</a>
2425 branch
2425 branch
2426 <span style="color:#395fa0">devbranch</span>
2426 <span style="color:#395fa0">devbranch</span>
2427 to
2427 to
2428 <a style="color:#395fa0;text-decoration:none"
2428 <a style="color:#395fa0;text-decoration:none"
2429 href="http://mainline.com/repo">http://mainline.com/repo</a>
2429 href="http://mainline.com/repo">http://mainline.com/repo</a>
2430 branch
2430 branch
2431 <span style="color:#395fa0">trunk</span>:
2431 <span style="color:#395fa0">trunk</span>:
2432 </div>
2432 </div>
2433 <div>
2433 <div>
2434 <a style="color:#395fa0;text-decoration:none"
2434 <a style="color:#395fa0;text-decoration:none"
2435 href="http://pr.org/7">#7</a>
2435 href="http://pr.org/7">#7</a>
2436 "<span style="color:#395fa0">The Title</span>"
2436 "<span style="color:#395fa0">The Title</span>"
2437 by
2437 by
2438 <span style="color:#395fa0">u2 u3 (u2)</span>.
2438 <span style="color:#395fa0">u2 u3 (u2)</span>.
2439 </div>
2439 </div>
2440 </td>
2440 </td>
2441 </tr>
2441 </tr>
2442 <tr>
2442 <tr>
2443 <td>
2443 <td>
2444 <center>
2444 <center>
2445 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2445 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2446 <tr>
2446 <tr>
2447 <td height="25px" style="height:25px"></td>
2447 <td height="25px" style="height:25px"></td>
2448 </tr>
2448 </tr>
2449 <tr>
2449 <tr>
2450 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2450 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2451 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2451 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2452 <center>
2452 <center>
2453 <font size="3">
2453 <font size="3">
2454 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2454 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2455 </font>
2455 </font>
2456 </center>
2456 </center>
2457 </a>
2457 </a>
2458 </td>
2458 </td>
2459 </tr>
2459 </tr>
2460 </table>
2460 </table>
2461 </center>
2461 </center>
2462 </td>
2462 </td>
2463 </tr>
2463 </tr>
2464 </table>
2464 </table>
2465 </td>
2465 </td>
2466 <td></td>
2466 <td></td>
2467 </tr>
2467 </tr>
2468 <tr>
2468 <tr>
2469 <td height="30px" style="height:30px" colspan="3"></td>
2469 <td height="30px" style="height:30px" colspan="3"></td>
2470 </tr>
2470 </tr>
2471 </table>
2471 </table>
2472 </td>
2472 </td>
2473 <td width="30px" style="width:30px"></td>
2473 <td width="30px" style="width:30px"></td>
2474 </tr>
2474 </tr>
2475 </table>
2475 </table>
2476 <!--/body-->
2476 <!--/body-->
2477 <!--/html-->
2477 <!--/html-->
2478 <hr/>
2478 <hr/>
2479 <hr/>
2479 <hr/>
2480 <h1>pull_request_comment, is_mention=True, status_change='Under Review', closing_pr=True</h1>
2480 <h1>pull_request_comment, is_mention=True, status_change='Under Review', closing_pr=True</h1>
2481 <pre>
2481 <pre>
2482 From: u1
2482 From: u1
2483 To: u2@example.com
2483 To: u2@example.com
2484 Subject: [Under Review, Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
2484 Subject: [Under Review, Closing: Comment] repo/name PR #7 "The Title" from devbranch by u2
2485 </pre>
2485 </pre>
2486 <hr/>
2486 <hr/>
2487 <pre>http://pr.org/comment
2487 <pre>http://pr.org/comment
2488
2488
2489 Mention in Comment on Pull Request #7 "The Title"
2489 Mention in Comment on Pull Request #7 "The Title"
2490
2490
2491
2491
2492 Opinionated User (jsmith):
2492 Opinionated User (jsmith):
2493
2493
2494 Status change: Under Review
2494 Status change: Under Review
2495
2495
2496 The pull request has been closed.
2496 The pull request has been closed.
2497
2497
2498 Me too!
2498 Me too!
2499
2499
2500 - and indented on second line
2500 - and indented on second line
2501
2501
2502
2502
2503 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
2503 Pull request from https://dev.org/repo at devbranch to http://mainline.com/repo at trunk:
2504 #7 "The Title" by u2 u3 (u2).
2504 #7 "The Title" by u2 u3 (u2).
2505
2505
2506
2506
2507 View Comment: http://pr.org/comment
2507 View Comment: http://pr.org/comment
2508 </pre>
2508 </pre>
2509 <hr/>
2509 <hr/>
2510 <!--!doctype html-->
2510 <!--!doctype html-->
2511 <!--html lang="en"-->
2511 <!--html lang="en"-->
2512 <!--head-->
2512 <!--head-->
2513 <!--title--><!--/title-->
2513 <!--title--><!--/title-->
2514 <!--meta name="viewport" content="width=device-width"-->
2514 <!--meta name="viewport" content="width=device-width"-->
2515 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2515 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2516 <!--/head-->
2516 <!--/head-->
2517 <!--body-->
2517 <!--body-->
2518 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2518 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2519 <tr>
2519 <tr>
2520 <td width="30px" style="width:30px"></td>
2520 <td width="30px" style="width:30px"></td>
2521 <td>
2521 <td>
2522 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2522 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2523 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2523 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2524 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2524 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2525 <tr>
2525 <tr>
2526 <td colspan="3">
2526 <td colspan="3">
2527 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2527 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2528 style="border-bottom:1px solid #ddd">
2528 style="border-bottom:1px solid #ddd">
2529 <tr>
2529 <tr>
2530 <td height="20px" style="height:20px" colspan="3"></td>
2530 <td height="20px" style="height:20px" colspan="3"></td>
2531 </tr>
2531 </tr>
2532 <tr>
2532 <tr>
2533 <td width="30px" style="width:30px"></td>
2533 <td width="30px" style="width:30px"></td>
2534 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2534 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2535 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
2535 <a style="text-decoration:none;font-weight:600;color:#395fa0" href="http://pr.org/comment"
2536 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
2536 target="_blank">Mention in Comment on Pull Request #7 &#34;The Title&#34;</a>
2537 </td>
2537 </td>
2538 <td width="30px" style="width:30px"></td>
2538 <td width="30px" style="width:30px"></td>
2539 </tr>
2539 </tr>
2540 <tr>
2540 <tr>
2541 <td height="20px" style="height:20px" colspan="3"></td>
2541 <td height="20px" style="height:20px" colspan="3"></td>
2542 </tr>
2542 </tr>
2543 </table>
2543 </table>
2544 </td>
2544 </td>
2545 </tr>
2545 </tr>
2546 <tr>
2546 <tr>
2547 <td height="30px" style="height:30px" colspan="3"></td>
2547 <td height="30px" style="height:30px" colspan="3"></td>
2548 </tr>
2548 </tr>
2549 <tr>
2549 <tr>
2550 <td></td>
2550 <td></td>
2551 <td>
2551 <td>
2552 <table cellpadding="0" cellspacing="0" border="0" width="100%">
2552 <table cellpadding="0" cellspacing="0" border="0" width="100%">
2553 <tr>
2553 <tr>
2554 <td>
2554 <td>
2555 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2555 <table cellpadding="0" cellspacing="0" width="100%" border="0" bgcolor="#f9f9f9" style="border:1px solid #ddd;border-radius:4px">
2556 <tr>
2556 <tr>
2557 <td height="10px" style="height:10px" colspan="3"></td>
2557 <td height="10px" style="height:10px" colspan="3"></td>
2558 </tr>
2558 </tr>
2559 <tr>
2559 <tr>
2560 <td width="20px" style="width:20px"></td>
2560 <td width="20px" style="width:20px"></td>
2561 <td>
2561 <td>
2562 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2562 <div style="font-weight:600;color:#395fa0">Opinionated User (jsmith)</div>
2563 </td>
2563 </td>
2564 <td width="20px" style="width:20px"></td>
2564 <td width="20px" style="width:20px"></td>
2565 </tr>
2565 </tr>
2566 <tr>
2566 <tr>
2567 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2567 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2568 </tr>
2568 </tr>
2569 <tr>
2569 <tr>
2570 <td height="10px" style="height:10px" colspan="3"></td>
2570 <td height="10px" style="height:10px" colspan="3"></td>
2571 </tr>
2571 </tr>
2572 <tr>
2572 <tr>
2573 <td width="20px" style="width:20px"></td>
2573 <td width="20px" style="width:20px"></td>
2574 <td>
2574 <td>
2575 <div style="font-weight:600">
2575 <div style="font-weight:600">
2576 Status change:
2576 Status change:
2577 Under Review
2577 Under Review
2578 </div>
2578 </div>
2579 <div style="font-weight:600">
2579 <div style="font-weight:600">
2580 The pull request has been closed.
2580 The pull request has been closed.
2581 </div>
2581 </div>
2582 </td>
2582 </td>
2583 <td width="20px" style="width:20px"></td>
2583 <td width="20px" style="width:20px"></td>
2584 </tr>
2584 </tr>
2585 <tr>
2585 <tr>
2586 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2586 <td height="10px" style="height:10px" colspan="3" style="border-bottom:1px solid #ddd"></td>
2587 </tr>
2587 </tr>
2588 <tr>
2588 <tr>
2589 <td height="10px" style="height:10px" colspan="3"></td>
2589 <td height="10px" style="height:10px" colspan="3"></td>
2590 </tr>
2590 </tr>
2591 <tr>
2591 <tr>
2592 <td width="20px" style="width:20px"></td>
2592 <td width="20px" style="width:20px"></td>
2593 <td>
2593 <td>
2594 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2594 <div style="font-family:Lucida Console,Consolas,Monaco,Inconsolata,Liberation Mono,monospace;white-space:pre-wrap"><div class="formatted-fixed">Me too!<br/><br/> - and indented on second line</div></div>
2595 </td>
2595 </td>
2596 <td width="20px" style="width:20px"></td>
2596 <td width="20px" style="width:20px"></td>
2597 </tr>
2597 </tr>
2598 <tr>
2598 <tr>
2599 <td height="10px" style="height:10px" colspan="3"></td>
2599 <td height="10px" style="height:10px" colspan="3"></td>
2600 </tr>
2600 </tr>
2601 </table>
2601 </table>
2602 </td>
2602 </td>
2603 </tr>
2603 </tr>
2604 <tr>
2604 <tr>
2605 <td height="30px" style="height:30px"></td>
2605 <td height="30px" style="height:30px"></td>
2606 </tr>
2606 </tr>
2607 <tr>
2607 <tr>
2608 <td>
2608 <td>
2609 <div>
2609 <div>
2610 Pull request from
2610 Pull request from
2611 <a style="color:#395fa0;text-decoration:none"
2611 <a style="color:#395fa0;text-decoration:none"
2612 href="https://dev.org/repo">https://dev.org/repo</a>
2612 href="https://dev.org/repo">https://dev.org/repo</a>
2613 branch
2613 branch
2614 <span style="color:#395fa0">devbranch</span>
2614 <span style="color:#395fa0">devbranch</span>
2615 to
2615 to
2616 <a style="color:#395fa0;text-decoration:none"
2616 <a style="color:#395fa0;text-decoration:none"
2617 href="http://mainline.com/repo">http://mainline.com/repo</a>
2617 href="http://mainline.com/repo">http://mainline.com/repo</a>
2618 branch
2618 branch
2619 <span style="color:#395fa0">trunk</span>:
2619 <span style="color:#395fa0">trunk</span>:
2620 </div>
2620 </div>
2621 <div>
2621 <div>
2622 <a style="color:#395fa0;text-decoration:none"
2622 <a style="color:#395fa0;text-decoration:none"
2623 href="http://pr.org/7">#7</a>
2623 href="http://pr.org/7">#7</a>
2624 "<span style="color:#395fa0">The Title</span>"
2624 "<span style="color:#395fa0">The Title</span>"
2625 by
2625 by
2626 <span style="color:#395fa0">u2 u3 (u2)</span>.
2626 <span style="color:#395fa0">u2 u3 (u2)</span>.
2627 </div>
2627 </div>
2628 </td>
2628 </td>
2629 </tr>
2629 </tr>
2630 <tr>
2630 <tr>
2631 <td>
2631 <td>
2632 <center>
2632 <center>
2633 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2633 <table cellspacing="0" cellpadding="0" style="margin-left:auto;margin-right:auto">
2634 <tr>
2634 <tr>
2635 <td height="25px" style="height:25px"></td>
2635 <td height="25px" style="height:25px"></td>
2636 </tr>
2636 </tr>
2637 <tr>
2637 <tr>
2638 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2638 <td style="border-collapse:collapse;border-radius:2px;text-align:center;display:block;border:solid 1px #395fa0;padding:11px 20px 11px 20px">
2639 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2639 <a href="http://pr.org/comment" style="text-decoration:none;display:block" target="_blank">
2640 <center>
2640 <center>
2641 <font size="3">
2641 <font size="3">
2642 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2642 <span style="font-family:Helvetica,Arial,sans-serif;font-weight:700;font-size:15px;line-height:14px;color:#395fa0;white-space:nowrap;vertical-align:middle">View Comment</span>
2643 </font>
2643 </font>
2644 </center>
2644 </center>
2645 </a>
2645 </a>
2646 </td>
2646 </td>
2647 </tr>
2647 </tr>
2648 </table>
2648 </table>
2649 </center>
2649 </center>
2650 </td>
2650 </td>
2651 </tr>
2651 </tr>
2652 </table>
2652 </table>
2653 </td>
2653 </td>
2654 <td></td>
2654 <td></td>
2655 </tr>
2655 </tr>
2656 <tr>
2656 <tr>
2657 <td height="30px" style="height:30px" colspan="3"></td>
2657 <td height="30px" style="height:30px" colspan="3"></td>
2658 </tr>
2658 </tr>
2659 </table>
2659 </table>
2660 </td>
2660 </td>
2661 <td width="30px" style="width:30px"></td>
2661 <td width="30px" style="width:30px"></td>
2662 </tr>
2662 </tr>
2663 </table>
2663 </table>
2664 <!--/body-->
2664 <!--/body-->
2665 <!--/html-->
2665 <!--/html-->
2666 <hr/>
2666 <hr/>
2667 <hr/>
2667 <hr/>
2668 <h1>TYPE_PASSWORD_RESET</h1>
2668 <h1>TYPE_PASSWORD_RESET</h1>
2669 <pre>
2669 <pre>
2670 From: u1
2670 From: u1
2671 To: john@doe.com
2671 To: john@doe.com
2672 Subject: Password reset link
2672 Subject: Password reset link
2673 </pre>
2673 </pre>
2674 <hr/>
2674 <hr/>
2675 <pre>Password Reset Request
2675 <pre>Password Reset Request
2676
2676
2677 Hello John Doe,
2677 Hello John Doe,
2678
2678
2679 We have received a request to reset the password for your account.
2679 We have received a request to reset the password for your account.
2680
2680
2681 To set a new password, click the following link:
2681 To set a new password, click the following link:
2682
2682
2683 http://reset.com/decbf64715098db5b0bd23eab44bd792670ab746
2683 http://reset.com/decbf64715098db5b0bd23eab44bd792670ab746
2684
2684
2685 Should you not be able to use the link above, please type the following code into the password reset form:
2685 Should you not be able to use the link above, please type the following code into the password reset form:
2686 decbf64715098db5b0bd23eab44bd792670ab746
2686 decbf64715098db5b0bd23eab44bd792670ab746
2687
2687
2688 If it weren't you who requested the password reset, just disregard this message.
2688 If it weren't you who requested the password reset, just disregard this message.
2689 </pre>
2689 </pre>
2690 <hr/>
2690 <hr/>
2691 <!--!doctype html-->
2691 <!--!doctype html-->
2692 <!--html lang="en"-->
2692 <!--html lang="en"-->
2693 <!--head-->
2693 <!--head-->
2694 <!--title--><!--/title-->
2694 <!--title--><!--/title-->
2695 <!--meta name="viewport" content="width=device-width"-->
2695 <!--meta name="viewport" content="width=device-width"-->
2696 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2696 <!--meta http-equiv="Content-Type" content="text/html; charset=UTF-8"-->
2697 <!--/head-->
2697 <!--/head-->
2698 <!--body-->
2698 <!--body-->
2699 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2699 <table align="center" cellpadding="0" cellspacing="0" border="0" style="min-width:348px;max-width:800px;font-family:Helvetica,Arial,sans-serif;font-weight:200;font-size:14px;line-height:17px;color:#202020">
2700 <tr>
2700 <tr>
2701 <td width="30px" style="width:30px"></td>
2701 <td width="30px" style="width:30px"></td>
2702 <td>
2702 <td>
2703 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2703 <table width="100%" cellpadding="0" cellspacing="0" border="0"
2704 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2704 style="table-layout:fixed;font-family:Helvetica,Arial,sans-serif;border:1px solid #ddd">
2705 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2705 <tr><td width="30px" style="width:30px"></td><td></td><td width="30px" style="width:30px"></td></tr>
2706 <tr>
2706 <tr>
2707 <td colspan="3">
2707 <td colspan="3">
2708 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2708 <table bgcolor="#f9f9f9" width="100%" cellpadding="0" cellspacing="0"
2709 style="border-bottom:1px solid #ddd">
2709 style="border-bottom:1px solid #ddd">
2710 <tr>
2710 <tr>
2711 <td height="20px" style="height:20px" colspan="3"></td>
2711 <td height="20px" style="height:20px" colspan="3"></td>
2712 </tr>
2712 </tr>
2713 <tr>
2713 <tr>
2714 <td width="30px" style="width:30px"></td>
2714 <td width="30px" style="width:30px"></td>
2715 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2715 <td style="font-family:Helvetica,Arial,sans-serif;font-size:19px;line-height:24px">
2716 <span style="font-weight:600;color:#395fa0">Password Reset Request</span>
2716 <span style="font-weight:600;color:#395fa0">Password Reset Request</span>
2717 </td>
2717 </td>
2718 <td width="30px" style="width:30px"></td>
2718 <td width="30px" style="width:30px"></td>
2719 </tr>
2719 </tr>
2720 <tr>
2720 <tr>
2721 <td height="20px" style="height:20px" colspan="3"></td>
2721 <td height="20px" style="height:20px" colspan="3"></td>
2722 </tr>
2722 </tr>
2723 </table>
2723 </table>
2724 </td>
2724 </td>
2725 </tr>
2725 </tr>
2726 <tr>
2726 <tr>
2727 <td height="30px" style="height:30px" colspan="3"></td>
2727 <td height="30px" style="height:30px" colspan="3"></td>
2728 </tr>
2728 </tr>
2729 <tr>
2729 <tr>
2730 <td></td>
2730 <td></td>
2731 <td>
2731 <td>
2732 <table cellpadding="0" cellspacing="0" border="0" width="100%" style="table-layout:fixed;word-wrap:break-word;">
2732 <table cellpadding="0" cellspacing="0" border="0" width="100%" style="table-layout:fixed;word-wrap:break-word;">
2733 <tr>
2733 <tr>
2734 <td>Hello John Doe,</td>
2734 <td>Hello John Doe,</td>
2735 </tr>
2735 </tr>
2736 <tr>
2736 <tr>
2737 <td height="10px" style="height:10px"></td>
2737 <td height="10px" style="height:10px"></td>
2738 </tr>
2738 </tr>
2739 <tr>
2739 <tr>
2740 <td>
2740 <td>
2741 We have received a request to reset the password for your account.
2741 We have received a request to reset the password for your account.
2742 </td>
2742 </td>
2743 </tr>
2743 </tr>
2744 <tr>
2744 <tr>
2745 <td height="10px" style="height:10px"></td>
2745 <td height="10px" style="height:10px"></td>
2746 </tr>
2746 </tr>
2747 <tr>
2747 <tr>
2748 <td>
2748 <td>
2749 <div>
2749 <div>
2750 To set a new password, click the following link:
2750 To set a new password, click the following link:
2751 <br/>
2751 <br/>
2752 <a style="color:#395fa0;text-decoration:none" href="http://reset.com/decbf64715098db5b0bd23eab44bd792670ab746"
2752 <a style="color:#395fa0;text-decoration:none" href="http://reset.com/decbf64715098db5b0bd23eab44bd792670ab746"
2753 target="_blank">http://reset.com/decbf64715098db5b0bd23eab44bd792670ab746</a>
2753 target="_blank">http://reset.com/decbf64715098db5b0bd23eab44bd792670ab746</a>
2754 <br/>
2754 <br/>
2755 Should you not be able to use the link above, please type the following code into the password reset form:
2755 Should you not be able to use the link above, please type the following code into the password reset form:
2756 <code>decbf64715098db5b0bd23eab44bd792670ab746</code>
2756 <code>decbf64715098db5b0bd23eab44bd792670ab746</code>
2757 </div>
2757 </div>
2758 </td>
2758 </td>
2759 </tr>
2759 </tr>
2760 <tr>
2760 <tr>
2761 <td height="10px" style="height:10px"></td>
2761 <td height="10px" style="height:10px"></td>
2762 </tr>
2762 </tr>
2763 <tr>
2763 <tr>
2764 <td>
2764 <td>
2765 If it weren&#39;t you who requested the password reset, just disregard this message.
2765 If it weren&#39;t you who requested the password reset, just disregard this message.
2766 </td>
2766 </td>
2767 </tr>
2767 </tr>
2768 </table>
2768 </table>
2769 </td>
2769 </td>
2770 <td></td>
2770 <td></td>
2771 </tr>
2771 </tr>
2772 <tr>
2772 <tr>
2773 <td height="30px" style="height:30px" colspan="3"></td>
2773 <td height="30px" style="height:30px" colspan="3"></td>
2774 </tr>
2774 </tr>
2775 </table>
2775 </table>
2776 </td>
2776 </td>
2777 <td width="30px" style="width:30px"></td>
2777 <td width="30px" style="width:30px"></td>
2778 </tr>
2778 </tr>
2779 </table>
2779 </table>
2780 <!--/body-->
2780 <!--/body-->
2781 <!--/html-->
2781 <!--/html-->
2782 <hr/>
2782 <hr/>
2783
2783
2784 </body>
2784 </body>
2785 </html>
2785 </html>
General Comments 0
You need to be logged in to leave comments. Login now