mercurial/hgweb/__init__.py
author Alexis S. L. Carvalho <alexis@cecm.usp.br>
Sat, 20 May 2006 15:34:19 -0300
changeset 2328 f789602ba840
parent 2311 b832b6eb65ab
child 2355 eb08fb4d41e1
permissions -rw-r--r--
hgweb.manifest: revno of manifest and changelog aren't always the same In the v4l-dvb repo, the manifest revno and the changelog revno are not in sync. This happened because the same patch was applied to the same revision in two different branches, resulting in the same manifest text, with the same parents and so the first revision was reused. Since hgweb.manifest was assuming the revnos of the manifest and of the changelog were always the same, clicking on manifest -> bz2 in the v4l-dvb site would download the wrong revision. Use the linkrev to go from manifest revision to changelog revision. This still won't be perfect since the page will still talk about "manifest for changeset XYZ", where XYZ was the first changeset to have this manifest, which is not necessarily the same changeset that the user clicked to get to this page - but at least the contents will be the same.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
238
3b92f8fe47ae hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents: 222
diff changeset
     1
# hgweb.py - web interface to a mercurial repository
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     2
#
238
3b92f8fe47ae hgweb.py: kill #! line, clean up copyright notice
mpm@selenic.com
parents: 222
diff changeset
     3
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 572
diff changeset
     4
# Copyright 2005 Matt Mackall <mpm@selenic.com>
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     5
#
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     6
# This software may be used and distributed according to the terms
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     7
# of the GNU General Public License, incorporated herein by reference.
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     8
1896
f8f818a04f5b move hgweb template code out to templater
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1796
diff changeset
     9
import os, cgi, sys
1777
a2316878f19d [hgweb] Static content serving
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1703
diff changeset
    10
import mimetypes
2311
b832b6eb65ab Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents: 2275
diff changeset
    11
from mercurial.demandload import demandload
b832b6eb65ab Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents: 2275
diff changeset
    12
demandload(globals(), "time re socket zlib errno ConfigParser tempfile")
b832b6eb65ab Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents: 2275
diff changeset
    13
demandload(globals(), "StringIO BaseHTTPServer SocketServer urllib")
b832b6eb65ab Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents: 2275
diff changeset
    14
demandload(globals(), "mercurial:mdiff,ui,hg,util,archival,templater")
b832b6eb65ab Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents: 2275
diff changeset
    15
from mercurial.node import *
b832b6eb65ab Moving hgweb.py into it's own module in preparation for breaking it up.
Eric Hopper <hopper@omnifarious.org>
parents: 2275
diff changeset
    16
from mercurial.i18n import gettext as _
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    17
2123
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    18
def splitURI(uri):
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    19
    """ Return path and query splited from uri
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    20
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    21
    Just like CGI environment, the path is unquoted, the query is
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    22
    not.
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    23
    """
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    24
    if '?' in uri:
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    25
        path, query = uri.split('?', 1)
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    26
    else:
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    27
        path, query = uri, ''
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    28
    return urllib.unquote(path), query
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
    29
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    30
def up(p):
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
    31
    if p[0] != "/":
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
    32
        p = "/" + p
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
    33
    if p[-1] == "/":
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
    34
        p = p[:-1]
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    35
    up = os.path.dirname(p)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    36
    if up == "/":
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    37
        return "/"
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    38
    return up + "/"
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
    39
1418
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    40
def get_mtime(repo_path):
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    41
    hg_path = os.path.join(repo_path, ".hg")
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    42
    cl_path = os.path.join(hg_path, "00changelog.i")
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    43
    if os.path.exists(os.path.join(cl_path)):
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    44
        return os.stat(cl_path).st_mtime
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    45
    else:
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    46
        return os.stat(hg_path).st_mtime
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
    47
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
    48
def staticfile(directory, fname):
1825
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    49
    """return a file inside directory with guessed content-type header
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    50
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    51
    fname always uses '/' as directory separator and isn't allowed to
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    52
    contain unusual path components.
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    53
    Content-type is guessed using the mimetypes module.
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    54
    Return an empty string if fname is illegal or file not found.
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
    55
1825
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    56
    """
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    57
    parts = fname.split('/')
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    58
    path = directory
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    59
    for part in parts:
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    60
        if (part in ('', os.curdir, os.pardir) or
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    61
            os.sep in part or os.altsep is not None and os.altsep in part):
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    62
            return ""
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    63
        path = os.path.join(path, part)
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
    64
    try:
1825
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    65
        os.stat(path)
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    66
        ct = mimetypes.guess_type(path)[0] or "text/plain"
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    67
        return "Content-type: %s\n\n%s" % (ct, file(path).read())
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    68
    except (TypeError, OSError):
a9343f9d7365 Make hgweb.staticfile() more secure and portable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1796
diff changeset
    69
        # illegal fname or unreadable file
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
    70
        return ""
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
    71
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1554
diff changeset
    72
class hgrequest(object):
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    73
    def __init__(self, inp=None, out=None, env=None):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    74
        self.inp = inp or sys.stdin
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    75
        self.out = out or sys.stdout
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    76
        self.env = env or os.environ
1407
db571bcaa35d allow empty values for url so we can have /?tip
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1406
diff changeset
    77
        self.form = cgi.parse(self.inp, self.env, keep_blank_values=1)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
    78
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    79
    def write(self, *things):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    80
        for thing in things:
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    81
            if hasattr(thing, "__iter__"):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    82
                for part in thing:
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    83
                    self.write(part)
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    84
            else:
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    85
                try:
1160
0da98529a476 Fix TypeError
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1159
diff changeset
    86
                    self.out.write(str(thing))
1174
9d9f4973c76a Added missing 'import errno', and use errno for EPIPE, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1172
diff changeset
    87
                except socket.error, inst:
9d9f4973c76a Added missing 'import errno', and use errno for EPIPE, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1172
diff changeset
    88
                    if inst[0] != errno.ECONNRESET:
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    89
                        raise
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    90
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    91
    def header(self, headers=[('Content-type','text/html')]):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    92
        for header in headers:
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    93
            self.out.write("%s: %s\r\n" % header)
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    94
        self.out.write("\r\n")
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    95
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    96
    def httphdr(self, type, file="", size=0):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    97
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    98
        headers = [('Content-type', type)]
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
    99
        if file:
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   100
            headers.append(('Content-disposition', 'attachment; filename=%s' % file))
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   101
        if size > 0:
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   102
            headers.append(('Content-length', str(size)))
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   103
        self.header(headers)
135
c0faf50822ea change template to a generator
jake@edge2.net
parents: 134
diff changeset
   104
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1554
diff changeset
   105
class hgweb(object):
987
bfe12654764d hgweb: change startup argument processing
mpm@selenic.com
parents: 986
diff changeset
   106
    def __init__(self, repo, name=None):
bfe12654764d hgweb: change startup argument processing
mpm@selenic.com
parents: 986
diff changeset
   107
        if type(repo) == type(""):
1213
db9639b8594c Clean up hgweb imports
mpm@selenic.com
parents: 1210
diff changeset
   108
            self.repo = hg.repository(ui.ui(), repo)
987
bfe12654764d hgweb: change startup argument processing
mpm@selenic.com
parents: 986
diff changeset
   109
        else:
bfe12654764d hgweb: change startup argument processing
mpm@selenic.com
parents: 986
diff changeset
   110
            self.repo = repo
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
   111
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
   112
        self.mtime = -1
1172
3f30a5e7e15b Use path relative to document root as reponame if published via a web server.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1170
diff changeset
   113
        self.reponame = name
1078
33f40d0c6124 Various cleanups for tarball support
mpm@selenic.com
parents: 1077
diff changeset
   114
        self.archives = 'zip', 'gz', 'bz2'
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   115
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
   116
    def refresh(self):
1418
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
   117
        mtime = get_mtime(self.repo.root)
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
   118
        if mtime != self.mtime:
68f81ba07b2a Make hgweb work when the repository is empty (no 00changelog.i)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1416
diff changeset
   119
            self.mtime = mtime
1213
db9639b8594c Clean up hgweb imports
mpm@selenic.com
parents: 1210
diff changeset
   120
            self.repo = hg.repository(self.repo.ui, self.repo.root)
1275
a1a84dd489ff Fix cut and paste error in hgweb.py
Florian La Roche <laroche@redhat.com>
parents: 1260
diff changeset
   121
            self.maxchanges = int(self.repo.ui.config("web", "maxchanges", 10))
a1a84dd489ff Fix cut and paste error in hgweb.py
Florian La Roche <laroche@redhat.com>
parents: 1260
diff changeset
   122
            self.maxfiles = int(self.repo.ui.config("web", "maxfiles", 10))
964
3f37720e7dc7 hgweb: Make maxfiles, maxchanges, and allowpull proper config options
mpm@selenic.com
parents: 957
diff changeset
   123
            self.allowpull = self.repo.ui.configbool("web", "allowpull", True)
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
   124
1498
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   125
    def archivelist(self, nodeid):
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   126
        for i in self.archives:
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   127
            if self.repo.ui.configbool("web", "allow" + i, False):
2171
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
   128
                yield {"type" : i, "node" : nodeid, "url": ""}
