mercurial/hgweb/hgwebdir_mod.py
author pacien <pacien.trangirard@pacien.net>
Thu, 22 Sep 2022 16:09:53 +0200
changeset 49499 4f36738a869a
parent 48946 642e31cb55f0
child 51296 3972d090aba2
permissions -rw-r--r--
tests: fix http-bad-server expected errors for python 3.10 (issue6643) The format of the error message changed with this version of Python. This also removes obsolete Python 3 checks.
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>
46819
d4ba4d51f85f contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents: 45378
diff changeset
     4
# Copyright 2005, 2006 Olivia Mackall <olivia@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
36845
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
    10
import gc
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    11
import os
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    12
import time
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    13
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    14
from ..i18n import _
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    15
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    16
from .common import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    17
    ErrorResponse,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    18
    HTTP_SERVER_ERROR,
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
    19
    cspvalues,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    20
    get_contact,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    21
    get_mtime,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    22
    ismember,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    23
    paritygen,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    24
    staticfile,
36907
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36906
diff changeset
    25
    statusmessage,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    26
)
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
from .. import (
34244
fe5202bef5ce configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents: 34243
diff changeset
    29
    configitems,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    30
    encoding,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    31
    error,
40728
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39793
diff changeset
    32
    extensions,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    33
    hg,
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
    34
    pathutil,
29787
80df04266a16 hgweb: profile HTTP requests
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29786
diff changeset
    35
    profiling,
34358
8cbcee0b923d py3: remove use of str() in hgwebdir
Yuya Nishihara <yuya@tcha.org>
parents: 34257
diff changeset
    36
    pycompat,
44245
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
    37
    rcutil,
38928
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
    38
    registrar,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    39
    scmutil,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    40
    templater,
37508
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37019
diff changeset
    41
    templateutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    42
    ui as uimod,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    43
    util,
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
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    46
from . import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    47
    hgweb_mod,
36804
b9b968e21f78 hgweb: rename req to wsgireq
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36607
diff changeset
    48
    request as requestmod,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    49
    webutil,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    50
    wsgicgi,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27045
diff changeset
    51
)
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 34703
diff changeset
    52
from ..utils import dateutil
138
c77a679e9cfa Revamped templated hgweb
mpm@selenic.com
parents: 137
diff changeset
    53
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
    54
8215
227707c90548 hgweb: some cleanups in hgwebdir, remove double defaults
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8209
diff changeset
    55
def cleannames(items):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    56
    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
    57
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
    58
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    59
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
    60
    repos = []
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
    61
    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
    62
        roothead, roottail = os.path.split(root)
17104
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    63
        # "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
    64
        # /bar/ be served as as foo/N .
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    65
        # '*' will not search inside dirs with .hg (except .hg/patches),
5a9acb0b2086 help: improve hgweb help
Mads Kiilerich <mads@kiilerich.com>
parents: 16754
diff changeset
    66
        # '**' 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
    67
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    68
            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
    69
        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
    70
            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
    71
            continue
47627
aceede7c4929 windows: use abspath in hgwebdir
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 46819
diff changeset
    72
        roothead = os.path.normpath(util.abspath(roothead))
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13964
diff changeset
    73
        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
    74
        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
    75
    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
    76
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
    77
13402
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    78
def urlrepos(prefix, roothead, paths):
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    79
    """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
    80
13538
d24e97fd52a9 test-doctest: handle unix/windows path discrepancies
Patrick Mezard <pmezard@gmail.com>
parents: 13436
diff changeset
    81
    >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
    82
    >>> 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
    83
    [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
34131
0fa781320203 doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents: 34022
diff changeset
    84
    >>> 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
    85
    [('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
    86
    """
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    87
    for path in paths:
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    88
        path = os.path.normpath(path)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
    89
        yield (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
    90
            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
    91
        ).strip(b'/'), path
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
    92
13402
f947d9a4c45c hgweb: doctest of url creation from wildcard expansion
Mads Kiilerich <mads@kiilerich.com>
parents: 13214
diff changeset
    93
36890
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
    94
