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 |
|
|
|
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( |
|
|
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 |
|
|
|
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 |
|
|
|
600 |
diff_processor = diffs.DiffProcessor( |
|
|
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 |
|
|
|
75 | raw_diff = get_gitdiff(filenode_old, filenode_new, | |
|
76 | 76 | ignore_whitespace=ignore_whitespace, |
|
77 | 77 | context=line_context) |
|
78 |
diff_processor = DiffProcessor( |
|
|
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 |
|
|
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 |
|
|
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