def archivefile(self, repo_name, fname): fileformat = None revision = None ext = None subrepos = request.GET.get('subrepos') == 'true' for a_type, ext_data in ARCHIVE_SPECS.items(): archive_spec = fname.split(ext_data[1]) if len(archive_spec) == 2 and archive_spec[1] == '': fileformat = a_type or ext_data[1] revision = archive_spec[0] ext = ext_data[1] try: dbrepo = RepoModel().get_by_repo_name(repo_name) if dbrepo.enable_downloads is False: return _('downloads disabled') cs = c.rhodecode_repo.get_changeset(revision) content_type = ARCHIVE_SPECS[fileformat][0] except ChangesetDoesNotExistError: return _('Unknown revision %s') % revision except EmptyRepositoryError: return _('Empty repository') except (ImproperArchiveTypeError, KeyError): return _('Unknown archive type') response.content_type = content_type response.content_disposition = 'attachment; filename=%s-%s%s' \ % (repo_name, revision, ext) import tempfile archive = tempfile.mkstemp()[1] t = open(archive, 'wb') cs.fill_archive(stream=t, kind=fileformat, subrepos=subrepos) def get_chunked_archive(archive): stream = open(archive, 'rb') while True: data = stream.read(4096) if not data: os.remove(archive) break yield data return get_chunked_archive(archive)