mercurial/hgweb/webutil.py
author Gregory Szorc <gregory.szorc@gmail.com>
Fri, 03 Aug 2018 10:05:26 -0700
changeset 38893 23d582caae30
parent 38783 e7aa113b14f7
child 38929 d7e6e109eaae
permissions -rw-r--r--
changegroup: capture revision delta in a data structure The current changegroup generation code is tightly coupled to the revlog API. This tight coupling makes it difficult to implement alternate storage backends without requiring a large surface area of the revlog API to be exposed. This is not desirable. In order to support changegroup generation with non-revlog storage, we'll need to abstract the concept of delta generation. This commit is the first step down that road. We introduce a data structure for representing a delta in a changegroup. The API still leaves a lot to be desired. But at least we now have separation between data and actions performed on it. As part of this, we tweak behavior slightly: we no longer concatenate the delta prefix with the metadata header. Instead, we track and emit the prefix as a separate chunk. This shouldn't have any meaningful impact since all the chunks just get sent to the wire, the compressor, etc. Because we're introducing a new object, this does add some overhead to changegroup execution. `hg perfchangegroupchangelog` on my clone of the Mercurial repo (~40,000 visible revisions in the changelog) slows down a bit: ! wall 1.268600 comb 1.270000 user 1.270000 sys 0.000000 (best of 8) ! wall 1.419479 comb 1.410000 user 1.410000 sys 0.000000 (best of 8) With for `hg bundle -t none-v2 -a /dev/null`: before: real 6.610 secs (user 6.460+0.000 sys 0.140+0.000) after: real 7.210 secs (user 7.060+0.000 sys 0.140+0.000) I plan to claw back this regression in future commits. And I may even do away with this data structure once the refactor is complete. For now, it makes things easier to comprehend. Differential Revision: https://phab.mercurial-scm.org/D4075
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,
38588
1c93e0237a24 diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents: 38585
diff changeset
    28
    diffutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    29
    error,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    30
    match,
31808
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31727
diff changeset
    31
    mdiff,
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
    32
    obsutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    33
    patch,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    34
    pathutil,
34807
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
    35
    pycompat,
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
    36
    scmutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    37
    templatefilters,
35485
1721ce06100a hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35454
diff changeset
    38
    templatekw,
37515
8a5ee6aa8870 hgweb: wrap {archives} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37514
diff changeset
    39
    templateutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    40
    ui as uimod,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    41
    util,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
    42
)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    43
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    44
from ..utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    45
    stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    46
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    47
37511
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    48
archivespecs = util.sortdict((
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    49
    ('zip', ('application/zip', 'zip', '.zip', None)),
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    50
    ('gz', ('application/x-gzip', 'tgz', '.tar.gz', None)),
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    51
    ('bz2', ('application/x-bzip2', 'tbz2', '.tar.bz2', None)),
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    52
))
356e61e82c2a hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37503
diff changeset
    53
37514
034a422aeaff hgweb: forward archivelist() of hgweb to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37513
diff changeset
    54
def archivelist(ui, nodeid, url=None):
38215
f715faeaceee config: rename allow_archive to allow-archive
David Demelier <markand@malikania.fr>
parents: 38059
diff changeset
    55
    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
    56
    archives = []
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    57
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    58
    for typ, spec in archivespecs.iteritems():
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    59
        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
    60
                                           untrusted=True):
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    61
            archives.append({
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    62
                'type': typ,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    63
                'extension': spec[2],
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    64
                'node': nodeid,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    65
                'url': url,
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    66
            })
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    67
37515
8a5ee6aa8870 hgweb: wrap {archives} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37514
diff changeset
    68
    return templateutil.mappinglist(archives)
37513
40a7c1dd2df9 hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents: 37511
diff changeset
    69
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    70
def up(p):
36714
250f3168d907 hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents: 36711
diff changeset
    71
    if p[0:1] != "/":
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    72
        p = "/" + p
36714
250f3168d907 hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents: 36711
diff changeset
    73
    if p[-1:] == "/":
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    74
        p = p[:-1]
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    75
    up = os.path.dirname(p)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    76
    if up == "/":
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    77
        return "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    78
    return up + "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    79
18391
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    80
def _navseq(step, firststep=None):
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    81
    if firststep:
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    82
        yield firststep
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    83
        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
    84
            firststep = 50
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    85
            yield firststep
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    86
        assert step > 0
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    87
        assert firststep > 0
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    88
        while step <= firststep:
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
    89
            step *= 10
