mercurial/hgweb/webutil.py
author Yuya Nishihara <yuya@tcha.org>
Mon, 19 Mar 2018 00:16:12 +0900
changeset 38265 41ae9b3cbfb9
parent 38244 688fbb758ba9
child 38267 fb874fc1d9b4
permissions -rw-r--r--
templater: abstract min/max away I'm not certain how many get*() functions I'll add to the wrapped types, but getmin() and getmax() will allow us to optimize a revset wrapper.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     1
# hgweb/webutil.py - utility library for the web interface.
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     2
#
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     3
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     4
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     5
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 7717
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: 9402
diff changeset
     7
# GNU General Public License version 2 or any later version.
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     8
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
     9
from __future__ import absolute_import
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    10
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    11
import copy
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    12
import difflib
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    13
import os
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
    14
import re
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    15
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    16
from ..i18n import _
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    17
from ..node import hex, nullid, short
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    18
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    19
from .common import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    20
    ErrorResponse,
31665
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
    21
    HTTP_BAD_REQUEST,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    22
    HTTP_NOT_FOUND,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    23
    paritygen,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    24
)
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    25
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    26
from .. import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    27
    context,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    28
    error,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    29
    match,
31808
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31727
diff changeset
    30
    mdiff,
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
    31
    obsutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    32
    patch,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    33
    pathutil,
34807
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
    34
    pycompat,
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
    35
    scmutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    36
    templatefilters,
35485
1721ce06100a hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35454
diff changeset
    37
    templatekw,
37515
8a5ee6aa8870 hgweb: wrap {archives} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37514
diff changeset
    38
    templateutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    39
    ui as uimod,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    40
    util,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    41
)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    42
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    43
from ..utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    44
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    45
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    46
37511
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    47
archivespecs = util.sortdict((
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    48
    ('zip', ('application/zip', 'zip', '.zip', None)),
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    49
    ('gz', ('application/x-gzip', 'tgz', '.tar.gz', None)),
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    50
    ('bz2', ('application/x-bzip2', 'tbz2', '.tar.bz2', None)),
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    51
))
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    52
37514
034a422aeaff hgweb: forward archivelist() of hgweb to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37513
diff changeset
    53
def archivelist(ui, nodeid, url=None):
38215
f715faeaceee config: rename allow_archive to allow-archive
David Demelier <markand@malikania.fr>
parents: 38059
diff changeset
    54
    allowed = ui.configlist('web', 'allow-archive', untrusted=True)
37513
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    55
    archives = []
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    56
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    57
    for typ, spec in archivespecs.iteritems():
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    58
        if typ in allowed or ui.configbool('web', 'allow' + typ,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    59
                                           untrusted=True):
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    60
            archives.append({
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    61
                'type': typ,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    62
                'extension': spec[2],
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    63
                'node': nodeid,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    64
                'url': url,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    65
            })
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    66
37515
8a5ee6aa8870 hgweb: wrap {archives} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37514
diff changeset
    67
    return templateutil.mappinglist(archives)
37513
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    68
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    69
def up(p):
36714
250f3168d907 hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents: 36711
diff changeset
    70
    if p[0:1] != "/":
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    71
        p = "/" + p
36714
250f3168d907 hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents: 36711
diff changeset
    72
    if p[-1:] == "/":
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    73
        p = p[:-1]
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    74
    up = os.path.dirname(p)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    75
    if up == "/":
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    76
        return "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    77
    return up + "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    78
18391
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    79
def _navseq(step, firststep=None):
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    80
    if firststep:
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    81
        yield firststep
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    82
        if firststep >= 20 and firststep <= 40:
18392
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    83
            firststep = 50
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    84
            yield firststep
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    85
        assert step > 0
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    86
        assert firststep > 0
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    87
        while step <= firststep:
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    88
            step *= 10
18390
28fa9443f751 hgweb: drop recursivity in _navseq
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18389
diff changeset
    89
    while True:
18391
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    90
        yield 1 * step
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    91
        yield 3 * step
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    92
        step *= 10
18389
82572533bc00 hgweb: move the `seq` function out of the revnavgen scope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18388
diff changeset
    93
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
    94
class revnav(object):
18320
60680d691a0b hgweb: document the revnavgen function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17991
diff changeset
    95
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
    96
    def __init__(self, repo):
18404
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
    97
        """Navigation generation object
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
    98
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
    99
        :repo: repo object we generate nav for
18404
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
   100
        """
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   101
        # used for hex generation
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   102
        self._revlog = repo.changelog
18404
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
   103
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   104
    def __nonzero__(self):
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   105
        """return True if any revision to navigate over"""
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   106
        return self._first() is not None
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   107
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31434
diff changeset
   108
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31434
diff changeset
   109
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   110
    def _first(self):
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   111
        """return the minimum non-filtered changeset or None"""
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   112
        try:
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   113
            return next(iter(self._revlog))
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   114
        except StopIteration:
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   115
            return None
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   116
18405
1eaf0d017b2c hgweb: move hex creation into an object method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18404
diff changeset
   117
    def hex(self, rev):
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   118
        return hex(self._revlog.node(rev))
18405
1eaf0d017b2c hgweb: move hex creation into an object method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18404
diff changeset
   119
