comparison pylons_app/controllers/changeset.py @ 545:2e2ae0af3962

merged
author Marcin Kuzminski <marcin@python-works.com>
date Tue, 05 Oct 2010 21:26:44 +0200
parents d8778cde98f0
children
comparison
equal deleted inserted replaced
542:c43b1a6d3ba9 545:2e2ae0af3962
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
71 #===================================================================
72 # ADDED FILES
73 #===================================================================
74 c.sum_added = 0
75 for node in c.changeset.added:
76
77 filenode_old = FileNode(node.path, '')
78 if filenode_old.is_binary or node.is_binary:
79 diff = wrap_to_table(_('binary file'))
80 else:
81 c.sum_added += node.size
82 if c.sum_added < cut_off_limit:
83 f_udiff = differ.get_udiff(filenode_old, node)
84 diff = differ.DiffProcessor(f_udiff).as_html()
85 else:
86 diff = wrap_to_table(_('Changeset is to big and was cut'
87 ' off, see raw changeset instead'))
88
89 cs1 = None
90 cs2 = node.last_changeset.short_id
91 c.changes.append(('added', node, diff, cs1, cs2))
92
93 #===================================================================
94 # CHANGED FILES
95 #===================================================================
96 c.sum_removed = 0
97 for node in c.changeset.changed:
98 try:
99 filenode_old = c.changeset_old.get_node(node.path)
100 except ChangesetError:
101 filenode_old = FileNode(node.path, '')
102
103 if filenode_old.is_binary or node.is_binary:
104 diff = wrap_to_table(_('binary file'))
105 else:
106 c.sum_removed += node.size
107 if c.sum_removed < cut_off_limit:
108 f_udiff = differ.get_udiff(filenode_old, node)
109 diff = differ.DiffProcessor(f_udiff).as_html()
110 else:
111 diff = wrap_to_table(_('Changeset is to big and was cut'
112 ' off, see raw changeset instead'))
113
114 cs1 = filenode_old.last_changeset.short_id
115 cs2 = node.last_changeset.short_id
116 c.changes.append(('changed', node, diff, cs1, cs2))
117
118 #===================================================================
119 # REMOVED FILES
120 #===================================================================
121 for node in c.changeset.removed:
122 c.changes.append(('removed', node, None, None, None))
123
124 return render('changeset/changeset.html')
125
126 def raw_changeset(self, revision):
127
128 hg_model = HgModel()
129 method = request.GET.get('diff', 'show')
47 try: 130 try:
48 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision) 131 c.changeset = hg_model.get_repo(c.repo_name).get_changeset(revision)
49 except RepositoryError: 132 except RepositoryError:
50 log.error(traceback.format_exc()) 133 log.error(traceback.format_exc())
51 return redirect(url('hg_home')) 134 return redirect(url('hg_home'))
57 c.changes = [] 140 c.changes = []
58 141
59 for node in c.changeset.added: 142 for node in c.changeset.added:
60 filenode_old = FileNode(node.path, '') 143 filenode_old = FileNode(node.path, '')
61 if filenode_old.is_binary or node.is_binary: 144 if filenode_old.is_binary or node.is_binary:
62 diff = 'binary file' 145 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: 146 else:
109 f_udiff = differ.get_udiff(filenode_old, node) 147 f_udiff = differ.get_udiff(filenode_old, node)
110 diff = differ.DiffProcessor(f_udiff).raw_diff() 148 diff = differ.DiffProcessor(f_udiff).raw_diff()
111 149
112 cs1 = None 150 cs1 = None
114 c.changes.append(('added', node, diff, cs1, cs2)) 152 c.changes.append(('added', node, diff, cs1, cs2))
115 153
116 for node in c.changeset.changed: 154 for node in c.changeset.changed:
117 filenode_old = c.changeset_old.get_node(node.path) 155 filenode_old = c.changeset_old.get_node(node.path)
118 if filenode_old.is_binary or node.is_binary: 156 if filenode_old.is_binary or node.is_binary:
119 diff = 'binary file' 157 diff = _('binary file')
120 else: 158 else:
121 f_udiff = differ.get_udiff(filenode_old, node) 159 f_udiff = differ.get_udiff(filenode_old, node)
122 diff = differ.DiffProcessor(f_udiff).raw_diff() 160 diff = differ.DiffProcessor(f_udiff).raw_diff()
123 161
124 cs1 = filenode_old.last_changeset.short_id 162 cs1 = filenode_old.last_changeset.short_id
127 165
128 response.content_type = 'text/plain' 166 response.content_type = 'text/plain'
129 if method == 'download': 167 if method == 'download':
130 response.content_disposition = 'attachment; filename=%s.patch' % revision 168 response.content_disposition = 'attachment; filename=%s.patch' % revision
131 parent = True if len(c.changeset.parents) > 0 else False 169 parent = True if len(c.changeset.parents) > 0 else False
132 c.parent_tmpl = 'Parent %s' % c.changeset.parents[0]._hex if parent else '' 170 c.parent_tmpl = 'Parent %s' % c.changeset.parents[0].raw_id if parent else ''
133 171
134 c.diffs = '' 172 c.diffs = ''
135 for x in c.changes: 173 for x in c.changes:
136 c.diffs += x[2] 174 c.diffs += x[2]
137 175