comparison pylons_app/controllers/changeset.py @ 592:a99e23e6c1e8

fixes #13 large initial commits and changesets are cut of now to not freeze the application. fixed _hex ! for raw changeset
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 05 Oct 2010 17:56:06 +0200
parents d945c95ba4ac
children d8778cde98f0
comparison
equal deleted inserted replaced
590:c8798599cf8d 592:a99e23e6c1e8
20 Created on April 25, 2010 20 Created on April 25, 2010
21 changeset controller for pylons 21 changeset controller for pylons
22 @author: marcink 22 @author: marcink
23 """ 23 """
24 from pylons import tmpl_context as c, url, request, response 24 from pylons import tmpl_context as c, url, request, response
25 from pylons.i18n.translation import _
25 from pylons.controllers.util import redirect 26 from pylons.controllers.util import redirect
26 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator 27 from pylons_app.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
27 from pylons_app.lib.base import BaseController, render 28 from pylons_app.lib.base import BaseController, render
28 from pylons_app.model.hg_model import HgModel 29 from pylons_app.model.hg_model import HgModel
29 from vcs.exceptions import RepositoryError 30 from vcs.exceptions import RepositoryError, ChangesetError
30 from vcs.nodes import FileNode 31 from vcs.nodes import FileNode
31 from vcs.utils import diffs as differ 32 from vcs.utils import diffs as differ
32 import logging 33 import logging
33 import traceback 34 import traceback
34 35
42 def __before__(self): 43 def __before__(self):
43 super(ChangesetController, self).__before__() 44 super(ChangesetController, self).__before__()
44 45
45 def index(self, revision): 46 def index(self, revision):
46 hg_model = HgModel() 47 hg_model = HgModel()
48 cut_off_limit = 1024 * 100
49
50 def wrap_to_table(str):
51
52 return '''<table class="code-difftable">
53 <tr class="line">
54 <td class="lineno new"></td>
55 <td class="code"><pre>%s</pre></td>
56 </tr>
57 </table>''' % str
58
59 try:
60 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
61 except RepositoryError:
62 log.error(traceback.format_exc())
63 return redirect(url('hg_home'))
64 else:
65 try:
66 c.changeset_old = c.changeset.parents[0]
67 except IndexError:
68 c.changeset_old = None
69 c.changes = []
70 c.sum_added = 0
71 for node in c.changeset.added:
72
73 filenode_old = FileNode(node.path, '')
74 if filenode_old.is_binary or node.is_binary:
75 diff = wrap_to_table(_('binary file'))
76 else:
77 c.sum_added += len(node.content)
78 if c.sum_added < cut_off_limit:
79 f_udiff = differ.get_udiff(filenode_old, node)
80 diff = differ.DiffProcessor(f_udiff).as_html()
81 else:
82 diff = wrap_to_table(_('Changeset is to big see raw changeset'))
83
84 cs1 = None
85 cs2 = node.last_changeset.short_id
86 c.changes.append(('added', node, diff, cs1, cs2))
87
88 c.sum_removed = 0
89 for node in c.changeset.changed:
90 try:
91 filenode_old = c.changeset_old.get_node(node.path)
92 except ChangesetError:
93 filenode_old = FileNode(node.path, '')
94
95 if filenode_old.is_binary or node.is_binary:
96 diff = wrap_to_table(_('binary file'))
97 else:
98 c.sum_removed += len(node.content)
99 if c.sum_removed < cut_off_limit:
100 f_udiff = differ.get_udiff(filenode_old, node)
101 diff = differ.DiffProcessor(f_udiff).as_html()
102 else:
103 diff = wrap_to_table(_('Changeset is to big see raw changeset'))
104
105 cs1 = filenode_old.last_changeset.short_id
106 cs2 = node.last_changeset.short_id
107 c.changes.append(('changed', node, diff, cs1, cs2))
108
109 for node in c.changeset.removed:
110 c.changes.append(('removed', node, None, None, None))
111
112 return render('changeset/changeset.html')
113
114 def raw_changeset(self, revision):
115
116 hg_model = HgModel()
117 method = request.GET.get('diff', 'show')
47 try: 118 try:
48 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision) 119 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
49 except RepositoryError: 120 except RepositoryError:
50 log.error(traceback.format_exc()) 121 log.error(traceback.format_exc())
51 return redirect(url('hg_home')) 122 return redirect(url('hg_home'))
57 c.changes = [] 128 c.changes = []
58 129
59 for node in c.changeset.added: 130 for node in c.changeset.added:
60 filenode_old = FileNode(node.path, '') 131 filenode_old = FileNode(node.path, '')
61 if filenode_old.is_binary or node.is_binary: 132 if filenode_old.is_binary or node.is_binary:
62 diff = 'binary file' 133 diff = _('binary file')
63 else:
64 f_udiff = differ.get_udiff(filenode_old, node)
65 diff = differ.DiffProcessor(f_udiff).as_html()
66
67 cs1 = None
68 cs2 = node.last_changeset.short_id
69 c.changes.append(('added', node, diff, cs1, cs2))
70
71 for node in c.changeset.changed:
72 filenode_old = c.changeset_old.get_node(node.path)
73 if filenode_old.is_binary or node.is_binary:
74 diff = 'binary file'
75 else:
76 f_udiff = differ.get_udiff(filenode_old, node)
77 diff = differ.DiffProcessor(f_udiff).as_html()
78
79 cs1 = filenode_old.last_changeset.short_id
80 cs2 = node.last_changeset.short_id
81 c.changes.append(('changed', node, diff, cs1, cs2))
82
83 for node in c.changeset.removed:
84 c.changes.append(('removed', node, None, None, None))
85
86 return render('changeset/changeset.html')
87
88 def raw_changeset(self,revision):
89
90 hg_model = HgModel()
91 method = request.GET.get('diff','show')
92 try:
93 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
94 except RepositoryError:
95 log.error(traceback.format_exc())
96 return redirect(url('hg_home'))
97 else:
98 try:
99 c.changeset_old = c.changeset.parents[0]
100 except IndexError:
101 c.changeset_old = None
102 c.changes = []
103
104 for node in c.changeset.added:
105 filenode_old = FileNode(node.path, '')
106 if filenode_old.is_binary or node.is_binary:
107 diff = 'binary file'
108 else: 134 else:
109 f_udiff = differ.get_udiff(filenode_old, node) 135 f_udiff = differ.get_udiff(filenode_old, node)
110 diff = differ.DiffProcessor(f_udiff).raw_diff() 136 diff = differ.DiffProcessor(f_udiff).raw_diff()
111 137
112 cs1 = None 138 cs1 = None
114 c.changes.append(('added', node, diff, cs1, cs2)) 140 c.changes.append(('added', node, diff, cs1, cs2))
115 141
116 for node in c.changeset.changed: 142 for node in c.changeset.changed:
117 filenode_old = c.changeset_old.get_node(node.path) 143 filenode_old = c.changeset_old.get_node(node.path)
118 if filenode_old.is_binary or node.is_binary: 144 if filenode_old.is_binary or node.is_binary:
119 diff = 'binary file' 145 diff = _('binary file')
120 else: 146 else:
121 f_udiff = differ.get_udiff(filenode_old, node) 147 f_udiff = differ.get_udiff(filenode_old, node)
122 diff = differ.DiffProcessor(f_udiff).raw_diff() 148 diff = differ.DiffProcessor(f_udiff).raw_diff()
123 149
124 cs1 = filenode_old.last_changeset.short_id 150 cs1 = filenode_old.last_changeset.short_id
127 153
128 response.content_type = 'text/plain' 154 response.content_type = 'text/plain'
129 if method == 'download': 155 if method == 'download':
130 response.content_disposition = 'attachment; filename=%s.patch' % revision 156 response.content_disposition = 'attachment; filename=%s.patch' % revision
131 parent = True if len(c.changeset.parents) > 0 else False 157 parent = True if len(c.changeset.parents) > 0 else False
132 c.parent_tmpl = 'Parent %s' % c.changeset.parents[0]._hex if parent else '' 158 c.parent_tmpl = 'Parent %s' % c.changeset.parents[0].raw_id if parent else ''
133 159
134 c.diffs = '' 160 c.diffs = ''
135 for x in c.changes: 161 for x in c.changes:
136 c.diffs += x[2] 162 c.diffs += x[2]
137 163