9
from breezy.transport import NoSuchFile
11
from breezy.errors import NoSuchFile
12
from breezy.tree import find_previous_path
15
from ..controllers import TemplatedBranchView
18
def _process_diff(difftext):
22
def decode_line(line):
23
return line.decode('utf-8', 'replace')
24
for line in difftext.splitlines():
27
if line.startswith(b'+++ ') or line.startswith(b'--- '):
29
if line.startswith(b'@@ '):
33
chunk = util.Container()
35
split_lines = line.split(b' ')[1:3]
36
lines = [int(x.split(b',')[0][1:]) for x in split_lines]
39
elif line.startswith(b' '):
40
chunk.diff.append(util.Container(old_lineno=old_lineno,
41
new_lineno=new_lineno,
43
line=decode_line(line[1:])))
46
elif line.startswith(b'+'):
47
chunk.diff.append(util.Container(
49
new_lineno=new_lineno,
50
type='insert', line=decode_line(line[1:])))
52
elif line.startswith(b'-'):
53
chunk.diff.append(util.Container(
54
old_lineno=old_lineno,
56
type='delete', line=decode_line(line[1:])))
59
chunk.diff.append(util.Container(
69
def diff_chunks_for_file(repository, filename, compare_revid, revid,
71
if context_lines is None:
74
compare_tree = repository.revision_tree(compare_revid)
75
tree = repository.revision_tree(revid)
77
lines[revid] = tree.get_file_lines(filename)
80
lines[compare_revid] = compare_tree.get_file_lines(filename)
82
compare_filename = find_previous_path(tree, compare_tree, filename)
83
if compare_filename is not None:
84
lines[compare_revid] = compare_tree.get_file_lines(compare_filename)
86
lines[compare_revid] = []
91
'', lines[compare_revid], '', lines[revid], buffer,
92
context_lines=context_lines)
93
except errors.BinaryFile:
96
difftext = buffer.getvalue()
98
return _process_diff(difftext)
101
class FileDiffUI(TemplatedBranchView):
103
template_name = 'filediff'
106
def get_values(self, path, kwargs, headers):
107
revid = urlutils.unquote_to_bytes(self.args[0])
108
compare_revid = urlutils.unquote_to_bytes(self.args[1])
109
filename = urlutils.unquote(self.args[2])
112
context_lines = int(kwargs['context'])
113
except (KeyError, ValueError):
116
chunks = diff_chunks_for_file(
117
self._history._branch.repository, filename, compare_revid, revid,
118
context_lines=context_lines)