Show More
@@ -2,7 +2,7 b'' | |||||
2 | Hg app, a web based mercurial repository managment based on pylons |
|
2 | Hg app, a web based mercurial repository managment based on pylons | |
3 | """ |
|
3 | """ | |
4 |
|
4 | |||
5 |
VERSION = (0, 7, |
|
5 | VERSION = (0, 7, 2, 'beta') | |
6 |
|
6 | |||
7 | __version__ = '.'.join((str(each) for each in VERSION[:4])) |
|
7 | __version__ = '.'.join((str(each) for each in VERSION[:4])) | |
8 |
|
8 |
@@ -1,14 +1,16 b'' | |||||
1 | import logging |
|
1 | import tempfile | |
2 |
|
2 | from pylons import request, response, session, tmpl_context as c, url, config, \ | ||
3 | from pylons import request, response, session, tmpl_context as c, url, config, app_globals as g |
|
3 | app_globals as g | |
4 | from pylons.controllers.util import abort, redirect |
|
4 | from pylons.controllers.util import abort, redirect | |
5 |
|
5 | from pylons_app.lib.auth import LoginRequired | ||
6 | from pylons_app.lib.base import BaseController, render |
|
6 | from pylons_app.lib.base import BaseController, render | |
7 | from pylons_app.lib.utils import get_repo_slug |
|
7 | from pylons_app.lib.utils import get_repo_slug | |
8 | from pylons_app.model.hg_model import HgModel |
|
8 | from pylons_app.model.hg_model import HgModel | |
|
9 | from vcs.exceptions import RepositoryError, ChangesetError | |||
9 | from vcs.utils import diffs as differ |
|
10 | from vcs.utils import diffs as differ | |
10 | from vcs.exceptions import RepositoryError, ChangesetError |
|
11 | import logging | |
11 | from pylons_app.lib.auth import LoginRequired |
|
12 | from mercurial import archival | |
|
13 | ||||
12 |
|
14 | |||
13 | log = logging.getLogger(__name__) |
|
15 | log = logging.getLogger(__name__) | |
14 |
|
16 | |||
@@ -84,7 +86,32 b' class FilesController(BaseController):' | |||||
84 | return render('files/files_annotate.html') |
|
86 | return render('files/files_annotate.html') | |
85 |
|
87 | |||
86 | def archivefile(self, repo_name, revision, fileformat): |
|
88 | def archivefile(self, repo_name, revision, fileformat): | |
87 | return '%s %s %s' % (repo_name, revision, fileformat) |
|
89 | archive_specs = { | |
|
90 | '.tar.bz2': ('application/x-tar', 'tbz2'), | |||
|
91 | '.tar.gz': ('application/x-tar', 'tgz'), | |||
|
92 | '.zip': ('application/zip', 'zip'), | |||
|
93 | } | |||
|
94 | if not archive_specs.has_key(fileformat): | |||
|
95 | return 'Unknown archive type %s' % fileformat | |||
|
96 | ||||
|
97 | def read_in_chunks(file_object, chunk_size=1024 * 40): | |||
|
98 | """Lazy function (generator) to read a file piece by piece. | |||
|
99 | Default chunk size: 40k.""" | |||
|
100 | while True: | |||
|
101 | data = file_object.read(chunk_size) | |||
|
102 | if not data: | |||
|
103 | break | |||
|
104 | yield data | |||
|
105 | ||||
|
106 | archive = tempfile.TemporaryFile() | |||
|
107 | repo = HgModel().get_repo(repo_name).repo | |||
|
108 | fname = '%s-%s%s' % (repo_name, revision, fileformat) | |||
|
109 | archival.archive(repo, archive, revision, archive_specs[fileformat][1], | |||
|
110 | prefix='%s-%s' % (repo_name, revision)) | |||
|
111 | response.content_type = archive_specs[fileformat][0] | |||
|
112 | response.content_disposition = 'attachment; filename=%s' % fname | |||
|
113 | archive.seek(0) | |||
|
114 | return read_in_chunks(archive) | |||
88 |
|
115 | |||
89 | def diff(self, repo_name, f_path): |
|
116 | def diff(self, repo_name, f_path): | |
90 | hg_model = HgModel() |
|
117 | hg_model = HgModel() |
General Comments 0
You need to be logged in to leave comments.
Login now