mercurial/hgweb.py
changeset 1077 b87aeccf73d9
parent 1076 01db658cc78a
child 1078 33f40d0c6124
equal deleted inserted replaced
1076:01db658cc78a 1077:b87aeccf73d9
   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 
   401                                 filenode=hex(mf.get(f, nullid)), file=f))
   393                                 filenode=hex(mf.get(f, nullid)), file=f))
   402 
   394 
   403         def diff(**map):
   395         def diff(**map):
   404             yield self.diff(p1, n, None)
   396             yield self.diff(p1, n, None)
   405 
   397 
       
   398         def tarballs():
       
   399             for i in self.allowedtarballs:
       
   400                 yield {"type" : i,
       
   401                         "manifest" : hex(changes[0])}
       
   402 
   406         yield self.t('changeset',
   403         yield self.t('changeset',
   407                      diff=diff,
   404                      diff=diff,
   408                      rev=cl.rev(n),
   405                      rev=cl.rev(n),
   409                      node=nodeid,
   406                      node=nodeid,
   410                      parent=self.parents("changesetparent",
   407                      parent=self.parents("changesetparent",
   413                      manifest=hex(changes[0]),
   410                      manifest=hex(changes[0]),
   414                      author=changes[1],
   411                      author=changes[1],
   415                      desc=changes[4],
   412                      desc=changes[4],
   416                      date=t,
   413                      date=t,
   417                      files=files,
   414                      files=files,
   418                      tarballbuttons=self.tarballbuttons(hex(changes[0])))
   415                      tarballbs = tarballs())
   419 
   416 
   420     def filelog(self, f, filenode):
   417     def filelog(self, f, filenode):
   421         cl = self.repo.changelog
   418         cl = self.repo.changelog
   422         fl = self.repo.file(f)
   419         fl = self.repo.file(f)
   423         count = fl.count()
   420         count = fl.count()
   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):