1
from StringIO import StringIO
4
from breezy import diff
5
from breezy import errors
6
from breezy import osutils
8
from loggerhead import util
9
from loggerhead.controllers import TemplatedBranchView
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
11
18
def _process_diff(difftext):
22
def decode_line(line):
23
return line.decode('utf-8', 'replace')
14
24
for line in difftext.splitlines():
17
if line.startswith('+++ ') or line.startswith('--- '):
27
if line.startswith(b'+++ ') or line.startswith(b'--- '):
19
if line.startswith('@@ '):
29
if line.startswith(b'@@ '):
21
31
if chunk is not None:
22
32
chunks.append(chunk)
23
33
chunk = util.Container()
25
split_lines = line.split(' ')[1:3]
26
lines = [int(x.split(',')[0][1:]) for x in split_lines]
35
split_lines = line.split(b' ')[1:3]
36
lines = [int(x.split(b',')[0][1:]) for x in split_lines]
27
37
old_lineno = lines[0]
28
38
new_lineno = lines[1]
29
elif line.startswith(' '):
39
elif line.startswith(b' '):
30
40
chunk.diff.append(util.Container(old_lineno=old_lineno,
31
41
new_lineno=new_lineno,
43
line=decode_line(line[1:])))
36
elif line.startswith('+'):
37
chunk.diff.append(util.Container(old_lineno=None,
38
new_lineno=new_lineno,
39
type='insert', 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:])))
41
elif line.startswith('-'):
42
chunk.diff.append(util.Container(old_lineno=old_lineno,
44
type='delete', 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:])))
47
chunk.diff.append(util.Container(old_lineno=None,
59
chunk.diff.append(util.Container(
51
64
if chunk is not None:
52
65
chunks.append(chunk)
56
def diff_chunks_for_file(repository, file_id, compare_revid, revid,
69
def diff_chunks_for_file(repository, filename, compare_revid, revid,
57
70
context_lines=None):
58
71
if context_lines is None:
62
for r in (compare_revid, revid):
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)
66
args.append((file_id, r, r))
67
for r, bytes_iter in repository.iter_files_bytes(args):
68
lines[r] = osutils.split_lines(''.join(bytes_iter))
86
lines[compare_revid] = []
71
diff.internal_diff('', lines[compare_revid], '', lines[revid], buffer, context_lines=context_lines)
91
'', lines[compare_revid], '', lines[revid], buffer,
92
context_lines=context_lines)
72
93
except errors.BinaryFile:
75
96
difftext = buffer.getvalue()
80
101
class FileDiffUI(TemplatedBranchView):
82
template_path = 'loggerhead.templates.filediff'
103
template_name = 'filediff'
83
104
supports_json = True
85
106
def get_values(self, path, kwargs, headers):
86
revid = urllib.unquote(self.args[0])
87
compare_revid = urllib.unquote(self.args[1])
88
file_id = urllib.unquote(self.args[2])
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])
91
112
context_lines = int(kwargs['context'])