17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
import json as simplejson
26
from paste.httpexceptions import HTTPServerError
23
from cherrypy import InternalError
28
25
from loggerhead import util
29
from loggerhead.controllers import TemplatedBranchView
30
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
26
from loggerhead.templatefunctions import templatefunctions
33
29
DEFAULT_LINE_COUNT_LIMIT = 3000
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))
32
class RevisionUI (object):
34
def __init__(self, branch):
40
@util.strip_whitespace
41
@turbogears.expose(html='zpt:loggerhead.templates.revision')
42
def default(self, *args, **kw):
44
h = self._branch.get_history()
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
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]
110
# Directory Breadcrumbs
111
directory_breadcrumbs = (
112
util.directory_breadcrumbs(
113
self._branch.friendly_name,
114
self._branch.is_root,
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),
127
'start_revid': start_revid,
128
'filter_file_id': filter_file_id,
131
'merged_in': merged_in,
132
'navigation': navigation,
134
'remember': remember,
135
'compare_revid': compare_revid,
136
'url': self._branch.context_url,
137
'directory_breadcrumbs': directory_breadcrumbs,
50
revid = h.fix_revid(args[0])
54
filter_file_id = kw.get('filter_file_id', None)
55
start_revid = h.fix_revid(kw.get('start_revid', None))
56
query = kw.get('q', None)
57
remember = kw.get('remember', None)
58
compare_revid = kw.get('compare_revid', None)
61
revid, start_revid, revid_list = h.get_view(revid, start_revid, filter_file_id, query)
63
self.log.exception('Exception fetching changes')
64
raise InternalError('Could not fetch changes')
66
navigation = util.Container(
67
revid_list=revid_list, revid=revid, start_revid=start_revid,
68
filter_file_id=filter_file_id, pagesize=1,
69
scan_url='/revision', branch=self._branch, feed=True)
71
navigation.query = query
72
util.fill_in_navigation(navigation)
74
change = h.get_change_with_diff(revid, compare_revid)
75
# add parent & merge-point branch-nick info, in case it's useful
76
h.get_branch_nicks([ change ])
78
line_count_limit = int(self._branch.get_config_item(
79
'line_count_limit', DEFAULT_LINE_COUNT_LIMIT))
81
for file in change.changes.modified:
82
for chunk in file.chunks:
83
line_count += len(chunk.diff)
85
# let's make side-by-side diff be the default
86
side_by_side = not kw.get('unified', False)
88
h.add_side_by_side([ change ])
91
'branch': self._branch,
94
'start_revid': start_revid,
95
'filter_file_id': filter_file_id,
98
'navigation': navigation,
100
'remember': remember,
101
'compare_revid': compare_revid,
102
'side_by_side': side_by_side,
103
'url': self._branch.context_url,
104
'line_count': line_count,
105
'line_count_limit': line_count_limit,
106
'show_plain_diffs': line_count > line_count_limit,
108
vals.update(templatefunctions)
110
self.log.info('/revision: %r seconds' % (time.time() - z,))