Changeset - 85ee0ea183e7
[Not reviewed]
beta
0 1 0
Marcin Kuzminski - 15 years ago 2011-01-21 00:53:08
marcin@python-works.com
fixed archival in rhodecode to use new functions from vcs
1 file changed with 17 insertions and 33 deletions:
0 comments (0 inline, 0 general)
rhodecode/controllers/files.py
Show inline comments
 
@@ -30,26 +30,27 @@ import rhodecode.lib.helpers as h
 

	
 
from mercurial import archival
 

	
 
from pylons import request, response, session, tmpl_context as c, url
 
from pylons.i18n.translation import _
 
from pylons.controllers.util import redirect
 

	
 
from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
 
from rhodecode.lib.base import BaseController, render
 
from rhodecode.lib.utils import EmptyChangeset
 
from rhodecode.model.scm import ScmModel
 

	
 
from vcs.backends import ARCHIVE_SPECS
 
from vcs.exceptions import RepositoryError, ChangesetError, \
 
    ChangesetDoesNotExistError, EmptyRepositoryError
 
    ChangesetDoesNotExistError, EmptyRepositoryError, InproperArchiveTypeError
 
from vcs.nodes import FileNode
 
from vcs.utils import diffs as differ
 

	
 
log = logging.getLogger(__name__)
 

	
 
class FilesController(BaseController):
 

	
 
    @LoginRequired()
 
    @HasRepoPermissionAnyDecorator('repository.read', 'repository.write',
 
                                   'repository.admin')
 
    def __before__(self):
 
        super(FilesController, self).__before__()
 
@@ -140,70 +141,53 @@ class FilesController(BaseController):
 
            c.file = c.cs.get_node(f_path)
 
        except RepositoryError, e:
 
            h.flash(str(e), category='warning')
 
            redirect(h.url('files_home', repo_name=repo_name, revision=revision))
 

	
 
        c.file_history = self._get_history(c.repo, c.file, f_path)
 

	
 
        c.f_path = f_path
 

	
 
        return render('files/files_annotate.html')
 

	
 
    def archivefile(self, repo_name, fname):
 
        archive_specs = {
 
          '.tar.bz2': ('application/x-tar', 'tbz2'),
 
          '.tar.gz': ('application/x-tar', 'tgz'),
 
          '.zip': ('application/zip', 'zip'),
 
        }
 

	
 
        fileformat = None
 
        revision = None
 
        ext = None
 

	
 
        for ext in archive_specs.keys():
 
            archive_spec = fname.split(ext)
 
            if len(archive_spec) == 2:
 
                fileformat = archive_spec[1] or ext
 
        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]
 

	
 
        if not archive_specs.has_key(fileformat):
 
            return _('Unknown archive type')
 

	
 
        repo = ScmModel().get_repo(repo_name)
 
                ext = ext_data[1]
 

	
 
        try:
 
            repo.get_changeset(revision)
 
            repo = ScmModel().get_repo(repo_name)
 
            cs = repo.get_changeset(revision)
 
        except ChangesetDoesNotExistError:
 
            return _('Unknown revision %s') % revision
 
        except EmptyRepositoryError:
 
            return _('Empty repository')
 
        except InproperArchiveTypeError:
 
            return _('Unknown archive type')
 

	
 
        archive = tempfile.TemporaryFile()
 
        localrepo = repo.repo
 
        fname = '%s-%s%s' % (repo_name, revision, fileformat)
 
        archival.archive(localrepo, 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)
 
        fname = '%s-%s%s' % (repo_name, revision, ext)
 

	
 
        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
 
        response.content_type = ARCHIVE_SPECS[fileformat][0]
 
        response.content_disposition = 'attachment; filename=%s' % fname
 

	
 
        return read_in_chunks(archive)
 
        return cs.get_chunked_archive(kind=fileformat)
 

	
 

	
 
    def diff(self, repo_name, f_path):
 
        hg_model = ScmModel()
 
        diff1 = request.GET.get('diff1')
 
        diff2 = request.GET.get('diff2')
 
        c.action = request.GET.get('diff')
 
        c.no_changes = diff1 == diff2
 
        c.f_path = f_path
 
        c.repo = hg_model.get_repo(c.repo_name)
 

	
 
        try:
 
            if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
0 comments (0 inline, 0 general)