18390
28fa9443f751 hgweb: drop recursivity in _navseq
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18389
diff changeset
    90
    while True:
18391
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    91
        yield 1 * step
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    92
        yield 3 * step
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
    93
        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
    94
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
    95
class revnav(object):
18320
60680d691a0b hgweb: document the revnavgen function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17991
diff changeset
    96
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
    97
    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
    98
        """Navigation generation object
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
    99
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   100
        :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
   101
        """
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   102
        # used for hex generation
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   103
        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
   104
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   105
    def __nonzero__(self):
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   106
        """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
   107
        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
   108
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31434
diff changeset
   109
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31434
diff changeset
   110
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   111
    def _first(self):
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   112
        """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
   113
        try:
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   114
            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
   115
        except StopIteration:
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   116
            return None
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   117
18405
1eaf0d017b2c hgweb: move hex creation into an object method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18404
diff changeset
   118
    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
   119
        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
   120
18404
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
   121
    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
   122
        """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
   123
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   124
        :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
   125
        :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
   126
        :limit: how far shall we link
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   127
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   128
        The return is:
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   129
            - a single element mappinglist
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   130
            - 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
   131
            - 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
   132
        """
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   133
        if not self:
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
   134
            # empty repo
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   135
            return templateutil.mappinglist([
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   136
                {'before': templateutil.mappinglist([]),
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   137
                 'after': templateutil.mappinglist([])},
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   138
            ])
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   139
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   140
        targets = []
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   141
        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
   142
            if f > limit:
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
   143
                break
18425
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.append(pos - f)
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   146
        targets.sort()
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   147
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
   148
        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
   149
        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
   150
        navafter = []
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   151
        for rev in targets:
18426
01638b51df44 hgweb: ignore filtered revision in revnav
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18425
diff changeset
   152
            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
   153
                continue
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   154
            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
   155
                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
   156
                                 'node': self.hex(rev)})
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
   157
            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
   158
                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
   159
                                  '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
   160
37697
6fb50e912aa8 hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents: 37696
diff changeset
   161
        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
   162
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   163
        # 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
   164
        return templateutil.mappinglist([
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   165
            {'before': templateutil.mappinglist(navbefore),
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   166
             'after': templateutil.mappinglist(navafter)},
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37697
diff changeset
   167
        ])
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   168
18408
f332a64fef51 hgweb: introduction a filerevnav subclass
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18407
diff changeset
   169
class filerevnav(revnav):
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   170
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   171
    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
   172
        """Navigation generation object
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   173
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   174
        :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
   175
        :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
   176
        """
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   177
        # used for iteration
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   178
        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
   179
        # used for hex generation
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   180
        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
   181
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   182
    def hex(self, rev):
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   183
        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
   184
37699
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   185
# 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
   186
