17
17
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23
from paste.httpexceptions import HTTPServerError
27
from cherrypy import HTTPRedirect, session
25
29
from loggerhead import util
26
from loggerhead.controllers import TemplatedBranchView
27
from loggerhead.controllers.filediff_ui import diff_chunks_for_file
30
DEFAULT_LINE_COUNT_LIMIT = 3000
33
return urllib.quote(urllib.quote(p, safe=''))
36
class RevisionUI(TemplatedBranchView):
38
template_path = 'loggerhead.templates.revision'
40
def get_values(self, path, kwargs, headers):
42
revid = self.get_revid()
44
filter_file_id = kwargs.get('filter_file_id', None)
45
start_revid = h.fix_revid(kwargs.get('start_revid', None))
46
query = kwargs.get('q', None)
47
remember = h.fix_revid(kwargs.get('remember', None))
48
compare_revid = h.fix_revid(kwargs.get('compare_revid', None))
32
class RevisionUI (object):
34
def __init__(self, branch):
39
@util.strip_whitespace
40
@turbogears.expose(html='loggerhead.templates.revision')
41
def default(self, *args, **kw):
43
h = self._branch.get_history()
47
revid = h.fix_revid(args[0])
51
file_id = kw.get('file_id', None)
52
start_revid = h.fix_revid(kw.get('start_revid', None))
53
query = kw.get('q', None)
54
remember = kw.get('remember', None)
55
compare_revid = kw.get('compare_revid', None)
51
revid, start_revid, revid_list = h.get_view(revid,
56
self.log.exception('Exception fetching changes')
57
raise HTTPServerError('Could not fetch changes')
59
navigation = util.Container(
60
revid_list=revid_list, revid=revid, start_revid=start_revid,
61
filter_file_id=filter_file_id, pagesize=1,
62
scan_url='/revision', branch=self._branch, feed=True, history=h)
58
revid, start_revid, revid_list = h.get_view(revid, start_revid, file_id, query)
60
self.log.error('Exception fetching changes: %s' % (x,))
61
util.log_exception(self.log)
62
raise HTTPRedirect(self._branch.url('/changes'))
64
navigation = util.Container(revid_list=revid_list, revid=revid, start_revid=start_revid, file_id=file_id,
65
pagesize=1, scan_url='/revision', branch=self._branch, feed=True)
63
66
if query is not None:
64
67
navigation.query = query
65
util.fill_in_navigation(navigation)
67
change = h.get_changes([revid])[0]
69
if compare_revid is None:
70
file_changes = h.get_file_changes(change)
72
file_changes = h.file_changes_for_revision_ids(
73
compare_revid, change.revid)
81
item = [x for x in file_changes.text_changes if x.filename == path][0]
82
diff_chunks = diff_chunks_for_file(
83
self._history._branch.repository, item.file_id,
84
item.old_revision, item.new_revision)
87
for i, item in enumerate(file_changes.text_changes):
89
link_data['diff-' + str(i)] = '%s/%s/%s' % (
90
dq(item.new_revision), dq(item.old_revision), dq(item.file_id))
91
path_to_id[item.filename] = 'diff-' + str(i)
93
h.add_branch_nicks(change)
95
if '.' in change.revno:
96
# Walk "up" though the merge-sorted graph until we find a
97
# revision with merge depth 0: this is the revision that merged
98
# this one to mainline.
99
ri = self._history._rev_info
100
i = self._history._rev_indices[change.revid]
101
while ri[i][0][2] > 0:
103
merged_in = ri[i][0][3]
107
# Directory Breadcrumbs
108
directory_breadcrumbs = (
109
util.directory_breadcrumbs(
110
self._branch.friendly_name,
111
self._branch.is_root,
68
util.fill_in_navigation(h, navigation)
70
if compare_revid is not None:
71
change = h.get_diff(compare_revid, revid)
73
change = h.get_changes([ revid ], get_diffs=True)[0]
74
# add parent & merge-point branch-nick info, in case it's useful
75
h.get_branch_nicks([ change ])
77
# let's make side-by-side diff be the default
78
side_by_side = not kw.get('unified', False)
80
h.add_side_by_side([ change ])
115
83
'branch': self._branch,
118
'file_changes': file_changes,
119
'diff_chunks': diff_chunks,
120
'link_data': simplejson.dumps(link_data),
121
'specific_path': path,
122
'json_specific_path': simplejson.dumps(path),
123
'path_to_id': simplejson.dumps(path_to_id),
124
86
'start_revid': start_revid,
125
'filter_file_id': filter_file_id,
128
'merged_in': merged_in,
129
90
'navigation': navigation,
131
92
'remember': remember,
132
93
'compare_revid': compare_revid,
133
'url': self._branch.context_url,
134
'directory_breadcrumbs': directory_breadcrumbs,
94
'side_by_side': side_by_side,
97
self.log.info('/revision: %r seconds' % (time.time() - z,))