Mercurial > kallithea
comparison rhodecode/controllers/files.py @ 948:85ee0ea183e7 beta
fixed archival in rhodecode to use new functions from vcs
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Fri, 21 Jan 2011 00:53:08 +0100 |
parents | 05b59c48556f |
children | 343c28c33c19 |
comparison
equal
deleted
inserted
replaced
947:99850ac883d1 | 948:85ee0ea183e7 |
---|---|
37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator | 37 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator |
38 from rhodecode.lib.base import BaseController, render | 38 from rhodecode.lib.base import BaseController, render |
39 from rhodecode.lib.utils import EmptyChangeset | 39 from rhodecode.lib.utils import EmptyChangeset |
40 from rhodecode.model.scm import ScmModel | 40 from rhodecode.model.scm import ScmModel |
41 | 41 |
42 from vcs.backends import ARCHIVE_SPECS | |
42 from vcs.exceptions import RepositoryError, ChangesetError, \ | 43 from vcs.exceptions import RepositoryError, ChangesetError, \ |
43 ChangesetDoesNotExistError, EmptyRepositoryError | 44 ChangesetDoesNotExistError, EmptyRepositoryError, InproperArchiveTypeError |
44 from vcs.nodes import FileNode | 45 from vcs.nodes import FileNode |
45 from vcs.utils import diffs as differ | 46 from vcs.utils import diffs as differ |
46 | 47 |
47 log = logging.getLogger(__name__) | 48 log = logging.getLogger(__name__) |
48 | 49 |
147 c.f_path = f_path | 148 c.f_path = f_path |
148 | 149 |
149 return render('files/files_annotate.html') | 150 return render('files/files_annotate.html') |
150 | 151 |
151 def archivefile(self, repo_name, fname): | 152 def archivefile(self, repo_name, fname): |
152 archive_specs = { | |
153 '.tar.bz2': ('application/x-tar', 'tbz2'), | |
154 '.tar.gz': ('application/x-tar', 'tgz'), | |
155 '.zip': ('application/zip', 'zip'), | |
156 } | |
157 | 153 |
158 fileformat = None | 154 fileformat = None |
159 revision = None | 155 revision = None |
160 | 156 ext = None |
161 for ext in archive_specs.keys(): | 157 |
162 archive_spec = fname.split(ext) | 158 for a_type, ext_data in ARCHIVE_SPECS.items(): |
163 if len(archive_spec) == 2: | 159 archive_spec = fname.split(ext_data[1]) |
164 fileformat = archive_spec[1] or ext | 160 if len(archive_spec) == 2 and archive_spec[1] == '': |
161 fileformat = a_type or ext_data[1] | |
165 revision = archive_spec[0] | 162 revision = archive_spec[0] |
166 | 163 ext = ext_data[1] |
167 if not archive_specs.has_key(fileformat): | 164 |
168 return _('Unknown archive type') | 165 try: |
169 | 166 repo = ScmModel().get_repo(repo_name) |
170 repo = ScmModel().get_repo(repo_name) | 167 cs = repo.get_changeset(revision) |
171 | |
172 try: | |
173 repo.get_changeset(revision) | |
174 except ChangesetDoesNotExistError: | 168 except ChangesetDoesNotExistError: |
175 return _('Unknown revision %s') % revision | 169 return _('Unknown revision %s') % revision |
176 except EmptyRepositoryError: | 170 except EmptyRepositoryError: |
177 return _('Empty repository') | 171 return _('Empty repository') |
178 | 172 except InproperArchiveTypeError: |
179 archive = tempfile.TemporaryFile() | 173 return _('Unknown archive type') |
180 localrepo = repo.repo | 174 |
181 fname = '%s-%s%s' % (repo_name, revision, fileformat) | 175 fname = '%s-%s%s' % (repo_name, revision, ext) |
182 archival.archive(localrepo, archive, revision, archive_specs[fileformat][1], | 176 |
183 prefix='%s-%s' % (repo_name, revision)) | 177 response.content_type = ARCHIVE_SPECS[fileformat][0] |
184 response.content_type = archive_specs[fileformat][0] | |
185 response.content_disposition = 'attachment; filename=%s' % fname | 178 response.content_disposition = 'attachment; filename=%s' % fname |
186 archive.seek(0) | 179 |
187 | 180 return cs.get_chunked_archive(kind=fileformat) |
188 def read_in_chunks(file_object, chunk_size=1024 * 40): | 181 |
189 """Lazy function (generator) to read a file piece by piece. | |
190 Default chunk size: 40k.""" | |
191 while True: | |
192 data = file_object.read(chunk_size) | |
193 if not data: | |
194 break | |
195 yield data | |
196 | |
197 return read_in_chunks(archive) | |
198 | 182 |
199 def diff(self, repo_name, f_path): | 183 def diff(self, repo_name, f_path): |
200 hg_model = ScmModel() | 184 hg_model = ScmModel() |
201 diff1 = request.GET.get('diff1') | 185 diff1 = request.GET.get('diff1') |
202 diff2 = request.GET.get('diff2') | 186 diff2 = request.GET.get('diff2') |