comparison mercurial/hgweb.py @ 2113:633d733e7b11

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.
author Vadim Gelfer <vadim.gelfer@gmail.com>
date Fri, 21 Apr 2006 15:28:50 -0700
parents caccf539c9a4
children f62195054c5b
comparison
equal deleted inserted replaced
2112:2b03c6733efa 2113:633d733e7b11
8 8
9 import os, cgi, sys 9 import os, cgi, sys
10 import mimetypes 10 import mimetypes
11 from demandload import demandload 11 from demandload import demandload
12 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser") 12 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser")
13 demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer util") 13 demandload(globals(), "tempfile StringIO BaseHTTPServer util")
14 demandload(globals(), "mimetypes templater") 14 demandload(globals(), "archival mimetypes templater")
15 from node import * 15 from node import *
16 from i18n import gettext as _ 16 from i18n import gettext as _
17 17
18 def up(p): 18 def up(p):
19 if p[0] != "/": 19 if p[0] != "/":
680 rev=self.repo.changelog.rev(n), 680 rev=self.repo.changelog.rev(n),
681 parent=self.siblings(cl.parents(n), cl.rev), 681 parent=self.siblings(cl.parents(n), cl.rev),
682 child=self.siblings(cl.children(n), cl.rev), 682 child=self.siblings(cl.children(n), cl.rev),
683 diff=diff) 683 diff=diff)
684 684
685 archive_specs = {
686 'bz2': ('application/x-tar', 'tbz2', '.tar.bz2', 'x-bzip2'),
687 'gz': ('application/x-tar', 'tgz', '.tar.gz', 'x-gzip'),
688 'zip': ('application/zip', 'zip', '.zip', None),
689 }
690
685 def archive(self, req, cnode, type): 691 def archive(self, req, cnode, type):
686 cs = self.repo.changelog.read(cnode) 692 reponame = re.sub(r"\W+", "-", os.path.basename(self.reponame))
687 mnode = cs[0] 693 name = "%s-%s" % (reponame, short(cnode))
688 mf = self.repo.manifest.read(mnode) 694 mimetype, artype, extension, encoding = self.archive_specs[type]
689 rev = self.repo.manifest.rev(mnode) 695 headers = [('Content-type', mimetype),
690 reponame = re.sub(r"\W+", "-", self.reponame) 696 ('Content-disposition', 'attachment; filename=%s%s' %
691 name = "%s-%s/" % (reponame, short(cnode)) 697 (name, extension))]
692 698 if encoding:
693 files = mf.keys() 699 headers.append(('Content-encoding', encoding))
694 files.sort() 700 req.header(headers)
695 701 archival.archive(self.repo, req.out, cnode, artype, prefix=name)
696 if type == 'zip':
697 tmp = tempfile.mkstemp()[1]
698 try:
699 zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED)
700
701 for f in files:
702 zf.writestr(name + f, self.repo.file(f).read(mf[f]))
703 zf.close()
704
705 f = open(tmp, 'r')
706 req.httphdr('application/zip', name[:-1] + '.zip',
707 os.path.getsize(tmp))
708 req.write(f.read())
709 f.close()
710 finally:
711 os.unlink(tmp)
712
713 else:
714 tf = tarfile.TarFile.open(mode='w|' + type, fileobj=req.out)
715 mff = self.repo.manifest.readflags(mnode)
716 mtime = int(time.time())
717
718 if type == "gz":
719 encoding = "gzip"
720 else:
721 encoding = "x-bzip2"
722 req.header([('Content-type', 'application/x-tar'),
723 ('Content-disposition', 'attachment; filename=%s%s%s' %
724 (name[:-1], '.tar.', type)),
725 ('Content-encoding', encoding)])
726 for fname in files:
727 rcont = self.repo.file(fname).read(mf[fname])
728 finfo = tarfile.TarInfo(name + fname)
729 finfo.mtime = mtime
730 finfo.size = len(rcont)
731 finfo.mode = mff[fname] and 0755 or 0644
732 tf.addfile(finfo, StringIO.StringIO(rcont))
733 tf.close()
734 702
735 # add tags to things 703 # add tags to things
736 # tags -> list of changesets corresponding to tags 704 # tags -> list of changesets corresponding to tags
737 # find tag, changeset, file 705 # find tag, changeset, file
738 706