mercurial/hgweb/hgwebdir_mod.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 07 Oct 2019 00:04:04 -0400
changeset 43106 d783f945a701
parent 43077 687b865b95ad
child 43447 6ff1a0d109c9
child 43677 0b7733719d21
permissions -rw-r--r--
py3: finish porting iteritems() to pycompat and remove source transformer This commit finishes porting .iteritems() to pycompat.iteritems() for the mercurial package. The translation of .iteritems() to .items() was the last conversion performed by the source transformer. With the porting to pycompat complete, we no longer have a need for the source transformer. So the source transformer has been removed. Good riddance! The code base is now compatible with Python 2 and Python 3. For the record, as the person who introduced the source transformer, it brings me joy to delete it. It accomplished its goal to facilitate a port to Python 3 without overly burdening people on some painful low-level differences between Python 2 and 3. It is unfortunate we still have to wallpaper over many differences with the pycompat shim. But it is what it is. Differential Revision: https://phab.mercurial-scm.org/D7015
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2391
d351a3be3371 Fixing up comment headers for split up code.
Eric Hopper <hopper@omnifarious.org>
parents: 2360
diff changeset
     1
# hgweb/hgwebdir_mod.py - Web interface for a directory of repositories.
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>
2859
345bac2bc4ec update copyrights.
Vadim Gelfer <vadim.gelfer@gmail.com>
parents: 2538
diff changeset
     4
# Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8216
diff changeset
     6
# This software may be used and distributed according to the terms of the
10263
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9903
diff changeset
     7
# GNU General Public License version 2 or any later version.
131
c9d51742471c moving hgweb to mercurial subdir
jake@edge2.net
parents:
diff changeset
     8
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
     9
from __future__ import absolute_import
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    10
35854
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
    11
import gc
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    12
import os
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    13
import time
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    14
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    15
from ..i18n import _
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    16
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    17
from .common import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    18
    ErrorResponse,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    19
    HTTP_SERVER_ERROR,
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
    20
    cspvalues,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    21
    get_contact,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    22
    get_mtime,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    23
    ismember,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    24
    paritygen,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    25
    staticfile,
36913
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36912
diff changeset
    26
    statusmessage,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    27
)
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    28
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    29
from .. import (
34251
fe5202bef5ce configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents: 34250
diff changeset
    30
    configitems,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    31
    encoding,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    32
    error,
40762
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
    33
    extensions,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    34
    hg,
29798
80df04266a16 hgweb: profile HTTP requests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29797
diff changeset
    35
    profiling,
34359
8cbcee0b923d py3: remove use of str() in hgwebdir
Yuya Nishihara <yuya@tcha.org>
parents: 34264
diff changeset
    36
    pycompat,
38967
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
    37
    registrar,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    38
    scmutil,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    39
    templater,
37508
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
    40
    templateutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    41
    ui as uimod,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    42
    util,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    43
)
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    44
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    45
from . import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    46
    hgweb_mod,
36812
b9b968e21f78 hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36636
diff changeset
    47
    request as requestmod,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    48
    webutil,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    49
    wsgicgi,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    50
)
36636
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 34703
diff changeset
    51
from ..utils import dateutil
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    52
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
    53
8215
227707c90548 hgweb: some cleanups in hgwebdir, remove double defaults
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8209
diff changeset
    54
