17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
import json as simplejson
22
26
from paste.httpexceptions import HTTPServerError
23
from paste.request import path_info_pop
25
28
from loggerhead import util
26
from loggerhead.templatefunctions import templatefunctions
27
from loggerhead.zptsupport import load_template
29
from loggerhead.controllers import TemplatedBranchView
30
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
30
33
DEFAULT_LINE_COUNT_LIMIT = 3000
33
class RevisionUI (object):
35
def __init__(self, branch):
40
def default(self, request, response):
42
h = self._branch.history
36
return urllib.quote(urllib.quote(p, safe=''))
39
class RevisionUI(TemplatedBranchView):
41
template_path = 'loggerhead.templates.revision'
43
def get_values(self, path, kwargs, headers):
45
revid = self.get_revid()
47
filter_file_id = kwargs.get('filter_file_id', None)
48
start_revid = h.fix_revid(kwargs.get('start_revid', None))
49
query = kwargs.get('q', None)
50
remember = h.fix_revid(kwargs.get('remember', None))
51
compare_revid = h.fix_revid(kwargs.get('compare_revid', None))
50
arg = path_info_pop(request.environ)
56
revid = h.fix_revid(args[0])
60
filter_file_id = kw.get('filter_file_id', None)
61
start_revid = h.fix_revid(kw.get('start_revid', None))
62
query = kw.get('q', None)
63
remember = kw.get('remember', None)
64
compare_revid = kw.get('compare_revid', None)
67
revid, start_revid, revid_list = h.get_view(revid, start_revid, filter_file_id, query)
69
self.log.exception('Exception fetching changes')
70
raise HTTPServerError('Could not fetch changes')
72
navigation = util.Container(
73
revid_list=revid_list, revid=revid, start_revid=start_revid,
74
filter_file_id=filter_file_id, pagesize=1,
75
scan_url='/revision', branch=self._branch, feed=True)
77
navigation.query = query
78
util.fill_in_navigation(navigation)
80
change = h.get_change_with_diff(revid, compare_revid)
81
# add parent & merge-point branch-nick info, in case it's useful
82
h.get_branch_nicks([ change ])
84
line_count_limit = DEFAULT_LINE_COUNT_LIMIT
86
for file in change.changes.modified:
87
for chunk in file.chunks:
88
line_count += len(chunk.diff)
90
# let's make side-by-side diff be the default
91
side_by_side = not kw.get('unified', False)
93
h.add_side_by_side([ change ])
96
'branch': self._branch,
99
'start_revid': start_revid,
100
'filter_file_id': filter_file_id,
103
'navigation': navigation,
105
'remember': remember,
106
'compare_revid': compare_revid,
107
'side_by_side': side_by_side,
108
'url': self._branch.context_url,
109
'line_count': line_count,
110
'line_count_limit': line_count_limit,
111
'show_plain_diffs': line_count > line_count_limit,
113
vals.update(templatefunctions)
114
self.log.info('/revision: %r seconds' % (time.time() - z,))
115
response.headers['Content-Type'] = 'text/html'
116
template = load_template('loggerhead.templates.revision')
117
template.expand_into(response, **vals)
54
revid, start_revid, revid_list = h.get_view(revid,
59
self.log.exception('Exception fetching changes')
60
raise HTTPServerError('Could not fetch changes')
62
navigation = util.Container(
63
revid_list=revid_list, revid=revid, start_revid=start_revid,
64
filter_file_id=filter_file_id, pagesize=1,
65
scan_url='/revision', branch=self._branch, feed=True, history=h)
67
navigation.query = query
68
util.fill_in_navigation(navigation)
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
# Directory Breadcrumbs
99
directory_breadcrumbs = (
100
util.directory_breadcrumbs(
101
self._branch.friendly_name,
102
self._branch.is_root,
106
'branch': self._branch,
109
'file_changes': file_changes,
110
'diff_chunks': diff_chunks,
111
'link_data': simplejson.dumps(link_data),
112
'specific_path': path,
113
'json_specific_path': simplejson.dumps(path),
114
'path_to_id': simplejson.dumps(path_to_id),
115
'start_revid': start_revid,
116
'filter_file_id': filter_file_id,
119
'navigation': navigation,
121
'remember': remember,
122
'compare_revid': compare_revid,
123
'url': self._branch.context_url,
124
'directory_breadcrumbs': directory_breadcrumbs,