Mercurial > kallithea
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 |