17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
import json as simplejson
20
26
from paste.httpexceptions import HTTPServerError
22
28
from loggerhead import util
23
29
from loggerhead.controllers import TemplatedBranchView
30
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
26
33
DEFAULT_LINE_COUNT_LIMIT = 3000
36
return urllib.quote(urllib.quote(p, safe=''))
29
39
class RevisionUI(TemplatedBranchView):
31
41
template_path = 'loggerhead.templates.revision'
33
def get_values(self, h, revid, path, kwargs, headers):
43
def get_values(self, path, kwargs, headers):
45
revid = self.get_revid()
35
47
filter_file_id = kwargs.get('filter_file_id', None)
36
48
start_revid = h.fix_revid(kwargs.get('start_revid', None))
55
67
navigation.query = query
56
68
util.fill_in_navigation(navigation)
58
change = h.get_change_with_diff(revid, compare_revid)
59
# add parent & merge-point branch-nick info, in case it's useful
60
h.get_branch_nicks([change])
62
line_count_limit = DEFAULT_LINE_COUNT_LIMIT
64
for file in change.changes.modified:
65
for chunk in file.chunks:
66
line_count += len(chunk.diff)
68
# let's make side-by-side diff be the default
69
# FIXME: not currently in use. Should be
70
side_by_side = not kwargs.get('unified', False)
72
h.add_side_by_side([change])
70
change = h.get_changes([revid])[0]
72
if compare_revid is None:
73
file_changes = h.get_file_changes(change)
75
file_changes = h.file_changes_for_revision_ids(
76
compare_revid, change.revid)
84
item = [x for x in file_changes.text_changes if x.filename == path][0]
85
diff_chunks = diff_chunks_for_file(
86
self._history._branch.repository, item.file_id,
87
item.old_revision, item.new_revision)
90
for i, item in enumerate(file_changes.text_changes):
92
link_data['diff-' + str(i)] = '%s/%s/%s' % (
93
dq(item.new_revision), dq(item.old_revision), dq(item.file_id))
94
path_to_id[item.filename] = 'diff-' + str(i)
96
h.add_branch_nicks(change)
98
if '.' in change.revno:
99
# Walk "down" though the merge-sorted graph until we find a
100
# revision with merge depth 0: this is the revision that merged
101
# this one to mainline.
102
ri = self._history._rev_info
103
i = self._history._rev_indices[change.revid]
104
while ri[i][0][2] > 0:
106
merged_in = ri[i][0][3]
74
110
# Directory Breadcrumbs
75
111
directory_breadcrumbs = (
82
118
'branch': self._branch,
121
'file_changes': file_changes,
122
'diff_chunks': diff_chunks,
123
'link_data': simplejson.dumps(link_data),
124
'specific_path': path,
125
'json_specific_path': simplejson.dumps(path),
126
'path_to_id': simplejson.dumps(path_to_id),
85
127
'start_revid': start_revid,
86
128
'filter_file_id': filter_file_id,
131
'merged_in': merged_in,
89
132
'navigation': navigation,
91
134
'remember': remember,
92
135
'compare_revid': compare_revid,
93
'side_by_side': side_by_side,
94
136
'url': self._branch.context_url,
95
'line_count': line_count,
96
'line_count_limit': line_count_limit,
97
'show_plain_diffs': line_count > line_count_limit,
98
137
'directory_breadcrumbs': directory_breadcrumbs,