1498
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   129
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   130
    def listfiles(self, files, mf):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   131
        for f in files[:self.maxfiles]:
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   132
            yield self.t("filenodelink", node=hex(mf[f]), file=f)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   133
        if len(files) > self.maxfiles:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   134
            yield self.t("fileellipses")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   135
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   136
    def listfilediffs(self, files, changeset):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   137
        for f in files[:self.maxfiles]:
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   138
            yield self.t("filedifflink", node=hex(changeset), file=f)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   139
        if len(files) > self.maxfiles:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   140
            yield self.t("fileellipses")
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   141
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   142
    def siblings(self, siblings=[], rev=None, hiderev=None, **args):
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   143
        if not rev:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   144
            rev = lambda x: ""
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   145
        siblings = [s for s in siblings if s != nullid]
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   146
        if len(siblings) == 1 and rev(siblings[0]) == hiderev:
1416
19d2776f1725 hgweb: hide trivial parent (like in show_changeset)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1411
diff changeset
   147
            return
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   148
        for s in siblings:
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   149
            yield dict(node=hex(s), rev=rev(s), **args)
569
3e347929f5f9 [PATCH 1/5]: cleaning the template parent management in hgweb
mpm@selenic.com
parents: 568
diff changeset
   150
1653
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   151
    def renamelink(self, fl, node):
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   152
        r = fl.renamed(node)
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   153
        if r:
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   154
            return [dict(file=r[0], node=hex(r[1]))]
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   155
        return []
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   156
568
e8fd41110dce [PATCH] Add tags to hgweb
mpm@selenic.com
parents: 547
diff changeset
   157
    def showtag(self, t1, node=nullid, **args):
e8fd41110dce [PATCH] Add tags to hgweb
mpm@selenic.com
parents: 547
diff changeset
   158
        for t in self.repo.nodetags(node):
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   159
             yield self.t(t1, tag=t, **args)
568
e8fd41110dce [PATCH] Add tags to hgweb
mpm@selenic.com
parents: 547
diff changeset
   160
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   161
    def diff(self, node1, node2, files):
1626
f2b1df3dbcbb make the order of the arguments for filterfiles consistent
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1619
diff changeset
   162
        def filterfiles(filters, files):
1627
11cd38286fdb fix for hgweb.filterfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1626
diff changeset
   163
            l = [x for x in files if x in filters]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   164
1626
f2b1df3dbcbb make the order of the arguments for filterfiles consistent
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1619
diff changeset
   165
            for t in filters:
1627
11cd38286fdb fix for hgweb.filterfiles
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1626
diff changeset
   166
                if t and t[-1] != os.sep:
1626
f2b1df3dbcbb make the order of the arguments for filterfiles consistent
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1619
diff changeset
   167
                    t += os.sep
f2b1df3dbcbb make the order of the arguments for filterfiles consistent
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1619
diff changeset
   168
                l += [x for x in files if x.startswith(t)]
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   169
            return l
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   170
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
   171
        parity = [0]
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
   172
        def diffblock(diff, f, fn):
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
   173
            yield self.t("diffblock",
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   174
                         lines=prettyprintlines(diff),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   175
                         parity=parity[0],
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   176
                         file=f,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   177
                         filenode=hex(fn or nullid))
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
   178
            parity[0] = 1 - parity[0]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   179
172
e9b1147db448 hgweb: alternating colors for multifile diffs
mpm@selenic.com
parents: 168
diff changeset
   180
        def prettyprintlines(diff):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   181
            for l in diff.splitlines(1):
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
   182
                if l.startswith('+'):
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   183
                    yield self.t("difflineplus", line=l)
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
   184
                elif l.startswith('-'):
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   185
                    yield self.t("difflineminus", line=l)
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
   186
                elif l.startswith('@'):
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   187
                    yield self.t("difflineat", line=l)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   188
                else:
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   189
                    yield self.t("diffline", line=l)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   190
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   191
        r = self.repo
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   192
        cl = r.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   193
        mf = r.manifest
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   194
        change1 = cl.read(node1)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   195
        change2 = cl.read(node2)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   196
        mmap1 = mf.read(change1[0])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   197
        mmap2 = mf.read(change2[0])
1333
901c645c1943 hgweb: fix date bug in hgweb diff generation
mpm@selenic.com
parents: 1324
diff changeset
   198
        date1 = util.datestr(change1[2])
901c645c1943 hgweb: fix date bug in hgweb diff generation
mpm@selenic.com
parents: 1324
diff changeset
   199
        date2 = util.datestr(change2[2])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   200
1619
1ba0d7041ac4 Distinguish removed and deleted files. Tests are not fixed yet.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1618
diff changeset
   201
        modified, added, removed, deleted, unknown = r.changes(node1, node2)
645
a55048b2ae3a this patch permits hgweb to show the deleted files in the changeset diff
kreijack@inwind.REMOVEME.it
parents: 635
diff changeset
   202
        if files:
1626
f2b1df3dbcbb make the order of the arguments for filterfiles consistent
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1619
diff changeset
   203
            modified, added, removed = map(lambda x: filterfiles(files, x),
1618
ff339dd21976 Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1606
diff changeset
   204
                                           (modified, added, removed))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   205
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   206
        diffopts = self.repo.ui.diffopts()
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   207
        showfunc = diffopts['showfunc']
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   208
        ignorews = diffopts['ignorews']
1618
ff339dd21976 Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1606
diff changeset
   209
        for f in modified:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   210
            to = r.file(f).read(mmap1[f])
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   211
            tn = r.file(f).read(mmap2[f])
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   212
            yield diffblock(mdiff.unidiff(to, date1, tn, date2, f,
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   213
                            showfunc=showfunc, ignorews=ignorews), f, tn)
1618
ff339dd21976 Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1606
diff changeset
   214
        for f in added:
265
7ca05593bd30 hgweb: fix non-existent source or destination for diff
mpm@selenic.com
parents: 258
diff changeset
   215
            to = None
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   216
            tn = r.file(f).read(mmap2[f])
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   217
            yield diffblock(mdiff.unidiff(to, date1, tn, date2, f,
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   218
                            showfunc=showfunc, ignorews=ignorews), f, tn)
1618
ff339dd21976 Renamed c, a, d, u to modified, added, removed, unknown for users of changes()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1606
diff changeset
   219
        for f in removed:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   220
            to = r.file(f).read(mmap1[f])
265
7ca05593bd30 hgweb: fix non-existent source or destination for diff
mpm@selenic.com
parents: 258
diff changeset
   221
            tn = None
1637
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   222
            yield diffblock(mdiff.unidiff(to, date1, tn, date2, f,
3b1b44b917f4 Add new bdiff based unidiff generation.
mason@suse.com
parents: 1627
diff changeset
   223
                            showfunc=showfunc, ignorews=ignorews), f, tn)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   224
180
f25944662097 hgweb: Fix navigate to 0 bug
mpm@selenic.com
parents: 173
diff changeset
   225
    def changelog(self, pos):
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   226
        def changenav(**map):
1703
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   227
            def seq(factor, maxchanges=None):
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   228
                if maxchanges:
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   229
                    yield maxchanges
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   230
                    if maxchanges >= 20 and maxchanges <= 40:
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   231
                        yield 50
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   232
                else:
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   233
                    yield 1 * factor
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   234
                    yield 3 * factor
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   235
                for f in seq(factor * 10):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   236
                    yield f
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   237
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
   238
            l = []
1703
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   239
            last = 0
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   240
            for f in seq(1, self.maxchanges):
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   241
                if f < self.maxchanges or f <= last:
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   242
                    continue
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   243
                if f > count:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   244
                    break
1703
41d884f741ca fix changenav for maxchanges != 10
Johannes Stezenbach <js@linuxtv.org>
parents: 1653
diff changeset
   245
                last = f
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
   246
                r = "%d" % f
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   247
                if pos + f < count:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   248
                    l.append(("+" + r, pos + f))
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   249
                if pos - f >= 0:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   250
                    l.insert(0, ("-" + r, pos - f))
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
   251
975
bdd7c53fca00 hgweb: Changed changelog page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 974
diff changeset
   252
            yield {"rev": 0, "label": "(0)"}
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   253
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
   254
            for label, rev in l:
975
bdd7c53fca00 hgweb: Changed changelog page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 974
diff changeset
   255
                yield {"label": label, "rev": rev}
173
8da1df932c16 hgweb: make navigation of changesets a bit nicer
mpm@selenic.com
parents: 172
diff changeset
   256
1409
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   257
            yield {"label": "tip", "rev": "tip"}
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   258
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   259
        def changelist(**map):
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   260
            parity = (start - end) & 1
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   261
            cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   262
            l = [] # build a list in forward order for efficiency
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
   263
            for i in range(start, end):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   264
                n = cl.node(i)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   265
                changes = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   266
                hn = hex(n)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   267
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   268
                l.insert(0, {"parity": parity,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   269
                             "author": changes[1],
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   270
                             "parent": self.siblings(cl.parents(n), cl.rev,
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   271
                                                     cl.rev(n) - 1),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   272
                             "child": self.siblings(cl.children(n), cl.rev,
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   273
                                                    cl.rev(n) + 1),
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   274
                             "changelogtag": self.showtag("changelogtag",n),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   275
                             "manifest": hex(changes[0]),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   276
                             "desc": changes[4],
1324
77cd8068dbf4 hgweb: pass date tuples around rather than whole changesets for dates
mpm@selenic.com
parents: 1321
diff changeset
   277
                             "date": changes[2],
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   278
                             "files": self.listfilediffs(changes[3], n),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   279
                             "rev": i,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   280
                             "node": hn})
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   281
                parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   282
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   283
            for e in l:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   284
                yield e
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   285
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   286
        cl = self.repo.changelog
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   287
        mf = cl.read(cl.tip())[0]
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   288
        count = cl.count()