def cleannames(items):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    55
    return [(util.pconvert(name).strip(b'/'), 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
    56
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
    57
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    58
def findrepos(paths):
9723
a235644a0b93 hgweb: use a tuple-list instead of dictionary for append-only store
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9363
diff changeset
    59
    repos = []
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    60
    for prefix, root in cleannames(paths):
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    61
        roothead, roottail = os.path.split(root)
17104
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    62
        # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    63
        # /bar/ be served as as foo/N .
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    64
        # '*' will not search inside dirs with .hg (except .hg/patches),
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    65
        # '**' will search inside dirs with .hg (and thus also find subrepos).
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    66
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    67
            recurse = {b'*': False, b'**': True}[roottail]
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    68
        except KeyError:
9723
a235644a0b93 hgweb: use a tuple-list instead of dictionary for append-only store
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9363
diff changeset
    69
            repos.append((prefix, root))
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    70
            continue
11677
8f8a7976f4bc hgwebdir: allow pure relative globs in paths
Mads Kiilerich <mads@kiilerich.com>
parents: 11649
diff changeset
    71
        roothead = os.path.normpath(os.path.abspath(roothead))
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13964
diff changeset
    72
        paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse)
13402
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    73
        repos.extend(urlrepos(prefix, roothead, paths))
9723
a235644a0b93 hgweb: use a tuple-list instead of dictionary for append-only store
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9363
diff changeset
    74
    return repos
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    75
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
    76
13402
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    77
def urlrepos(prefix, roothead, paths):
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    78
    """yield url paths and filesystem paths from a list of repo paths
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    79
13538
d24e97fd52a9 test-doctest: handle unix/windows path discrepancies
Patrick Mezard <pmezard@gmail.com>
parents: 13436
diff changeset
    80
    >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
34146
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34040
diff changeset
    81
    >>> conv(urlrepos(b'hg', b'/opt', [b'/opt/r', b'/opt/r/r', b'/opt']))
13403
8ed91088acbb hgweb: make paths wildcards expanding in a repo root match repo correctly
Mads Kiilerich <mads@kiilerich.com>
parents: 13402
diff changeset
    82
    [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
34146
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34040
diff changeset
    83
    >>> conv(urlrepos(b'', b'/opt', [b'/opt/r', b'/opt/r/r', b'/opt']))
13402
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    84
    [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    85
    """
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    86
    for path in paths:
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    87
        path = os.path.normpath(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
    88
        yield (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    89
            prefix + b'/' + util.pconvert(path[len(roothead) :]).lstrip(b'/')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    90
        ).strip(b'/'), path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
    91
13402
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    92
36896
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    93
def readallowed(ui, req):
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    94
    """Check allow_read and deny_read config options of a repo's ui object
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    95
    to determine user permissions.  By default, with neither option set (or
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    96
    both empty), allow all users to read the repo.  There are two ways a
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    97
    user can be denied read access:  (1) deny_read is not empty, and the
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    98
    user is unauthenticated or deny_read contains user (or *), and (2)
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
    99
    allow_read is not empty and the user is not in allow_read.  Return True
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   100
    if user is allowed to read the repo, else return False."""
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   101
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   102
    user = req.remoteuser
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   103
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   104
    deny_read = ui.configlist(b'web', b'deny_read', untrusted=True)
36896
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   105
    if deny_read and (not user or ismember(ui, user, deny_read)):
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   106
        return False
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   107
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   108
    allow_read = ui.configlist(b'web', b'allow_read', untrusted=True)
36896
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   109
    # by default, allow reading if no allow_read option has been set
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   110
    if not allow_read or ismember(ui, user, allow_read):
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   111
        return True
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   112
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   113
    return False
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   114
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   115
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   116
def rawindexentries(ui, repos, req, subdir=b''):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   117
    descend = ui.configbool(b'web', b'descend')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   118
    collapse = ui.configbool(b'web', b'collapse')
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   119
    seenrepos = set()
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   120
    seendirs = set()
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   121
    for name, path in repos:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   122
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   123
        if not name.startswith(subdir):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   124
            continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   125
        name = name[len(subdir) :]
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   126
        directory = False
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   127
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   128
        if b'/' in name:
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   129
            if not descend:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   130
                continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   131
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   132
            nameparts = name.split(b'/')
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   133
            rootname = nameparts[0]
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   134
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   135
            if not collapse:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   136
                pass
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   137
            elif rootname in seendirs:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   138
                continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   139
            elif rootname in seenrepos:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   140
                pass
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   141
            else:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   142
                directory = True
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   143
                name = rootname
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   144
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   145
                # redefine the path to refer to the directory
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   146
                discarded = b'/'.join(nameparts[1:])
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   147
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   148
                # remove name parts plus accompanying slash
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   149
                path = path[: -len(discarded) - 1]
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   150
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   151
                try:
41387
876494fd967d cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41344
diff changeset
   152
                    hg.repository(ui, path)
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   153
                    directory = False
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   154
                except (IOError, error.RepoError):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   155
                    pass
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   156
36908
e473a032f38a hgweb: rewrite path generation for index entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36907
diff changeset
   157
        parts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   158
            req.apppath.strip(b'/'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   159
            subdir.strip(b'/'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   160
            name.strip(b'/'),
36908
e473a032f38a hgweb: rewrite path generation for index entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36907
diff changeset
   161
        ]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   162
        url = b'/' + b'/'.join(p for p in parts if p) + b'/'
15003
a31b8e03af28 hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents: 15002
diff changeset
   163
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   164
        # show either a directory entry or a repository
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   165
        if directory:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   166
            # get the directory's time information
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   167
            try:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   168
                d = (get_mtime(path), dateutil.makedate()[1])
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   169
            except OSError:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   170
                continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   171
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   172
            # add '/' to the name to make it obvious that
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   173
            # the entry is a directory, not a regular repository
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   174
            row = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   175
                b'contact': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   176
                b'contact_sort': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   177
                b'name': name + b'/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
                b'name_sort': name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   179
                b'url': url,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
                b'description': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
                b'description_sort': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
                b'lastchange': d,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   183
                b'lastchange_sort': d[1] - d[0],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   184
                b'archives': templateutil.mappinglist([]),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   185
                b'isdirectory': True,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   186
                b'labels': templateutil.hybridlist([], name=b'label'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   187
            }
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   188
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   189
            seendirs.add(name)
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   190
            yield row
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   191
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   192
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   193
        u = ui.copy()
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   194
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   195
            u.readconfig(os.path.join(path, b'.hg', b'hgrc'))
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   196
        except Exception as e:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   197
            u.warn(_(b'error reading %s/.hg/hgrc: %s\n') % (path, e))
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   198
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   199
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   200
        def get(section, name, default=uimod._unset):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   201
            return u.config(section, name, default, untrusted=True)
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   202
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   203
        if u.configbool(b"web", b"hidden", untrusted=True):
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   204
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   205
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   206
        if not readallowed(u, req):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   207
            continue
15003
a31b8e03af28 hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents: 15002
diff changeset
   208
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   209
        # update time with local timezone
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   210
        try:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   211
            r = hg.repository(ui, path)
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   212
        except IOError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   213
            u.warn(_(b'error accessing repository at %s\n') % path)
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   214
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   215
        except error.RepoError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   216
            u.warn(_(b'error accessing repository at %s\n') % path)
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   217
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   218
        try:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   219
            d = (get_mtime(r.spath), dateutil.makedate()[1])
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   220
        except OSError:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   221
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   222
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   223
        contact = get_contact(get)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   224
        description = get(b"web", b"description")
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   225
        seenrepos.add(name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   226
        name = get(b"web", b"name", name)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   227
        labels = u.configlist(b'web', b'labels', untrusted=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   228
        row = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   229
            b'contact': contact or b"unknown",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   230
            b'contact_sort': contact.upper() or b"unknown",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
            b'name': name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   232
            b'name_sort': name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   233
            b'url': url,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   234
            b'description': description or b"unknown",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
            b'description_sort': description.upper() or b"unknown",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
            b'lastchange': d,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
            b'lastchange_sort': d[1] - d[0],
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   238
            b'archives': webutil.archivelist(u, b"tip", url),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
            b'isdirectory': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   240
            b'labels': templateutil.hybridlist(labels, name=b'label'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   241
        }
36898
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   242
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   243
        yield row
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36897
diff changeset
   244
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   245
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   246
def _indexentriesgen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   247
    context, ui, repos, req, stripecount, sortcolumn, descending, subdir
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   248
):
36910
092ab4ba7ee5 hgweb: don't pass wsgireq to makeindex and other functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36909
diff changeset
   249
    rows = rawindexentries(ui, repos, req, subdir=subdir)
36899
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   250
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   251
    sortdefault = None, False
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   252
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   253
    if sortcolumn and sortdefault != (sortcolumn, descending):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   254
        sortkey = b'%s_sort' % sortcolumn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   255
        rows = sorted(rows, key=lambda x: x[sortkey], reverse=descending)
36899
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   256
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   257
    for row, parity in zip(rows, paritygen(stripecount)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   258
        row[b'parity'] = parity
36899
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   259
        yield row
15003
a31b8e03af28 hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents: 15002
diff changeset
   260
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   261
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   262
def indexentries(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   263
    ui, repos, req, stripecount, sortcolumn=b'', descending=False, subdir=b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   264
):
37508
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   265
    args = (ui, repos, req, stripecount, sortcolumn, descending, subdir)
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   266
    return templateutil.mappinggenerator(_indexentriesgen, args=args)
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   267
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   268
1559
59b3639df0a9 Convert all classes to new-style classes by deriving them from object.
Eric Hopper <hopper@omnifarious.org>
parents: 1554
diff changeset
   269
class hgwebdir(object):
26132
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   270
    """HTTP server for multiple repositories.
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   271
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   272
    Given a configuration, different repositories will be served depending
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   273
    on the request path.
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   274
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   275
    Instances are typically used as WSGI applications.
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   276
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   277
8191
35604226d712 hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents: 8190
diff changeset
   278
    def __init__(self, conf, baseui=None):
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   279
        self.conf = conf
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   280
        self.baseui = baseui
26072
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   281
        self.ui = None
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   282
        self.lastrefresh = 0
9903
5d748045c2ae Do not overwrite motd attribute of hgwebdir instances on refresh.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 9842
diff changeset
   283
        self.motd = None
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   284
        self.refresh()
40762
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
   285
        if not baseui:
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
   286
            # set up environment for new ui
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
   287
            extensions.loadall(self.ui)
40763
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40762
diff changeset
   288
            extensions.populateui(self.ui)
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
   289
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   290
    def refresh(self):
26072
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   291
        if self.ui:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
            refreshinterval = self.ui.configint(b'web', b'refreshinterval')
34251
fe5202bef5ce configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents: 34250
diff changeset
   293
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   294
            item = configitems.coreitems[b'web'][b'refreshinterval']
34251
fe5202bef5ce configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents: 34250
diff changeset
   295
            refreshinterval = item.default
26072
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   296
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   297
        # refreshinterval <= 0 means to always refresh.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   298
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   299
            refreshinterval > 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   300
            and self.lastrefresh + refreshinterval > time.time()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   301
        ):
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   302
            return
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   303
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   304
        if self.baseui:
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   305
            u = self.baseui.copy()
1143
4fffb3d84b7c Allow list of (virtual, real) or dictionary to be passed to hgwebdir.
Thomas Arendsen Hein <thomas@intevation.de>
parents: 1142
diff changeset
   306
        else:
30564
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 29798
diff changeset
   307
            u = uimod.ui.load()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   308
            u.setconfig(b'ui', b'report_untrusted', b'off', b'hgwebdir')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   309
            u.setconfig(b'ui', b'nontty', b'true', b'hgwebdir')
25488
89ce95f907bd hgewb: disable progress when serving (issue4582)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25427
diff changeset
   310
            # displaying bundling progress bar while serving feels wrong and may
89ce95f907bd hgewb: disable progress when serving (issue4582)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25427
diff changeset
   311
            # break some wsgi implementations.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   312
            u.setconfig(b'progress', b'disable', b'true', b'hgweb')
8136
6b5522cb2ad2 ui: refactor option setting
Matt Mackall <mpm@selenic.com>
parents: 7966
diff changeset
   313
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
   314
        if not isinstance(self.conf, (dict, list, tuple)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   315
            map = {b'paths': b'hgweb-paths'}
13214
5bcb6c9d16db hgweb: abort if config file isn't found
Matt Mackall <mpm@selenic.com>
parents: 13066
diff changeset
   316
            if not os.path.exists(self.conf):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   317
                raise error.Abort(_(b'config file %s not found!') % self.conf)
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   318
            u.readconfig(self.conf, remap=map, trust=True)
13667
8cbb59124e67 hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents: 13538
diff changeset
   319
            paths = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   320
            for name, ignored in u.configitems(b'hgweb-paths'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   321
                for path in u.configlist(b'hgweb-paths', name):
13667
8cbb59124e67 hgweb: support multiple directories for the same path
timeless <timeless@gmail.com>
parents: 13538
diff changeset
   322
                    paths.append((name, path))
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
   323
        elif isinstance(self.conf, (list, tuple)):
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
   324
            paths = self.conf
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
   325
        elif isinstance(self.conf, dict):
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
   326
            paths = self.conf.items()
40763
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40762
diff changeset
   327
        extensions.populateui(u)
8345
dcebff8a25dd hgwebdir: read --webdir-conf as actual configuration to ui (issue1586)
Alexander Solovyov <piranha@piranha.org.ua>
parents: 8225
diff changeset
   328
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   329
        repos = findrepos(paths)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   330
        for prefix, root in u.configitems(b'collections'):
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   331
            prefix = util.pconvert(prefix)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13964
diff changeset
   332
            for path in scmutil.walkrepos(root, followsym=True):
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   333
                repo = os.path.normpath(path)
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   334
                name = util.pconvert(repo)
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   335
                if name.startswith(prefix):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   336
                    name = name[len(prefix) :]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   337
                repos.append((name.lstrip(b'/'), repo))
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   338
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   339
        self.repos = repos
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   340
        self.ui = u
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   341
        encoding.encoding = self.ui.config(b'web', b'encoding')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   342
        self.style = self.ui.config(b'web', b'style')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
        self.templatepath = self.ui.config(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   344
            b'web', b'templates', untrusted=False
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   345
        )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   346
        self.stripecount = self.ui.config(b'web', b'stripes')
8621
13613221caf1 hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8537
diff changeset
   347
        if self.stripecount:
13613221caf1 hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8537
diff changeset
   348
            self.stripecount = int(self.stripecount)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   349
        prefix = self.ui.config(b'web', b'prefix')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   350
        if prefix.startswith(b'/'):
18515
bf8bbbf4aa45 hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18258
diff changeset
   351
            prefix = prefix[1:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   352
        if prefix.endswith(b'/'):
18515
bf8bbbf4aa45 hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18258
diff changeset
   353
            prefix = prefix[:-1]
bf8bbbf4aa45 hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18258
diff changeset
   354
        self.prefix = prefix
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   355
        self.lastrefresh = time.time()
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
   356
2535
b8ccf6386db7 Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents: 2514
diff changeset
   357
    def run(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   358
        if not encoding.environ.get(b'GATEWAY_INTERFACE', b'').startswith(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
            b"CGI/1."
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   360
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   361
            raise RuntimeError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   362
                b"This function is only intended to be "
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   363
                b"called while running as a CGI script."
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   364
            )
5566
d74fc8dec2b4 Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5561
diff changeset
   365
        wsgicgi.launch(self)
d74fc8dec2b4 Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5561
diff changeset
   366
d74fc8dec2b4 Less indirection in the WSGI web interface. This simplifies some code, and makes it more compliant with WSGI.
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5561
diff changeset
   367
    def __call__(self, env, respond):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   368
        baseurl = self.ui.config(b'web', b'baseurl')
36917
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   369
        req = requestmod.parserequestfromenv(env, altbaseurl=baseurl)
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   370
        res = requestmod.wsgiresponse(req, respond)
7336
2dc868712dcc hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents: 7225
diff changeset
   371
36917
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   372
        return self.run_wsgi(req, res)
7336
2dc868712dcc hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents: 7225
diff changeset
   373
36917
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   374
    def run_wsgi(self, req, res):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   375
        profile = self.ui.configbool(b'profiling', b'enabled')
32808
eede022fc142 profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32004
diff changeset
   376
        with profiling.profile(self.ui, enabled=profile):
35854
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   377
            try:
36984
c479692690ef merge with stable
Augie Fackler <augie@google.com>
parents: 36926 35854
diff changeset
   378
                for r in self._runwsgi(req, res):
35854
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   379
                    yield r
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   380
            finally:
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   381
                # There are known cycles in localrepository that prevent
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   382
                # those objects (and tons of held references) from being
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   383
                # collected through normal refcounting. We mitigate those
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   384
                # leaks by performing an explicit GC on every request.
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   385
                # TODO remove this once leaks are fixed.
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   386
                # TODO only run this on requests that create localrepository
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   387
                # instances instead of every request.
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   388
                gc.collect()
29797
fc2442492606 hgweb: abstract call to hgwebdir wsgi function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29471
diff changeset
   389
36917
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   390
    def _runwsgi(self, req, res):
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   391
        try:
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   392
            self.refresh()
5603
74f65f44a9aa hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5602
diff changeset
   393
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   394
            csp, nonce = cspvalues(self.ui)
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   395
            if csp:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   396
                res.headers[b'Content-Security-Policy'] = csp
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   397
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   398
            virtual = req.dispatchpath.strip(b'/')
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   399
            tmpl = self.templater(req, nonce)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   400
            ctype = tmpl.render(b'mimetype', {b'encoding': encoding.encoding})
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5603
diff changeset
   401
36879
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
   402
            # Global defaults. These can be overridden by any handler.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   403
            res.status = b'200 Script output follows'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   404
            res.headers[b'Content-Type'] = ctype
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5603
diff changeset
   405
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   406
            # a static file
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   407
            if virtual.startswith(b'static/') or b'static' in req.qsparams:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   408
                if virtual.startswith(b'static/'):
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   409
                    fname = virtual[7:]
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   410
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   411
                    fname = req.qsparams[b'static']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   412
                static = self.ui.config(b"web", b"static", untrusted=False)
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   413
                if not static:
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   414
                    tp = self.templatepath or templater.templatepaths()
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   415
                    if isinstance(tp, str):
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   416
                        tp = [tp]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   417
                    static = [os.path.join(p, b'static') for p in tp]
36879
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
   418
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
   419
                staticfile(static, fname, res)
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
   420
                return res.sendresponse()
5603
74f65f44a9aa hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5602
diff changeset
   421
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   422
            # top-level index
31489
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   423
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   424
            repos = dict(self.repos)
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   425
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   426
            if (not virtual or virtual == b'index') and virtual not in repos:
36911
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36910
diff changeset
   427
                return self.makeindex(req, res, tmpl)
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   428
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   429
            # nested indexes and hgwebs
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6046
diff changeset
   430
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   431
            if virtual.endswith(b'/index') and virtual not in repos:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   432
                subdir = virtual[: -len(b'index')]
31489
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   433
                if any(r.startswith(subdir) for r in repos):
36911
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36910
diff changeset
   434
                    return self.makeindex(req, res, tmpl, subdir)
31489
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   435
32004
bd3cb917761a hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents: 31489
diff changeset
   436
            def _virtualdirs():
42365
d8e55c0c642c util: make util.dirs() and util.finddirs() include root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41387
diff changeset
   437
                # Check the full virtual path, and each parent
d8e55c0c642c util: make util.dirs() and util.finddirs() include root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41387
diff changeset
   438
                yield virtual
d8e55c0c642c util: make util.dirs() and util.finddirs() include root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41387
diff changeset
   439
                for p in util.finddirs(virtual):
d8e55c0c642c util: make util.dirs() and util.finddirs() include root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41387
diff changeset
   440
                    yield p
32004
bd3cb917761a hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents: 31489
diff changeset
   441
bd3cb917761a hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents: 31489
diff changeset
   442
            for virtualrepo in _virtualdirs():
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   443
                real = repos.get(virtualrepo)
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   444
                if real:
36903
d7fd203e36cc hgweb: refactor repository name URL parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36901
diff changeset
   445
                    # Re-parse the WSGI environment to take into account our
d7fd203e36cc hgweb: refactor repository name URL parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36901
diff changeset
   446
                    # repository path component.
37712
a728e3695325 hgwebdir: un-bytes the env dict before re-parsing env
Augie Fackler <augie@google.com>
parents: 37515
diff changeset
   447
                    uenv = req.rawenv
a728e3695325 hgwebdir: un-bytes the env dict before re-parsing env
Augie Fackler <augie@google.com>
parents: 37515
diff changeset
   448
                    if pycompat.ispy3:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   449
                        uenv = {
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
   450
                            k.decode('latin1'): v
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
   451
                            for k, v in pycompat.iteritems(uenv)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   452
                        }
36917
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   453
                    req = requestmod.parserequestfromenv(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   454
                        uenv,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   455
                        reponame=virtualrepo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   456
                        altbaseurl=self.ui.config(b'web', b'baseurl'),
37818
877185de62cf hgweb: reuse body file object when hgwebdir calls hgweb (issue5851)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37712
diff changeset
   457
                        # Reuse wrapped body file object otherwise state
877185de62cf hgweb: reuse body file object when hgwebdir calls hgweb (issue5851)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37712
diff changeset
   458
                        # tracking can get confused.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   459
                        bodyfh=req.bodyfh,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   460
                    )
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   461
                    try:
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   462
                        # ensure caller gets private copy of ui
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   463
                        repo = hg.repository(self.ui.copy(), real)
36917
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36914
diff changeset
   464
                        return hgweb_mod.hgweb(repo).run_wsgi(req, res)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25488
diff changeset
   465
                    except IOError as inst:
34040
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 33328
diff changeset
   466
                        msg = encoding.strtolocal(inst.strerror)
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   467
                        raise ErrorResponse(HTTP_SERVER_ERROR, msg)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25488
diff changeset
   468
                    except error.RepoError as inst:
34359
8cbcee0b923d py3: remove use of str() in hgwebdir
Yuya Nishihara <yuya@tcha.org>
parents: 34264
diff changeset
   469
                        raise ErrorResponse(HTTP_SERVER_ERROR, bytes(inst))
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   470
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   471
            # browse subdirectories
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   472
            subdir = virtual + b'/'
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   473
            if [r for r in repos if r.startswith(subdir)]:
36911
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36910
diff changeset
   474
                return self.makeindex(req, res, tmpl, subdir)
5603
74f65f44a9aa hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5602
diff changeset
   475
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   476
            # prefixes not found
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   477
            res.status = b'404 Not Found'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   478
            res.setbodygen(tmpl.generate(b'notfound', {b'repo': virtual}))
36913
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36912
diff changeset
   479
            return res.sendresponse()
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5603
diff changeset
   480
36913
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36912
diff changeset
   481
        except ErrorResponse as e:
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36912
diff changeset
   482
            res.status = statusmessage(e.code, pycompat.bytestr(e))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   483
            res.setbodygen(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   484
                tmpl.generate(b'error', {b'error': e.message or b''})
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   485
            )
36913
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36912
diff changeset
   486
            return res.sendresponse()
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   487
        finally:
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   488
            tmpl = None
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   489
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   490
    def makeindex(self, req, res, tmpl, subdir=b""):
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   491
        self.refresh()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   492
        sortable = [b"name", b"description", b"contact", b"lastchange"]
36899
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36898
diff changeset
   493
        sortcolumn, descending = None, False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   494
        if b'sort' in req.qsparams:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   495
            sortcolumn = req.qsparams[b'sort']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   496
            descending = sortcolumn.startswith(b'-')
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   497
            if descending:
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   498
                sortcolumn = sortcolumn[1:]
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   499
            if sortcolumn not in sortable:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   500
                sortcolumn = b""
4841
9b0ebb5e0f94 hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents: 4709
diff changeset
   501
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   502
        sort = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   503
            (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   504
                b"sort_%s" % column,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   505
                b"%s%s"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   506
                % (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   507
                    (not descending and column == sortcolumn) and b"-" or b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   508
                    column,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   509
                ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   510
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   511
            for column in sortable
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   512
        ]
5928
3340aa5a64f7 hgweb: move HTTP content types out of header templates
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5915
diff changeset
   513
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   514
        self.refresh()
6221
2eb18c780287 Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents: 6217
diff changeset
   515
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   516
        entries = indexentries(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   517
            self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   518
            self.repos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   519
            req,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   520
            self.stripecount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   521
            sortcolumn=sortcolumn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   522
            descending=descending,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   523
            subdir=subdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   524
        )
6221
2eb18c780287 Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents: 6217
diff changeset
   525
37022
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36992
diff changeset
   526
        mapping = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   527
            b'entries': entries,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   528
            b'subdir': subdir,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   529
            b'pathdef': hgweb_mod.makebreadcrumb(b'/' + subdir, self.prefix),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   530
            b'sortcolumn': sortcolumn,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   531
            b'descending': descending,
37022
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36992
diff changeset
   532
        }
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36992
diff changeset
   533
        mapping.update(sort)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   534
        res.setbodygen(tmpl.generate(b'index', mapping))
36911
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36910
diff changeset
   535
        return res.sendresponse()
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   536
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   537
    def templater(self, req, nonce):
34233
cf08aaaea7f0 web: use '_unset' default value for proxy config method
Boris Feld <boris.feld@octobus.net>
parents: 34146
diff changeset
   538
        def config(section, name, default=uimod._unset, untrusted=True):
8191
35604226d712 hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents: 8190
diff changeset
   539
            return self.ui.config(section, name, default, untrusted)
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   540
8216
25266fe996b0 hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8215
diff changeset
   541
        vars = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   542
        styles, (style, mapfile) = hgweb_mod.getstyle(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   543
            req, config, self.templatepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   544
        )
9842
d3dbdca92458 hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9724
diff changeset
   545
        if style == styles[0]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   546
            vars[b'style'] = style
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   547
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   548
        sessionvars = webutil.sessionvars(vars, b'?')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   549
        logourl = config(b'web', b'logourl')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   550
        logoimg = config(b'web', b'logoimg')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   551
        staticurl = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   552
            config(b'web', b'staticurl')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   553
            or req.apppath.rstrip(b'/') + b'/static/'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   554
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   555
        if not staticurl.endswith(b'/'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   556
            staticurl += b'/'
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   557
28954
f97a0bcfd7a1 templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents: 27046
diff changeset
   558
        defaults = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   559
            b"encoding": encoding.encoding,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   560
            b"url": req.apppath + b'/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
            b"logourl": logourl,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   562
            b"logoimg": logoimg,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   563
            b"staticurl": staticurl,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   564
            b"sessionvars": sessionvars,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   565
            b"style": style,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   566
            b"nonce": nonce,
28954
f97a0bcfd7a1 templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents: 27046
diff changeset
   567
        }
38967
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   568
        templatekeyword = registrar.templatekeyword(defaults)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42365
diff changeset
   569
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   570
        @templatekeyword(b'motd', requires=())
38967
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   571
        def motd(context, mapping):
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   572
            if self.motd is not None:
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   573
                yield self.motd
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   574
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   575
                yield config(b'web', b'motd')
38967
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   576
28954
f97a0bcfd7a1 templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents: 27046
diff changeset
   577
        tmpl = templater.templater.frommapfile(mapfile, defaults=defaults)
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   578
        return tmpl