##// END OF EJS Templates
diffs: inline prepare() into __init__ and make the result available as .parsed...
Mads Kiilerich -
r6838:24a9bec8 default
parent child Browse files
Show More
@@ -279,11 +279,10 b' class ChangesetController(BaseRepoContro'
279 279 diff_processor = diffs.DiffProcessor(raw_diff,
280 280 vcs=c.db_repo_scm_instance.alias,
281 281 diff_limit=diff_limit)
282 _parsed = diff_processor.prepare()
283 282 c.limited_diff = False
284 if isinstance(_parsed, LimitedDiffContainer):
283 if isinstance(diff_processor.parsed, LimitedDiffContainer):
285 284 c.limited_diff = True
286 for f in _parsed:
285 for f in diff_processor.parsed:
287 286 st = f['stats']
288 287 c.lines_added += st['added']
289 288 c.lines_deleted += st['deleted']
@@ -267,21 +267,20 b' class CompareController(BaseRepoControll'
267 267
268 268 log.debug('running diff between %s and %s in %s',
269 269 rev1, c.cs_rev, org_repo.scm_instance.path)
270 txtdiff = org_repo.scm_instance.get_diff(rev1=rev1, rev2=c.cs_rev,
270 raw_diff = org_repo.scm_instance.get_diff(rev1=rev1, rev2=c.cs_rev,
271 271 ignore_whitespace=ignore_whitespace,
272 272 context=line_context)
273 273
274 diff_processor = diffs.DiffProcessor(txtdiff or '', diff_limit=diff_limit)
275 _parsed = diff_processor.prepare()
274 diff_processor = diffs.DiffProcessor(raw_diff or '', diff_limit=diff_limit)
276 275
277 276 c.limited_diff = False
278 if isinstance(_parsed, LimitedDiffContainer):
277 if isinstance(diff_processor.parsed, LimitedDiffContainer):
279 278 c.limited_diff = True
280 279
281 280 c.file_diff_data = []
282 281 c.lines_added = 0
283 282 c.lines_deleted = 0
284 for f in _parsed:
283 for f in diff_processor.parsed:
285 284 st = f['stats']
286 285 c.lines_added += st['added']
287 286 c.lines_deleted += st['deleted']
@@ -74,13 +74,13 b' class FeedController(BaseRepoController)'
74 74 diff_limit = safe_int(CONFIG.get('rss_cut_off_limit', 32 * 1024))
75 75 raw_diff = cs.diff()
76 76 diff_processor = DiffProcessor(raw_diff,
77 diff_limit=diff_limit)
78 _parsed = diff_processor.prepare(inline_diff=False)
77 diff_limit=diff_limit,
78 inline_diff=False)
79 79 limited_diff = False
80 if isinstance(_parsed, LimitedDiffContainer):
80 if isinstance(diff_processor.parsed, LimitedDiffContainer):
81 81 limited_diff = True
82 82
83 for st in _parsed:
83 for st in diff_processor.parsed:
84 84 st.update({'added': st['stats']['added'],
85 85 'removed': st['stats']['deleted']})
86 86 changes.append('\n %(operation)s %(filename)s '
@@ -592,23 +592,22 b' class PullrequestsController(BaseRepoCon'
592 592 log.debug('running diff between %s and %s in %s',
593 593 c.a_rev, c.cs_rev, org_scm_instance.path)
594 594 try:
595 txtdiff = org_scm_instance.get_diff(rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev),
595 raw_diff = org_scm_instance.get_diff(rev1=safe_str(c.a_rev), rev2=safe_str(c.cs_rev),
596 596 ignore_whitespace=ignore_whitespace,
597 597 context=line_context)
598 598 except ChangesetDoesNotExistError:
599 txtdiff = _("The diff can't be shown - the PR revisions could not be found.")
600 diff_processor = diffs.DiffProcessor(txtdiff or '', diff_limit=diff_limit)
601 _parsed = diff_processor.prepare()
599 raw_diff = _("The diff can't be shown - the PR revisions could not be found.")
600 diff_processor = diffs.DiffProcessor(raw_diff or '', diff_limit=diff_limit)
602 601
603 602 c.limited_diff = False
604 if isinstance(_parsed, LimitedDiffContainer):
603 if isinstance(diff_processor.parsed, LimitedDiffContainer):
605 604 c.limited_diff = True
606 605
607 606 c.file_diff_data = []
608 607 c.lines_added = 0
609 608 c.lines_deleted = 0
610 609
611 for f in _parsed:
610 for f in diff_processor.parsed:
612 611 st = f['stats']
613 612 c.lines_added += st['added']
614 613 c.lines_deleted += st['deleted']
@@ -72,13 +72,12 b' def wrapped_diff(filenode_old, filenode_'
72 72 diff_limit is None or
73 73 (filenode_old.size < diff_limit and filenode_new.size < diff_limit)):
74 74
75 f_gitdiff = get_gitdiff(filenode_old, filenode_new,
75 raw_diff = get_gitdiff(filenode_old, filenode_new,
76 76 ignore_whitespace=ignore_whitespace,
77 77 context=line_context)
78 diff_processor = DiffProcessor(f_gitdiff)
79 _parsed = diff_processor.prepare()
80 if _parsed: # there should be exactly one element, for the specified file
81 f = _parsed[0]
78 diff_processor = DiffProcessor(raw_diff)
79 if diff_processor.parsed: # there should be exactly one element, for the specified file
80 f = diff_processor.parsed[0]
82 81 op = f['operation']
83 82 a_path = f['old_filename']
84 83
@@ -203,7 +202,7 b' class DiffProcessor(object):'
203 202
204 203 _escape_re = re.compile(r'(&)|(<)|(>)|(\t)|(\r)|(?<=.)( \n| $)')
205 204
206 def __init__(self, diff, vcs='hg', diff_limit=None):
205 def __init__(self, diff, vcs='hg', diff_limit=None, inline_diff=True):
207 206 """
208 207 :param diff: a text in diff format
209 208 :param vcs: type of version control hg or git
@@ -218,12 +217,10 b' class DiffProcessor(object):'
218 217 self.adds = 0
219 218 self.removes = 0
220 219 # calculate diff size
221 self.diff_size = len(diff)
222 220 self.diff_limit = diff_limit
223 221 self.cur_diff_size = 0
224 self.parsed = False
225 self.parsed_diff = []
226 222 self.vcs = vcs
223 self.parsed = self._parse_gitdiff(inline_diff=inline_diff)
227 224
228 225 def _escaper(self, string):
229 226 """
@@ -307,7 +304,7 b' class DiffProcessor(object):'
307 304 diff_lines = (self._escaper(m.group(0)) for m in re.finditer(r'.*\n|.+$', rest)) # don't split on \r as str.splitlines do
308 305 return meta_info, diff_lines
309 306
310 def _parse_gitdiff(self, inline_diff=True):
307 def _parse_gitdiff(self, inline_diff):
311 308 """Parse self._diff and return a list of dicts with meta info and chunks for each file.
312 309 If diff is truncated, wrap it in LimitedDiffContainer.
313 310 Optionally, do an extra pass and to extra markup of one-liner changes.
@@ -575,16 +572,6 b' class DiffProcessor(object):'
575 572 idstring = re.sub(r'(?!-)\W', "", idstring).lower()
576 573 return idstring
577 574
578 def prepare(self, inline_diff=True):
579 """
580 Prepare the passed udiff for HTML rendering. It'll return a list
581 of dicts with diff information
582 """
583 parsed = self._parse_gitdiff(inline_diff=inline_diff)
584 self.parsed = True
585 self.parsed_diff = parsed
586 return parsed
587
588 575 def as_html(self, table_class='code-difftable', line_class='line',
589 576 old_lineno_class='lineno old', new_lineno_class='lineno new',
590 577 no_lineno_class='lineno',
@@ -604,10 +591,8 b' class DiffProcessor(object):'
604 591 }
605 592 else:
606 593 return label
607 if not self.parsed:
608 self.prepare()
609 594
610 diff_lines = self.parsed_diff
595 diff_lines = self.parsed
611 596 if parsed_lines:
612 597 diff_lines = parsed_lines
613 598
@@ -275,21 +275,19 b' class TestDiffLib(TestController):'
275 275
276 276 @parametrize('diff_fixture', DIFF_FIXTURES)
277 277 def test_diff(self, diff_fixture):
278 diff = fixture.load_resource(diff_fixture, strip=False)
278 raw_diff = fixture.load_resource(diff_fixture, strip=False)
279 279 vcs = 'hg'
280 280 if diff_fixture.startswith('git_'):
281 281 vcs = 'git'
282 diff_proc = DiffProcessor(diff, vcs=vcs)
283 diff_proc_d = diff_proc.prepare()
284 data = [(x['filename'], x['operation'], x['stats']) for x in diff_proc_d]
282 diff_processor = DiffProcessor(raw_diff, vcs=vcs)
283 data = [(x['filename'], x['operation'], x['stats']) for x in diff_processor.parsed]
285 284 expected_data = DIFF_FIXTURES[diff_fixture]
286 285 assert expected_data == data
287 286
288 287 def test_diff_markup(self):
289 diff = fixture.load_resource('markuptest.diff', strip=False)
290 diff_proc = DiffProcessor(diff)
291 diff_proc_d = diff_proc.prepare()
292 chunks = diff_proc_d[0]['chunks']
288 raw_diff = fixture.load_resource('markuptest.diff', strip=False)
289 diff_processor = DiffProcessor(raw_diff)
290 chunks = diff_processor.parsed[0]['chunks']
293 291 assert not chunks[0]
294 292 #from pprint import pprint; pprint(chunks[1])
295 293 l = ['\n']
General Comments 0
You need to be logged in to leave comments. Login now