17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
20
from paste.httpexceptions import HTTPServerError
25
22
from loggerhead import util
26
23
from loggerhead.controllers import TemplatedBranchView
27
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
30
26
DEFAULT_LINE_COUNT_LIMIT = 3000
33
return urllib.quote(urllib.quote(p, safe=''))
36
29
class RevisionUI(TemplatedBranchView):
38
31
template_path = 'loggerhead.templates.revision'
41
def get_values(self, path, kwargs, headers):
43
revid = self.get_revid()
45
filter_file_id = kwargs.get('filter_file_id', None)
46
start_revid = h.fix_revid(kwargs.get('start_revid', None))
47
query = kwargs.get('q', None)
48
compare_revid = h.fix_revid(kwargs.get('compare_revid', None))
50
# TODO: This try/except looks to date before real exception handling
51
# and should be removed
33
def get_values(self, h, args, kw, headers):
36
revid = h.fix_revid(args[0])
40
filter_file_id = kw.get('filter_file_id', None)
41
start_revid = h.fix_revid(kw.get('start_revid', None))
42
query = kw.get('q', None)
43
remember = h.fix_revid(kw.get('remember', None))
44
compare_revid = h.fix_revid(kw.get('compare_revid', None))
53
revid, start_revid, revid_list = h.get_view(revid,
47
revid, start_revid, revid_list = h.get_view(revid, start_revid, filter_file_id, query)
58
49
self.log.exception('Exception fetching changes')
59
50
raise HTTPServerError('Could not fetch changes')
60
# XXX: Some concern about namespace collisions. These are only stored
61
# here so they can be expanded into the template later. Should probably
62
# be stored in a specific dict/etc.
63
self.revid_list = revid_list
64
self.compare_revid = compare_revid
66
kwargs['start_revid'] = start_revid
68
change = h.get_changes([revid])[0]
70
if compare_revid is None:
71
file_changes = h.get_file_changes(change)
73
file_changes = h.file_changes_for_revision_ids(
74
compare_revid, change.revid)
76
h.add_branch_nicks(change)
78
if '.' in change.revno:
79
# Walk "up" though the merge-sorted graph until we find a
80
# revision with merge depth 0: this is the revision that merged
81
# this one to mainline.
82
ri = self._history._rev_info
83
i = self._history._rev_indices[change.revid]
84
while ri[i][0][2] > 0:
86
merged_in = ri[i][0][3]
93
'file_changes': file_changes,
94
'merged_in': merged_in,
97
def add_template_values(self, values):
98
super(RevisionUI, self).add_template_values(values)
99
remember = self._history.fix_revid(self.kwargs.get('remember', None))
100
query = self.kwargs.get('q', None)
101
filter_file_id = self.kwargs.get('filter_file_id', None)
102
start_revid = self.kwargs['start_revid']
103
52
navigation = util.Container(
104
revid_list=self.revid_list, revid=values['revid'],
105
start_revid=start_revid,
53
revid_list=revid_list, revid=revid, start_revid=start_revid,
106
54
filter_file_id=filter_file_id, pagesize=1,
107
scan_url='/revision', branch=self._branch, feed=True,
108
history=self._history)
55
scan_url='/revision', branch=self._branch, feed=True, history=h)
109
56
if query is not None:
110
57
navigation.query = query
111
58
util.fill_in_navigation(navigation)
113
if path in ('', '/'):
117
file_changes = values['file_changes']
121
items = [x for x in file_changes.text_changes if x.filename == path]
124
diff_chunks = diff_chunks_for_file(
125
self._history._branch.repository, item.file_id,
126
item.old_revision, item.new_revision)
131
for i, item in enumerate(file_changes.text_changes):
133
link_data['diff-' + str(i)] = '%s/%s/%s' % (
134
dq(item.new_revision), dq(item.old_revision), dq(item.file_id))
135
path_to_id[item.filename] = 'diff-' + str(i)
137
# Directory Breadcrumbs
138
directory_breadcrumbs = (
139
util.directory_breadcrumbs(
140
self._branch.friendly_name,
141
self._branch.is_root,
145
'history': self._history,
146
'link_data': simplejson.dumps(link_data),
147
'json_specific_path': simplejson.dumps(path),
148
'path_to_id': simplejson.dumps(path_to_id),
149
'directory_breadcrumbs': directory_breadcrumbs,
60
change = h.get_change_with_diff(revid, compare_revid)
61
# add parent & merge-point branch-nick info, in case it's useful
62
h.get_branch_nicks([ change ])
64
line_count_limit = DEFAULT_LINE_COUNT_LIMIT
66
for file in change.changes.modified:
67
for chunk in file.chunks:
68
line_count += len(chunk.diff)
70
# let's make side-by-side diff be the default
71
side_by_side = not kw.get('unified', False)
73
h.add_side_by_side([ change ])
76
'branch': self._branch,
79
'start_revid': start_revid,
80
'filter_file_id': filter_file_id,
150
83
'navigation': navigation,
151
85
'remember': remember,
152
'compare_revid': self.compare_revid,
153
'filter_file_id': filter_file_id,
154
'diff_chunks': diff_chunks,
156
'specific_path': path,
157
'start_revid': start_revid,
86
'compare_revid': compare_revid,
87
'side_by_side': side_by_side,
88
'url': self._branch.context_url,
89
'line_count': line_count,
90
'line_count_limit': line_count_limit,
91
'show_plain_diffs': line_count > line_count_limit,