diff options
author | Marcin Kuzminski <marcin@python-works.com> | 2010-05-23 21:26:18 +0200 |
---|---|---|
committer | Marcin Kuzminski <marcin@python-works.com> | 2010-05-23 21:26:18 +0200 |
commit | fdb9e99a63928c960e3100430dcb65485c775bda (patch) | |
tree | 802c3848569a11d0dd74f2b8293a2d928f2a9c35 | |
parent | c025b6831d0c65c93091e692453cafcd0e3bf9f2 (diff) |
Added archives support. Version bumpv0.7.2
-rw-r--r-- | pylons_app/__init__.py | 2 | ||||
-rw-r--r-- | pylons_app/controllers/files.py | 41 |
2 files changed, 35 insertions, 8 deletions
diff --git a/pylons_app/__init__.py b/pylons_app/__init__.py index db0cadf7..28467212 100644 --- a/pylons_app/__init__.py +++ b/pylons_app/__init__.py @@ -2,7 +2,7 @@ Hg app, a web based mercurial repository managment based on pylons """ -VERSION = (0, 7, 1, 'beta') +VERSION = (0, 7, 2, 'beta') __version__ = '.'.join((str(each) for each in VERSION[:4])) diff --git a/pylons_app/controllers/files.py b/pylons_app/controllers/files.py index 0def4e86..cf417560 100644 --- a/pylons_app/controllers/files.py +++ b/pylons_app/controllers/files.py @@ -1,14 +1,16 @@ -import logging - -from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g +import tempfile +from pylons import request, response, session, tmpl_context as c, url, config, \ + app_globals as g from pylons.controllers.util import abort, redirect - +from pylons_app.lib.auth import LoginRequired from pylons_app.lib.base import BaseController, render from pylons_app.lib.utils import get_repo_slug from pylons_app.model.hg_model import HgModel -from vcs.utils import diffs as differ from vcs.exceptions import RepositoryError, ChangesetError -from pylons_app.lib.auth import LoginRequired +from vcs.utils import diffs as differ +import logging +from mercurial import archival + log = logging.getLogger(__name__) @@ -84,7 +86,32 @@ class FilesController(BaseController): return render('files/files_annotate.html') def archivefile(self, repo_name, revision, fileformat): - return '%s %s %s' % (repo_name, revision, fileformat) + archive_specs = { + '.tar.bz2': ('application/x-tar', 'tbz2'), + '.tar.gz': ('application/x-tar', 'tgz'), + '.zip': ('application/zip', 'zip'), + } + if not archive_specs.has_key(fileformat): + return 'Unknown archive type %s' % fileformat + + def read_in_chunks(file_object, chunk_size=1024 * 40): + """Lazy function (generator) to read a file piece by piece. + Default chunk size: 40k.""" + while True: + data = file_object.read(chunk_size) + if not data: + break + yield data + + archive = tempfile.TemporaryFile() + repo = HgModel().get_repo(repo_name).repo + fname = '%s-%s%s' % (repo_name, revision, fileformat) + archival.archive(repo, archive, revision, archive_specs[fileformat][1], + prefix='%s-%s' % (repo_name, revision)) + response.content_type = archive_specs[fileformat][0] + response.content_disposition = 'attachment; filename=%s' % fname + archive.seek(0) + return read_in_chunks(archive) def diff(self, repo_name, f_path): hg_model = HgModel() |