351
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
   289
        start = max(0, pos - self.maxchanges + 1)
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
   290
        end = min(count, start + self.maxchanges)
9525208e1c1d hgweb: change number navigation tidy up
mpm@selenic.com
parents: 350
diff changeset
   291
        pos = end - 1
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   292
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   293
        yield self.t('changelog',
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   294
                     changenav=changenav,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   295
                     manifest=hex(mf),
2170
29eeb2717915 Add archive download links to tip on main changeset list page
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2148
diff changeset
   296
                     rev=pos, changesets=count, entries=changelist,
29eeb2717915 Add archive download links to tip on main changeset list page
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2148
diff changeset
   297
                     archives=self.archivelist("tip"))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   298
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   299
    def search(self, query):
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   300
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   301
        def changelist(**map):
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   302
            cl = self.repo.changelog
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   303
            count = 0
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   304
            qw = query.lower().split()
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   305
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   306
            def revgen():
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   307
                for i in range(cl.count() - 1, 0, -100):
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   308
                    l = []
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   309
                    for j in range(max(0, i - 100), i):
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   310
                        n = cl.node(j)
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   311
                        changes = cl.read(n)
1023
bc806ba72959 Minor tweak to the revgen algorithm
mpm@selenic.com
parents: 1022
diff changeset
   312
                        l.append((n, j, changes))
bc806ba72959 Minor tweak to the revgen algorithm
mpm@selenic.com
parents: 1022
diff changeset
   313
                    l.reverse()
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   314
                    for e in l:
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   315
                        yield e
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   316
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   317
            for n, i, changes in revgen():
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   318
                miss = 0
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   319
                for q in qw:
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   320
                    if not (q in changes[1].lower() or
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   321
                            q in changes[4].lower() or
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   322
                            q in " ".join(changes[3][:20]).lower()):
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   323
                        miss = 1
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   324
                        break
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   325
                if miss:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   326
                    continue
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   327
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   328
                count += 1
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   329
                hn = hex(n)
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   330
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   331
                yield self.t('searchentry',
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   332
                             parity=count & 1,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   333
                             author=changes[1],
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   334
                             parent=self.siblings(cl.parents(n), cl.rev),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   335
                             child=self.siblings(cl.children(n), cl.rev),
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   336
                             changelogtag=self.showtag("changelogtag",n),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   337
                             manifest=hex(changes[0]),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   338
                             desc=changes[4],
1324
77cd8068dbf4 hgweb: pass date tuples around rather than whole changesets for dates
mpm@selenic.com
parents: 1321
diff changeset
   339
                             date=changes[2],
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   340
                             files=self.listfilediffs(changes[3], n),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   341
                             rev=i,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   342
                             node=hn)
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   343
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   344
                if count >= self.maxchanges:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   345
                    break
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   346
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   347
        cl = self.repo.changelog
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   348
        mf = cl.read(cl.tip())[0]
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   349
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   350
        yield self.t('search',
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   351
                     query=query,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   352
                     manifest=hex(mf),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   353
                     entries=changelist)
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   354
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   355
    def changeset(self, nodeid):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   356
        cl = self.repo.changelog
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   357
        n = self.repo.lookup(nodeid)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   358
        nodeid = hex(n)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   359
        changes = cl.read(n)
598
f8d44a2e6928 [PATCH 4/5]: cleaning the template parent management in hgweb
mpm@selenic.com
parents: 582
diff changeset
   360
        p1 = cl.parents(n)[0]
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   361
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
   362
        files = []
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   363
        mf = self.repo.manifest.read(changes[0])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   364
        for f in changes[3]:
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   365
            files.append(self.t("filenodelink",
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   366
                                filenode=hex(mf.get(f, nullid)), file=f))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   367
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   368
        def diff(**map):
645
a55048b2ae3a this patch permits hgweb to show the deleted files in the changeset diff
kreijack@inwind.REMOVEME.it
parents: 635
diff changeset
   369
            yield self.diff(p1, n, None)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   370
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   371
        yield self.t('changeset',
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   372
                     diff=diff,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   373
                     rev=cl.rev(n),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   374
                     node=nodeid,
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   375
                     parent=self.siblings(cl.parents(n), cl.rev),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   376
                     child=self.siblings(cl.children(n), cl.rev),
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   377
                     changesettag=self.showtag("changesettag",n),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   378
                     manifest=hex(changes[0]),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   379
                     author=changes[1],
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   380
                     desc=changes[4],
1324
77cd8068dbf4 hgweb: pass date tuples around rather than whole changesets for dates
mpm@selenic.com
parents: 1321
diff changeset
   381
                     date=changes[2],
1076
01db658cc78a tarball support v0.3
Wojciech Milkowski <wmilkowski@interia.pl>
parents: 1073
diff changeset
   382
                     files=files,
1498
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   383
                     archives=self.archivelist(nodeid))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   384
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   385
    def filelog(self, f, filenode):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   386
        cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   387
        fl = self.repo.file(f)
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   388
        filenode = hex(fl.lookup(filenode))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   389
        count = fl.count()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   390
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   391
        def entries(**map):
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   392
            l = []
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   393
            parity = (count - 1) & 1
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   394
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   395
            for i in range(count):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   396
                n = fl.node(i)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   397
                lr = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   398
                cn = cl.node(lr)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   399
                cs = cl.read(cl.node(lr))
133
fb84d3e71042 added template support for some hgweb output, also, template files for
jake@edge2.net
parents: 132
diff changeset
   400