18404
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
   120
    def gen(self, pos, pagelen, limit):
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   121
        """computes label and revision id for navigation link
18320
60680d691a0b hgweb: document the revnavgen function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17991
diff changeset
   122
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   123
        :pos: is the revision relative to which we generate navigation.
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   124
        :pagelen: the size of each navigation page
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   125
        :limit: how far shall we link
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   126
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   127
        The return is:
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   128
            - a single element mappinglist
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   129
            - containing a dictionary with a `before` and `after` key
37697
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   130
            - values are dictionaries with `label` and `node` keys
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   131
        """
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   132
        if not self:
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   133
            # empty repo
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   134
            return templateutil.mappinglist([
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   135
                {'before': templateutil.mappinglist([]),
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   136
                 'after': templateutil.mappinglist([])},
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   137
            ])
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   138
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   139
        targets = []
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   140
        for f in _navseq(1, pagelen):
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   141
            if f > limit:
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   142
                break
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   143
            targets.append(pos + f)
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   144
            targets.append(pos - f)
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   145
        targets.sort()
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   146
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   147
        first = self._first()
37697
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   148
        navbefore = [{'label': '(%i)' % first, 'node': self.hex(first)}]
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   149
        navafter = []
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   150
        for rev in targets:
18426
01638b51df44 hgweb: ignore filtered revision in revnav
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18425
diff changeset
   151
            if rev not in self._revlog:
01638b51df44 hgweb: ignore filtered revision in revnav
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18425
diff changeset
   152
                continue
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   153
            if pos < rev < limit:
37697
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   154
                navafter.append({'label': '+%d' % abs(rev - pos),
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   155
                                 'node': self.hex(rev)})
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   156
            if 0 < rev < pos:
37697
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   157
                navbefore.append({'label': '-%d' % abs(rev - pos),
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   158
                                  'node': self.hex(rev)})
10254
8d5de52431f2 hgweb: changenav: separate pages before and after the current position
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9402
diff changeset
   159
37697
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   160
        navafter.append({'label': 'tip', 'node': 'tip'})
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   161
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   162
        # TODO: maybe this can be a scalar object supporting tomap()
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   163
        return templateutil.mappinglist([
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   164
            {'before': templateutil.mappinglist(navbefore),
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   165
             'after': templateutil.mappinglist(navafter)},
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   166
        ])
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   167
18408
f332a64fef51 hgweb: introduction a filerevnav subclass
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18407
diff changeset
   168