# yields {'ctx': ctx}
37700
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   187
def _ctxsgen(context, ctxs):
37699
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   188
    for s in ctxs:
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   189
        d = {
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   190
            'node': s.hex(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   191
            'rev': s.rev(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   192
            'user': s.user(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   193
            'date': s.date(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   194
            'description': s.description(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   195
            'branch': s.branch(),
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   196
        }
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   197
        if util.safehasattr(s, 'path'):
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   198
            d['file'] = s.path()
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   199
        yield d
0e02eb838b96 hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   200
37700
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   201
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
   202
    if siblings is None:
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   203
        siblings = []
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   204
    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
   205
    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
   206
        siblings = []
495fbeae63cc hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37699
diff changeset
   207
    return templateutil.mappinggenerator(_ctxsgen, args=(siblings,))
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   208
34390
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   209
def difffeatureopts(req, ui, section):
38566
1770416de208 webutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38519
diff changeset
   210
    diffopts = diffutil.difffeatureopts(ui, untrusted=True,
1770416de208 webutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38519
diff changeset
   211
                                        section=section, whitespace=True)
34390
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   212
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   213
    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
   214
        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
   215
        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
   216
            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
   217
            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
   218
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   219
    return diffopts
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   220
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34246
diff changeset
   221
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
   222
    diffopts = difffeatureopts(req, ui, 'annotate')
37065
b235bde38a83 annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37019
diff changeset
   223
    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
   224
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   225
def parents(ctx, hide=None):
24136
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
   226
    if isinstance(ctx, context.basefilectx):
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
   227
        introrev = ctx.introrev()
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
   228
        if ctx.changectx().rev() != introrev:
24340
567ae5365754 hgweb: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24306
diff changeset
   229
            return _siblings([ctx.repo()[introrev]], hide)
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   230
    return _siblings(ctx.parents(), hide)
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   231
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   232
def children(ctx, hide=None):
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   233
    return _siblings(ctx.children(), hide)
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   234
6434
62e0bb41e682 hgweb: minor improvements for new web style
Matt Mackall <mpm@selenic.com>
parents: 6413
diff changeset
   235
def renamelink(fctx):
6437
101526031d06 hgweb: fix merge breakage
Matt Mackall <mpm@selenic.com>
parents: 6434
diff changeset
   236
    r = fctx.renamed()
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   237
    if r:
37902
2095331ff926 hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37700
diff changeset
   238
        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
   239
    return templateutil.mappinglist([])
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   240
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   241
def nodetagsdict(repo, node):
37903
450de9cb0b36 hgweb: wrap {tags} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37902
diff changeset
   242
    return templateutil.hybridlist(repo.nodetags(node), name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   243
13596
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
   244
def nodebookmarksdict(repo, node):
37904
40a664bd06fa hgweb: wrap {bookmarks} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37903
diff changeset
   245
    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
   246
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   247
def nodebranchdict(repo, ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   248
    branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   249
    branch = ctx.branch()
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   250
    # 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
   251
    # ctx.branch() == 'default'.
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   252
    try:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   253
        branchnode = repo.branchtip(branch)
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   254
    except error.RepoLookupError:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   255
        branchnode = None
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   256
    if branchnode == ctx.node():
37905
f5155bca5023 hgweb: wrap {branches} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37904
diff changeset
   257
        branches.append(branch)
f5155bca5023 hgweb: wrap {branches} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37904
diff changeset
   258
    return templateutil.hybridlist(branches, name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   259
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   260
def nodeinbranch(repo, ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   261
    branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   262
    branch = ctx.branch()
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   263
    try:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   264
        branchnode = repo.branchtip(branch)
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   265
    except error.RepoLookupError:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   266
        branchnode = None
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
   267
    if branch != 'default' and branchnode != ctx.node():
37906
a5d16f23a2c9 hgweb: wrap {inbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37905
diff changeset
   268
        branches.append(branch)
a5d16f23a2c9 hgweb: wrap {inbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37905
diff changeset
   269
    return templateutil.hybridlist(branches, name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   270
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   271
def nodebranchnodefault(ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   272
    branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   273
    branch = ctx.branch()
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   274
    if branch != 'default':
37907
3b3d818bde8b hgweb: wrap {branch} and {changesetbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37906
diff changeset
   275
        branches.append(branch)
3b3d818bde8b hgweb: wrap {branch} and {changesetbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37906
diff changeset
   276
    return templateutil.hybridlist(branches, name='name')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   277
37911
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   278
def _nodenamesgen(context, f, node, name):
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   279
    for t in f(node):
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   280
        yield {name: t}
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   281
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   282
def showtag(repo, t1, node=nullid):
37911
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   283
    args = (repo.nodetags, node, 'tag')
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   284
    return templateutil.mappinggenerator(_nodenamesgen, args=args, name=t1)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   285
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   286
def showbookmark(repo, t1, node=nullid):
37911
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   287
    args = (repo.nodebookmarks, node, 'bookmark')
26aed0d561e8 hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents: 37910
diff changeset
   288
    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
   289
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   290
def branchentries(repo, stripecount, limit=0):
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   291
    tips = []
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   292
    heads = repo.heads()
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   293
    parity = paritygen(stripecount)
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   294
    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
   295
37913
89db78126f7f hgweb: wrap {branches} and {entries} of branches with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37912
diff changeset
   296
    def entries(context):
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   297
        count = 0
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   298
        if not tips:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   299
            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
   300
                tips.append((repo[tip], closed))
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   301
        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
   302
            if limit > 0 and count >= limit:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   303
                return
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   304
            count += 1
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   305
            if closed:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   306
                status = 'closed'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   307
            elif ctx.node() not in heads:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   308
                status = 'inactive'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   309
            else:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   310
                status = 'open'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   311
            yield {
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   312
                'parity': next(parity),
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   313
                'branch': ctx.branch(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   314
                'status': status,
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   315
                'node': ctx.hex(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   316
                'date': ctx.date()
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   317
            }
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   318
37913
89db78126f7f hgweb: wrap {branches} and {entries} of branches with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37912
diff changeset
   319
    return templateutil.mappinggenerator(entries)
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
   320
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   321
def cleanpath(repo, path):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   322
    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
   323
    return pathutil.canonpath(repo.root, '', path)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   324
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
   325
def changectx(repo, req):
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   326
    changeid = "tip"
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   327
    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
   328
        changeid = req.qsparams['node']
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
   329
        ipos = changeid.find(':')
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   330
        if ipos != -1:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   331
            changeid = changeid[(ipos + 1):]
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   332
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
   333
    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
   334
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   335
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
   336
    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
   337
        changeid = req.qsparams['node']
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
   338
        ipos = changeid.find(':')
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   339
        if ipos != -1:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   340
            changeid = changeid[:ipos]
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
   341
            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
   342
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   343
    return None
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
   344
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   345
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
   346
    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
   347
        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
   348
    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
   349
    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
   350
        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
   351
    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
   352
        changeid = req.qsparams['filenode']
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   353
    else:
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
   354
        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
   355
    try:
37335
956260cbc564 hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents: 37334
diff changeset
   356
        fctx = scmutil.revsymbol(repo, changeid)[path]
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
   357
    except error.RepoError:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   358
        fctx = repo.filectx(path, fileid=changeid)
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   359
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   360
    return fctx
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   361
31665
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   362
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
   363
    linerange = req.qsparams.getall('linerange')
36865
3d60a22e27f5 hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36863
diff changeset
   364
    if not linerange:
31665
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   365
        return None
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   366
    if len(linerange) > 1:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   367
        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
   368
                            'redundant linerange parameter')
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   369
    try:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   370
        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
   371
    except ValueError:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   372
        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
   373
                            'invalid linerange parameter')
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   374
    try:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   375
        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
   376
    except error.ParseError as exc:
36258
af0a19d8812b py3: get bytes-repr of network errors portably
Augie Fackler <augie@google.com>
parents: 36183
diff changeset
   377
        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
   378
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   379
def formatlinerange(fromline, toline):
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31660
diff changeset
   380
    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
   381
37914
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   382
def _succsandmarkersgen(context, mapping):
36594
59ee648870a7 templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36518
diff changeset
   383
    repo = context.resource(mapping, 'repo')
37503
49a8c2cc7978 templatekw: fix return type of {succsandmarkers} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 37335
diff changeset
   384
    itemmappings = templatekw.showsuccsandmarkers(context, mapping)
49a8c2cc7978 templatekw: fix return type of {succsandmarkers} (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 37335
diff changeset
   385
    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
   386
        item['successors'] = _siblings(repo[successor]
4c7ae95e1c71 hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35485
diff changeset
   387
                                       for successor in item['successors'])
4c7ae95e1c71 hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35485
diff changeset
   388
        yield item
35485
1721ce06100a hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 35454
diff changeset
   389
37914
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   390
def succsandmarkers(context, mapping):
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   391
    return templateutil.mappinggenerator(_succsandmarkersgen, args=(mapping,))
10d3dc8123c5 hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37913
diff changeset
   392
36594
59ee648870a7 templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36518
diff changeset
   393
# 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
   394
succsandmarkers._requires = {'repo', 'ctx'}
36594
59ee648870a7 templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents: 36518
diff changeset
   395
37915
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   396
def _whyunstablegen(context, mapping):
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   397
    repo = context.resource(mapping, 'repo')
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   398
    ctx = context.resource(mapping, 'ctx')
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   399
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   400
    entries = obsutil.whyunstable(repo, ctx)
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   401
    for entry in entries:
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   402
        if entry.get('divergentnodes'):
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   403
            entry['divergentnodes'] = _siblings(entry['divergentnodes'])
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   404
        yield entry
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   405
37915
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   406
def whyunstable(context, mapping):
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   407
    return templateutil.mappinggenerator(_whyunstablegen, args=(mapping,))
3dc4045db164 hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37914
diff changeset
   408
37069
724f2e21d870 templatekw: stop using _showlist() which is about to be deprecated
Yuya Nishihara <yuya@tcha.org>
parents: 37065
diff changeset
   409
whyunstable._requires = {'repo', 'ctx'}
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   410
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   411
def commonentry(repo, ctx):
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   412
    node = ctx.node()
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   413
    return {
36518
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   414
        # 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
   415
        # 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
   416
        # 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
   417
        'ctx': ctx,
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   418
        'rev': ctx.rev(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   419
        'node': hex(node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   420
        'author': ctx.user(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   421
        'desc': ctx.description(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   422
        'date': ctx.date(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   423
        'extra': ctx.extra(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   424
        'phase': ctx.phasestr(),
35088
a9454beb9dd8 context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents: 34855
diff changeset
   425
        'obsolete': ctx.obsolete(),
36518
7937850a523d hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents: 36434
diff changeset
   426
        'succsandmarkers': succsandmarkers,
37916
34f259a1c153 hgweb: wrap {instabilities} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37915
diff changeset
   427
        'instabilities': templateutil.hybridlist(ctx.instabilities(),
34f259a1c153 hgweb: wrap {instabilities} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37915
diff changeset
   428
                                                 name='instability'),
36955
f21798a6bc20 hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents: 36886
diff changeset
   429
        'whyunstable': whyunstable,
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   430
        'branch': nodebranchnodefault(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   431
        'inbranch': nodeinbranch(repo, ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   432
        'branches': nodebranchdict(repo, ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   433
        'tags': nodetagsdict(repo, node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   434
        'bookmarks': nodebookmarksdict(repo, node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   435
        '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
   436
        '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
   437
    }
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   438
36885
c68e79dcf21c hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36865
diff changeset
   439
def changelistentry(web, ctx):
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   440
    '''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
   441
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   442
    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
   443
    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
   444
    '''
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   445
    repo = web.repo
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   446
    rev = ctx.rev()
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   447
    n = ctx.node()
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   448
    showtags = showtag(repo, 'changelogtag', n)
37954
9482498b96b0 hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37953
diff changeset
   449
    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
   450
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   451
    entry = commonentry(repo, ctx)
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   452
    entry.update(
28709
94494031f659 hgweb: add parents to json-log (issue5074)
Anton Shestakov <av6@dwimlabs.net>
parents: 27294
diff changeset
   453
        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
   454
        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
   455
        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
   456
        changelogtag=showtags,
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   457
        files=files,
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   458
    )
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
   459
    return entry
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
   460
38043
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   461
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
   462
    """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
   463
    repo = web.repo
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   464
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   465
    count = 0
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   466
    for rev in revs:
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   467
        if count >= maxcount:
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   468
            break
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   469
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   470
        count += 1
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   471
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   472
        entry = changelistentry(web, repo[rev])
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   473
        entry['parity'] = next(parityfn)
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   474
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   475
        yield entry
5989261a8356 hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37993
diff changeset
   476
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   477
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
   478
    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
   479
        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
   480
    else:
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   481
        return short(ctx.node())
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
   482
37951
c4313a9fde7b hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37950
diff changeset
   483
def _listfilesgen(context, ctx, stripecount):
37949
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   484
    parity = paritygen(stripecount)
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   485
    for blockno, f in enumerate(ctx.files()):
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   486
        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
   487
        yield context.process(template, {
37949
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   488
            'node': ctx.hex(),
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   489
            'file': f,
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   490
            'blockno': blockno + 1,
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   491
            'parity': next(parity),
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   492
        })
1129e444fd6c hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37916
diff changeset
   493
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   494
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
   495
    '''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
   496
37912
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37911
diff changeset
   497
    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
   498
    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
   499
    showbranch = nodebranchnodefault(ctx)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   500
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   501
    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
   502
    if basectx is None:
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   503
        basectx = ctx.p1()
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   504
34246
db63872e10cc configitems: register the 'web.style' config
Boris Feld <boris.feld@octobus.net>
parents: 31808
diff changeset
   505
    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
   506
    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
   507
        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
   508
36885
c68e79dcf21c hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36865
diff changeset
   509
    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
   510
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   511
    parity = paritygen(web.stripecount)
38585
66eb74f9d87d hgweb: pass ui to diffstatgen() explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 38566
diff changeset
   512
    diffstatsgen = diffstatgen(web.repo.ui, ctx, basectx)
38059
4c3ab15f3532 hgweb: drop unused argument 'tmpl' from webutil.diffstat()
Yuya Nishihara <yuya@tcha.org>
parents: 38058
diff changeset
   513
    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
   514
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   515
    return dict(
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   516
        diff=diff,
36886
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36885
diff changeset
   517
        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
   518
        basenode=basectx.hex(),
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   519
        changesettag=showtags,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   520
        changesetbookmark=showbookmarks,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   521
        changesetbranch=showbranch,
37950
790ca0c11fd4 hgweb: wrap {files} of changesetentry() with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37949
diff changeset
   522
        files=templateutil.mappedgenerator(_listfilesgen,
37951
c4313a9fde7b hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents: 37950
diff changeset
   523
                                           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
   524
        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
   525
        diffstat=diffstats,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
   526
        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
   527
        **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
   528
37953
4237d07fad2c hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents: 37952
diff changeset
   529
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
   530
    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
   531
        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
   532
    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
   533
        yield context.process('fileellipses', {})
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
   534
37954
9482498b96b0 hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37953
diff changeset
   535
def listfilediffs(files, node, max):
37952
028d7c24f2e5 hgweb: wrap {files} of changelist entries with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37951
diff changeset
   536
    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
   537
                                        args=(files, node, max))
37952
028d7c24f2e5 hgweb: wrap {files} of changelist entries with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37951
diff changeset
   538
37986
7a9e9fbaa559 hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents: 37985
diff changeset
   539
def _prettyprintdifflines(context, lines, blockno, lineidprefix):
37984
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   540
    for lineno, l in enumerate(lines, 1):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   541
        difflineno = "%d.%d" % (blockno, lineno)
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   542
        if l.startswith('+'):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   543
            ltype = "difflineplus"
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   544
        elif l.startswith('-'):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   545
            ltype = "difflineminus"
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   546
        elif l.startswith('@'):
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   547
            ltype = "difflineat"
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   548
        else:
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   549
            ltype = "diffline"
37986
7a9e9fbaa559 hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents: 37985
diff changeset
   550
        yield context.process(ltype, {
37984
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   551
            'line': l,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   552
            'lineno': lineno,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   553
            'lineid': lineidprefix + "l%s" % difflineno,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   554
            'linenumber': "% 8s" % difflineno,
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   555
        })
3f70466ec7aa hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37954
diff changeset
   556
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   557
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
   558
              linerange, lineidprefix):
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   559
    if files:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   560
        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
   561
    else:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   562
        m = match.always(repo.root, repo.getcwd())
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   563
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   564
    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
   565
    node1 = basectx.node()
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   566
    node2 = ctx.node()
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   567
    parity = paritygen(stripecount)
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
   568
31276
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   569
    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
   570
    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
   571
        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
   572
            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
   573
        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
   574
        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
   575
            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
   576
                s1, l1, s2, l2 = hunkrange
31808
ca3b4a2b7e54 mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents: 31727
diff changeset
   577
                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
   578
                    continue
31276
cd29673cebdb hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31275
diff changeset
   579
            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
   580
        if lines:
37985
6a4de2dc78dd hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37984
diff changeset
   581
            l = templateutil.mappedgenerator(_prettyprintdifflines,
37986
7a9e9fbaa559 hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents: 37985
diff changeset
   582
                                             args=(lines, blockno,
37985
6a4de2dc78dd hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37984
diff changeset
   583
                                                   lineidprefix))
37987
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   584
            yield {
37019
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   585
                'parity': next(parity),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   586
                'blockno': blockno,
37985
6a4de2dc78dd hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 37984
diff changeset
   587
                'lines': l,
37987
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
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   590
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
   591
    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
   592
            linerange, lineidprefix)
8cc23a46df37 hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37986
diff changeset
   593
    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
   594
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   595
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
   596
    lineid = leftlineno and ("l%d" % leftlineno) or ''
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   597
    lineid += rightlineno and ("r%d" % rightlineno) or ''
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   598
    llno = '%d' % leftlineno if leftlineno else ''
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   599
    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
   600
    return {
37988
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   601
        'type': type,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   602
        'lineid': lineid,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   603
        'leftlineno': leftlineno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   604
        'leftlinenumber': "% 6s" % llno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   605
        'leftline': leftline or '',
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   606
        'rightlineno': rightlineno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   607
        'rightlinenumber': "% 6s" % rlno,
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   608
        'rightline': rightline or '',
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   609
    }
37988
406f945c5814 hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37987
diff changeset
   610
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   611
def _getcompblockgen(context, leftlines, rightlines, opcodes):
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   612
    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
   613
        len1 = lhi - llo
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   614
        len2 = rhi - rlo
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   615
        count = min(len1, len2)
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38588
diff changeset
   616
        for i in pycompat.xrange(count):
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   617
            yield _compline(type=type,
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   618
                            leftlineno=llo + i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   619
                            leftline=leftlines[llo + i],
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   620
                            rightlineno=rlo + i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   621
                            rightline=rightlines[rlo + i])
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   622
        if len1 > len2:
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38588
diff changeset
   623
            for i in pycompat.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
   624
                yield _compline(type=type,
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   625
                                leftlineno=i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   626
                                leftline=leftlines[i],
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   627
                                rightlineno=None,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   628
                                rightline=None)
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   629
        elif len2 > len1:
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38588
diff changeset
   630
            for i in pycompat.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
   631
                yield _compline(type=type,
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   632
                                leftlineno=None,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   633
                                leftline=None,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   634
                                rightlineno=i + 1,
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   635
                                rightline=rightlines[i])
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   636
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   637
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
   638
    args = (leftlines, rightlines, opcodes)
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   639
    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
   640
                                         name='comparisonline')
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   641
37992
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   642
def _comparegen(context, contextnum, leftlines, rightlines):
37989
53b0a51aed72 hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37988
diff changeset
   643
    '''Generator function that provides side-by-side comparison data.'''
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   644
    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
   645
    if contextnum < 0:
37990
c0ccbf4fbe47 hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37989
diff changeset
   646
        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
   647
        yield {'lines': l}
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   648
    else:
37991
4e407c7b1fbd hgweb: rename 'context' argument of webutil.compare() to avoid name conflicts
Yuya Nishihara <yuya@tcha.org>
parents: 37990
diff changeset
   649
        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
   650
            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
   651
            yield {'lines': l}
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   652
37993
623dc2651d26 hgweb: drop unused argument 'tmpl' from webutil.compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37992
diff changeset
   653
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
   654
    args = (contextnum, leftlines, rightlines)
b3992c21b7f3 hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents: 37991
diff changeset
   655
    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
   656
                                         name='comparisonblock')
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
   657
38585
66eb74f9d87d hgweb: pass ui to diffstatgen() explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 38566
diff changeset
   658
def diffstatgen(ui, ctx, basectx):
14570
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   659
    '''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
   660
38585
66eb74f9d87d hgweb: pass ui to diffstatgen() explicitly
Yuya Nishihara <yuya@tcha.org>
parents: 38566
diff changeset
   661
    diffopts = patch.diffopts(ui, {'noprefix': False})
35429
0279c2267d00 hgweb: disable diff.noprefix option for diffstat
Yuya Nishihara <yuya@tcha.org>
parents: 34855
diff changeset
   662
    stats = patch.diffstatdata(
38566
1770416de208 webutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38519
diff changeset
   663
        util.iterlines(ctx.diff(basectx, opts=diffopts)))
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   664
    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
   665
    while True:
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   666
        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
   667
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   668
def diffsummary(statgen):
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   669
    '''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
   670
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   671
    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
   672
    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
   673
             len(stats), addtotal, removetotal)
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
   674
38058
6369e21e97ac hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents: 38057
diff changeset
   675
def _diffstattmplgen(context, ctx, statgen, parity):
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28709
diff changeset
   676
    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
   677
    files = ctx.files()
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   678
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   679
    def pct(i):
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   680
        if maxtotal == 0:
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   681
            return 0
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   682
        return (float(i) / maxtotal) * 100
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   683
14562
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
   684
    fileno = 0
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
   685
    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
   686
        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
   687
        total = adds + removes
14562
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
   688
        fileno += 1
38058
6369e21e97ac hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents: 38057
diff changeset
   689
        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
   690
            'node': ctx.hex(),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   691
            'file': filename,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   692
            'fileno': fileno,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   693
            'total': total,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   694
            'addpct': pct(adds),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   695
            'removepct': pct(removes),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   696
            'parity': next(parity),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36955
diff changeset
   697
        })
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
   698
38059
4c3ab15f3532 hgweb: drop unused argument 'tmpl' from webutil.diffstat()
Yuya Nishihara <yuya@tcha.org>
parents: 38058
diff changeset
   699
def diffstat(ctx, statgen, parity):
38057
f0ee627162f4 hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38043
diff changeset
   700
    '''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
   701
    args = (ctx, statgen, parity)
38057
f0ee627162f4 hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38043
diff changeset
   702
    return templateutil.mappedgenerator(_diffstattmplgen, args=args)
f0ee627162f4 hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38043
diff changeset
   703
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   704
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
   705
    def __init__(self, vars, start='?'):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   706
        self._start = start
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   707
        self._vars = vars
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   708
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   709
    def __getitem__(self, key):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   710
        return self._vars[key]
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   711
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   712
    def __setitem__(self, key, value):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   713
        self._vars[key] = value
37695
570a4426c5b8 hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents: 37694
diff changeset
   714
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   715
    def __copy__(self):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   716
        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
   717
38267
fb874fc1d9b4 templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38265
diff changeset
   718
    def contains(self, context, mapping, item):
fb874fc1d9b4 templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38265
diff changeset
   719
        item = templateutil.unwrapvalue(context, mapping, item)
fb874fc1d9b4 templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38265
diff changeset
   720
        return item in self._vars
fb874fc1d9b4 templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38265
diff changeset
   721
38243
06d11cd90516 templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38215
diff changeset
   722
    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
   723
        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
   724
        return self._vars.get(key)
06d11cd90516 templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents: 38215
diff changeset
   725
38265
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   726
    def getmin(self, context, mapping):
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   727
        raise error.ParseError(_('not comparable'))
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   728
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   729
    def getmax(self, context, mapping):
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   730
        raise error.ParseError(_('not comparable'))
41ae9b3cbfb9 templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents: 38244
diff changeset
   731
38448
dae829b4de78 templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents: 38289
diff changeset
   732
    def filter(self, context, mapping, select):
dae829b4de78 templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents: 38289
diff changeset
   733
        # implement if necessary
dae829b4de78 templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents: 38289
diff changeset
   734
        raise error.ParseError(_('not filterable'))
dae829b4de78 templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents: 38289
diff changeset
   735
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   736
    def itermaps(self, context):
37694
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   737
        separator = self._start
d14dbf46e5c7 hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents: 37515
diff changeset
   738
        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
   739
            yield {'name': key,
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   740
                   'value': pycompat.bytestr(value),
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   741
                   'separator': separator,
3caec3c032c8 webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents: 34403
diff changeset
   742
            }
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
   743
            separator = '&'
12691
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   744
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   745
    def join(self, context, mapping, sep):
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   746
        # could be '{separator}{name}={value|urlescape}'
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   747
        raise error.ParseError(_('not displayable without template'))
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   748
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   749
    def show(self, context, mapping):
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   750
        return self.join(context, '')
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   751
38289
f9c426385853 templater: abstract truth testing to fix {if(list_of_empty_strings)}
Yuya Nishihara <yuya@tcha.org>
parents: 38267
diff changeset
   752
    def tobool(self, context, mapping):
f9c426385853 templater: abstract truth testing to fix {if(list_of_empty_strings)}
Yuya Nishihara <yuya@tcha.org>
parents: 38267
diff changeset
   753
        return bool(self._vars)
f9c426385853 templater: abstract truth testing to fix {if(list_of_empty_strings)}
Yuya Nishihara <yuya@tcha.org>
parents: 38267
diff changeset
   754
37696
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   755
    def tovalue(self, context, mapping):
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   756
        return self._vars
9ac3e97b299b hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents: 37695
diff changeset
   757
27007
c8cbef073645 hgweb: alias ui module as uimod
Yuya Nishihara <yuya@tcha.org>
parents: 26894
diff changeset
   758
class wsgiui(uimod.ui):
12691
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   759
    # 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
   760
    def termwidth(self):
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
   761
        return 80
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   762
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   763
def getwebsubs(repo):
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   764
    websubtable = []
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   765
    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
   766
    # 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
   767
    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
   768
    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
   769
        # 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
   770
        unesc = pattern[1:2]
38475
67dc32d4e790 cleanup: migrate from re.escape to stringutil.reescape
Augie Fackler <augie@google.com>
parents: 38448
diff changeset
   771
        delim = stringutil.reescape(unesc)
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   772
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   773
        # 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
   774
        # 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
   775
        # delimiters are required.
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   776
        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
   777
            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
   778
            % (delim, delim, delim), pattern)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   779
        if not match:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   780
            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
   781
                              % (key, pattern))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   782
            continue
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   783
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   784
        # 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
   785
        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
   786
        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
   787
        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
   788
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   789
        # 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
   790
        flagin = match.group(3)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   791
        flags = 0
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   792
        if flagin:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   793
            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
   794
                flags |= re.__dict__[flag]
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   795
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   796
        try:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   797
            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
   798
            websubtable.append((regexp, format))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   799
        except re.error:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   800
            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
   801
                         % (key, regexp))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
   802
    return websubtable
37909
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   803
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   804
def getgraphnode(repo, ctx):
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   805
    return (templatekw.getgraphnodecurrent(repo, ctx) +
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37907
diff changeset
   806
            templatekw.getgraphnodesymbol(ctx))