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