156 self.repo = repo |
156 self.repo = repo |
157 |
157 |
158 self.mtime = -1 |
158 self.mtime = -1 |
159 self.reponame = name or self.repo.ui.config("web", "name", |
159 self.reponame = name or self.repo.ui.config("web", "name", |
160 self.repo.root) |
160 self.repo.root) |
|
161 self.supportedtarballs = 'zip', 'gz', 'bz2' |
161 |
162 |
162 def refresh(self): |
163 def refresh(self): |
163 s = os.stat(os.path.join(self.repo.root, ".hg", "00changelog.i")) |
164 s = os.stat(os.path.join(self.repo.root, ".hg", "00changelog.i")) |
164 if s.st_mtime != self.mtime: |
165 if s.st_mtime != self.mtime: |
165 self.mtime = s.st_mtime |
166 self.mtime = s.st_mtime |
166 self.repo = repository(self.repo.ui, self.repo.root) |
167 self.repo = repository(self.repo.ui, self.repo.root) |
167 self.maxchanges = self.repo.ui.config("web", "maxchanges", 10) |
168 self.maxchanges = self.repo.ui.config("web", "maxchanges", 10) |
168 self.maxfiles = self.repo.ui.config("web", "maxchanges", 10) |
169 self.maxfiles = self.repo.ui.config("web", "maxchanges", 10) |
169 self.allowpull = self.repo.ui.configbool("web", "allowpull", True) |
170 self.allowpull = self.repo.ui.configbool("web", "allowpull", True) |
170 self.allowzip = self.repo.ui.configbool("web", "zip", True) |
171 self.allowedtarballs = [] |
171 self.allowgz = self.repo.ui.configbool("web", "gz", True) |
172 for i in self.supportedtarballs: |
172 self.allowbz2 = self.repo.ui.configbool("web", "bz2", True) |
173 if self.repo.ui.configbool("web", i, True): |
|
174 self.allowedtarballs.append(i) |
173 |
175 |
174 def date(self, cs): |
176 def date(self, cs): |
175 return time.asctime(time.gmtime(float(cs[2].split(' ')[0]))) |
177 return time.asctime(time.gmtime(float(cs[2].split(' ')[0]))) |
176 |
178 |
177 def listfiles(self, files, mf): |
179 def listfiles(self, files, mf): |
194 yield self.t(t1, node=hex(node), rev=rev(node), **args) |
196 yield self.t(t1, node=hex(node), rev=rev(node), **args) |
195 |
197 |
196 def showtag(self, t1, node=nullid, **args): |
198 def showtag(self, t1, node=nullid, **args): |
197 for t in self.repo.nodetags(node): |
199 for t in self.repo.nodetags(node): |
198 yield self.t(t1, tag=t, **args) |
200 yield self.t(t1, tag=t, **args) |
199 |
|
200 def tarballbuttons(self, m): |
|
201 s = '' |
|
202 if self.allowzip: |
|
203 s += '<a href="?cmd=tarball;manifest=%s;type=zip">zip</a>\n' % m |
|
204 if self.allowgz: |
|
205 s += '<a href="?cmd=tarball;manifest=%s;type=gz">gz</a>\n' % m |
|
206 if self.allowbz2: |
|
207 s += '<a href="?cmd=tarball;manifest=%s;type=bz2">bz2</a>\n' % m |
|
208 return s |
|
209 |
201 |
210 def diff(self, node1, node2, files): |
202 def diff(self, node1, node2, files): |
211 def filterfiles(list, files): |
203 def filterfiles(list, files): |
212 l = [x for x in list if x in files] |
204 l = [x for x in list if x in files] |
213 |
205 |
641 rev=self.repo.changelog.rev(n), |
638 rev=self.repo.changelog.rev(n), |
642 parent=self.parents("filediffparent", |
639 parent=self.parents("filediffparent", |
643 cl.parents(n), cl.rev), |
640 cl.parents(n), cl.rev), |
644 diff=diff) |
641 diff=diff) |
645 |
642 |
646 def ziparchive(self, mnode): |
643 def tarball(self, mnode, type): |
647 import zipfile |
644 if type == 'zip': |
648 |
645 import zipfile |
649 tmp = tempfile.mkstemp()[1] |
646 |
650 zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) |
647 tmp = tempfile.mkstemp()[1] |
651 mf = self.repo.manifest.read(bin(mnode)) |
648 zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED) |
652 rev = self.repo.manifest.rev(bin(mnode)) |
649 mf = self.repo.manifest.read(bin(mnode)) |
653 cnode = short(self.repo.changelog.node(rev)) |
650 rev = self.repo.manifest.rev(bin(mnode)) |
654 name = os.path.basename(self.repo.path[:-4]) # without '/.hg' suffix |
651 cnode = short(self.repo.changelog.node(rev)) |
655 name += '-' + str(rev) + '-' + cnode + '/' |
652 name = os.path.basename(self.repo.path[:-4]) # without '/.hg' suffix |
656 |
653 name += '-' + str(rev) + '-' + cnode + '/' |
657 for fname in mf.keys(): |
654 |
658 r = self.repo.file(fname) |
655 for fname in mf.keys(): |
659 zf.writestr(name + fname, r.read(mf[fname])) |
656 r = self.repo.file(fname) |
660 zf.close() |
657 zf.writestr(name + fname, r.read(mf[fname])) |
661 |
658 zf.close() |
662 f = open(tmp, 'r') |
659 |
663 httphdr('application/zip', name[:-1] + '.zip', os.path.getsize(tmp)) |
660 f = open(tmp, 'r') |
664 sys.stdout.write(f.read()) |
661 httphdr('application/zip', name[:-1] + '.zip', os.path.getsize(tmp)) |
665 f.close() |
662 sys.stdout.write(f.read()) |
666 os.unlink(tmp) |
663 f.close() |
667 |
664 os.unlink(tmp) |
668 def tararchive(self, mnode, type): |
665 |
669 import StringIO |
666 else: |
670 import time |
667 import StringIO |
671 import tarfile |
668 import time |
672 |
669 import tarfile |
673 #if type == "gz": |
670 |
674 # tf = tarfile.TarFile.gzopen('', 'w', sys.stdout, compressionlevel) |
671 #if type == "gz": |
675 #else: |
672 # tf = tarfile.TarFile.gzopen('', 'w', sys.stdout, compressionlevel) |
676 # tf = tarfile.TarFile.bz2open('', 'w', sys.stdout, compressionlevel) |
673 #else: |
677 tf = tarfile.TarFile.open(mode='w|' + type, fileobj=sys.stdout) |
674 # tf = tarfile.TarFile.bz2open('', 'w', sys.stdout, compressionlevel) |
678 |
675 tf = tarfile.TarFile.open(mode='w|' + type, fileobj=sys.stdout) |
679 mf = self.repo.manifest.read(bin(mnode)) |
676 |
680 rev = self.repo.manifest.rev(bin(mnode)) |
677 mf = self.repo.manifest.read(bin(mnode)) |
681 cnode = short(self.repo.changelog.node(rev)) |
678 rev = self.repo.manifest.rev(bin(mnode)) |
682 mff = self.repo.manifest.readflags(bin(mnode)) |
679 cnode = short(self.repo.changelog.node(rev)) |
683 mtime = int(time.time()) |
680 mff = self.repo.manifest.readflags(bin(mnode)) |
684 name = os.path.basename(self.repo.path[:-4]) # without '/.hg' suffix |
681 mtime = int(time.time()) |
685 name += '-' + str(rev) + '-' + cnode + '/' |
682 name = os.path.basename(self.repo.path[:-4]) # without '/.hg' suffix |
686 |
683 name += '-' + str(rev) + '-' + cnode + '/' |
687 httphdr('application/octet-stream', name[:-1] + '.tar.' + type) |
684 |
688 for fname in mf.keys(): |
685 httphdr('application/octet-stream', name[:-1] + '.tar.' + type) |
689 r = self.repo.file(fname) |
686 for fname in mf.keys(): |
690 rcont = r.read(mf[fname]) |
687 r = self.repo.file(fname) |
691 finfo = tarfile.TarInfo(name + fname) |
688 rcont = r.read(mf[fname]) |
692 finfo.mtime = mtime |
689 finfo = tarfile.TarInfo(name + fname) |
693 finfo.size = len(rcont) |
690 finfo.mtime = mtime |
694 finfo.mode = mff[fname] and 0755 or 0644 |
691 finfo.size = len(rcont) |
695 tf.addfile(finfo, StringIO.StringIO(rcont)) |
692 finfo.mode = mff[fname] and 0755 or 0644 |
696 tf.close() |
693 tf.addfile(finfo, StringIO.StringIO(rcont)) |
|
694 tf.close() |
697 |
695 |
698 # add tags to things |
696 # add tags to things |
699 # tags -> list of changesets corresponding to tags |
697 # tags -> list of changesets corresponding to tags |
700 # find tag, changeset, file |
698 # find tag, changeset, file |
701 |
699 |
813 sys.stdout.write(z.flush()) |
811 sys.stdout.write(z.flush()) |
814 |
812 |
815 elif args['cmd'][0] == 'tarball': |
813 elif args['cmd'][0] == 'tarball': |
816 manifest = args['manifest'][0] |
814 manifest = args['manifest'][0] |
817 type = args['type'][0] |
815 type = args['type'][0] |
818 if type == 'zip' and self.allowzip: |
816 for i in self.supportedtarballs: |
819 self.ziparchive(manifest) |
817 if type == i and i in self.allowedtarballs: |
820 elif type == 'gz' and self.allowgz: |
818 self.tarball(manifest, type) |
821 self.tararchive(manifest, 'gz') |
819 return |
822 elif type == 'bz2' and self.allowbz2: |
820 |
823 self.tararchive(manifest, 'bz2') |
821 write(self.t("error")) |
824 else: |
|
825 write(self.t("error")) |
|
826 |
822 |
827 else: |
823 else: |
828 write(self.t("error")) |
824 write(self.t("error")) |
829 |
825 |
830 def create_server(repo): |
826 def create_server(repo): |