978
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   401
                l.insert(0, {"parity": parity,
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   402
                             "filenode": hex(n),
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   403
                             "filerev": i,
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   404
                             "file": f,
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   405
                             "node": hex(cn),
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   406
                             "author": cs[1],
1324
77cd8068dbf4 hgweb: pass date tuples around rather than whole changesets for dates
mpm@selenic.com
parents: 1321
diff changeset
   407
                             "date": cs[2],
1653
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   408
                             "rename": self.renamelink(fl, n),
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   409
                             "parent": self.siblings(fl.parents(n),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   410
                                                     fl.rev, file=f),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   411
                             "child": self.siblings(fl.children(n),
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   412
                                                    fl.rev, file=f),
978
ea67e5b37043 hgweb: Changed file revision page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 977
diff changeset
   413
                             "desc": cs[4]})
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   414
                parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   415
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   416
            for e in l:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   417
                yield e
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   418
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   419
        yield self.t("filelog", file=f, filenode=filenode, entries=entries)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   420
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   421
    def filerevision(self, f, node):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   422
        fl = self.repo.file(f)
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   423
        n = fl.lookup(node)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   424
        node = hex(n)
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
   425
        text = fl.read(n)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   426
        changerev = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   427
        cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   428
        cn = cl.node(changerev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   429
        cs = cl.read(cn)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   430
        mfn = cs[0]
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   431
1411
e2ba788545bf hgweb: make viewing of non-text work in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1409
diff changeset
   432
        mt = mimetypes.guess_type(f)[0]
e2ba788545bf hgweb: make viewing of non-text work in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1409
diff changeset
   433
        rawtext = text
e2ba788545bf hgweb: make viewing of non-text work in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1409
diff changeset
   434
        if util.binary(text):
2103
caccf539c9a4 Use application/octet-stream as the content-type of unknown binary files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2095
diff changeset
   435
            mt = mt or 'application/octet-stream'
caccf539c9a4 Use application/octet-stream as the content-type of unknown binary files
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2095
diff changeset
   436
            text = "(binary:%s)" % mt
2095
0bf2a9e5eff1 Don't send "Content-Type: none"
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 1964
diff changeset
   437
        mt = mt or 'text/plain'
1411
e2ba788545bf hgweb: make viewing of non-text work in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1409
diff changeset
   438
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   439
        def lines():
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   440
            for l, t in enumerate(text.splitlines(1)):
976
5d5ab159d197 hgweb: Changed file page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 975
diff changeset
   441
                yield {"line": t,
5d5ab159d197 hgweb: Changed file page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 975
diff changeset
   442
                       "linenumber": "% 6d" % (l + 1),
5d5ab159d197 hgweb: Changed file page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 975
diff changeset
   443
                       "parity": l & 1}
359
0c4688e9ee5c hgweb: add file permissions
mpm@selenic.com
parents: 351
diff changeset
   444
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   445
        yield self.t("filerevision",
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   446
                     file=f,
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   447
                     filenode=node,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   448
                     path=up(f),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   449
                     text=lines(),
1411
e2ba788545bf hgweb: make viewing of non-text work in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1409
diff changeset
   450
                     raw=rawtext,
e2ba788545bf hgweb: make viewing of non-text work in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1409
diff changeset
   451
                     mimetype=mt,
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   452
                     rev=changerev,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   453
                     node=hex(cn),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   454
                     manifest=hex(mfn),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   455
                     author=cs[1],
1324
77cd8068dbf4 hgweb: pass date tuples around rather than whole changesets for dates
mpm@selenic.com
parents: 1321
diff changeset
   456
                     date=cs[2],
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   457
                     parent=self.siblings(fl.parents(n), fl.rev, file=f),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   458
                     child=self.siblings(fl.children(n), fl.rev, file=f),
1653
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   459
                     rename=self.renamelink(fl, n),
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   460
                     permissions=self.repo.manifest.readflags(mfn)[f])
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   461
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   462
    def fileannotate(self, f, node):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   463
        bcache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   464
        ncache = {}
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   465
        fl = self.repo.file(f)
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   466
        n = fl.lookup(node)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   467
        node = hex(n)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   468
        changerev = fl.linkrev(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   469
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   470
        cl = self.repo.changelog
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   471
        cn = cl.node(changerev)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   472
        cs = cl.read(cn)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   473
        mfn = cs[0]
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   474
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   475
        def annotate(**map):
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   476
            parity = 1
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   477
            last = None
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   478
            for r, l in fl.annotate(n):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   479
                try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   480
                    cnode = ncache[r]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   481
                except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   482
                    cnode = ncache[r] = self.repo.changelog.node(r)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   483
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   484
                try:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   485
                    name = bcache[r]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   486
                except KeyError:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   487
                    cl = self.repo.changelog.read(cnode)
1129
ee4f60abad93 Move generating short username to display in hg/hgweb annotate to ui module.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1123
diff changeset
   488
                    bcache[r] = name = self.repo.ui.shortuser(cl[1])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   489
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   490
                if last != cnode:
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   491
                    parity = 1 - parity
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   492
                    last = cnode
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   493
977
289975641886 hgweb: Changed annotate page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 976
diff changeset
   494
                yield {"parity": parity,
289975641886 hgweb: Changed annotate page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 976
diff changeset
   495
                       "node": hex(cnode),
289975641886 hgweb: Changed annotate page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 976
diff changeset
   496
                       "rev": r,
289975641886 hgweb: Changed annotate page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 976
diff changeset
   497
                       "author": name,
289975641886 hgweb: Changed annotate page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 976
diff changeset
   498
                       "file": f,
289975641886 hgweb: Changed annotate page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 976
diff changeset
   499
                       "line": l}
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   500
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   501
        yield self.t("fileannotate",
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   502
                     file=f,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   503
                     filenode=node,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   504
                     annotate=annotate,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   505
                     path=up(f),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   506
                     rev=changerev,
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   507
                     node=hex(cn),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   508
                     manifest=hex(mfn),
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   509
                     author=cs[1],
1324
77cd8068dbf4 hgweb: pass date tuples around rather than whole changesets for dates
mpm@selenic.com
parents: 1321
diff changeset
   510
                     date=cs[2],
1653
e8a3df8b62b3 hgweb: show copy/rename links in file history
Matt Mackall <mpm@selenic.com>
parents: 1650
diff changeset
   511
                     rename=self.renamelink(fl, n),
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   512
                     parent=self.siblings(fl.parents(n), fl.rev, file=f),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   513
                     child=self.siblings(fl.children(n), fl.rev, file=f),
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   514
                     permissions=self.repo.manifest.readflags(mfn)[f])
136
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
   515
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   516
    def manifest(self, mnode, path):
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   517
        man = self.repo.manifest
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   518
        mn = man.lookup(mnode)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   519
        mnode = hex(mn)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   520
        mf = man.read(mn)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   521
        rev = man.rev(mn)
2328
f789602ba840 hgweb.manifest: revno of manifest and changelog aren't always the same
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2311
diff changeset
   522
        changerev = man.linkrev(mn)
f789602ba840 hgweb.manifest: revno of manifest and changelog aren't always the same
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2311
diff changeset
   523
        node = self.repo.changelog.node(changerev)
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   524
        mff = man.readflags(mn)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   525
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   526
        files = {}
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   527
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   528
        p = path[1:]
1649
beb7da710c8a hgweb: fix breakage on manifest subdirs from path cleaning
Matt Mackall <mpm@selenic.com>
parents: 1646
diff changeset
   529
        if p and p[-1] != "/":
beb7da710c8a hgweb: fix breakage on manifest subdirs from path cleaning
Matt Mackall <mpm@selenic.com>
parents: 1646
diff changeset
   530
            p += "/"
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   531
        l = len(p)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   532
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   533
        for f,n in mf.items():
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   534
            if f[:l] != p:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   535
                continue
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   536
            remain = f[l:]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   537
            if "/" in remain:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   538
                short = remain[:remain.find("/") + 1] # bleah
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   539
                files[short] = (f, None)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   540
            else:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   541
                short = os.path.basename(remain)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   542
                files[short] = (f, n)
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   543
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   544
        def filelist(**map):
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   545
            parity = 0
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   546
            fl = files.keys()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   547
            fl.sort()
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   548
            for f in fl:
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   549
                full, fnode = files[f]
979
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   550
                if not fnode:
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   551
                    continue
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   552
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   553
                yield {"file": full,
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   554
                       "manifest": mnode,
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   555
                       "filenode": hex(fnode),
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   556
                       "parity": parity,
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   557
                       "basename": f,
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   558
                       "permissions": mff[full]}
142
529bf610092e Prettify the web interface
mpm@selenic.com
parents: 138
diff changeset
   559
                parity = 1 - parity
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   560
979
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   561
        def dirlist(**map):
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   562
            parity = 0
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   563
            fl = files.keys()
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   564
            fl.sort()
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   565
            for f in fl:
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   566
                full, fnode = files[f]
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   567
                if fnode:
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   568
                    continue
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   569
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   570
                yield {"parity": parity,
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   571
                       "path": os.path.join(path, f),
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   572
                       "manifest": mnode,
980
5197fb9d65d5 Merge with MPM
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 979 939
diff changeset
   573
                       "basename": f[:-1]}
979
87d40e085e08 hgweb: Changed manifest page to list format syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 978
diff changeset
   574
                parity = 1 - parity
982
8d2e24bae760 hgweb: convert index entries to list expansion style
mpm@selenic.com
parents: 981
diff changeset
   575
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   576
        yield self.t("manifest",
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   577
                     manifest=mnode,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   578
                     rev=rev,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   579
                     node=hex(node),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   580
                     path=path,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   581
                     up=up(path),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   582
                     fentries=filelist,
1498
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   583
                     dentries=dirlist,
78590fb4a82b hgweb: Added archive download buttons to manifest page.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1473
diff changeset
   584
                     archives=self.archivelist(hex(node)))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   585
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   586
    def tags(self):
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   587
        cl = self.repo.changelog
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   588
        mf = cl.read(cl.tip())[0]
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   589
343
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 330
diff changeset
   590
        i = self.repo.tagslist()
d7df759d0e97 rework all code using tags
mpm@selenic.com
parents: 330
diff changeset
   591
        i.reverse()
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   592
1767
adbc392dfd9e implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
Peter van Dijk <peter@dataloss.nl>
parents: 1653
diff changeset
   593
        def entries(notip=False, **map):
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   594
            parity = 0
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   595
            for k,n in i:
1767
adbc392dfd9e implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
Peter van Dijk <peter@dataloss.nl>
parents: 1653
diff changeset
   596
                if notip and k == "tip": continue
974
aedb47764f29 Added support for #foo%bar# syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 938
diff changeset
   597
                yield {"parity": parity,
aedb47764f29 Added support for #foo%bar# syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 938
diff changeset
   598
                       "tag": k,
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   599
                       "tagmanifest": hex(cl.read(n)[0]),
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   600
                       "date": cl.read(n)[2],
974
aedb47764f29 Added support for #foo%bar# syntax
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 938
diff changeset
   601
                       "node": hex(n)}
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   602
                parity = 1 - parity
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   603
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   604
        yield self.t("tags",
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   605
                     manifest=hex(mf),
1767
adbc392dfd9e implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
Peter van Dijk <peter@dataloss.nl>
parents: 1653
diff changeset
   606
                     entries=lambda **x: entries(False, **x),
adbc392dfd9e implement entriesnotip for tags in hgweb.py ; change entries to entriesnotip in templates/tags-rss.tmpl
Peter van Dijk <peter@dataloss.nl>
parents: 1653
diff changeset
   607
                     entriesnotip=lambda **x: entries(True, **x))
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   608
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   609
    def summary(self):
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   610
        cl = self.repo.changelog
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   611
        mf = cl.read(cl.tip())[0]
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   612
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   613
        i = self.repo.tagslist()
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   614
        i.reverse()
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   615
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   616
        def tagentries(**map):
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   617
            parity = 0
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   618
            count = 0
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   619
            for k,n in i:
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   620
                if k == "tip": # skip tip
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   621
                    continue;
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   622
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   623
                count += 1
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   624
                if count > 10: # limit to 10 tags
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   625
                    break;
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   626
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   627
                c = cl.read(n)
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   628
                m = c[0]
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   629
                t = c[2]
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   630
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   631
                yield self.t("tagentry",
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   632
                             parity = parity,
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   633
                             tag = k,
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   634
                             node = hex(n),
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   635
                             date = t,
1575
0a1cca912fda [hgweb] gitweb style: File annotate converted, file revision made more like the deafault style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1574
diff changeset
   636
                             tagmanifest = hex(m))
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   637
                parity = 1 - parity
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   638
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   639
        def changelist(**map):
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   640
            parity = 0
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   641
            cl = self.repo.changelog
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   642
            l = [] # build a list in forward order for efficiency
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   643
            for i in range(start, end):
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   644
                n = cl.node(i)
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   645
                changes = cl.read(n)
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   646
                hn = hex(n)
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   647
                t = changes[2]
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   648
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   649
                l.insert(0, self.t(
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   650
                    'shortlogentry',
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   651
                    parity = parity,
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   652
                    author = changes[1],
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   653
                    manifest = hex(changes[0]),
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   654
                    desc = changes[4],
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   655
                    date = t,
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   656
                    rev = i,
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   657
                    node = hn))
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   658
                parity = 1 - parity
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   659
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   660
            yield l
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   661
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   662
        cl = self.repo.changelog
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   663
        mf = cl.read(cl.tip())[0]
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   664
        count = cl.count()
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   665
        start = max(0, count - self.maxchanges)
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   666
        end = min(count, start + self.maxchanges)
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   667
        pos = end - 1
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   668
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   669
        yield self.t("summary",
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   670
                 desc = self.repo.ui.config("web", "description", "unknown"),
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   671
                 owner = (self.repo.ui.config("ui", "username") or # preferred
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   672
                          self.repo.ui.config("web", "contact") or # deprecated
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   673
                          self.repo.ui.config("web", "author", "unknown")), # also
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   674
                 lastchange = (0, 0), # FIXME
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   675
                 manifest = hex(mf),
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   676
                 tags = tagentries,
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   677
                 shortlog = changelist)
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   678
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   679
    def filediff(self, file, changeset):
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   680
        cl = self.repo.changelog
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   681
        n = self.repo.lookup(changeset)
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   682
        changeset = hex(n)
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   683
        p1 = cl.parents(n)[0]
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   684
        cs = cl.read(n)
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   685
        mf = self.repo.manifest.read(cs[0])
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   686
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   687
        def diff(**map):
2275
714f4d25a7a9 Fix hgweb.filediff
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents: 2174
diff changeset
   688
            yield self.diff(p1, n, [file])
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   689
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   690
        yield self.t("filediff",
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   691
                     file=file,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   692
                     filenode=hex(mf.get(file, nullid)),
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   693
                     node=changeset,
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   694
                     rev=self.repo.changelog.rev(n),
1606
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   695
                     parent=self.siblings(cl.parents(n), cl.rev),
ba625c8083d8 - duplicate the parent link logic to show child links
Muli Ben-Yehuda <mulix@mulix.org>
parents: 1579
diff changeset
   696
                     child=self.siblings(cl.children(n), cl.rev),
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
   697
                     diff=diff)
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   698
2113
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   699
    archive_specs = {
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   700
        'bz2': ('application/x-tar', 'tbz2', '.tar.bz2', 'x-bzip2'),
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   701
        'gz': ('application/x-tar', 'tgz', '.tar.gz', 'x-gzip'),
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   702
        'zip': ('application/zip', 'zip', '.zip', None),
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   703
        }
1076
01db658cc78a tarball support v0.3
Wojciech Milkowski <wmilkowski@interia.pl>
parents: 1073
diff changeset
   704
2113
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   705
    def archive(self, req, cnode, type):
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   706
        reponame = re.sub(r"\W+", "-", os.path.basename(self.reponame))
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   707
        name = "%s-%s" % (reponame, short(cnode))
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   708
        mimetype, artype, extension, encoding = self.archive_specs[type]
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   709
        headers = [('Content-type', mimetype),
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   710
                   ('Content-disposition', 'attachment; filename=%s%s' %
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   711
                    (name, extension))]
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   712
        if encoding:
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   713
            headers.append(('Content-encoding', encoding))
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   714
        req.header(headers)
633d733e7b11 make hgweb use new archival module.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2103
diff changeset
   715
        archival.archive(self.repo, req.out, cnode, artype, prefix=name)
1076
01db658cc78a tarball support v0.3
Wojciech Milkowski <wmilkowski@interia.pl>
parents: 1073
diff changeset
   716
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   717
    # add tags to things
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   718
    # tags -> list of changesets corresponding to tags
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   719
    # find tag, changeset, file
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   720
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   721
    def run(self, req=hgrequest()):
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   722
        def clean(path):
1864
7a09785d3237 Fix manifest view on Windows
Lee Cantey <lcantey@gmail.com>
parents: 1834
diff changeset
   723
            p = util.normpath(path)
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   724
            if p[:2] == "..":
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   725
                raise "suspicious path"
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   726
            return p
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   727
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   728
        def header(**map):
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   729
            yield self.t("header", **map)
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   730
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   731
        def footer(**map):
2148
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
   732
            yield self.t("footer",
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
   733
                         motd=self.repo.ui.config("web", "motd", ""),
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
   734
                         **map)
1409
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   735
1406
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   736
        def expand_form(form):
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   737
            shortcuts = {
1409
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   738
                'cl': [('cmd', ['changelog']), ('rev', None)],
1406
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   739
                'cs': [('cmd', ['changeset']), ('node', None)],
1409
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   740
                'f': [('cmd', ['file']), ('filenode', None)],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   741
                'fl': [('cmd', ['filelog']), ('filenode', None)],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   742
                'fd': [('cmd', ['filediff']), ('node', None)],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   743
                'fa': [('cmd', ['annotate']), ('filenode', None)],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   744
                'mf': [('cmd', ['manifest']), ('manifest', None)],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   745
                'ca': [('cmd', ['archive']), ('node', None)],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   746
                'tags': [('cmd', ['tags'])],
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   747
                'tip': [('cmd', ['changeset']), ('node', ['tip'])],
1777
a2316878f19d [hgweb] Static content serving
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1703
diff changeset
   748
                'static': [('cmd', ['static']), ('file', None)]
1406
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   749
            }
1409
964baa35faf8 hgweb: add shortcuts for all the web commands / fix empty arg bug
Matt Mackall <mpm@selenic.com>
parents: 1407
diff changeset
   750
1406
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   751
            for k in shortcuts.iterkeys():
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   752
                if form.has_key(k):
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   753
                    for name, value in shortcuts[k]:
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   754
                        if value is None:
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   755
                            value = form[k]
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   756
                        form[name] = value
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   757
                    del form[k]
857
41b344235bb7 [PATCH] Propagate the template map though recursively
Jeff Sipek <jeffpc@optonline.net>
parents: 839
diff changeset
   758
258
268bcb5a072a hgweb: watch changelog for changes
mpm@selenic.com
parents: 241
diff changeset
   759
        self.refresh()
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   760
1406
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   761
        expand_form(req.form)
34cb3957d875 hgweb: allow urls to be shorter by using shortcuts
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1402
diff changeset
   762
1897
58b6784cf9f1 move hgweb.templatepath into templater
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1896
diff changeset
   763
        t = self.repo.ui.config("web", "templates", templater.templatepath())
1777
a2316878f19d [hgweb] Static content serving
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1703
diff changeset
   764
        static = self.repo.ui.config("web", "static", os.path.join(t,"static"))
938
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   765
        m = os.path.join(t, "map")
986
2810c625ca98 Add web:style option
mpm@selenic.com
parents: 984
diff changeset
   766
        style = self.repo.ui.config("web", "style", "")
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   767
        if req.form.has_key('style'):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   768
            style = req.form['style'][0]
986
2810c625ca98 Add web:style option
mpm@selenic.com
parents: 984
diff changeset
   769
        if style:
2810c625ca98 Add web:style option
mpm@selenic.com
parents: 984
diff changeset
   770
            b = os.path.basename("map-" + style)
983
4a988dc8d9b8 Fix RSS feeds
mpm@selenic.com
parents: 982
diff changeset
   771
            p = os.path.join(t, b)
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   772
            if os.path.isfile(p):
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   773
                m = p
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   774
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   775
        port = req.env["SERVER_PORT"]
601
8865eb8ade99 Add globals to templater/fixup RSS
mpm@selenic.com
parents: 600
diff changeset
   776
        port = port != "80" and (":" + port) or ""
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   777
        uri = req.env["REQUEST_URI"]
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   778
        if "?" in uri:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   779
            uri = uri.split("?")[0]
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   780
        url = "http://%s%s%s" % (req.env["SERVER_NAME"], port, uri)
1172
3f30a5e7e15b Use path relative to document root as reponame if published via a web server.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1170
diff changeset
   781
        if not self.reponame:
3f30a5e7e15b Use path relative to document root as reponame if published via a web server.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1170
diff changeset
   782
            self.reponame = (self.repo.ui.config("web", "name")
3f30a5e7e15b Use path relative to document root as reponame if published via a web server.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1170
diff changeset
   783
                             or uri.strip('/') or self.repo.root)
601
8865eb8ade99 Add globals to templater/fixup RSS
mpm@selenic.com
parents: 600
diff changeset
   784
1896
f8f818a04f5b move hgweb template code out to templater
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1796
diff changeset
   785
        self.t = templater.templater(m, templater.common_filters,
1964
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
   786
                                     defaults={"url": url,
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
   787
                                               "repo": self.reponame,
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
   788
                                               "header": header,
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
   789
                                               "footer": footer,
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
   790
                                               })
201
f918a6fa2572 hgweb: add template filters, template style maps, and raw pages
mpm@selenic.com
parents: 198
diff changeset
   791
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   792
        if not req.form.has_key('cmd'):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   793
            req.form['cmd'] = [self.t.cache['default'],]
937
e4f1b76831b2 Whitespace
mpm@selenic.com
parents: 896
diff changeset
   794
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   795
        cmd = req.form['cmd'][0]
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   796
        if cmd == 'changelog':
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   797
            hi = self.repo.changelog.count() - 1
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   798
            if req.form.has_key('rev'):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   799
                hi = req.form['rev'][0]
166
39624c47060f hgweb: don't blow up on search for unknown keys
mpm@selenic.com
parents: 165
diff changeset
   800
                try:
39624c47060f hgweb: don't blow up on search for unknown keys
mpm@selenic.com
parents: 165
diff changeset
   801
                    hi = self.repo.changelog.rev(self.repo.lookup(hi))
1219
56582bb2b869 hgweb: fix scope for RepoError
mpm@selenic.com
parents: 1217
diff changeset
   802
                except hg.RepoError:
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   803
                    req.write(self.search(hi)) # XXX redirect to 404 page?
538
7140bc781655 Add multiple keyword search to hgweb
mpm@selenic.com
parents: 536
diff changeset
   804
                    return
575
7f5ce4bbdd7b More whitespace cleanups
mpm@selenic.com
parents: 572
diff changeset
   805
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   806
            req.write(self.changelog(hi))
515
03f27b1381f9 Whitespace cleanups
mpm@selenic.com
parents: 391
diff changeset
   807
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   808
        elif cmd == 'changeset':
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   809
            req.write(self.changeset(req.form['node'][0]))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   810
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   811
        elif cmd == 'manifest':
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   812
            req.write(self.manifest(req.form['manifest'][0],
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   813
                                    clean(req.form['path'][0])))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   814
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   815
        elif cmd == 'tags':
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   816
            req.write(self.tags())
168
65cf1b0cfe86 hgweb: add tags links and manifest links
mpm@selenic.com
parents: 166
diff changeset
   817
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   818
        elif cmd == 'summary':
1572
385b8872b8e3 [hgweb] Initial import of the "gitweb" style
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1559
diff changeset
   819
            req.write(self.summary())
1579
85803ec2daab Remove tabs, and trailing whitespace from hgweb.py
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1575
diff changeset
   820
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   821
        elif cmd == 'filediff':
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   822
            req.write(self.filediff(clean(req.form['file'][0]),
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   823
                                    req.form['node'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   824
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   825
        elif cmd == 'file':
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   826
            req.write(self.filerevision(clean(req.form['file'][0]),
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   827
                                        req.form['filenode'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   828
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   829
        elif cmd == 'annotate':
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   830
            req.write(self.fileannotate(clean(req.form['file'][0]),
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   831
                                        req.form['filenode'][0]))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   832
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   833
        elif cmd == 'filelog':
1646
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   834
            req.write(self.filelog(clean(req.form['file'][0]),
8e9c203946ae Clean up paths passed to hgweb
Matt Mackall <mpm@selenic.com>
parents: 1637
diff changeset
   835
                                   req.form['filenode'][0]))
136
0e8d60d2bb2b added annotate
jake@edge2.net
parents: 135
diff changeset
   836
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   837
        elif cmd == 'heads':
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   838
            req.httphdr("application/mercurial-0.1")
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
   839
            h = self.repo.heads()
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   840
            req.write(" ".join(map(hex, h)) + "\n")
222
87484f627422 make pull work for multiple heads
mpm@selenic.com
parents: 215
diff changeset
   841
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   842
        elif cmd == 'branches':
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   843
            req.httphdr("application/mercurial-0.1")
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   844
            nodes = []
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   845
            if req.form.has_key('nodes'):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   846
                nodes = map(bin, req.form['nodes'][0].split(" "))
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   847
            for b in self.repo.branches(nodes):
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   848
                req.write(" ".join(map(hex, b)) + "\n")
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   849
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   850
        elif cmd == 'between':
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   851
            req.httphdr("application/mercurial-0.1")
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   852
            nodes = []
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   853
            if req.form.has_key('pairs'):
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   854
                pairs = [map(bin, p.split("-"))
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   855
                         for p in req.form['pairs'][0].split(" ")]
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
   856
            for b in self.repo.between(pairs):
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   857
                req.write(" ".join(map(hex, b)) + "\n")
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   858
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   859
        elif cmd == 'changegroup':
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   860
            req.httphdr("application/mercurial-0.1")
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   861
            nodes = []
964
3f37720e7dc7 hgweb: Make maxfiles, maxchanges, and allowpull proper config options
mpm@selenic.com
parents: 957
diff changeset
   862
            if not self.allowpull:
197
b388603984fc hgweb: add view-only support
mpm@selenic.com
parents: 195
diff changeset
   863
                return
b388603984fc hgweb: add view-only support
mpm@selenic.com
parents: 195
diff changeset
   864
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   865
            if req.form.has_key('roots'):
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   866
                nodes = map(bin, req.form['roots'][0].split(" "))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   867
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   868
            z = zlib.compressobj()
1736
50de0887bbcd add preoutgoing and outgoing hooks.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
   869
            f = self.repo.changegroup(nodes, 'serve')
635
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 620
diff changeset
   870
            while 1:
85e2209d401c Protocol switch from using generators to stream-like objects.
Matt Mackall <mpm@selenic.com>
parents: 620
diff changeset
   871
                chunk = f.read(4096)
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   872
                if not chunk:
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   873
                    break
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   874
                req.write(z.compress(chunk))
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   875
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   876
            req.write(z.flush())
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   877
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   878
        elif cmd == 'archive':
1369
b6d4ebebc35c Allows abbreviated hashes in hgweb
Matt Mackall <mpm@selenic.com>
parents: 1348
diff changeset
   879
            changeset = self.repo.lookup(req.form['node'][0])
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   880
            type = req.form['type'][0]
1078
33f40d0c6124 Various cleanups for tarball support
mpm@selenic.com
parents: 1077
diff changeset
   881
            if (type in self.archives and
33f40d0c6124 Various cleanups for tarball support
mpm@selenic.com
parents: 1077
diff changeset
   882
                self.repo.ui.configbool("web", "allow" + type, False)):
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   883
                self.archive(req, changeset, type)
1078
33f40d0c6124 Various cleanups for tarball support
mpm@selenic.com
parents: 1077
diff changeset
   884
                return
1077
b87aeccf73d9 tarball support v0.3 pt 2
Wojciech Milkowski <wmilkowski@interia.pl>
parents: 1076
diff changeset
   885
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   886
            req.write(self.t("error"))
1076
01db658cc78a tarball support v0.3
Wojciech Milkowski <wmilkowski@interia.pl>
parents: 1073
diff changeset
   887
2119
f62195054c5b Cleaned hgweb.py a little bit
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2113
diff changeset
   888
        elif cmd == 'static':
1777
a2316878f19d [hgweb] Static content serving
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1703
diff changeset
   889
            fname = req.form['file'][0]
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
   890
            req.write(staticfile(static, fname)
1796
a373881fdf2a Fixed wrong (copy&paste) usage of tmpl instead of self.t in hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1795
diff changeset
   891
                      or self.t("error", error="%r not found" % fname))
1777
a2316878f19d [hgweb] Static content serving
Josef "Jeff" Sipek <jeffpc@optonline.net>
parents: 1703
diff changeset
   892
132
210eeb6f5197 making hgweb class
jake@edge2.net
parents: 131
diff changeset
   893
        else:
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
   894
            req.write(self.t("error"))
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
   895
2127
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   896
def create_server(ui, repo):
2121
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   897
    use_threads = True
2124
27fd8b7a6c51 Cleaned trailing whitespace in hgweb.py, removed command line shortcut for webdir-conf.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2123
diff changeset
   898
938
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   899
    def openlog(opt, default):
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   900
        if opt and opt != '-':
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   901
            return open(opt, 'w')
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   902
        return default
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   903
2127
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   904
    address = ui.config("web", "address", "")
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   905
    port = int(ui.config("web", "port", 8000))
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   906
    use_ipv6 = ui.configbool("web", "ipv6")
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   907
    webdir_conf = ui.config("web", "webdir_conf")
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   908
    accesslog = openlog(ui.config("web", "accesslog", "-"), sys.stdout)
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   909
    errorlog = openlog(ui.config("web", "errorlog", "-"), sys.stderr)
2124
27fd8b7a6c51 Cleaned trailing whitespace in hgweb.py, removed command line shortcut for webdir-conf.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2123
diff changeset
   910
2121
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   911
    if use_threads:
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   912
        try:
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   913
            from threading import activeCount
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   914
        except ImportError:
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   915
            use_threads = False
938
54b2a42e501e hgweb: add [web] section to hgrc
mpm@selenic.com
parents: 937
diff changeset
   916
2121
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   917
    if use_threads:
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   918
        _mixin = SocketServer.ThreadingMixIn
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   919
    else:
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   920
        if hasattr(os, "fork"):
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   921
            _mixin = SocketServer.ForkingMixIn
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   922
        else:
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   923
            class _mixin: pass
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   924
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   925
    class MercurialHTTPServer(_mixin, BaseHTTPServer.HTTPServer):
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   926
        pass
2124
27fd8b7a6c51 Cleaned trailing whitespace in hgweb.py, removed command line shortcut for webdir-conf.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2123
diff changeset
   927
2121
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
   928
    class IPv6HTTPServer(MercurialHTTPServer):
881
16ce690c411d Fix problem with "hg serve" on systems not providing IPv6.
Bryan O'Sullivan <bos@serpentine.com>
parents: 858
diff changeset
   929
        address_family = getattr(socket, 'AF_INET6', None)
16ce690c411d Fix problem with "hg serve" on systems not providing IPv6.
Bryan O'Sullivan <bos@serpentine.com>
parents: 858
diff changeset
   930
16ce690c411d Fix problem with "hg serve" on systems not providing IPv6.
Bryan O'Sullivan <bos@serpentine.com>
parents: 858
diff changeset
   931
        def __init__(self, *args, **kwargs):
16ce690c411d Fix problem with "hg serve" on systems not providing IPv6.
Bryan O'Sullivan <bos@serpentine.com>
parents: 858
diff changeset
   932
            if self.address_family is None:
1402
9d2c2e6b32b5 i18n part2: use '_' for all strings who are part of the user interface
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1400
diff changeset
   933
                raise hg.RepoError(_('IPv6 not available on this system'))
881
16ce690c411d Fix problem with "hg serve" on systems not providing IPv6.
Bryan O'Sullivan <bos@serpentine.com>
parents: 858
diff changeset
   934
            BaseHTTPServer.HTTPServer.__init__(self, *args, **kwargs)
825
0108c602feb9 Add an option to hg serve to serve file using IPv6
Samuel Tardieu <sam@rfc1149.net>
parents: 753
diff changeset
   935
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   936
    class hgwebhandler(BaseHTTPServer.BaseHTTPRequestHandler):
2123
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
   937
605
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   938
        def log_error(self, format, *args):
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   939
            errorlog.write("%s - - [%s] %s\n" % (self.address_string(),
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   940
                                                 self.log_date_time_string(),
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   941
                                                 format % args))
937
e4f1b76831b2 Whitespace
mpm@selenic.com
parents: 896
diff changeset
   942
605
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   943
        def log_message(self, format, *args):
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   944
            accesslog.write("%s - - [%s] %s\n" % (self.address_string(),
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   945
                                                  self.log_date_time_string(),
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   946
                                                  format % args))
8e82fd763be2 [PATCH] Get "hg serve" to optionally log accesses and errors to files
mpm@selenic.com
parents: 603
diff changeset
   947
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   948
        def do_POST(self):
271
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
   949
            try:
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
   950
                self.do_hgweb()
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
   951
            except socket.error, inst:
1174
9d9f4973c76a Added missing 'import errno', and use errno for EPIPE, too.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1172
diff changeset
   952
                if inst[0] != errno.EPIPE:
1063
58eefdfb8472 Some more spacing/indentation/linebreak cleanups to hgweb.py.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1062
diff changeset
   953
                    raise
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   954
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   955
        def do_GET(self):
271
35acefbf0ae6 hgweb: ignore pipe errors
mpm@selenic.com
parents: 269
diff changeset
   956
            self.do_POST()
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   957
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   958
        def do_hgweb(self):
2123
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
   959
            path_info, query = splitURI(self.path)
2124
27fd8b7a6c51 Cleaned trailing whitespace in hgweb.py, removed command line shortcut for webdir-conf.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2123
diff changeset
   960
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   961
            env = {}
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   962
            env['GATEWAY_INTERFACE'] = 'CGI/1.1'
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   963
            env['REQUEST_METHOD'] = self.command
599
765182a4c843 [PATCH] Add RSS support to hgweb
mpm@selenic.com
parents: 598
diff changeset
   964
            env['SERVER_NAME'] = self.server.server_name
765182a4c843 [PATCH] Add RSS support to hgweb
mpm@selenic.com
parents: 598
diff changeset
   965
            env['SERVER_PORT'] = str(self.server.server_port)
765182a4c843 [PATCH] Add RSS support to hgweb
mpm@selenic.com
parents: 598
diff changeset
   966
            env['REQUEST_URI'] = "/"
2123
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
   967
            env['PATH_INFO'] = path_info
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   968
            if query:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   969
                env['QUERY_STRING'] = query
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   970
            host = self.address_string()
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   971
            if host != self.client_address[0]:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   972
                env['REMOTE_HOST'] = host
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   973
                env['REMOTE_ADDR'] = self.client_address[0]
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   974
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   975
            if self.headers.typeheader is None:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   976
                env['CONTENT_TYPE'] = self.headers.type
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   977
            else:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   978
                env['CONTENT_TYPE'] = self.headers.typeheader
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   979
            length = self.headers.getheader('content-length')
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   980
            if length:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   981
                env['CONTENT_LENGTH'] = length
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   982
            accept = []
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   983
            for line in self.headers.getallmatchingheaders('accept'):
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   984
                if line[:1] in "\t\n\r ":
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   985
                    accept.append(line.strip())
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   986
                else:
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   987
                    accept = accept + line[7:].split(',')
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   988
            env['HTTP_ACCEPT'] = ','.join(accept)
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
   989
1180
fe3eb1628c40 Saving sys.argv and sys.stderr is not needed anymore
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1163
diff changeset
   990
            req = hgrequest(self.rfile, self.wfile, env)
fe3eb1628c40 Saving sys.argv and sys.stderr is not needed anymore
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1163
diff changeset
   991
            self.send_response(200, "Script output follows")
2122
9383ba6b069a Added hgwebdir support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2121
diff changeset
   992
9383ba6b069a Added hgwebdir support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2121
diff changeset
   993
            if webdir_conf:
2123
c0729a7f6f8a Fixed path handling of the standalone server, fixed typo.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2122
diff changeset
   994
                hgwebobj = hgwebdir(webdir_conf)
2127
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   995
            elif repo is not None:
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   996
                hgwebobj = hgweb(repo.__class__(repo.ui, repo.origroot))
2122
9383ba6b069a Added hgwebdir support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2121
diff changeset
   997
            else:
2127
8a85dbbadddf Allow 'hg serve --webdir-conf foo' to be run outside a repository.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2124
diff changeset
   998
                raise hg.RepoError(_('no repo found'))
2122
9383ba6b069a Added hgwebdir support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2121
diff changeset
   999
            hgwebobj.run(req)
2124
27fd8b7a6c51 Cleaned trailing whitespace in hgweb.py, removed command line shortcut for webdir-conf.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2123
diff changeset
  1000
158
be7103467d2e Add 'hg serve' command for stand-alone server
mpm@selenic.com
parents: 157
diff changeset
  1001
825
0108c602feb9 Add an option to hg serve to serve file using IPv6
Samuel Tardieu <sam@rfc1149.net>
parents: 753
diff changeset
  1002
    if use_ipv6:
0108c602feb9 Add an option to hg serve to serve file using IPv6
Samuel Tardieu <sam@rfc1149.net>
parents: 753
diff changeset
  1003
        return IPv6HTTPServer((address, port), hgwebhandler)
0108c602feb9 Add an option to hg serve to serve file using IPv6
Samuel Tardieu <sam@rfc1149.net>
parents: 753
diff changeset
  1004
    else:
2121
150cdd6c3c90 Added threading support to hg serve.
Alexander Schremmer <alex AT alexanderweb DOT de>
parents: 2119
diff changeset
  1005
        return MercurialHTTPServer((address, port), hgwebhandler)
603
bc5d058e65e9 [PATCH] Get "hg serve" to print the URL being served
mpm@selenic.com
parents: 601
diff changeset
  1006
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1007
# This is a stopgap
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1554
diff changeset
  1008
class hgwebdir(object):
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1009
    def __init__(self, config):
1181
4f5001f5b4c3 Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1180
diff changeset
  1010
        def cleannames(items):
1829
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1011
            return [(name.strip(os.sep), path) for name, path in items]
1181
4f5001f5b4c3 Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1180
diff changeset
  1012
2148
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
  1013
        self.motd = ""
2174
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1014
        self.repos_sorted = ('name', False)
1829
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1015
        if isinstance(config, (list, tuple)):
1181
4f5001f5b4c3 Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1180
diff changeset
  1016
            self.repos = cleannames(config)
2174
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1017
            self.repos_sorted = ('', False)
1829
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1018
        elif isinstance(config, dict):
1181
4f5001f5b4c3 Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1180
diff changeset
  1019
            self.repos = cleannames(config.items())
1143
4fffb3d84b7c Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1142
diff changeset
  1020
            self.repos.sort()
4fffb3d84b7c Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1142
diff changeset
  1021
        else:
4fffb3d84b7c Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1142
diff changeset
  1022
            cp = ConfigParser.SafeConfigParser()
4fffb3d84b7c Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1142
diff changeset
  1023
            cp.read(config)
1829
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1024
            self.repos = []
2148
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
  1025
            if cp.has_section('web') and cp.has_option('web', 'motd'):
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
  1026
                self.motd = cp.get('web', 'motd')
1829
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1027
            if cp.has_section('paths'):
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1028
                self.repos.extend(cleannames(cp.items('paths')))
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1029
            if cp.has_section('collections'):
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1030
                for prefix, root in cp.items('collections'):
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1031
                    for path in util.walkrepos(root):
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1032
                        repo = os.path.normpath(path)
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1033
                        name = repo
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1034
                        if name.startswith(prefix):
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1035
                            name = name[len(prefix):]
b0f6af327fd4 hgwebdir: export collections of repos
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1703
diff changeset
  1036
                        self.repos.append((name.lstrip(os.sep), repo))
1143
4fffb3d84b7c Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1142
diff changeset
  1037
            self.repos.sort()
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1038
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
  1039
    def run(self, req=hgrequest()):
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1040
        def header(**map):
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1041
            yield tmpl("header", **map)
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1042
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1043
        def footer(**map):
2148
c72e618c1204 Add MOTD display to hgweb and hgwebdir.
Colin McMillen <mcmillen@cs.cmu.edu>
parents: 2127
diff changeset
  1044
            yield tmpl("footer", motd=self.motd, **map)
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1045
1897
58b6784cf9f1 move hgweb.templatepath into templater
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1896
diff changeset
  1046
        m = os.path.join(templater.templatepath(), "map")
1898
e517189f168d missed hunk when moving code to templater module
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1897
diff changeset
  1047
        tmpl = templater.templater(m, templater.common_filters,
1964
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
  1048
                                   defaults={"header": header,
778281d46bb2 fix template bug that made hgweb break.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1920
diff changeset
  1049
                                             "footer": footer})
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1050
2171
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
  1051
        def archivelist(ui, nodeid, url):
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
  1052
            for i in ['zip', 'gz', 'bz2']:
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
  1053
                if ui.configbool("web", "allow" + i, False):
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
  1054
                    yield {"type" : i, "node": nodeid, "url": url}
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
  1055
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1056
        def entries(sortcolumn="", descending=False, **map):
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1057
            rows = []
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1058
            parity = 0
1141
033c968d7c66 Use ConfigParser only in hgwebdir.__init__()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1140
diff changeset
  1059
            for name, path in self.repos:
1213
db9639b8594c Clean up hgweb imports
mpm@selenic.com
parents: 1210
diff changeset
  1060
                u = ui.ui()
1170
85555540a4e2 Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1165
diff changeset
  1061
                try:
1473
7d66ce9895fa make readconfig take a filename instead of a file pointer as argument
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 1445
diff changeset
  1062
                    u.readconfig(os.path.join(path, '.hg', 'hgrc'))
1170
85555540a4e2 Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1165
diff changeset
  1063
                except IOError:
85555540a4e2 Make .hg/hgrc optional for repositories published by hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1165
diff changeset
  1064
                    pass
1140
04d52b446e5e Don't create repo objects in hgwebdir, ui object is enough.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1139
diff changeset
  1065
                get = u.config
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1066
1181
4f5001f5b4c3 Make sure the repository names don't have slashes at the at or else in some
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1180
diff changeset
  1067
                url = ('/'.join([req.env["REQUEST_URI"].split('?')[0], name])
1142
74d184a40a2e Cleaned up hgweb.hgwebdir.run()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1141
diff changeset
  1068
                       .replace("//", "/"))
1022
31dcaf9123ba Minor hgwebdir tweaks
mpm@selenic.com
parents: 987
diff changeset
  1069
1348
b8c82bf3da21 hgwebdir: Fix date display
mpm@selenic.com
parents: 1333
diff changeset
  1070
                # update time with local timezone
1524
0d47bb884330 hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents: 1511
diff changeset
  1071
                try:
0d47bb884330 hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents: 1511
diff changeset
  1072
                    d = (get_mtime(path), util.makedate()[1])
0d47bb884330 hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents: 1511
diff changeset
  1073
                except OSError:
0d47bb884330 hgweb: fix traceback by skipping invalid repo paths
TK Soh <teekaysoh@yahoo.com>
parents: 1511
diff changeset
  1074
                    continue
1348
b8c82bf3da21 hgwebdir: Fix date display
mpm@selenic.com
parents: 1333
diff changeset
  1075
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1076
                contact = (get("ui", "username") or # preferred
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1077
                           get("web", "contact") or # deprecated
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1078
                           get("web", "author", "")) # also
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1079
                description = get("web", "description", "")
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1080
                name = get("web", "name", name)
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1081
                row = dict(contact=contact or "unknown",
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1082
                           contact_sort=contact.upper() or "unknown",
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1083
                           name=name,
2174
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1084
                           name_sort=name,
1062
6d5a62a549fa pep-0008 cleanup
benoit.boissinot@ens-lyon.fr
parents: 1023
diff changeset
  1085
                           url=url,
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1086
                           description=description or "unknown",
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1087
                           description_sort=description.upper() or "unknown",
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1088
                           lastchange=d,
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1089
                           lastchange_sort=d[1]-d[0],
2171
290534ee163c Add download links to hgwebdir index page for allowed archive types.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2170
diff changeset
  1090
                           archives=archivelist(u, "tip", url))
2174
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1091
                if (not sortcolumn
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1092
                    or (sortcolumn, descending) == self.repos_sorted):
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1093
                    # fast path for unsorted output
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1094
                    row['parity'] = parity
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1095
                    parity = 1 - parity
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1096
                    yield row
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1097
                else:
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1098
                    rows.append((row["%s_sort" % sortcolumn], row))
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1099
            if rows:
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1100
                rows.sort()
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1101
                if descending:
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1102
                    rows.reverse()
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1103
                for key, row in rows:
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1104
                    row['parity'] = parity
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1105
                    parity = 1 - parity
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1106
                    yield row
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
  1107
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
  1108
        virtual = req.env.get("PATH_INFO", "").strip('/')
1142
74d184a40a2e Cleaned up hgweb.hgwebdir.run()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1141
diff changeset
  1109
        if virtual:
1141
033c968d7c66 Use ConfigParser only in hgwebdir.__init__()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1140
diff changeset
  1110
            real = dict(self.repos).get(virtual)
033c968d7c66 Use ConfigParser only in hgwebdir.__init__()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1140
diff changeset
  1111
            if real:
1554
68ec7b9e09a4 Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1545
diff changeset
  1112
                try:
68ec7b9e09a4 Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1545
diff changeset
  1113
                    hgweb(real).run(req)
68ec7b9e09a4 Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1545
diff changeset
  1114
                except IOError, inst:
68ec7b9e09a4 Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1545
diff changeset
  1115
                    req.write(tmpl("error", error=inst.strerror))
68ec7b9e09a4 Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1545
diff changeset
  1116
                except hg.RepoError, inst:
68ec7b9e09a4 Catch IOErrors and RepoErrors when serving repositories via hgweb.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1545
diff changeset
  1117
                    req.write(tmpl("error", error=str(inst)))
1123
457c23af92bd Use a template for the error message.
Ollivier Robert <roberto@keltia.freenix.fr>
parents: 1122
diff changeset
  1118
            else:
1159
b6f5a947e62e Change use of global sys.stdout, sys.stdin os.environ to a hgrequest object.
Vincent Wagelaar <vincent@ricardis.tudelft.nl>
parents: 1143
diff changeset
  1119
                req.write(tmpl("notfound", repo=virtual))
1142
74d184a40a2e Cleaned up hgweb.hgwebdir.run()
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1141
diff changeset
  1120
        else:
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
  1121
            if req.form.has_key('static'):
1897
58b6784cf9f1 move hgweb.templatepath into templater
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 1896
diff changeset
  1122
                static = os.path.join(templater.templatepath(), "static")
1793
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
  1123
                fname = req.form['static'][0]
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
  1124
                req.write(staticfile(static, fname)
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
  1125
                          or tmpl("error", error="%r not found" % fname))
83c6d8355909 Allow serving static files from hgwebdir to fix CSS and favicon.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1792
diff changeset
  1126
            else:
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1127
                sortable = ["name", "description", "contact", "lastchange"]
2174
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1128
                sortcolumn, descending = self.repos_sorted
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1129
                if req.form.has_key('sort'):
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1130
                    sortcolumn = req.form['sort'][0]
2174
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1131
                    descending = sortcolumn.startswith('-')
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1132
                    if descending:
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1133
                        sortcolumn = sortcolumn[1:]
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1134
                    if sortcolumn not in sortable:
3044a3fdae76 If default sorting is name, offer name-descending with one click.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2173
diff changeset
  1135
                        sortcolumn = ""
2173
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1136
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1137
                sort = [("sort_%s" % column,
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1138
                         "%s%s" % ((not descending and column == sortcolumn)
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1139
                                   and "-" or "", column))
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1140
                        for column in sortable]
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1141
                req.write(tmpl("index", entries=entries,
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1142
                               sortcolumn=sortcolumn, descending=descending,
d1943df604c4 Make hgwebdir columns sortable.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 2171
diff changeset
  1143
                               **dict(sort)))