class filerevnav(revnav):
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   169
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   170
    def __init__(self, repo, path):
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   171
        """Navigation generation object
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   172
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   173
        :repo: repo object we generate nav for
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   174
        :path: path of the file we generate nav for
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   175
        """
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   176
        # used for iteration
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   177
        self._changelog = repo.unfiltered().changelog
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   178
        # used for hex generation
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   179
        self._revlog = repo.file(path)
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   180
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   181
    def hex(self, rev):
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   182
        return hex(self._changelog.node(self._revlog.linkrev(rev)))
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   183
37699
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   184
# TODO: maybe this can be a wrapper class for changectx/filectx list, which
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   185
# yields {'ctx': ctx}
37700
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   186
def _ctxsgen(context, ctxs):
37699
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   187
    for s in ctxs:
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   188
        d = {
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   189
            'node': s.hex(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   190
            'rev': s.rev(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   191
            'user': s.user(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   192
            'date': s.date(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   193
            'description': s.description(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   194
            'branch': s.branch(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   195
        }
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   196
        if util.safehasattr(s, 'path'):
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   197
            d['file'] = s.path()
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   198
        yield d
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   199
37700
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   200
def _siblings(siblings=None, hiderev=None):
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   201
    if siblings is None:
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   202
        siblings = []
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   203
    siblings = [s for s in siblings if s.node() != nullid]
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   204
    if len(siblings) == 1 and siblings[0].rev() == hiderev:
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   205
        siblings = []
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   206
    return templateutil.mappinggenerator(_ctxsgen, args=(siblings,))
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   207
34390
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   208
def difffeatureopts(req, ui, section):
30081
dd0ff715a82c hgweb: make fctx.annotate a separated function so it could be wrapped
Jun Wu <quark@fb.com>
parents: 29216
diff changeset
   209
    diffopts = patch.difffeatureopts(ui, untrusted=True,
34390
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   210
                                     section=section, whitespace=True)
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   211
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   212
    for k in ('ignorews', 'ignorewsamount', 'ignorewseol', 'ignoreblanklines'):
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   213
        v = req.qsparams.get(k)
34390
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   214
        if v is not None:
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
   215
            v = stringutil.parsebool(v)
34403
407ebe7a9b93 hgweb: use parsebool for parsing diff query string options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34390
diff changeset
   216
            setattr(diffopts, k, v if v is not None else True)
34390
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   217
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   218
    return diffopts
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   219
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   220
def annotate(req, fctx, ui):
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   221
    diffopts = difffeatureopts(req, ui, 'annotate')
37065
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37019
diff changeset
   222
    return fctx.annotate(follow=True, diffopts=diffopts)
30081
dd0ff715a82c hgweb: make fctx.annotate a separated function so it could be wrapped
Jun Wu <quark@fb.com>
parents: 29216
diff changeset
   223
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   224
def parents(ctx, hide=None):
24136
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
   225
    if isinstance(ctx, context.basefilectx):
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
   226
        introrev = ctx.introrev()
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
   227
        if ctx.changectx().rev() != introrev:
24340
567ae5365754 hgweb: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24306
diff changeset
   228
            return _siblings([ctx.repo()[introrev]], hide)
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   229
    return _siblings(ctx.parents(), hide)
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   230
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   231
def children(ctx, hide=None):
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   232
    return _siblings(ctx.children(), hide)
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   233
6434
62e0bb41e682 hgweb: minor improvements for new web style
Matt Mackall <mpm@selenic.com>
parents: 6413
diff changeset
   234
def renamelink(fctx):
6437
101526031d06 hgweb: fix merge breakage
Matt Mackall <mpm@selenic.com>
parents: 6434
diff changeset
   235
    r = fctx.renamed()
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   236
    if r:
37902
2095331ff926 hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37700
diff changeset
   237
        return templateutil.mappinglist([{'file': r[0], 'node': hex(r[1])}])
2095331ff926 hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37700
diff changeset
   238
    return templateutil.mappinglist([])
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   239
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   240
def nodetagsdict(repo, node):
37903
450de9cb0b36 hgweb: wrap {tags} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37902
diff changeset
   241
    return templateutil.hybridlist(repo.nodetags(node), name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   242
13596
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
   243
def nodebookmarksdict(repo, node):
37904
40a664bd06fa hgweb: wrap {bookmarks} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37903
diff changeset
   244
    return templateutil.hybridlist(repo.nodebookmarks(node), name='name')
13596
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
   245
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   246
def nodebranchdict(repo, ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   247
    branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   248
    branch = ctx.branch()
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   249
    # If this is an empty repo, ctx.node() == nullid,
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   250
    # ctx.branch() == 'default'.
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   251
    try:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   252
        branchnode = repo.branchtip(branch)
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   253
    except error.RepoLookupError:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   254
        branchnode = None
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   255
    if branchnode == ctx.node():
37905
f5155bca5023 hgweb: wrap {branches} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37904
diff changeset
   256
        branches.append(branch)
f5155bca5023 hgweb: wrap {branches} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37904
diff changeset
   257
    return templateutil.hybridlist(branches, name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   258
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   259
def nodeinbranch(repo, ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   260
    branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   261
    branch = ctx.branch()
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   262
    try:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   263
        branchnode = repo.branchtip(branch)
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   264
    except error.RepoLookupError:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   265
        branchnode = None
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   266
    if branch != 'default' and branchnode != ctx.node():
37906
a5d16f23a2c9 hgweb: wrap {inbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37905
diff changeset
   267
        branches.append(branch)
a5d16f23a2c9 hgweb: wrap {inbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37905
diff changeset
   268
    return templateutil.hybridlist(branches, name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   269
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   270
def nodebranchnodefault(ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   271
    branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   272
    branch = ctx.branch()
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   273
    if branch != 'default':
37907
3b3d818bde8b hgweb: wrap {branch} and {changesetbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37906
diff changeset
   274
        branches.append(branch)
3b3d818bde8b hgweb: wrap {branch} and {changesetbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37906
diff changeset
   275
    return templateutil.hybridlist(branches, name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   276
37911
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   277
def _nodenamesgen(context, f, node, name):
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   278
    for t in f(node):
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   279
        yield {name: t}
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   280
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   281
def showtag(repo, t1, node=nullid):
37911
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   282
    args = (repo.nodetags, node, 'tag')
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   283
    return templateutil.mappinggenerator(_nodenamesgen, args=args, name=t1)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   284
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   285
def showbookmark(repo, t1, node=nullid):
37911
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   286
    args = (repo.nodebookmarks, node, 'bookmark')
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   287
    return templateutil.mappinggenerator(_nodenamesgen, args=args, name=t1)
13596
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
   288
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   289
def branchentries(repo, stripecount, limit=0):
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   290
    tips = []
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   291
    heads = repo.heads()
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   292
    parity = paritygen(stripecount)
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   293
    sortkey = lambda item: (not item[1], item[0].rev())
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   294
37913
89db78126f7f hgweb: wrap {branches} and {entries} of branches with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37912
diff changeset
   295
    def entries(context):
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   296
        count = 0
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   297
        if not tips:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   298
            for tag, hs, tip, closed in repo.branchmap().iterbranches():
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   299
                tips.append((repo[tip], closed))
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   300
        for ctx, closed in sorted(tips, key=sortkey, reverse=True):
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   301
            if limit > 0 and count >= limit:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   302
                return
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   303
            count += 1
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   304
            if closed:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   305
                status = 'closed'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   306
            elif ctx.node() not in heads:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   307
                status = 'inactive'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   308
            else:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   309
                status = 'open'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   310
            yield {
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   311
                'parity': next(parity),
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   312
                'branch': ctx.branch(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   313
                'status': status,
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   314
                'node': ctx.hex(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   315
                'date': ctx.date()
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   316
            }
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   317
37913
89db78126f7f hgweb: wrap {branches} and {entries} of branches with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37912
diff changeset
   318
    return templateutil.mappinggenerator(entries)
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   319
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   320
def cleanpath(repo, path):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   321
    path = path.lstrip('/')
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19094
diff changeset
   322
    return pathutil.canonpath(repo.root, '', path)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   323
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
   324
def changectx(repo, req):
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   325
    changeid = "tip"
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   326
    if 'node' in req.qsparams:
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   327
        changeid = req.qsparams['node']
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
   328
        ipos = changeid.find(':')
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   329
        if ipos != -1:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   330
            changeid = changeid[(ipos + 1):]
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   331
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
   332
    return scmutil.revsymbol(repo, changeid)
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   333
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   334
def basechangectx(repo, req):
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   335
    if 'node' in req.qsparams:
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   336
        changeid = req.qsparams['node']
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
   337
        ipos = changeid.find(':')
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   338
        if ipos != -1:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   339
            changeid = changeid[:ipos]
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
   340
            return scmutil.revsymbol(repo, changeid)
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   341
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   342
    return None
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   343
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   344
def filectx(repo, req):
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   345
    if 'file' not in req.qsparams:
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
   346
        raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   347
    path = cleanpath(repo, req.qsparams['file'])
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   348
    if 'node' in req.qsparams:
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   349
        changeid = req.qsparams['node']
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   350
    elif 'filenode' in req.qsparams:
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   351
        changeid = req.qsparams['filenode']
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   352
    else:
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
   353
        raise ErrorResponse(HTTP_NOT_FOUND, 'node or filenode not given')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   354
    try:
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
   355
        fctx = scmutil.revsymbol(repo, changeid)[path]
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
   356
    except error.RepoError:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   357
        fctx = repo.filectx(path, fileid=changeid)
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   358
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   359
    return fctx
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   360
31665
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   361
def linerange(req):
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   362
    linerange = req.qsparams.getall('linerange')
36865
3d60a22e27f5 hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36863
diff changeset
   363
    if not linerange:
31665
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   364
        return None
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   365
    if len(linerange) > 1:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   366
        raise ErrorResponse(HTTP_BAD_REQUEST,
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   367
                            'redundant linerange parameter')
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   368
    try:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   369
        fromline, toline = map(int, linerange[0].split(':', 1))
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   370
    except ValueError:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   371
        raise ErrorResponse(HTTP_BAD_REQUEST,
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   372
                            'invalid linerange parameter')
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   373
    try:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   374
        return util.processlinerange(fromline, toline)
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   375
    except error.ParseError as exc:
36258
af0a19d8812b py3: get bytes-repr of network errors portably
Augie Fackler <augie@google.com>
parents: 36183
diff changeset
   376
        raise ErrorResponse(HTTP_BAD_REQUEST, pycompat.bytestr(exc))
31665
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   377
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   378
def formatlinerange(fromline, toline):
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   379
    return '%d:%d' % (fromline + 1, toline)
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   380
37914
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   381
def _succsandmarkersgen(context, mapping):
36594
59ee648870a7 templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36518
diff changeset
   382
    repo = context.resource(mapping, 'repo')
37503
49a8c2cc7978 templatekw: fix return type of {succsandmarkers} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 37335
diff changeset
   383
    itemmappings = templatekw.showsuccsandmarkers(context, mapping)
49a8c2cc7978 templatekw: fix return type of {succsandmarkers} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 37335
diff changeset
   384
    for item in itemmappings.tovalue(context, mapping):
35486
4c7ae95e1c71 hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35485
diff changeset
   385
        item['successors'] = _siblings(repo[successor]
4c7ae95e1c71 hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35485
diff changeset
   386
                                       for successor in item['successors'])
4c7ae95e1c71 hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35485
diff changeset
   387
        yield item
35485
1721ce06100a hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35454
diff changeset
   388
37914
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   389
def succsandmarkers(context, mapping):
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   390
    return templateutil.mappinggenerator(_succsandmarkersgen, args=(mapping,))
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   391
36594
59ee648870a7 templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36518
diff changeset
   392
# teach templater succsandmarkers is switched to (context, mapping) API
37069
724f2e21d870 templatekw: stop using _showlist() which is about to be deprecated
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
   393
succsandmarkers._requires = {'repo', 'ctx'}
36594
59ee648870a7 templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36518
diff changeset
   394
37915
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   395
def _whyunstablegen(context, mapping):
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   396
    repo = context.resource(mapping, 'repo')
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   397
    ctx = context.resource(mapping, 'ctx')
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   398
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   399
    entries = obsutil.whyunstable(repo, ctx)
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   400
    for entry in entries:
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   401
        if entry.get('divergentnodes'):
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   402
            entry['divergentnodes'] = _siblings(entry['divergentnodes'])
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   403
        yield entry
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   404
37915
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   405
def whyunstable(context, mapping):
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   406
    return templateutil.mappinggenerator(_whyunstablegen, args=(mapping,))
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   407
37069
724f2e21d870 templatekw: stop using _showlist() which is about to be deprecated
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
   408
whyunstable._requires = {'repo', 'ctx'}
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   409
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   410
def commonentry(repo, ctx):
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   411
    node = ctx.node()
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   412
    return {
36518
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   413
        # TODO: perhaps ctx.changectx() should be assigned if ctx is a
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   414
        # filectx, but I'm not pretty sure if that would always work because
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   415
        # fctx.parents() != fctx.changectx.parents() for example.
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   416
        'ctx': ctx,
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   417
        'rev': ctx.rev(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   418
        'node': hex(node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   419
        'author': ctx.user(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   420
        'desc': ctx.description(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   421
        'date': ctx.date(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   422
        'extra': ctx.extra(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   423
        'phase': ctx.phasestr(),
35088
a9454beb9dd8 context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 34855
diff changeset
   424
        'obsolete': ctx.obsolete(),
36518
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   425
        'succsandmarkers': succsandmarkers,
37916
34f259a1c153 hgweb: wrap {instabilities} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37915
diff changeset
   426
        'instabilities': templateutil.hybridlist(ctx.instabilities(),
34f259a1c153 hgweb: wrap {instabilities} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37915
diff changeset
   427
                                                 name='instability'),
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   428
        'whyunstable': whyunstable,
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   429
        'branch': nodebranchnodefault(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   430
        'inbranch': nodeinbranch(repo, ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   431
        'branches': nodebranchdict(repo, ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   432
        'tags': nodetagsdict(repo, node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   433
        'bookmarks': nodebookmarksdict(repo, node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   434
        'parent': lambda **x: parents(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   435
        'child': lambda **x: children(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   436
    }
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   437
36885
c68e79dcf21c hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36865
diff changeset
   438
def changelistentry(web, ctx):
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   439
    '''Obtain a dictionary to be used for entries in a changelist.
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   440
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   441
    This function is called when producing items for the "entries" list passed
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   442
    to the "shortlog" and "changelog" templates.
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   443
    '''
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   444
    repo = web.repo
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   445
    rev = ctx.rev()
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   446
    n = ctx.node()
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   447
    showtags = showtag(repo, 'changelogtag', n)
37954
9482498b96b0 hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37953
diff changeset
   448
    files = listfilediffs(ctx.files(), n, web.maxfiles)
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   449
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   450
    entry = commonentry(repo, ctx)
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   451
    entry.update(
28709
94494031f659 hgweb: add parents to json-log (issue5074)
Anton Shestakov <av6@dwimlabs.net>
parents: 27294
diff changeset
   452
        allparents=lambda **x: parents(ctx),
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   453
        parent=lambda **x: parents(ctx, rev - 1),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   454
        child=lambda **x: children(ctx, rev + 1),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   455
        changelogtag=showtags,
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   456
        files=files,
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   457
    )
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   458
    return entry
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   459
38043
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   460
def changelistentries(web, revs, maxcount, parityfn):
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   461
    """Emit up to N records for an iterable of revisions."""
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   462
    repo = web.repo
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   463
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   464
    count = 0
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   465
    for rev in revs:
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   466
        if count >= maxcount:
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   467
            break
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   468
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   469
        count += 1
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   470
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   471
        entry = changelistentry(web, repo[rev])
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   472
        entry['parity'] = next(parityfn)
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   473
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   474
        yield entry
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   475
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   476
def symrevorshortnode(req, ctx):
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   477
    if 'node' in req.qsparams:
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   478
        return templatefilters.revescape(req.qsparams['node'])
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   479
    else:
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   480
        return short(ctx.node())
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   481
37951
c4313a9fde7b hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37950
diff changeset
   482
def _listfilesgen(context, ctx, stripecount):
37949
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   483
    parity = paritygen(stripecount)
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   484
    for blockno, f in enumerate(ctx.files()):
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   485
        template = 'filenodelink' if f in ctx else 'filenolink'
37951
c4313a9fde7b hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37950
diff changeset
   486
        yield context.process(template, {
37949
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   487
            'node': ctx.hex(),
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   488
            'file': f,
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   489
            'blockno': blockno + 1,
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   490
            'parity': next(parity),
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   491
        })
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   492
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   493
def changesetentry(web, ctx):
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   494
    '''Obtain a dictionary to be used to render the "changeset" template.'''
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   495
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   496
    showtags = showtag(web.repo, 'changesettag', ctx.node())
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   497
    showbookmarks = showbookmark(web.repo, 'changesetbookmark', ctx.node())
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   498
    showbranch = nodebranchnodefault(ctx)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   499
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   500
    basectx = basechangectx(web.repo, web.req)
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   501
    if basectx is None:
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   502
        basectx = ctx.p1()
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   503
34246
db63872e10cc configitems: register the 'web.style' config
Boris Feld <boris.feld@octobus.net>
parents: 31808
diff changeset
   504
    style = web.config('web', 'style')
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   505
    if 'style' in web.req.qsparams:
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   506
        style = web.req.qsparams['style']
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   507
36885
c68e79dcf21c hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36865
diff changeset
   508
    diff = diffs(web, ctx, basectx, None, style)
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   509
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   510
    parity = paritygen(web.stripecount)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   511
    diffstatsgen = diffstatgen(ctx, basectx)
38059
4c3ab15f3532 hgweb: drop unused argument 'tmpl' from webutil.diffstat()
Yuya Nishihara <yuya@tcha.org>
parents: 38058
diff changeset
   512
    diffstats = diffstat(ctx, diffstatsgen, parity)
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   513
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   514
    return dict(
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   515
        diff=diff,
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   516
        symrev=symrevorshortnode(web.req, ctx),
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   517
        basenode=basectx.hex(),
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   518
        changesettag=showtags,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   519
        changesetbookmark=showbookmarks,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   520
        changesetbranch=showbranch,
37950
790ca0c11fd4 hgweb: wrap {files} of changesetentry() with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37949
diff changeset
   521
        files=templateutil.mappedgenerator(_listfilesgen,
37951
c4313a9fde7b hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37950
diff changeset
   522
                                           args=(ctx, web.stripecount)),
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   523
        diffsummary=lambda **x: diffsummary(diffstatsgen),
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   524
        diffstat=diffstats,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   525
        archives=web.archivelist(ctx.hex()),
36434
1fb9e01328e4 py3: use pycompat.strkwargs to convert kwargs keys to str
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36258
diff changeset
   526
        **pycompat.strkwargs(commonentry(web.repo, ctx)))
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   527
37953
4237d07fad2c hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents: 37952
diff changeset
   528
def _listfilediffsgen(context, files, node, max):
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
   529
    for f in files[:max]:
37953
4237d07fad2c hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents: 37952
diff changeset
   530
        yield context.process('filedifflink', {'node': hex(node), 'file': f})
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
   531
    if len(files) > max:
37953
4237d07fad2c hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents: 37952
diff changeset
   532
        yield context.process('fileellipses', {})
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
   533
37954
9482498b96b0 hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37953
diff changeset
   534
def listfilediffs(files, node, max):
37952
028d7c24f2e5 hgweb: wrap {files} of changelist entries with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37951
diff changeset
   535
    return templateutil.mappedgenerator(_listfilediffsgen,
37953
4237d07fad2c hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents: 37952
diff changeset
   536
                                        args=(files, node, max))
37952
028d7c24f2e5 hgweb: wrap {files} of changelist entries with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37951
diff changeset
   537
37986
7a9e9fbaa559 hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents: 37985
diff changeset
   538
def _prettyprintdifflines(context, lines, blockno, lineidprefix):
37984
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   539
    for lineno, l in enumerate(lines, 1):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   540
        difflineno = "%d.%d" % (blockno, lineno)
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   541
        if l.startswith('+'):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   542
            ltype = "difflineplus"
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   543
        elif l.startswith('-'):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   544
            ltype = "difflineminus"
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   545
        elif l.startswith('@'):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   546
            ltype = "difflineat"
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   547
        else:
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   548
            ltype = "diffline"
37986
7a9e9fbaa559 hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents: 37985
diff changeset
   549
        yield context.process(ltype, {
37984
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   550
            'line': l,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   551
            'lineno': lineno,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   552
            'lineid': lineidprefix + "l%s" % difflineno,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   553
            'linenumber': "% 8s" % difflineno,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   554
        })
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   555
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   556
def _diffsgen(context, repo, ctx, basectx, files, style, stripecount,
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   557
              linerange, lineidprefix):
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   558
    if files:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   559
        m = match.exact(repo.root, repo.getcwd(), files)
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   560
    else:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   561
        m = match.always(repo.root, repo.getcwd())
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   562
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   563
    diffopts = patch.diffopts(repo.ui, untrusted=True)
31082
abb92b3d370e hgweb: explictly pass basectx in webutil.diffs
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30375
diff changeset
   564
    node1 = basectx.node()
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   565
    node2 = ctx.node()
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   566
    parity = paritygen(stripecount)
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   567
31276
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   568
    diffhunks = patch.diffhunks(repo, node1, node2, m, opts=diffopts)
34855
35c6a54ec1ff diff: also yield file context objects in patch.trydiff() (API)
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 34807
diff changeset
   569
    for blockno, (fctx1, fctx2, header, hunks) in enumerate(diffhunks, 1):
31276
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   570
        if style != 'raw':
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   571
            header = header[1:]
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   572
        lines = [h + '\n' for h in header]
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   573
        for hunkrange, hunklines in hunks:
31666
aaebc80c9f1d hgweb: add a 'linerange' parameter to webutil.diffs()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
   574
            if linerange is not None and hunkrange is not None:
aaebc80c9f1d hgweb: add a 'linerange' parameter to webutil.diffs()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
   575
                s1, l1, s2, l2 = hunkrange
31808
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31727
diff changeset
   576
                if not mdiff.hunkinrange((s2, l2), linerange):
31666
aaebc80c9f1d hgweb: add a 'linerange' parameter to webutil.diffs()
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
   577
                    continue
31276
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   578
            lines.extend(hunklines)
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   579
        if lines:
37985
6a4de2dc78dd hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37984
diff changeset
   580
            l = templateutil.mappedgenerator(_prettyprintdifflines,
37986
7a9e9fbaa559 hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents: 37985
diff changeset
   581
                                             args=(lines, blockno,
37985
6a4de2dc78dd hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37984
diff changeset
   582
                                                   lineidprefix))
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   583
            yield {
37019
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   584
                'parity': next(parity),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   585
                'blockno': blockno,
37985
6a4de2dc78dd hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37984
diff changeset
   586
                'lines': l,
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   587
            }
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   588
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   589
def diffs(web, ctx, basectx, files, style, linerange=None, lineidprefix=''):
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   590
    args = (web.repo, ctx, basectx, files, style, web.stripecount,
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   591
            linerange, lineidprefix)
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   592
    return templateutil.mappinggenerator(_diffsgen, args=args, name='diffblock')
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   593
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   594
def _compline(type, leftlineno, leftline, rightlineno, rightline):
37988
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   595
    lineid = leftlineno and ("l%d" % leftlineno) or ''
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   596
    lineid += rightlineno and ("r%d" % rightlineno) or ''
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   597
    llno = '%d' % leftlineno if leftlineno else ''
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   598
    rlno = '%d' % rightlineno if rightlineno else ''
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   599
    return {
37988
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   600
        'type': type,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   601
        'lineid': lineid,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   602
        'leftlineno': leftlineno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   603
        'leftlinenumber': "% 6s" % llno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   604
        'leftline': leftline or '',
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   605
        'rightlineno': rightlineno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   606
        'rightlinenumber': "% 6s" % rlno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   607
        'rightline': rightline or '',
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   608
    }
37988
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   609
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   610
def _getcompblockgen(context, leftlines, rightlines, opcodes):
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   611
    for type, llo, lhi, rlo, rhi in opcodes:
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   612
        len1 = lhi - llo
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   613
        len2 = rhi - rlo
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   614
        count = min(len1, len2)
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   615
        for i in xrange(count):
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   616
            yield _compline(type=type,
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   617
                            leftlineno=llo + i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   618
                            leftline=leftlines[llo + i],
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   619
                            rightlineno=rlo + i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   620
                            rightline=rightlines[rlo + i])
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   621
        if len1 > len2:
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   622
            for i in xrange(llo + count, lhi):
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   623
                yield _compline(type=type,
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   624
                                leftlineno=i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   625
                                leftline=leftlines[i],
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   626
                                rightlineno=None,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   627
                                rightline=None)
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   628
        elif len2 > len1:
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   629
            for i in xrange(rlo + count, rhi):
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   630
                yield _compline(type=type,
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   631
                                leftlineno=None,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   632
                                leftline=None,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   633
                                rightlineno=i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   634
                                rightline=rightlines[i])
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   635
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   636
def _getcompblock(leftlines, rightlines, opcodes):
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   637
    args = (leftlines, rightlines, opcodes)
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   638
    return templateutil.mappinggenerator(_getcompblockgen, args=args,
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   639
                                         name='comparisonline')
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   640
37992
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   641
def _comparegen(context, contextnum, leftlines, rightlines):
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   642
    '''Generator function that provides side-by-side comparison data.'''
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   643
    s = difflib.SequenceMatcher(None, leftlines, rightlines)
37991
4e407c7b1fbd hgweb: rename 'context' argument of webutil.compare() to avoid name conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 37990
diff changeset
   644
    if contextnum < 0:
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   645
        l = _getcompblock(leftlines, rightlines, s.get_opcodes())
37992
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   646
        yield {'lines': l}
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   647
    else:
37991
4e407c7b1fbd hgweb: rename 'context' argument of webutil.compare() to avoid name conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 37990
diff changeset
   648
        for oc in s.get_grouped_opcodes(n=contextnum):
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   649
            l = _getcompblock(leftlines, rightlines, oc)
37992
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   650
            yield {'lines': l}
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   651
37993
623dc2651d26 hgweb: drop unused argument 'tmpl' from webutil.compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37992
diff changeset
   652
def compare(contextnum, leftlines, rightlines):
37992
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   653
    args = (contextnum, leftlines, rightlines)
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   654
    return templateutil.mappinggenerator(_comparegen, args=args,
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   655
                                         name='comparisonblock')
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   656
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   657
def diffstatgen(ctx, basectx):
14570
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   658
    '''Generator function that provides the diffstat data.'''
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   659
35429
0279c2267d00 hgweb: disable diff.noprefix option for diffstat
Yuya Nishihara <yuya@tcha.org>
parents: 34855
diff changeset
   660
    stats = patch.diffstatdata(
0279c2267d00 hgweb: disable diff.noprefix option for diffstat
Yuya Nishihara <yuya@tcha.org>
parents: 34855
diff changeset
   661
        util.iterlines(ctx.diff(basectx, noprefix=False)))
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   662
    maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats)
14570
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   663
    while True:
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   664
        yield stats, maxname, maxtotal, addtotal, removetotal, binary
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   665
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   666
def diffsummary(statgen):
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   667
    '''Return a short summary of the diff.'''
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   668
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   669
    stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen)
14570
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   670
    return _(' %d files changed, %d insertions(+), %d deletions(-)\n') % (
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   671
             len(stats), addtotal, removetotal)
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   672
38058
6369e21e97ac hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents: 38057
diff changeset
   673
def _diffstattmplgen(context, ctx, statgen, parity):
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   674
    stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen)
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   675
    files = ctx.files()
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   676
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   677
    def pct(i):
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   678
        if maxtotal == 0:
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   679
            return 0
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   680
        return (float(i) / maxtotal) * 100
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   681
14562
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
   682
    fileno = 0
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   683
    for filename, adds, removes, isbinary in stats:
35314
1fe3c8296cfe hgweb: rewrite `template = A and B or C` to be a proper ternary operator
Anton Shestakov <av6@dwimlabs.net>
parents: 35131
diff changeset
   684
        template = 'diffstatlink' if filename in files else 'diffstatnolink'
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   685
        total = adds + removes
14562
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
   686
        fileno += 1
38058
6369e21e97ac hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents: 38057
diff changeset
   687
        yield context.process(template, {
37019
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   688
            'node': ctx.hex(),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   689
            'file': filename,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   690
            'fileno': fileno,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   691
            'total': total,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   692
            'addpct': pct(adds),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   693
            'removepct': pct(removes),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   694
            'parity': next(parity),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   695
        })
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   696
38059
4c3ab15f3532 hgweb: drop unused argument 'tmpl' from webutil.diffstat()
Yuya Nishihara <yuya@tcha.org>
parents: 38058
diff changeset
   697
def diffstat(ctx, statgen, parity):
38057
f0ee627162f4 hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38043
diff changeset
   698
    '''Return a diffstat template for each file in the diff.'''
38058
6369e21e97ac hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents: 38057
diff changeset
   699
    args = (ctx, statgen, parity)
38057
f0ee627162f4 hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38043
diff changeset
   700
    return templateutil.mappedgenerator(_diffstattmplgen, args=args)
f0ee627162f4 hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38043
diff changeset
   701
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   702
class sessionvars(templateutil.wrapped):
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   703
    def __init__(self, vars, start='?'):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   704
        self._start = start
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   705
        self._vars = vars
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   706
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   707
    def __getitem__(self, key):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   708
        return self._vars[key]
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   709
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   710
    def __setitem__(self, key, value):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   711
        self._vars[key] = value
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   712
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   713
    def __copy__(self):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   714
        return sessionvars(copy.copy(self._vars), self._start)
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   715
38243
06d11cd90516 templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38215
diff changeset
   716
    def getmember(self, context, mapping, key):
38244
688fbb758ba9 templater: resolve type of dict key in getmember()
Yuya Nishihara <yuya@tcha.org>
parents: 38243
diff changeset
   717
        key = templateutil.unwrapvalue(context, mapping, key)
38243
06d11cd90516 templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38215
diff changeset
   718
        return self._vars.get(key)
06d11cd90516 templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38215
diff changeset
   719
38265
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   720
    def getmin(self, context, mapping):
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   721
        raise error.ParseError(_('not comparable'))
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   722
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   723
    def getmax(self, context, mapping):
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   724
        raise error.ParseError(_('not comparable'))
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   725
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   726
    def itermaps(self, context):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   727
        separator = self._start
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   728
        for key, value in sorted(self._vars.iteritems()):
34807
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   729
            yield {'name': key,
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   730
                   'value': pycompat.bytestr(value),
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   731
                   'separator': separator,
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   732
            }
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   733
            separator = '&'
12691
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   734
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   735
    def join(self, context, mapping, sep):
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   736
        # could be '{separator}{name}={value|urlescape}'
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   737
        raise error.ParseError(_('not displayable without template'))
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   738
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   739
    def show(self, context, mapping):
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   740
        return self.join(context, '')
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   741
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   742
    def tovalue(self, context, mapping):
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   743
        return self._vars
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   744
27007
c8cbef073645 hgweb: alias ui module as uimod
Yuya Nishihara <yuya@tcha.org>
parents: 26894
diff changeset
   745
class wsgiui(uimod.ui):
12691
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   746
    # default termwidth breaks under mod_wsgi
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   747
    def termwidth(self):
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   748
        return 80
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   749
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   750
def getwebsubs(repo):
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   751
    websubtable = []
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   752
    websubdefs = repo.ui.configitems('websub')
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   753
    # we must maintain interhg backwards compatibility
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   754
    websubdefs += repo.ui.configitems('interhg')
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   755
    for key, pattern in websubdefs:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   756
        # grab the delimiter from the character after the "s"
36180
34e850440271 py3: slice over bytes to prevent getting ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35486
diff changeset
   757
        unesc = pattern[1:2]
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   758
        delim = re.escape(unesc)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   759
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   760
        # identify portions of the pattern, taking care to avoid escaped
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   761
        # delimiters. the replace format and flags are optional, but
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   762
        # delimiters are required.
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   763
        match = re.match(
36183
44a519ec5077 py3: add b'' to make sure regex pattern are bytes in hgweb/webutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36180
diff changeset
   764
            br'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$'
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   765
            % (delim, delim, delim), pattern)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   766
        if not match:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   767
            repo.ui.warn(_("websub: invalid pattern for %s: %s\n")
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   768
                              % (key, pattern))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   769
            continue
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   770
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   771
        # we need to unescape the delimiter for regexp and format
36183
44a519ec5077 py3: add b'' to make sure regex pattern are bytes in hgweb/webutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36180
diff changeset
   772
        delim_re = re.compile(br'(?<!\\)\\%s' % delim)
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   773
        regexp = delim_re.sub(unesc, match.group(1))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   774
        format = delim_re.sub(unesc, match.group(2))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   775
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   776
        # the pattern allows for 6 regexp flags, so set them if necessary
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   777
        flagin = match.group(3)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   778
        flags = 0
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   779
        if flagin:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   780
            for flag in flagin.upper():
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   781
                flags |= re.__dict__[flag]
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   782
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   783
        try:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   784
            regexp = re.compile(regexp, flags)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   785
            websubtable.append((regexp, format))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   786
        except re.error:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   787
            repo.ui.warn(_("websub: invalid regexp for %s: %s\n")
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   788
                         % (key, regexp))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   789
    return websubtable
37909
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   790
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   791
def getgraphnode(repo, ctx):
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   792
    return (templatekw.getgraphnodecurrent(repo, ctx) +
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   793
            templatekw.getgraphnodesymbol(ctx))