hgweb.py
author jake@edge2.net
Fri, 13 May 2005 17:48:10 -0700
changeset 100 526722d24ee5
parent 99 db5eb6a86179
child 101 6da5cf0c4193
permissions -rw-r--r--
reorganize code into classes clean up html code for w3c validation
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     1
#!/usr/bin/env python
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     2
#
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     3
# hgweb.py - 0.1 - 9 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     4
#    - web interface to a mercurial repository
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     5
#
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     6
# This software may be used and distributed according to the terms
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     7
# of the GNU General Public License, incorporated herein by reference.
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     8
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
     9
# useful for debugging
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    10
import cgitb
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    11
cgitb.enable()
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    12
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
    13
import os, cgi, time, re, difflib, sys, zlib
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    14
from mercurial import hg, mdiff
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    15
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    16
repo_path = "."  # change as needed
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    17
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    18
def nl2br(text):
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    19
    return re.sub('\n', '<br />', text)
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    20
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    21
def obfuscate(text):
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    22
    l = []
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    23
    for c in text:
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    24
        l.append('&#%d;' % ord(c))
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    25
    return ''.join(l)
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    26
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    27
def httphdr(type):
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
    28
    print 'Content-type: %s\n' % type
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    29
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    30
class page:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    31
    def __init__(self, type="text/html", title="Mercurial Web", 
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    32
            charset="ISO-8859-1"):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    33
        print 'Content-type: %s; charset=%s\n' % (type, charset)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    34
        print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    35
        print '<HTML>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    36
        print '<!-- created by hgweb 0.1 - jake@edge2.net -->'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    37
        print '<HEAD><TITLE>%s</TITLE>' % title
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    38
        print '<style type="text/css">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    39
        print 'body { font-family: sans-serif; font-size: 12px; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    40
        print 'table { font-size: 12px; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    41
        print '.errmsg { font-size: 200%; color: red; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    42
        print '.filename { font-size: 150%; color: purple; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    43
        print '.plusline { color: green; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    44
        print '.minusline { color: red; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    45
        print '.atline { color: purple; }'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    46
        print '</style>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    47
        print '</HEAD>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    48
        print '<BODY>'
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    49
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    50
    def endpage(self):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    51
        print '</BODY>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    52
        print '</HTML>'
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
    53
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    54
    def show_diff(self, a, b, fn):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    55
        a = a.splitlines(1)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    56
        b = b.splitlines(1)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    57
        l = difflib.unified_diff(a, b, fn, fn)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    58
        print '<pre>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    59
        for line in l:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    60
            line = cgi.escape(line[:-1])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    61
            if line.startswith('+'):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    62
                print '<span class="plusline">%s</span>' % (line, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    63
            elif line.startswith('-'):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    64
                print '<span class="minusline">%s</span>' % (line, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    65
            elif line.startswith('@'):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    66
                print '<span class="atline">%s</span>' % (line, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    67
            else:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    68
                print line
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    69
        print '</pre>'
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    70
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    71
class errpage(page):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    72
    def __init__(self):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    73
        page.__init__(self, title="Mercurial Web Error Page")
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    74
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    75
class change_list(page):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    76
    def __init__(self, repo, reponame):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    77
        page.__init__(self)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    78
        self.repo = repo
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    79
        print '<h3>Changes For: %s</h3>' % reponame
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
    80
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    81
    def content(self, start='tip', end='0', boundtype='rev'):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    82
        print '<table summary="" width="100%" align="center">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    83
        cl = []
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    84
        for i in xrange(self.repo.changelog.count()):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    85
            n = self.repo.changelog.node(i)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    86
            cl.append((n, self.repo.changelog.read(n)))
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    87
        cl.reverse()
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    88
        for n, ch in cl:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    89
            print '<tr><td>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    90
            self.change_table(n, ch)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    91
            print '</td></tr>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    92
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    93
        print '</table>'
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
    94
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    95
    def change_table(self, nodeid, changes):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    96
        hn = hg.hex(nodeid)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    97
        i = self.repo.changelog.rev(nodeid)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    98
        (h1, h2) = [ hg.hex(x) for x in self.repo.changelog.parents(nodeid) ]
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
    99
        datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0])))
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   100
        print '<table summary="" width="100%" border="1">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   101
        print '\t<tr><td valign="top" width="10%">author:</td>' + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   102
                '<td valign="top" width="20%%">%s</td>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   103
                (obfuscate(changes[1]), )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   104
        print '\t\t<td valign="top" width="10%">description:</td>' + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   105
                '<td width="60%">' + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   106
                '<a href="?cmd=chkin;nd=%s">%s</a></td></tr>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   107
                (hn, nl2br(cgi.escape(changes[4])), )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   108
        print '\t<tr><td>date:</td><td>%s UTC</td>' % (datestr, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   109
        print '\t\t<td valign="top">files:</td><td valign="top">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   110
        for f in changes[3]:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   111
            print '\t\t<a href="?cmd=file;cs=%s;fn=%s">%s</a>&nbsp;&nbsp;' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   112
                    (hn, f, cgi.escape(f), )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   113
        print '\t</td></tr>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   114
        print '\t<tr><td>revision:</td><td colspan="3">%d:<a ' % (i, ) + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   115
                'href="?cmd=chkin;nd=%s">%s</a></td></tr>' % (hn, hn, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   116
        print '</table><br />'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   117
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   118
class checkin(page):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   119
    def __init__(self, repo, nodestr):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   120
        page.__init__(self)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   121
        self.repo = repo
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   122
        self.node = hg.bin(nodestr)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   123
        self.nodestr = nodestr
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   124
        print '<h3>Checkin: %s</h3>' % nodestr
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   125
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   126
    def content(self):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   127
        changes = self.repo.changelog.read(self.node)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   128
        i = self.repo.changelog.rev(self.node)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   129
        parents = self.repo.changelog.parents(self.node)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   130
        (h1, h2) = [ hg.hex(x) for x in parents ]
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   131
        (i1, i2) = [ self.repo.changelog.rev(x) for x in parents ]
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   132
        datestr = time.asctime(time.gmtime(float(changes[2].split(' ')[0])))
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   133
        mf = self.repo.manifest.read(changes[0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   134
        print '<table summary="" width="100%" border="1">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   135
        print '\t<tr><td>revision:</td><td colspan="3">%d:' % (i, ),
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   136
        print '<a href="?cmd=chkin;nd=%s">%s</a></td></tr>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   137
                (self.nodestr, self.nodestr, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   138
        print '\t<tr><td>parent(s):</td><td colspan="3">%d:' % (i1, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   139
        print '<a href="?cmd=chkin;nd=%s">%s</a>' % (h1, h1, ),
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   140
        if i2 != -1:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   141
            print '&nbsp;&nbsp;%d:<a href="?cmd=chkin;nd=%s">%s</a>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   142
                    (i2, h2, h2, ),
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   143
        else:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   144
            print '&nbsp;&nbsp;%d:%s' % (i2, h2, ),
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   145
        print '</td></tr>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   146
        print '\t<tr><td>manifest:</td><td colspan="3">%d:' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   147
                (self.repo.manifest.rev(changes[0]), ),
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   148
        print '<a href="?cmd=mf;nd=%s">%s</a></td></tr>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   149
                (hg.hex(changes[0]), hg.hex(changes[0]), )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   150
        print '\t<tr><td valign="top" width="10%">author:</td>' + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   151
                '<td valign="top" width="20%%">%s</td>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   152
                (obfuscate(changes[1]), )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   153
        print '\t\t<td valign="top" width="10%">description:</td>' + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   154
                '<td width="60%">' + \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   155
                '<a href="?cmd=chkin;nd=%s">%s</a></td></tr>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   156
                (self.nodestr, nl2br(cgi.escape(changes[4])), )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   157
        print '\t<tr><td>date:</td><td>%s UTC</td>' % (datestr, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   158
        print '\t\t<td valign="top">files:</td><td valign="top">'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   159
        for f in changes[3]:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   160
            print '\t\t<a href="?cmd=file;nd=%s&fn=%s">%s</a>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   161
                    (hg.hex(mf[f]), f, cgi.escape(f), ),
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   162
            print '&nbsp;&nbsp;'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   163
        print '\t</td></tr>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   164
        print '</table><br />'
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   165
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   166
        (c, a, d) = self.repo.diffrevs(parents[0], self.node)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   167
        change = self.repo.changelog.read(parents[0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   168
        mf2 = self.repo.manifest.read(change[0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   169
        for f in c:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   170
            self.show_diff(self.repo.file(f).read(mf2[f]), \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   171
                    self.repo.file(f).read(mf[f]), f)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   172
        for f in a:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   173
            self.show_diff('', self.repo.file(f).read(mf[f]), f)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   174
        for f in d:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   175
            self.show_diff(self.repo.file(f).read(mf2[f]), '', f)
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   176
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   177
class filepage(page):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   178
    def __init__(self, repo, fn, node=None, cs=None):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   179
        page.__init__(self)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   180
        self.repo = repo
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   181
        self.fn = fn
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   182
        if cs: 
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   183
            chng = self.repo.changelog.read(hg.bin(cs))
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   184
            mf = self.repo.manifest.read(chng[0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   185
            self.node = mf[self.fn]
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   186
            self.nodestr = hg.hex(self.node)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   187
        else:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   188
            self.nodestr = node
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   189
            self.node = hg.bin(node)
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   190
        print '<div class="filename">%s (%s)</div>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   191
                (cgi.escape(self.fn), self.nodestr, )
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   192
        print '<a href="?cmd=hist;fn=%s">history</a><br />' % self.fn
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   193
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   194
    def content(self):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   195
        print '<pre>'
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   196
        print cgi.escape(self.repo.file(self.fn).read(self.node))
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   197
        print '</pre>'
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   198
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   199
args = cgi.parse()
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   200
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   201
ui = hg.ui()
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   202
repo = hg.repository(ui, repo_path)
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   203
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   204
if not args.has_key('cmd'):
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   205
    page = change_list(repo, 'Mercurial')
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   206
    page.content()
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   207
    page.endpage()
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   208
    
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   209
elif args['cmd'][0] == 'chkin':
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   210
    if not args.has_key('nd'):
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   211
        page = errpage()
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   212
        print '<div class="errmsg">No Node!</div>'
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   213
    else:
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   214
        page = checkin(repo, args['nd'][0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   215
        page.content()
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   216
    page.endpage()
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   217
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   218
elif args['cmd'][0] == 'file':
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   219
    if not (args.has_key('nd') and args.has_key('fn')) and \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   220
            not (args.has_key('cs') and args.has_key('fn')):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   221
        page = errpage()
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   222
        print '<div class="errmsg">Invalid Args!</div>'
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   223
    else:
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   224
        if args.has_key('nd'):
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   225
            page = filepage(repo, args['fn'][0], node=args['nd'][0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   226
        else:
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   227
            page = filepage(repo, args['fn'][0], cs=args['cs'][0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   228
        page.content()
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   229
    page.endpage()
61
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   230
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   231
elif args['cmd'][0] == 'branches':
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   232
    httphdr("text/plain")
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   233
    nodes = []
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   234
    if args.has_key('nodes'):
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   235
        nodes = map(hg.bin, args['nodes'][0].split(" "))
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   236
    for b in repo.branches(nodes):
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   237
        print " ".join(map(hg.hex, b))
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   238
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   239
elif args['cmd'][0] == 'between':
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   240
    httphdr("text/plain")
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   241
    nodes = []
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   242
    if args.has_key('pairs'):
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   243
        pairs = [ map(hg.bin, p.split("-"))
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   244
                  for p in args['pairs'][0].split(" ") ]
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   245
    for b in repo.between(pairs):
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   246
        print " ".join(map(hg.hex, b))
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   247
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   248
elif args['cmd'][0] == 'changegroup':
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   249
    httphdr("application/hg-changegroup")
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   250
    nodes = []
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   251
    if args.has_key('roots'):
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   252
        nodes = map(hg.bin, args['roots'][0].split(" "))
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   253
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   254
    z = zlib.compressobj()
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   255
    for chunk in repo.changegroup(nodes):
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   256
        sys.stdout.write(z.compress(chunk))
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   257
1215bf60468f Add server side of hg:// protocol to hgweb
mpm@selenic.com
parents: 57
diff changeset
   258
    sys.stdout.write(z.flush())
57
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   259
115106376f45 hgweb.py from Jake Edge
mpm@selenic.com
parents:
diff changeset
   260
else:
100
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   261
    page = errpage()
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   262
    print '<div class="errmsg">unknown command: %s</div>' % \
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   263
            cgi.escape(args['cmd'][0])
526722d24ee5 reorganize code into classes
jake@edge2.net
parents: 99
diff changeset
   264
    page.endpage()