# HG changeset patch # User Vadim Gelfer # Date 1145658530 25200 # Node ID 633d733e7b11e68856cac0bba8b96233e413642d # Parent 2b03c6733efae2a76179cfc49bd591023fb0fa3a make hgweb use new archival module. also use "x-gzip" encoding for ".tar.gz" files, so mozilla and firefox will not transparently decompress stream and save with wrong name. diff -r 2b03c6733efa -r 633d733e7b11 mercurial/hgweb.py --- a/mercurial/hgweb.py Fri Apr 21 15:27:57 2006 -0700 +++ b/mercurial/hgweb.py Fri Apr 21 15:28:50 2006 -0700 @@ -10,8 +10,8 @@ import mimetypes from demandload import demandload demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser") -demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer util") -demandload(globals(), "mimetypes templater") +demandload(globals(), "tempfile StringIO BaseHTTPServer util") +demandload(globals(), "archival mimetypes templater") from node import * from i18n import gettext as _ @@ -682,55 +682,23 @@ child=self.siblings(cl.children(n), cl.rev), diff=diff) - def archive(self, req, cnode, type): - cs = self.repo.changelog.read(cnode) - mnode = cs[0] - mf = self.repo.manifest.read(mnode) - rev = self.repo.manifest.rev(mnode) - reponame = re.sub(r"\W+", "-", self.reponame) - name = "%s-%s/" % (reponame, short(cnode)) - - files = mf.keys() - files.sort() - - if type == 'zip': - tmp = tempfile.mkstemp()[1] - try: - zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) - - for f in files: - zf.writestr(name + f, self.repo.file(f).read(mf[f])) - zf.close() + archive_specs = { + 'bz2': ('application/x-tar', 'tbz2', '.tar.bz2', 'x-bzip2'), + 'gz': ('application/x-tar', 'tgz', '.tar.gz', 'x-gzip'), + 'zip': ('application/zip', 'zip', '.zip', None), + } - f = open(tmp, 'r') - req.httphdr('application/zip', name[:-1] + '.zip', - os.path.getsize(tmp)) - req.write(f.read()) - f.close() - finally: - os.unlink(tmp) - - else: - tf = tarfile.TarFile.open(mode='w|' + type, fileobj=req.out) - mff = self.repo.manifest.readflags(mnode) - mtime = int(time.time()) - - if type == "gz": - encoding = "gzip" - else: - encoding = "x-bzip2" - req.header([('Content-type', 'application/x-tar'), - ('Content-disposition', 'attachment; filename=%s%s%s' % - (name[:-1], '.tar.', type)), - ('Content-encoding', encoding)]) - for fname in files: - rcont = self.repo.file(fname).read(mf[fname]) - finfo = tarfile.TarInfo(name + fname) - finfo.mtime = mtime - finfo.size = len(rcont) - finfo.mode = mff[fname] and 0755 or 0644 - tf.addfile(finfo, StringIO.StringIO(rcont)) - tf.close() + def archive(self, req, cnode, type): + reponame = re.sub(r"\W+", "-", os.path.basename(self.reponame)) + name = "%s-%s" % (reponame, short(cnode)) + mimetype, artype, extension, encoding = self.archive_specs[type] + headers = [('Content-type', mimetype), + ('Content-disposition', 'attachment; filename=%s%s' % + (name, extension))] + if encoding: + headers.append(('Content-encoding', encoding)) + req.header(headers) + archival.archive(self.repo, req.out, cnode, artype, prefix=name) # add tags to things # tags -> list of changesets corresponding to tags