def readallowed(ui, req):
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
    95
    """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: 36889
diff changeset
    96
    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: 36889
diff changeset
    97
    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: 36889
diff changeset
    98
    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: 36889
diff changeset
    99
    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: 36889
diff changeset
   100
    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: 36889
diff changeset
   101
    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: 36889
diff changeset
   102
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   103
    user = req.remoteuser
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   104
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   105
    deny_read = ui.configlist(b'web', b'deny_read', untrusted=True)
36890
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   106
    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: 36889
diff changeset
   107
        return False
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   108
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   109
    allow_read = ui.configlist(b'web', b'allow_read', untrusted=True)
36890
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   110
    # 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: 36889
diff changeset
   111
    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: 36889
diff changeset
   112
        return True
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   113
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   114
    return False
f8d6d9b29b39 hgweb: move readallowed to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   115
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   116
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   117
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
   118
    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
   119
    collapse = ui.configbool(b'web', b'collapse')
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   120
    seenrepos = set()
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   121
    seendirs = set()
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   122
    for name, path in repos:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   123
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   124
        if not name.startswith(subdir):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   125
            continue
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   126
        name = name[len(subdir) :]
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   127
        directory = False
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   128
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   129
        if b'/' in name:
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   130
            if not descend:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   131
                continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   132
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
            nameparts = name.split(b'/')
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   134
            rootname = nameparts[0]
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   135
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   136
            if not collapse:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   137
                pass
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   138
            elif rootname in seendirs:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   139
                continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   140
            elif rootname in seenrepos:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   141
                pass
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   142
            else:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   143
                directory = True
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   144
                name = rootname
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   145
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   146
                # 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
   147
                discarded = b'/'.join(nameparts[1:])
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   148
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   149
                # remove name parts plus accompanying slash
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   150
                path = path[: -len(discarded) - 1]
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   151
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   152
                try:
41365
876494fd967d cleanup: delete lots of unused local variables
Martin von Zweigbergk <martinvonz@google.com>
parents: 41319
diff changeset
   153
                    hg.repository(ui, path)
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   154
                    directory = False
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   155
                except (IOError, error.RepoError):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   156
                    pass
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   157
36902
e473a032f38a hgweb: rewrite path generation for index entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36901
diff changeset
   158
        parts = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   159
            req.apppath.strip(b'/'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   160
            subdir.strip(b'/'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   161
            name.strip(b'/'),
36902
e473a032f38a hgweb: rewrite path generation for index entries
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36901
diff changeset
   162
        ]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   163
        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
   164
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   165
        # show either a directory entry or a repository
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   166
        if directory:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   167
            # get the directory's time information
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   168
            try:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   169
                d = (get_mtime(path), dateutil.makedate()[1])
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   170
            except OSError:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   171
                continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   172
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   173
            # add '/' to the name to make it obvious that
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   174
            # the entry is a directory, not a regular repository
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   175
            row = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   176
                b'contact': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   177
                b'contact_sort': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   178
                b'name': name + b'/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   179
                b'name_sort': name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   180
                b'url': url,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   181
                b'description': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   182
                b'description_sort': b"",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   183
                b'lastchange': d,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   184
                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
   185
                b'archives': templateutil.mappinglist([]),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   186
                b'isdirectory': True,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   187
                b'labels': templateutil.hybridlist([], name=b'label'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   188
            }
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   189
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   190
            seendirs.add(name)
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   191
            yield row
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   192
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   193
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   194
        u = ui.copy()
44245
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
   195
        if rcutil.use_repo_hgrc():
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
   196
            try:
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
   197
                u.readconfig(os.path.join(path, b'.hg', b'hgrc'))
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
   198
            except Exception as e:
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
   199
                u.warn(_(b'error reading %s/.hg/hgrc: %s\n') % (path, e))
bf23d6ee7ec7 config: also respect HGRCSKIPREPO in hgwebdir_mod
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43986
diff changeset
   200
                continue
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   201
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   202
        def get(section, name, default=uimod._unset):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   203
            return u.config(section, name, default, untrusted=True)
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   204
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   205
        if u.configbool(b"web", b"hidden", untrusted=True):
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   206
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   207
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   208
        if not readallowed(u, req):
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   209
            continue
15003
a31b8e03af28 hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents: 15002
diff changeset
   210
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   211
        # update time with local timezone
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   212
        try:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   213
            r = hg.repository(ui, path)
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   214
        except IOError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   215
            u.warn(_(b'error accessing repository at %s\n') % path)
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   216
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   217
        except error.RepoError:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   218
            u.warn(_(b'error accessing repository at %s\n') % path)
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   219
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   220
        try:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   221
            d = (get_mtime(r.spath), dateutil.makedate()[1])
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   222
        except OSError:
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   223
            continue
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   224
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   225
        contact = get_contact(get)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   226
        description = get(b"web", b"description")
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   227
        seenrepos.add(name)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   228
        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
   229
        labels = u.configlist(b'web', b'labels', untrusted=True)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   230
        row = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   231
            b'contact': contact or b"unknown",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   232
            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
   233
            b'name': name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   234
            b'name_sort': name,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
            b'url': url,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
            b'description': description or b"unknown",
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
            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
   238
            b'lastchange': d,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   239
            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
   240
            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
   241
            b'isdirectory': None,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   242
            b'labels': templateutil.hybridlist(labels, name=b'label'),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   243
        }
36892
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   244
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   245
        yield row
f370f1b4f12c hgweb: move rawentries() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   246
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   247
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   248
def _indexentriesgen(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   249
    context, ui, repos, req, stripecount, sortcolumn, descending, subdir
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   250
):
36904
092ab4ba7ee5 hgweb: don't pass wsgireq to makeindex and other functions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36903
diff changeset
   251
    rows = rawindexentries(ui, repos, req, subdir=subdir)
36893
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   252
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   253
    sortdefault = None, False
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   254
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   255
    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
   256
        sortkey = b'%s_sort' % sortcolumn
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   257
        rows = sorted(rows, key=lambda x: x[sortkey], reverse=descending)
36893
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   258
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   259
    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
   260
        row[b'parity'] = parity
36893
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   261
        yield row
15003
a31b8e03af28 hgweb: extract the path logic from updatereqenv and add doctests
Matt Mackall <mpm@selenic.com>
parents: 15002
diff changeset
   262
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   263
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   264
def indexentries(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   265
    ui, repos, req, stripecount, sortcolumn=b'', descending=False, subdir=b''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   266
):
37508
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37019
diff changeset
   267
    args = (ui, repos, req, stripecount, sortcolumn, descending, subdir)
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37019
diff changeset
   268
    return templateutil.mappinggenerator(_indexentriesgen, args=args)
30a7b32897f1 hgwebdir: wrap {entries} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37019
diff changeset
   269
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   270
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48904
diff changeset
   271
class hgwebdir:
26132
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   272
    """HTTP server for multiple repositories.
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   273
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   274
    Given a configuration, different repositories will be served depending
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   275
    on the request path.
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   276
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   277
    Instances are typically used as WSGI applications.
