Mercurial > kallithea
comparison rhodecode/controllers/files.py @ 636:ffd07396d315 beta
Fixes for raw_id, needed for git
Renamed hg controller to home
css html changes
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Tue, 26 Oct 2010 03:20:32 +0200 |
parents | 7e536d1af60d |
children | c8bd0e6cc3da |
comparison
equal
deleted
inserted
replaced
635:fd63782c4426 | 636:ffd07396d315 |
---|---|
34 from vcs.nodes import FileNode | 34 from vcs.nodes import FileNode |
35 from vcs.utils import diffs as differ | 35 from vcs.utils import diffs as differ |
36 import logging | 36 import logging |
37 import rhodecode.lib.helpers as h | 37 import rhodecode.lib.helpers as h |
38 import tempfile | 38 import tempfile |
39 | 39 |
40 log = logging.getLogger(__name__) | 40 log = logging.getLogger(__name__) |
41 | 41 |
42 class FilesController(BaseController): | 42 class FilesController(BaseController): |
43 | 43 |
44 @LoginRequired() | 44 @LoginRequired() |
45 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', | 45 @HasRepoPermissionAnyDecorator('repository.read', 'repository.write', |
46 'repository.admin') | 46 'repository.admin') |
47 def __before__(self): | 47 def __before__(self): |
48 super(FilesController, self).__before__() | 48 super(FilesController, self).__before__() |
49 c.file_size_limit = 250 * 1024 #limit of file size to display | 49 c.file_size_limit = 250 * 1024 #limit of file size to display |
50 | 50 |
51 def index(self, repo_name, revision, f_path): | 51 def index(self, repo_name, revision, f_path): |
52 hg_model = HgModel() | 52 hg_model = HgModel() |
53 c.repo = repo = hg_model.get_repo(c.repo_name) | 53 c.repo = repo = hg_model.get_repo(c.repo_name) |
54 revision = request.POST.get('at_rev', None) or revision | 54 revision = request.POST.get('at_rev', None) or revision |
55 | 55 |
56 def get_next_rev(cur): | 56 def get_next_rev(cur): |
57 max_rev = len(c.repo.revisions) - 1 | 57 max_rev = len(c.repo.revisions) - 1 |
58 r = cur + 1 | 58 r = cur + 1 |
59 if r > max_rev: | 59 if r > max_rev: |
60 r = max_rev | 60 r = max_rev |
61 return r | 61 return r |
62 | 62 |
63 def get_prev_rev(cur): | 63 def get_prev_rev(cur): |
64 r = cur - 1 | 64 r = cur - 1 |
65 return r | 65 return r |
66 | 66 |
67 c.f_path = f_path | 67 c.f_path = f_path |
68 | 68 |
69 | 69 |
70 try: | 70 try: |
71 cur_rev = repo.get_changeset(revision).revision | 71 cur_rev = repo.get_changeset(revision).revision |
72 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).short_id | 72 prev_rev = repo.get_changeset(get_prev_rev(cur_rev)).raw_id |
73 next_rev = repo.get_changeset(get_next_rev(cur_rev)).short_id | 73 next_rev = repo.get_changeset(get_next_rev(cur_rev)).raw_id |
74 | 74 |
75 c.url_prev = url('files_home', repo_name=c.repo_name, | 75 c.url_prev = url('files_home', repo_name=c.repo_name, |
76 revision=prev_rev, f_path=f_path) | 76 revision=prev_rev, f_path=f_path) |
77 c.url_next = url('files_home', repo_name=c.repo_name, | 77 c.url_next = url('files_home', repo_name=c.repo_name, |
78 revision=next_rev, f_path=f_path) | 78 revision=next_rev, f_path=f_path) |
79 | 79 |
80 c.changeset = repo.get_changeset(revision) | 80 c.changeset = repo.get_changeset(revision) |
81 | 81 |
82 c.cur_rev = c.changeset.short_id | 82 c.cur_rev = c.changeset.raw_id |
83 c.rev_nr = c.changeset.revision | 83 c.rev_nr = c.changeset.revision |
84 c.files_list = c.changeset.get_node(f_path) | 84 c.files_list = c.changeset.get_node(f_path) |
85 c.file_history = self._get_history(repo, c.files_list, f_path) | 85 c.file_history = self._get_history(repo, c.files_list, f_path) |
86 | 86 |
87 except (RepositoryError, ChangesetError): | 87 except (RepositoryError, ChangesetError): |
88 c.files_list = None | 88 c.files_list = None |
89 | 89 |
90 return render('files/files.html') | 90 return render('files/files.html') |
91 | 91 |
92 def rawfile(self, repo_name, revision, f_path): | 92 def rawfile(self, repo_name, revision, f_path): |
93 hg_model = HgModel() | 93 hg_model = HgModel() |
94 c.repo = hg_model.get_repo(c.repo_name) | 94 c.repo = hg_model.get_repo(c.repo_name) |
95 file_node = c.repo.get_changeset(revision).get_node(f_path) | 95 file_node = c.repo.get_changeset(revision).get_node(f_path) |
96 response.content_type = file_node.mimetype | 96 response.content_type = file_node.mimetype |
97 response.content_disposition = 'attachment; filename=%s' \ | 97 response.content_disposition = 'attachment; filename=%s' \ |
98 % f_path.split('/')[-1] | 98 % f_path.split('/')[-1] |
99 return file_node.content | 99 return file_node.content |
100 | 100 |
101 def raw(self, repo_name, revision, f_path): | 101 def raw(self, repo_name, revision, f_path): |
102 hg_model = HgModel() | 102 hg_model = HgModel() |
103 c.repo = hg_model.get_repo(c.repo_name) | 103 c.repo = hg_model.get_repo(c.repo_name) |
104 file_node = c.repo.get_changeset(revision).get_node(f_path) | 104 file_node = c.repo.get_changeset(revision).get_node(f_path) |
105 response.content_type = 'text/plain' | 105 response.content_type = 'text/plain' |
106 | 106 |
107 return file_node.content | 107 return file_node.content |
108 | 108 |
109 def annotate(self, repo_name, revision, f_path): | 109 def annotate(self, repo_name, revision, f_path): |
110 hg_model = HgModel() | 110 hg_model = HgModel() |
111 c.repo = hg_model.get_repo(c.repo_name) | 111 c.repo = hg_model.get_repo(c.repo_name) |
112 cs = c.repo.get_changeset(revision) | 112 cs = c.repo.get_changeset(revision) |
113 c.file = cs.get_node(f_path) | 113 c.file = cs.get_node(f_path) |
114 c.file_msg = cs.get_file_message(f_path) | 114 c.file_msg = cs.get_file_message(f_path) |
115 c.cur_rev = cs.short_id | 115 c.cur_rev = cs.raw_id |
116 c.rev_nr = cs.revision | 116 c.rev_nr = cs.revision |
117 c.f_path = f_path | 117 c.f_path = f_path |
118 | 118 |
119 return render('files/files_annotate.html') | 119 return render('files/files_annotate.html') |
120 | 120 |
121 def archivefile(self, repo_name, revision, fileformat): | 121 def archivefile(self, repo_name, revision, fileformat): |
122 archive_specs = { | 122 archive_specs = { |
123 '.tar.bz2': ('application/x-tar', 'tbz2'), | 123 '.tar.bz2': ('application/x-tar', 'tbz2'), |
124 '.tar.gz': ('application/x-tar', 'tgz'), | 124 '.tar.gz': ('application/x-tar', 'tgz'), |
125 '.zip': ('application/zip', 'zip'), | 125 '.zip': ('application/zip', 'zip'), |
126 } | 126 } |
127 if not archive_specs.has_key(fileformat): | 127 if not archive_specs.has_key(fileformat): |
128 return 'Unknown archive type %s' % fileformat | 128 return 'Unknown archive type %s' % fileformat |
129 | 129 |
130 def read_in_chunks(file_object, chunk_size=1024 * 40): | 130 def read_in_chunks(file_object, chunk_size=1024 * 40): |
131 """Lazy function (generator) to read a file piece by piece. | 131 """Lazy function (generator) to read a file piece by piece. |
132 Default chunk size: 40k.""" | 132 Default chunk size: 40k.""" |
133 while True: | 133 while True: |
134 data = file_object.read(chunk_size) | 134 data = file_object.read(chunk_size) |
135 if not data: | 135 if not data: |
136 break | 136 break |
137 yield data | 137 yield data |
138 | 138 |
139 archive = tempfile.TemporaryFile() | 139 archive = tempfile.TemporaryFile() |
140 repo = HgModel().get_repo(repo_name).repo | 140 repo = HgModel().get_repo(repo_name).repo |
141 fname = '%s-%s%s' % (repo_name, revision, fileformat) | 141 fname = '%s-%s%s' % (repo_name, revision, fileformat) |
142 archival.archive(repo, archive, revision, archive_specs[fileformat][1], | 142 archival.archive(repo, archive, revision, archive_specs[fileformat][1], |
143 prefix='%s-%s' % (repo_name, revision)) | 143 prefix='%s-%s' % (repo_name, revision)) |
144 response.content_type = archive_specs[fileformat][0] | 144 response.content_type = archive_specs[fileformat][0] |
145 response.content_disposition = 'attachment; filename=%s' % fname | 145 response.content_disposition = 'attachment; filename=%s' % fname |
146 archive.seek(0) | 146 archive.seek(0) |
147 return read_in_chunks(archive) | 147 return read_in_chunks(archive) |
148 | 148 |
149 def diff(self, repo_name, f_path): | 149 def diff(self, repo_name, f_path): |
150 hg_model = HgModel() | 150 hg_model = HgModel() |
151 diff1 = request.GET.get('diff1') | 151 diff1 = request.GET.get('diff1') |
152 diff2 = request.GET.get('diff2') | 152 diff2 = request.GET.get('diff2') |
153 c.action = request.GET.get('diff') | 153 c.action = request.GET.get('diff') |
160 c.changeset_1 = c.repo.get_changeset(diff1) | 160 c.changeset_1 = c.repo.get_changeset(diff1) |
161 node1 = c.changeset_1.get_node(f_path) | 161 node1 = c.changeset_1.get_node(f_path) |
162 else: | 162 else: |
163 c.changeset_1 = EmptyChangeset() | 163 c.changeset_1 = EmptyChangeset() |
164 node1 = FileNode('.', '', changeset=c.changeset_1) | 164 node1 = FileNode('.', '', changeset=c.changeset_1) |
165 | 165 |
166 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]: | 166 if diff2 not in ['', None, 'None', '0' * 12, '0' * 40]: |
167 c.changeset_2 = c.repo.get_changeset(diff2) | 167 c.changeset_2 = c.repo.get_changeset(diff2) |
168 node2 = c.changeset_2.get_node(f_path) | 168 node2 = c.changeset_2.get_node(f_path) |
169 else: | 169 else: |
170 c.changeset_2 = EmptyChangeset() | 170 c.changeset_2 = EmptyChangeset() |
171 node2 = FileNode('.', '', changeset=c.changeset_2) | 171 node2 = FileNode('.', '', changeset=c.changeset_2) |
172 except RepositoryError: | 172 except RepositoryError: |
173 return redirect(url('files_home', | 173 return redirect(url('files_home', |
174 repo_name=c.repo_name, f_path=f_path)) | 174 repo_name=c.repo_name, f_path=f_path)) |
175 | 175 |
176 c.diff1 = 'r%s:%s' % (c.changeset_1.revision, c.changeset_1.short_id) | |
177 c.diff2 = 'r%s:%s' % (c.changeset_2.revision, c.changeset_2.short_id) | |
178 | |
179 f_udiff = differ.get_udiff(node1, node2) | 176 f_udiff = differ.get_udiff(node1, node2) |
180 diff = differ.DiffProcessor(f_udiff) | 177 diff = differ.DiffProcessor(f_udiff) |
181 | 178 |
182 if c.action == 'download': | 179 if c.action == 'download': |
183 diff_name = '%s_vs_%s.diff' % (diff1, diff2) | 180 diff_name = '%s_vs_%s.diff' % (diff1, diff2) |
184 response.content_type = 'text/plain' | 181 response.content_type = 'text/plain' |
185 response.content_disposition = 'attachment; filename=%s' \ | 182 response.content_disposition = 'attachment; filename=%s' \ |
186 % diff_name | 183 % diff_name |
187 return diff.raw_diff() | 184 return diff.raw_diff() |
188 | 185 |
189 elif c.action == 'raw': | 186 elif c.action == 'raw': |
190 c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff()) | 187 c.cur_diff = '<pre class="raw">%s</pre>' % h.escape(diff.raw_diff()) |
191 elif c.action == 'diff': | 188 elif c.action == 'diff': |
192 if node1.size > c.file_size_limit or node2.size > c.file_size_limit: | 189 if node1.size > c.file_size_limit or node2.size > c.file_size_limit: |
193 c.cur_diff = _('Diff is to big to display') | 190 c.cur_diff = _('Diff is to big to display') |
197 #default option | 194 #default option |
198 if node1.size > c.file_size_limit or node2.size > c.file_size_limit: | 195 if node1.size > c.file_size_limit or node2.size > c.file_size_limit: |
199 c.cur_diff = _('Diff is to big to display') | 196 c.cur_diff = _('Diff is to big to display') |
200 else: | 197 else: |
201 c.cur_diff = diff.as_html() | 198 c.cur_diff = diff.as_html() |
202 | 199 |
203 if not c.cur_diff: c.no_changes = True | 200 if not c.cur_diff: c.no_changes = True |
204 return render('files/file_diff.html') | 201 return render('files/file_diff.html') |
205 | 202 |
206 def _get_history(self, repo, node, f_path): | 203 def _get_history(self, repo, node, f_path): |
207 from vcs.nodes import NodeKind | 204 from vcs.nodes import NodeKind |
208 if not node.kind is NodeKind.FILE: | 205 if not node.kind is NodeKind.FILE: |
209 return [] | 206 return [] |
210 changesets = node.history | 207 changesets = node.history |
211 hist_l = [] | 208 hist_l = [] |
212 for chs in changesets: | 209 for chs in changesets: |
213 n_desc = 'r%s:%s' % (chs.revision, chs.short_id) | 210 n_desc = 'r%s:%s' % (chs.revision, chs.short_id) |
214 hist_l.append((chs.short_id, n_desc,)) | 211 hist_l.append((chs.raw_id, n_desc,)) |
215 return hist_l | 212 return hist_l |