hgweb.py
changeset 101 6da5cf0c4193
parent 100 526722d24ee5
child 102 58039eddbdda
equal deleted inserted replaced
100:526722d24ee5 101:6da5cf0c4193
    38         print '<style type="text/css">'
    38         print '<style type="text/css">'
    39         print 'body { font-family: sans-serif; font-size: 12px; }'
    39         print 'body { font-family: sans-serif; font-size: 12px; }'
    40         print 'table { font-size: 12px; }'
    40         print 'table { font-size: 12px; }'
    41         print '.errmsg { font-size: 200%; color: red; }'
    41         print '.errmsg { font-size: 200%; color: red; }'
    42         print '.filename { font-size: 150%; color: purple; }'
    42         print '.filename { font-size: 150%; color: purple; }'
       
    43         print '.manifest { font-size: 150%; color: purple; }'
       
    44         print '.filehist { font-size: 150%; color: purple; }'
    43         print '.plusline { color: green; }'
    45         print '.plusline { color: green; }'
    44         print '.minusline { color: red; }'
    46         print '.minusline { color: red; }'
    45         print '.atline { color: purple; }'
    47         print '.atline { color: purple; }'
    46         print '</style>'
    48         print '</style>'
    47         print '</HEAD>'
    49         print '</HEAD>'
    71 class errpage(page):
    73 class errpage(page):
    72     def __init__(self):
    74     def __init__(self):
    73         page.__init__(self, title="Mercurial Web Error Page")
    75         page.__init__(self, title="Mercurial Web Error Page")
    74 
    76 
    75 class change_list(page):
    77 class change_list(page):
       
    78 
       
    79     numchanges = 50   # number of changes to show
       
    80 
    76     def __init__(self, repo, reponame):
    81     def __init__(self, repo, reponame):
    77         page.__init__(self)
    82         page.__init__(self)
    78         self.repo = repo
    83         self.repo = repo
    79         print '<h3>Changes For: %s</h3>' % reponame
    84         print '<h3>Changes For: %s</h3>' % reponame
    80 
    85 
    81     def content(self, start='tip', end='0', boundtype='rev'):
    86     def content(self, hi=None):
    82         print '<table summary="" width="100%" align="center">'
       
    83         cl = []
    87         cl = []
    84         for i in xrange(self.repo.changelog.count()):
    88         count = self.repo.changelog.count()
       
    89         if not hi:
       
    90             hi = count
       
    91         elif hi < self.numchanges:
       
    92             hi = self.numchanges
       
    93 
       
    94         start = 0
       
    95         if hi - self.numchanges >= 0:
       
    96             start = hi - self.numchanges
       
    97 
       
    98         nav = "Displaying Revisions: %d-%d" % (start, hi-1)
       
    99         if start != 0:
       
   100             nav = ('<a href="?cmd=changes;hi=%d">Previous %d</a>&nbsp;&nbsp;' \
       
   101                     % (start, self.numchanges)) + nav
       
   102         if hi != count:
       
   103             if hi + self.numchanges <= count:
       
   104                 nav += '&nbsp;&nbsp;<a href="?cmd=changes;hi=%d">Next %d</a>' \
       
   105                         % (hi + self.numchanges, self.numchanges)
       
   106             else:
       
   107                 nav += '&nbsp;&nbsp;<a href="?cmd=changes">Next %d</a>' % \
       
   108                         self.numchanges
       
   109 
       
   110         print '<center>%s</center>' % nav
       
   111 
       
   112         for i in xrange(start, hi):
    85             n = self.repo.changelog.node(i)
   113             n = self.repo.changelog.node(i)
    86             cl.append((n, self.repo.changelog.read(n)))
   114             cl.append((n, self.repo.changelog.read(n)))
    87         cl.reverse()
   115         cl.reverse()
       
   116 
       
   117         print '<table summary="" width="100%" align="center">'
    88         for n, ch in cl:
   118         for n, ch in cl:
    89             print '<tr><td>'
   119             print '<tr><td>'
    90             self.change_table(n, ch)
   120             self.change_table(n, ch)
    91             print '</td></tr>'
   121             print '</td></tr>'
    92 
       
    93         print '</table>'
   122         print '</table>'
       
   123 
       
   124         print '<center>%s</center>' % nav
    94 
   125 
    95     def change_table(self, nodeid, changes):
   126     def change_table(self, nodeid, changes):
    96         hn = hg.hex(nodeid)
   127         hn = hg.hex(nodeid)
    97         i = self.repo.changelog.rev(nodeid)
   128         i = self.repo.changelog.rev(nodeid)
    98         (h1, h2) = [ hg.hex(x) for x in self.repo.changelog.parents(nodeid) ]
   129         (h1, h2) = [ hg.hex(x) for x in self.repo.changelog.parents(nodeid) ]
   194     def content(self):
   225     def content(self):
   195         print '<pre>'
   226         print '<pre>'
   196         print cgi.escape(self.repo.file(self.fn).read(self.node))
   227         print cgi.escape(self.repo.file(self.fn).read(self.node))
   197         print '</pre>'
   228         print '</pre>'
   198 
   229 
       
   230 class mfpage(page):
       
   231     def __init__(self, repo, node):
       
   232         page.__init__(self)
       
   233         self.repo = repo
       
   234         self.nodestr = node
       
   235         self.node = hg.bin(node)
       
   236 
       
   237     def content(self):
       
   238         mf = self.repo.manifest.read(self.node)
       
   239         fns = mf.keys()
       
   240         fns.sort()
       
   241         print '<div class="manifest">Manifest (%s)</div>' % self.nodestr
       
   242         for f in fns:
       
   243             print '<a href="?cmd=file;fn=%s;nd=%s">%s</a><br />' % \
       
   244                     (f, hg.hex(mf[f]), f)
       
   245 
       
   246 class histpage(page):
       
   247     def __init__(self, repo, fn):
       
   248         page.__init__(self)
       
   249         self.repo = repo
       
   250         self.fn = fn
       
   251 
       
   252     def content(self):
       
   253         print '<div class="filehist">File History: %s</div>' % self.fn
       
   254         r = self.repo.file(self.fn)
       
   255         print '<br />'
       
   256         print '<table summary="" width="100%" align="center">'
       
   257         for i in xrange(r.count()-1, -1, -1):
       
   258             n = r.node(i)
       
   259             (p1, p2) = r.parents(n)
       
   260             (h, h1, h2) = map(hg.hex, (n, p1, p2))
       
   261             (i1, i2) = map(r.rev, (p1, p2))
       
   262             ci = r.linkrev(n)
       
   263             cn = self.repo.changelog.node(ci)
       
   264             cs = hg.hex(cn)
       
   265             changes = self.repo.changelog.read(cn)
       
   266             print '<tr><td>'
       
   267             self.hist_ent(i, h, i1, h1, i2, h2, ci, cs, changes)
       
   268             print '</tr></td>'
       
   269         print '</table>'
       
   270 
       
   271     def hist_ent(self, revi, revs, p1i, p1s, p2i, p2s, ci, cs, changes):
       
   272         datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0])))
       
   273         print '<table summary="" width="100%" border="1">'
       
   274         print '\t<tr><td valign="top" width="10%">author:</td>' + \
       
   275                 '<td valign="top" width="20%%">%s</td>' % \
       
   276                 (obfuscate(changes[1]), )
       
   277         print '\t\t<td valign="top" width="10%">description:</td>' + \
       
   278                 '<td width="60%">' + \
       
   279                 '<a href="?cmd=chkin;nd=%s">%s</a></td></tr>' % \
       
   280                 (cs, nl2br(cgi.escape(changes[4])), )
       
   281         print '\t<tr><td>date:</td><td>%s UTC</td>' % (datestr, )
       
   282         print '\t\t<td>revision:</td><td>%d:<a ' % (revi, ) + \
       
   283                 'href="?cmd=file;cs=%s;fn=%s">%s</a></td></tr>' % \
       
   284                 (cs, self.fn, revs )
       
   285         print '\t<tr><td>parent(s):</td><td colspan="3">%d:' % (p1i, )
       
   286         print '<a href="?cmd=file;nd=%s;fn=%s">%s</a>' % (p1s, self.fn, p1s, ),
       
   287         if p2i != -1:
       
   288             print '&nbsp;&nbsp;%d:<a href="?cmd=file;nd=%s;fn=%s">%s</a>' % \
       
   289                     (p2i, p2s, self.fn, p2s ),
       
   290         print '</td></tr>'
       
   291         print '</table><br />'
       
   292 
   199 args = cgi.parse()
   293 args = cgi.parse()
   200 
   294 
   201 ui = hg.ui()
   295 ui = hg.ui()
   202 repo = hg.repository(ui, repo_path)
   296 repo = hg.repository(ui, repo_path)
   203 
   297 
   204 if not args.has_key('cmd'):
   298 if not args.has_key('cmd') or args['cmd'][0] == 'changes':
   205     page = change_list(repo, 'Mercurial')
   299     page = change_list(repo, 'Mercurial')
   206     page.content()
   300     hi = args.get('hi', ( repo.changelog.count(), ))
       
   301     page.content(hi = int(hi[0]))
   207     page.endpage()
   302     page.endpage()
   208     
   303     
   209 elif args['cmd'][0] == 'chkin':
   304 elif args['cmd'][0] == 'chkin':
   210     if not args.has_key('nd'):
   305     if not args.has_key('nd'):
   211         page = errpage()
   306         page = errpage()
   226         else:
   321         else:
   227             page = filepage(repo, args['fn'][0], cs=args['cs'][0])
   322             page = filepage(repo, args['fn'][0], cs=args['cs'][0])
   228         page.content()
   323         page.content()
   229     page.endpage()
   324     page.endpage()
   230 
   325 
       
   326 elif args['cmd'][0] == 'mf':
       
   327     if not args.has_key('nd'):
       
   328         page = errpage()
       
   329         print '<div class="errmsg">No Node!</div>'
       
   330     else:
       
   331         page = mfpage(repo, args['nd'][0])
       
   332         page.content()
       
   333     page.endpage()
       
   334 
       
   335 elif args['cmd'][0] == 'hist':
       
   336     if not args.has_key('fn'):
       
   337         page = errpage()
       
   338         print '<div class="errmsg">No Filename!</div>'
       
   339     else:
       
   340         page = histpage(repo, args['fn'][0])
       
   341         page.content()
       
   342     page.endpage()
       
   343 
   231 elif args['cmd'][0] == 'branches':
   344 elif args['cmd'][0] == 'branches':
   232     httphdr("text/plain")
   345     httphdr("text/plain")
   233     nodes = []
   346     nodes = []
   234     if args.has_key('nodes'):
   347     if args.has_key('nodes'):
   235         nodes = map(hg.bin, args['nodes'][0].split(" "))
   348         nodes = map(hg.bin, args['nodes'][0].split(" "))