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')