9df8c729e2e7 hgweb: add some documentation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26072
diff changeset
   278
    """
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   279
8191
35604226d712 hgweb: kill parentui references
Matt Mackall <mpm@selenic.com>
parents: 8190
diff changeset
   280
    def __init__(self, conf, baseui=None):
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   281
        self.conf = conf
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   282
        self.baseui = baseui
26072
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   283
        self.ui = None
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   284
        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
   285
        self.motd = None
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   286
        self.refresh()
47802
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   287
        self.requests_count = 0
40728
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39793
diff changeset
   288
        if not baseui:
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39793
diff changeset
   289
            # set up environment for new ui
2cd5f1fac788 hgweb: load globally-enabled extensions explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 39793
diff changeset
   290
            extensions.loadall(self.ui)
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40728
diff changeset
   291
            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
   292
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   293
    def refresh(self):
26072
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   294
        if self.ui:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   295
            refreshinterval = self.ui.configint(b'web', b'refreshinterval')
34244
fe5202bef5ce configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents: 34243
diff changeset
   296
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   297
            item = configitems.coreitems[b'web'][b'refreshinterval']
34244
fe5202bef5ce configitems: register the 'web.refreshinterval' config
Boris Feld <boris.feld@octobus.net>
parents: 34243
diff changeset
   298
            refreshinterval = item.default
26072
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   299
06320fb11699 hgweb: make refresh interval configurable
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25660
diff changeset
   300
        # refreshinterval <= 0 means to always refresh.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   301
        if (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   302
            refreshinterval > 0
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   303
            and self.lastrefresh + refreshinterval > time.time()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   304
        ):
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   305
            return
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   306
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   307
        if self.baseui:
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   308
            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
   309
        else:
30559
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 29787
diff changeset
   310
            u = uimod.ui.load()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   311
            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
   312
            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
   313
            # 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
   314
            # break some wsgi implementations.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   315
            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
   316
8529
a767998f0a78 hgweb: make hgwebdir handle dict/list paths the same as config paths
Jeremy Whitlock <jcscoobyrs@gmail.com>
parents: 8389
diff changeset
   317
        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
   318
            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
   319
            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
   320
                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
   321
            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
   322
            paths = []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   323
            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
   324
                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
   325
                    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
   326
        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
   327
            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
   328
        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
   329
            paths = self.conf.items()
40729
c93d046d4300 extensions: add "uipopulate" hook, called per instance, not per process
Yuya Nishihara <yuya@tcha.org>
parents: 40728
diff changeset
   330
        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
   331
11239
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   332
        repos = findrepos(paths)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   333
        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
   334
            prefix = util.pconvert(prefix)
13975
938fbeacac84 move walkrepos from util to scmutil
Adrian Buehlmann <adrian@cadifra.com>
parents: 13964
diff changeset
   335
            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
   336
                repo = os.path.normpath(path)
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   337
                name = util.pconvert(repo)
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   338
                if name.startswith(prefix):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   339
                    name = name[len(prefix) :]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   340
                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
   341
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   342
        self.repos = repos
99bc18d1ab0f hgweb: fix race in refreshing repo list (issue2188)
Matt Mackall <mpm@selenic.com>
parents: 10675
diff changeset
   343
        self.ui = u
47802
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   344
        self.gc_full_collect_rate = self.ui.configint(
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   345
            b'experimental', b'web.full-garbage-collection-rate'
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   346
        )
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   347
        self.gc_full_collections_done = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   348
        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
   349
        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
   350
        self.templatepath = self.ui.config(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   351
            b'web', b'templates', untrusted=False
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   352
        )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   353
        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
   354
        if self.stripecount:
13613221caf1 hgweb: extract config values after reading webdir-config
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8537
diff changeset
   355
            self.stripecount = int(self.stripecount)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   356
        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
   357
        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
   358
            prefix = prefix[1:]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   359
        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
   360
            prefix = prefix[:-1]
bf8bbbf4aa45 hgwebdir: use web.prefix when creating url breadcrumbs (issue3790)
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18258
diff changeset
   361
        self.prefix = prefix
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   362
        self.lastrefresh = time.time()
941
4cf418c2a013 Add a multi-repository server
mpm@selenic.com
parents: 939
diff changeset
   363
2535
b8ccf6386db7 Arrange for old copies of CGI scripts to still work.
Eric Hopper <hopper@omnifarious.org>
parents: 2514
diff changeset
   364
    def run(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   365
        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
   366
            b"CGI/1."
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   367
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   368
            raise RuntimeError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   369
                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
   370
                b"called while running as a CGI script."
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   371
            )
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
   372
        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
   373
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
   374
    def __call__(self, env, respond):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   375
        baseurl = self.ui.config(b'web', b'baseurl')
36911
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   376
        req = requestmod.parserequestfromenv(env, altbaseurl=baseurl)
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   377
        res = requestmod.wsgiresponse(req, respond)
7336
2dc868712dcc hgweb: support for deny_read/allow_read options
Mark Edgington <edgimar@gmail.com>
parents: 7225
diff changeset
   378
36911
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   379
        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
   380
36911
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   381
    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
   382
        profile = self.ui.configbool(b'profiling', b'enabled')
32788
eede022fc142 profile: drop maybeprofile
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32004
diff changeset
   383
        with profiling.profile(self.ui, enabled=profile):
36845
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   384
            try:
36978
c479692690ef merge with stable
Augie Fackler <augie@google.com>
parents: 36920 36845
diff changeset
   385
                for r in self._runwsgi(req, res):
36845
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   386
                    yield r
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   387
            finally:
ff2370a70fe8 hgweb: garbage collect on every request
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34703
diff changeset
   388
                # 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
   389
                # those objects (and tons of held references) from being
47802
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   390
                # collected through normal refcounting.
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   391
                # In some cases, the resulting memory consumption can
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   392
                # be tamed by performing explicit garbage collections.
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   393
                # In presence of actual leaks or big long-lived caches, the
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   394
                # impact on performance of such collections can become a
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   395
                # problem, hence the rate shouldn't be set too low.
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   396
                # See "Collecting the oldest generation" in
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   397
                # https://devguide.python.org/garbage_collector
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   398
                # for more about such trade-offs.
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   399
                rate = self.gc_full_collect_rate
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   400
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   401
                # this is not thread safe, but the consequence (skipping
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   402
                # a garbage collection) is arguably better than risking
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   403
                # to have several threads perform a collection in parallel
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   404
                # (long useless wait on all threads).
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   405
                self.requests_count += 1
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   406
                if rate > 0 and self.requests_count % rate == 0:
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   407
                    gc.collect()
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   408
                    self.gc_full_collections_done += 1
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   409
                else:
de2e04fe4897 hgwebdir: avoid systematic full garbage collection
Georges Racinet <georges.racinet@octobus.net>
parents: 47627
diff changeset
   410
                    gc.collect(generation=1)
29786
fc2442492606 hgweb: abstract call to hgwebdir wsgi function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 29471
diff changeset
   411
36911
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   412
    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
   413
        try:
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   414
            self.refresh()
5603
74f65f44a9aa hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5602
diff changeset
   415
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   416
            csp, nonce = cspvalues(self.ui)
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   417
            if csp:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   418
                res.headers[b'Content-Security-Policy'] = csp
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   419
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   420
            virtual = req.dispatchpath.strip(b'/')
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   421
            tmpl = self.templater(req, nonce)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   422
            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
   423
36873
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36865
diff changeset
   424
            # 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
   425
            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
   426
            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
   427
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   428
            # a static file
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   429
            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
   430
                if virtual.startswith(b'static/'):
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   431
                    fname = virtual[7:]
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   432
                else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   433
                    fname = req.qsparams[b'static']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   434
                static = self.ui.config(b"web", b"static", untrusted=False)
45378
dc9fe90bdbd5 hgweb: let staticfile() look up path from default location unless provided
Martin von Zweigbergk <martinvonz@google.com>
parents: 45318
diff changeset
   435
                staticfile(self.templatepath, static, fname, res)
36873
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36865
diff changeset
   436
                return res.sendresponse()
5603
74f65f44a9aa hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5602
diff changeset
   437
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   438
            # top-level index
31482
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   439
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   440
            repos = dict(self.repos)
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   441
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   442
            if (not virtual or virtual == b'index') and virtual not in repos:
36905
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36904
diff changeset
   443
                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
   444
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   445
            # nested indexes and hgwebs
6210
942287cb1f57 Removed trailing spaces from everything except test output
Thomas Arendsen Hein <thomas@intevation.de>
parents: 6046
diff changeset
   446
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   447
            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
   448
                subdir = virtual[: -len(b'index')]
31482
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   449
                if any(r.startswith(subdir) for r in repos):
36905
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36904
diff changeset
   450
                    return self.makeindex(req, res, tmpl, subdir)
31482
da7d19324b1e hgwebdir: add support for explicit index files
Matt Harbison <matt_harbison@yahoo.com>
parents: 30766
diff changeset
   451
32004
bd3cb917761a hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents: 31482
diff changeset
   452
            def _virtualdirs():
42343
d8e55c0c642c util: make util.dirs() and util.finddirs() include root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
   453
                # 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: 41365
diff changeset
   454
                yield virtual
43633
0b7733719d21 utils: move finddirs() to pathutil
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   455
                for p in pathutil.finddirs(virtual):
42343
d8e55c0c642c util: make util.dirs() and util.finddirs() include root directory (API)
Martin von Zweigbergk <martinvonz@google.com>
parents: 41365
diff changeset
   456
                    yield p
32004
bd3cb917761a hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents: 31482
diff changeset
   457
bd3cb917761a hgwebdir: allow a repository to be hosted at "/"
Matt Harbison <matt_harbison@yahoo.com>
parents: 31482
diff changeset
   458
            for virtualrepo in _virtualdirs():
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   459
                real = repos.get(virtualrepo)
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   460
                if real:
36897
d7fd203e36cc hgweb: refactor repository name URL parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   461
                    # Re-parse the WSGI environment to take into account our
d7fd203e36cc hgweb: refactor repository name URL parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36895
diff changeset
   462
                    # repository path component.
48904
7dc430b85351 hgweb: simplify uenv assignment
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   463
                    uenv = {
7dc430b85351 hgweb: simplify uenv assignment
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   464
                        k.decode('latin1'): v for k, v in req.rawenv.items()
7dc430b85351 hgweb: simplify uenv assignment
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   465
                    }
36911
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   466
                    req = requestmod.parserequestfromenv(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   467
                        uenv,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   468
                        reponame=virtualrepo,
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   469
                        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
   470
                        # 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
   471
                        # tracking can get confused.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   472
                        bodyfh=req.bodyfh,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   473
                    )
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   474
                    try:
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   475
                        # ensure caller gets private copy of ui
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   476
                        repo = hg.repository(self.ui.copy(), real)
36911
f0a851542a05 hgweb: remove wsgirequest (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36908
diff changeset
   477
                        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
   478
                    except IOError as inst:
34022
d5b2beca16c0 python3: wrap all uses of <exception>.strerror with strtolocal
Augie Fackler <raf@durin42.com>
parents: 33328
diff changeset
   479
                        msg = encoding.strtolocal(inst.strerror)
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   480
                        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
   481
                    except error.RepoError as inst:
34358
8cbcee0b923d py3: remove use of str() in hgwebdir
Yuya Nishihara <yuya@tcha.org>
parents: 34257
diff changeset
   482
                        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
   483
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   484
            # browse subdirectories
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   485
            subdir = virtual + b'/'
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   486
            if [r for r in repos if r.startswith(subdir)]:
36905
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36904
diff changeset
   487
                return self.makeindex(req, res, tmpl, subdir)
5603
74f65f44a9aa hgwebdir: refactor inner loop
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5602
diff changeset
   488
25083
ef36536abea3 hgweb: use try/except/finally
Matt Mackall <mpm@selenic.com>
parents: 22634
diff changeset
   489
            # prefixes not found
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   490
            res.status = b'404 Not Found'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   491
            res.setbodygen(tmpl.generate(b'notfound', {b'repo': virtual}))
36907
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36906
diff changeset
   492
            return res.sendresponse()
5760
0145f9afb0e7 Removed tabs and trailing whitespace in python files
Thomas Arendsen Hein <thomas@intevation.de>
parents: 5603
diff changeset
   493
36907
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36906
diff changeset
   494
        except ErrorResponse as e:
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36906
diff changeset
   495
            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
   496
            res.setbodygen(
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   497
                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
   498
            )
36907
c1de7efca574 hgweb: port to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36906
diff changeset
   499
            return res.sendresponse()
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   500
        finally:
43986
71582c5ad00f hgweb: delete local variable instead of setting it to `None`
Matt Harbison <matt_harbison@yahoo.com>
parents: 43793
diff changeset
   501
            del tmpl
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   502
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   503
    def makeindex(self, req, res, tmpl, subdir=b""):
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   504
        self.refresh()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   505
        sortable = [b"name", b"description", b"contact", b"lastchange"]
36893
455918512ed2 hgweb: extract entries() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   506
        sortcolumn, descending = None, False
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   507
        if b'sort' in req.qsparams:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   508
            sortcolumn = req.qsparams[b'sort']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   509
            descending = sortcolumn.startswith(b'-')
5601
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   510
            if descending:
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   511
                sortcolumn = sortcolumn[1:]
8279cb841467 hgwebdir: split out makeindex function, facilitate test failure diagnosis
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5585
diff changeset
   512
            if sortcolumn not in sortable:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   513
                sortcolumn = b""
4841
9b0ebb5e0f94 hgweb: let hgwebdir browse subdirectories
Brendan Cully <brendan@kublai.com>
parents: 4709
diff changeset
   514
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   515
        sort = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   516
            (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   517
                b"sort_%s" % column,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   518
                b"%s%s"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   519
                % (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   520
                    (not descending and column == sortcolumn) and b"-" or b"",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   521
                    column,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   522
                ),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   523
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   524
            for column in sortable
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   525
        ]
5928
3340aa5a64f7 hgweb: move HTTP content types out of header templates
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5915
diff changeset
   526
8371
1bd0fdf4c1ec hgwebdir: refresh configuration periodically
Bryan O'Sullivan <bos@serpentine.com>
parents: 8360
diff changeset
   527
        self.refresh()
6221
2eb18c780287 Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents: 6217
diff changeset
   528
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   529
        entries = indexentries(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   530
            self.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   531
            self.repos,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   532
            req,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   533
            self.stripecount,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   534
            sortcolumn=sortcolumn,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   535
            descending=descending,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   536
            subdir=subdir,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   537
        )
6221
2eb18c780287 Support web.baseurl in hgwebdir, overriding SCRIPT_NAME
Brendan Cully <brendan@kublai.com>
parents: 6217
diff changeset
   538
37019
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
   539
        mapping = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   540
            b'entries': entries,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   541
            b'subdir': subdir,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   542
            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
   543
            b'sortcolumn': sortcolumn,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   544
            b'descending': descending,
37019
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
   545
        }
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36989
diff changeset
   546
        mapping.update(sort)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   547
        res.setbodygen(tmpl.generate(b'index', mapping))
36905
93717f082af9 hgweb: use modern response type for index generation
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36904
diff changeset
   548
        return res.sendresponse()
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   549
30766
d7bf7d2bd5ab hgweb: support Content Security Policy
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30749
diff changeset
   550
    def templater(self, req, nonce):
45314
d12fba074cc6 hgweb: remove some accesses to private member uimod._unset
Martin von Zweigbergk <martinvonz@google.com>
parents: 45306
diff changeset
   551
        def config(*args, **kwargs):
d12fba074cc6 hgweb: remove some accesses to private member uimod._unset
Martin von Zweigbergk <martinvonz@google.com>
parents: 45306
diff changeset
   552
            kwargs.setdefault('untrusted', True)
d12fba074cc6 hgweb: remove some accesses to private member uimod._unset
Martin von Zweigbergk <martinvonz@google.com>
parents: 45306
diff changeset
   553
            return self.ui.config(*args, **kwargs)
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   554
8216
25266fe996b0 hgweb: use new sessionvars code in hgwebdir, too
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8215
diff changeset
   555
        vars = {}
45318
1a4f925f72c3 hgweb: enable reading styles from resources in frozen binaries
Martin von Zweigbergk <martinvonz@google.com>
parents: 45314
diff changeset
   556
        styles, (style, mapfile, fp) = hgweb_mod.getstyle(
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   557
            req, config, self.templatepath
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   558
        )
9842
d3dbdca92458 hgweb: don't choke when an inexistent style is requested (issue1901)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9724
diff changeset
   559
        if style == styles[0]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   560
            vars[b'style'] = style
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   561
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   562
        sessionvars = webutil.sessionvars(vars, b'?')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   563
        logourl = config(b'web', b'logourl')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   564
        logoimg = config(b'web', b'logoimg')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   565
        staticurl = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   566
            config(b'web', b'staticurl')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   567
            or req.apppath.rstrip(b'/') + b'/static/'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   568
        )
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   569
        if not staticurl.endswith(b'/'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   570
            staticurl += b'/'
5602
d676d0f35bd8 hgwebdir: split out templater creation
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5601
diff changeset
   571
28954
f97a0bcfd7a1 templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents: 27046
diff changeset
   572
        defaults = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   573
            b"encoding": encoding.encoding,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   574
            b"url": req.apppath + b'/',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   575
            b"logourl": logourl,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   576
            b"logoimg": logoimg,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   577
            b"staticurl": staticurl,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   578
            b"sessionvars": sessionvars,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   579
            b"style": style,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   580
            b"nonce": nonce,
28954
f97a0bcfd7a1 templater: separate function to create templater from map file (API)
Yuya Nishihara <yuya@tcha.org>
parents: 27046
diff changeset
   581
        }
38928
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   582
        templatekeyword = registrar.templatekeyword(defaults)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42343
diff changeset
   583
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   584
        @templatekeyword(b'motd', requires=())
38928
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   585
        def motd(context, mapping):
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   586
            if self.motd is not None:
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   587
                yield self.motd
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   588
            else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   589
                yield config(b'web', b'motd')
38928
4167437a45dd hgweb: use registrar to add "motd" template keyword
Yuya Nishihara <yuya@tcha.org>
parents: 38745
diff changeset
   590
45318
1a4f925f72c3 hgweb: enable reading styles from resources in frozen binaries
Martin von Zweigbergk <martinvonz@google.com>
parents: 45314
diff changeset
   591
        return templater.templater.frommapfile(
1a4f925f72c3 hgweb: enable reading styles from resources in frozen binaries
Martin von Zweigbergk <martinvonz@google.com>
parents: 45314
diff changeset
   592
            mapfile, fp=fp, defaults=defaults
1a4f925f72c3 hgweb: enable reading styles from resources in frozen binaries
Martin von Zweigbergk <martinvonz@google.com>
parents: 45314
diff changeset
   593
        )