mercurial/hgweb/webcommands.py
author Kyle Lippincott <spectral@google.com>
Wed, 13 Mar 2019 20:09:56 -0700
changeset 41993 cde5827d09a7
parent 41419 0bd56c291359
child 43076 2372284d9457
permissions -rw-r--r--
crecord: redraw the screen when starting up chunkselector Failure to do this can cause screen corruption like: <headerline> [X] filename.cc <several blank lines> <output from previous iteration of split that happened to be here> I believe this might only happen in some terminals, and maybe only when using the "alternate screen". Regardless of the exact conditions to reproduce, it should be safe to always clear it when starting up and is probably the correct thing to do anyway :) Differential Revision: https://phab.mercurial-scm.org/D6131
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     1
#
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     2
# Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     3
# Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     4
#
8225
46293a0c7e9f updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents: 8209
diff changeset
     5
# 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: 9404
diff changeset
     6
# GNU General Public License version 2 or any later version.
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
     7
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
     8
from __future__ import absolute_import
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
     9
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    10
import copy
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    11
import mimetypes
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    12
import os
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    13
import re
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    14
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    15
from ..i18n import _
37953
7fae76c2c564 hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents: 37946
diff changeset
    16
from ..node import hex, short
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    17
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    18
from .common import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    19
    ErrorResponse,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    20
    HTTP_FORBIDDEN,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    21
    HTTP_NOT_FOUND,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    22
    get_contact,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    23
    paritygen,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    24
    staticfile,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    25
)
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    26
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    27
from .. import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    28
    archival,
32922
582080a4a812 dagop: move blockancestors() and blockdescendants() from context
Yuya Nishihara <yuya@tcha.org>
parents: 32599
diff changeset
    29
    dagop,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    30
    encoding,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    31
    error,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    32
    graphmod,
34809
3a65012be661 webcommands: replace str(ctx) etc with pycompat.bytestr(ctx) etc
Augie Fackler <augie@google.com>
parents: 34695
diff changeset
    33
    pycompat,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    34
    revset,
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31043
diff changeset
    35
    revsetlang,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    36
    scmutil,
31043
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30826
diff changeset
    37
    smartset,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    38
    templater,
37400
47aea60d114d hgweb: fix search {entries} to not return results of template expansion
Yuya Nishihara <yuya@tcha.org>
parents: 37387
diff changeset
    39
    templateutil,
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    40
)
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    41
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    42
from ..utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
    43
    stringutil,
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    44
)
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    45
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    46
from . import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    47
    webutil,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
    48
)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    49
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    50
__all__ = []
24077
e8046ca0405d webcommands: define a dict of available commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24076
diff changeset
    51
commands = {}
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    52
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    53
class webcommand(object):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    54
    """Decorator used to register a web command handler.
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    55
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    56
    The decorator takes as its positional arguments the name/path the
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    57
    command should be accessible under.
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    58
36876
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    59
    When called, functions receive as arguments a ``requestcontext``,
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    60
    ``wsgirequest``, and a templater instance for generatoring output.
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    61
    The functions should populate the ``rctx.res`` object with details
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    62
    about the HTTP response.
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    63
36886
67fb0dca29bc hgweb: always return iterable from @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36882
diff changeset
    64
    The function returns a generator to be consumed by the WSGI application.
67fb0dca29bc hgweb: always return iterable from @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36882
diff changeset
    65
    For most commands, this should be the result from
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
    66
    ``web.res.sendresponse()``. Many commands will call ``web.sendtemplate()``
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
    67
    to render a template.
36876
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
    68
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    69
    Usage:
5963
5be210afe1b8 hgweb: explicitly check if requested command exists
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5960
diff changeset
    70
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    71
    @webcommand('mycommand')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
    72
    def mycommand(web):
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    73
        pass
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    74
    """
5963
5be210afe1b8 hgweb: explicitly check if requested command exists
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5960
diff changeset
    75
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    76
    def __init__(self, name):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    77
        self.name = name
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    78
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    79
    def __call__(self, func):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    80
        __all__.append(self.name)
24077
e8046ca0405d webcommands: define a dict of available commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24076
diff changeset
    81
        commands[self.name] = func
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    82
        return func
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    83
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    84
@webcommand('log')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
    85
def log(web):
24087
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    86
    """
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    87
    /log[/{revision}[/{path}]]
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    88
    --------------------------
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    89
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    90
    Show repository or file history.
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    91
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    92
    For URLs of the form ``/log/{revision}``, a list of changesets starting at
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    93
    the specified changeset identifier is shown. If ``{revision}`` is not
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    94
    defined, the default is ``tip``. This form is equivalent to the
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    95
    ``changelog`` handler.
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    96
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    97
    For URLs of the form ``/log/{revision}/{file}``, the history for a specific
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    98
    file will be shown. This form is equivalent to the ``filelog`` handler.
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    99
    """
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
   100
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   101
    if web.req.qsparams.get('file'):
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   102
        return filelog(web)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   103
    else:
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   104
        return changelog(web)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   105
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   106
@webcommand('rawfile')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   107
def rawfile(web):
34608
f12de15c5711 configitems: register the 'web.guessmime' config
Boris Feld <boris.feld@octobus.net>
parents: 34433
diff changeset
   108
    guessmime = web.configbool('web', 'guessmime')
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
   109
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   110
    path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   111
    if not path:
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   112
        return manifest(web)
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   113
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   114
    try:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   115
        fctx = webutil.filectx(web.repo, web.req)
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25602
diff changeset
   116
    except error.LookupError as inst:
6368
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
   117
        try:
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   118
            return manifest(web)
6368
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
   119
        except ErrorResponse:
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
   120
            raise inst
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   121
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   122
    path = fctx.path()
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   123
    text = fctx.data()
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
   124
    mt = 'application/binary'
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
   125
    if guessmime:
40158
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   126
        mt = mimetypes.guess_type(pycompat.fsdecode(path))[0]
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
   127
        if mt is None:
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
   128
            if stringutil.binary(text):
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   129
                mt = 'application/binary'
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   130
            else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   131
                mt = 'text/plain'
40158
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   132
        else:
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   133
            mt = pycompat.sysbytes(mt)
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   134
11332
716e176a4e01 hgweb: specify a charset when sending raw text files
Julian Cowley <julian@lava.net>
parents: 10394
diff changeset
   135
    if mt.startswith('text/'):
716e176a4e01 hgweb: specify a charset when sending raw text files
Julian Cowley <julian@lava.net>
parents: 10394
diff changeset
   136
        mt += '; charset="%s"' % encoding.encoding
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   137
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   138
    web.res.headers['Content-Type'] = mt
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   139
    filename = (path.rpartition('/')[-1]
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   140
                .replace('\\', '\\\\').replace('"', '\\"'))
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   141
    web.res.headers['Content-Disposition'] = 'inline; filename="%s"' % filename
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   142
    web.res.setbodybytes(text)
36886
67fb0dca29bc hgweb: always return iterable from @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36882
diff changeset
   143
    return web.res.sendresponse()
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   144
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   145
def _filerevision(web, fctx):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   146
    f = fctx.path()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   147
    text = fctx.data()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   148
    parity = paritygen(web.stripecount)
39800
be0f32ca2671 hgweb: use heads() instead of headrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39443
diff changeset
   149
    ishead = fctx.filenode() in fctx.filelog().heads()
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   150
37087
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 37069
diff changeset
   151
    if stringutil.binary(text):
40158
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   152
        mt = pycompat.sysbytes(
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   153
            mimetypes.guess_type(pycompat.fsdecode(f))[0]
40211
d216ae4cc3f6 py3: r'' prefix default values for mimetypes.guess_mime()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40158
diff changeset
   154
            or r'application/octet-stream')
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   155
        text = '(binary:%s)' % mt
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   156
38093
aeccb08af311 hgweb: wrap {lines} of filerevision with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38076
diff changeset
   157
    def lines(context):
9136
31177742f54a for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8842
diff changeset
   158
        for lineno, t in enumerate(text.splitlines(True)):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   159
            yield {"line": t,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   160
                   "lineid": "l%d" % (lineno + 1),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   161
                   "linenumber": "% 6d" % (lineno + 1),
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   162
                   "parity": next(parity)}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   163
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   164
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   165
        'filerevision',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   166
        file=f,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   167
        path=webutil.up(f),
38093
aeccb08af311 hgweb: wrap {lines} of filerevision with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38076
diff changeset
   168
        text=templateutil.mappinggenerator(lines),
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   169
        symrev=webutil.symrevorshortnode(web.req, fctx),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   170
        rename=webutil.renamelink(fctx),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   171
        permissions=fctx.manifest().flags(f),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   172
        ishead=int(ishead),
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   173
        **pycompat.strkwargs(webutil.commonentry(web.repo, fctx)))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   174
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   175
@webcommand('file')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   176
def file(web):
24088
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   177
    """
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   178
    /file/{revision}[/{path}]
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   179
    -------------------------
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   180
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   181
    Show information about a directory or file in the repository.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   182
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   183
    Info about the ``path`` given as a URL parameter will be rendered.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   184
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   185
    If ``path`` is a directory, information about the entries in that
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   186
    directory will be rendered. This form is equivalent to the ``manifest``
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   187
    handler.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   188
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   189
    If ``path`` is a file, information about that file will be shown via
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   190
    the ``filerevision`` template.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   191
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   192
    If ``path`` is not defined, information about the root directory will
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   193
    be rendered.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   194
    """
36878
89002d07a114 hgweb: remove one-off routing for file?style=raw
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36877
diff changeset
   195
    if web.req.qsparams.get('style') == 'raw':
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   196
        return rawfile(web)
36878
89002d07a114 hgweb: remove one-off routing for file?style=raw
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36877
diff changeset
   197
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   198
    path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
6853
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   199
    if not path:
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   200
        return manifest(web)
6853
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   201
    try:
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   202
        return _filerevision(web, webutil.filectx(web.repo, web.req))
25660
328739ea70c3 global: mass rewrite to use modern exception syntax
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25602
diff changeset
   203
    except error.LookupError as inst:
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   204
        try:
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   205
            return manifest(web)
6853
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   206
        except ErrorResponse:
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   207
            raise inst
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   208
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   209
def _search(web):
19656
60ce14e41faf hgweb: add string constants for search mode names
Alexander Plavin <alexander@plav.in>
parents: 19634
diff changeset
   210
    MODE_REVISION = 'rev'
60ce14e41faf hgweb: add string constants for search mode names
Alexander Plavin <alexander@plav.in>
parents: 19634
diff changeset
   211
    MODE_KEYWORD = 'keyword'
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   212
    MODE_REVSET = 'revset'
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   213
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   214
    def revsearch(ctx):
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   215
        yield ctx
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   216
19632
299511aabf85 hgweb: pass arguments which a function depends on explicitly in search
Alexander Plavin <alexander@plav.in>
parents: 19631
diff changeset
   217
    def keywordsearch(query):
15727
917f263eeb26 i18n: use "encoding.lower()" to normalize string in hgweb search query
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15528
diff changeset
   218
        lower = encoding.lower
917f263eeb26 i18n: use "encoding.lower()" to normalize string in hgweb search query
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15528
diff changeset
   219
        qw = lower(query).split()
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   220
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   221
        def revgen():
18497
a58d8936647a hgweb: prevent traceback during search when filtered (issue3783)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18478
diff changeset
   222
            cl = web.repo.changelog
38823
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38486
diff changeset
   223
            for i in pycompat.xrange(len(web.repo) - 1, 0, -100):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   224
                l = []
19491
e111d5e6bbbd hgweb: fix duplication for some search queries
Alexander Plavin <me@aplavin.ru>
parents: 19487
diff changeset
   225
                for j in cl.revs(max(0, i - 99), i):
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   226
                    ctx = web.repo[j]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   227
                    l.append(ctx)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   228
                l.reverse()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   229
                for e in l:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   230
                    yield e
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   231
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   232
        for ctx in revgen():
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   233
            miss = 0
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   234
            for q in qw:
15727
917f263eeb26 i18n: use "encoding.lower()" to normalize string in hgweb search query
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15528
diff changeset
   235
                if not (q in lower(ctx.user()) or
917f263eeb26 i18n: use "encoding.lower()" to normalize string in hgweb search query
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15528
diff changeset
   236
                        q in lower(ctx.description()) or
917f263eeb26 i18n: use "encoding.lower()" to normalize string in hgweb search query
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 15528
diff changeset
   237
                        q in lower(" ".join(ctx.files()))):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   238
                    miss = 1
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   239
                    break
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   240
            if miss:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   241
                continue
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   242
19533
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   243
            yield ctx
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   244
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   245
    def revsetsearch(revs):
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   246
        for r in revs:
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   247
            yield web.repo[r]
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   248
19631
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   249
    searchfuncs = {
20004
06e118c097ff hgweb, i18n: do not translate search mode description
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 19951
diff changeset
   250
        MODE_REVISION: (revsearch, 'exact revision search'),
06e118c097ff hgweb, i18n: do not translate search mode description
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 19951
diff changeset
   251
        MODE_KEYWORD: (keywordsearch, 'literal keyword search'),
06e118c097ff hgweb, i18n: do not translate search mode description
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 19951
diff changeset
   252
        MODE_REVSET: (revsetsearch, 'revset expression search'),
19631
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   253
    }
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   254
19632
299511aabf85 hgweb: pass arguments which a function depends on explicitly in search
Alexander Plavin <alexander@plav.in>
parents: 19631
diff changeset
   255
    def getsearchmode(query):
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   256
        try:
37387
83d537162894 hgweb: use revsymbol() to determine if query is a revision
Martin von Zweigbergk <martinvonz@google.com>
parents: 37363
diff changeset
   257
            ctx = scmutil.revsymbol(web.repo, query)
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   258
        except (error.RepoError, error.LookupError):
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   259
            # query is not an exact revision pointer, need to
19951
d51c4d85ec23 spelling: random spell checker fixes
Mads Kiilerich <madski@unity3d.com>
parents: 19886
diff changeset
   260
            # decide if it's a revset expression or keywords
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   261
            pass
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   262
        else:
19656
60ce14e41faf hgweb: add string constants for search mode names
Alexander Plavin <alexander@plav.in>
parents: 19634
diff changeset
   263
            return MODE_REVISION, ctx
19631
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   264
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   265
        revdef = 'reverse(%s)' % query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   266
        try:
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31043
diff changeset
   267
            tree = revsetlang.parse(revdef)
27009
f5faef7e9119 hgweb: unify import style of error classes
Yuya Nishihara <yuya@tcha.org>
parents: 26894
diff changeset
   268
        except error.ParseError:
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   269
            # can't parse to a revset tree
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   270
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   271
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31043
diff changeset
   272
        if revsetlang.depth(tree) <= 2:
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   273
            # no revset syntax used
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   274
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   275
25149
3f0744eeaeaf cleanup: use __builtins__.any instead of util.any
Augie Fackler <augie@google.com>
parents: 25136
diff changeset
   276
        if any((token, (value or '')[:3]) == ('string', 're:')
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31043
diff changeset
   277
               for token, value, pos in revsetlang.tokenize(revdef)):
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   278
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   279
31044
0b8356705de6 revset: split language services to revsetlang module (API)
Yuya Nishihara <yuya@tcha.org>
parents: 31043
diff changeset
   280
        funcsused = revsetlang.funcsused(tree)
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   281
        if not funcsused.issubset(revset.safesymbols):
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   282
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   283
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   284
        try:
38768
5caee9f923ae hgweb: catch ParseError that's raised by revset.match()
Anton Shestakov <av6@dwimlabs.net>
parents: 38486
diff changeset
   285
            mfunc = revset.match(web.repo.ui, revdef,
5caee9f923ae hgweb: catch ParseError that's raised by revset.match()
Anton Shestakov <av6@dwimlabs.net>
parents: 38486
diff changeset
   286
                                 lookup=revset.lookupfn(web.repo))
24114
fafd9a1284cf revset: make match function initiate query from full set by default
Yuya Nishihara <yuya@tcha.org>
parents: 24097
diff changeset
   287
            revs = mfunc(web.repo)
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   288
            return MODE_REVSET, revs
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   289
            # ParseError: wrongly placed tokens, wrongs arguments, etc
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   290
            # RepoLookupError: no such revision, e.g. in 'revision:'
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   291
            # Abort: bookmark/tag not exists
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   292
            # LookupError: ambiguous identifier, e.g. in '(bc)' on a large repo
27009
f5faef7e9119 hgweb: unify import style of error classes
Yuya Nishihara <yuya@tcha.org>
parents: 26894
diff changeset
   293
        except (error.ParseError, error.RepoLookupError, error.Abort,
f5faef7e9119 hgweb: unify import style of error classes
Yuya Nishihara <yuya@tcha.org>
parents: 26894
diff changeset
   294
                LookupError):
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   295
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   296
37400
47aea60d114d hgweb: fix search {entries} to not return results of template expansion
Yuya Nishihara <yuya@tcha.org>
parents: 37387
diff changeset
   297
    def changelist(context):
19533
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   298
        count = 0
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   299
19765
521c373ff134 hgweb: pass variable with current search mode name to the search template
Alexander Plavin <alexander@plav.in>
parents: 19738
diff changeset
   300
        for ctx in searchfunc[0](funcarg):
6659
bc553c6d1ef9 webcommands: fix increments lost by 894875eae49b
Andrew Beekhof <beekhof@gmail.com>
parents: 6657
diff changeset
   301
            count += 1
39810
4f44f747f094 hgweb: use scmutil.binnode() to translate None to wdir hash (issue5988)
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
   302
            n = scmutil.binnode(ctx)
37956
16c7a6ac8f94 hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents: 37953
diff changeset
   303
            showtags = webutil.showtag(web.repo, 'changelogtag', n)
37998
9482498b96b0 hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents: 37956
diff changeset
   304
            files = webutil.listfilediffs(ctx.files(), n, web.maxfiles)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   305
37022
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   306
            lm = webutil.commonentry(web.repo, ctx)
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   307
            lm.update({
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   308
                'parity': next(parity),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   309
                'changelogtag': showtags,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   310
                'files': files,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   311
            })
37400
47aea60d114d hgweb: fix search {entries} to not return results of template expansion
Yuya Nishihara <yuya@tcha.org>
parents: 37387
diff changeset
   312
            yield lm
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   313
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   314
            if count >= revcount:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   315
                break
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   316
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   317
    query = web.req.qsparams['rev']
19418
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   318
    revcount = web.maxchanges
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   319
    if 'revcount' in web.req.qsparams:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   320
        try:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   321
            revcount = int(web.req.qsparams.get('revcount', revcount))
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   322
            revcount = max(revcount, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   323
            web.tmpl.defaults['sessionvars']['revcount'] = revcount
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   324
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   325
            pass
19418
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   326
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   327
    lessvars = copy.copy(web.tmpl.defaults['sessionvars'])
36582
24897a9d18ac webcommands: use explicit integer division for Python 3 compat
Augie Fackler <augie@google.com>
parents: 36464
diff changeset
   328
    lessvars['revcount'] = max(revcount // 2, 1)
19418
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   329
    lessvars['rev'] = query
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   330
    morevars = copy.copy(web.tmpl.defaults['sessionvars'])
19418
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   331
    morevars['revcount'] = revcount * 2
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   332
    morevars['rev'] = query
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   333
19632
299511aabf85 hgweb: pass arguments which a function depends on explicitly in search
Alexander Plavin <alexander@plav.in>
parents: 19631
diff changeset
   334
    mode, funcarg = getsearchmode(query)
19768
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   335
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   336
    if 'forcekw' in web.req.qsparams:
19768
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   337
        showforcekw = ''
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   338
        showunforcekw = searchfuncs[mode][1]
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   339
        mode = MODE_KEYWORD
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   340
        funcarg = query
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   341
    else:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   342
        if mode != MODE_KEYWORD:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   343
            showforcekw = searchfuncs[MODE_KEYWORD][1]
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   344
        else:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   345
            showforcekw = ''
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   346
        showunforcekw = ''
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   347
19631
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   348
    searchfunc = searchfuncs[mode]
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   349
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   350
    tip = web.repo['tip']
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   351
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   352
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   353
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   354
        'search',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   355
        query=query,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   356
        node=tip.hex(),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   357
        symrev='tip',
37400
47aea60d114d hgweb: fix search {entries} to not return results of template expansion
Yuya Nishihara <yuya@tcha.org>
parents: 37387
diff changeset
   358
        entries=templateutil.mappinggenerator(changelist, name='searchentry'),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   359
        archives=web.archivelist('tip'),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   360
        morevars=morevars,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   361
        lessvars=lessvars,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   362
        modedesc=searchfunc[1],
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   363
        showforcekw=showforcekw,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   364
        showunforcekw=showunforcekw)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   365
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   366
@webcommand('changelog')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   367
def changelog(web, shortlog=False):
24089
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   368
    """
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   369
    /changelog[/{revision}]
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   370
    -----------------------
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   371
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   372
    Show information about multiple changesets.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   373
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   374
    If the optional ``revision`` URL argument is absent, information about
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   375
    all changesets starting at ``tip`` will be rendered. If the ``revision``
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   376
    argument is present, changesets will be shown starting from the specified
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   377
    revision.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   378
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   379
    If ``revision`` is absent, the ``rev`` query string argument may be
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   380
    defined. This will perform a search for changesets.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   381
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   382
    The argument for ``rev`` can be a single revision, a revision set,
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   383
    or a literal keyword to search for in changeset data (equivalent to
24867
6d97ca3f05ba webcommands: fix typo in changelog documentation
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 24859
diff changeset
   384
    :hg:`log -k`).
24089
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   385
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   386
    The ``revcount`` query string argument defines the maximum numbers of
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   387
    changesets to render.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   388
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   389
    For non-searches, the ``changelog`` template will be rendered.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   390
    """
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   391
19396
afc23eddc324 hgweb: show current search query in the input field
Alexander Plavin <me@aplavin.ru>
parents: 18968
diff changeset
   392
    query = ''
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   393
    if 'node' in web.req.qsparams:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   394
        ctx = webutil.changectx(web.repo, web.req)
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   395
        symrev = webutil.symrevorshortnode(web.req, ctx)
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   396
    elif 'rev' in web.req.qsparams:
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   397
        return _search(web)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   398
    else:
19534
983bb4069004 hgweb: cleaner if conditions in changelog() function
Alexander Plavin <alexander@plav.in>
parents: 19533
diff changeset
   399
        ctx = web.repo['tip']
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
   400
        symrev = 'tip'
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   401
38780
ede3bf31fe63 hgweb: load revcount + 1 entries to fill nextentry in log page (issue5972)
Yuya Nishihara <yuya@tcha.org>
parents: 38768
diff changeset
   402
    def changelist(maxcount):
18427
56ca4443a343 hgweb: use changelog for iteration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18409
diff changeset
   403
        revs = []
19486
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   404
        if pos != -1:
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   405
            revs = web.repo.changelog.revs(pos, 0)
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   406
38780
ede3bf31fe63 hgweb: load revcount + 1 entries to fill nextentry in log page (issue5972)
Yuya Nishihara <yuya@tcha.org>
parents: 38768
diff changeset
   407
        for entry in webutil.changelistentries(web, revs, maxcount, parity):
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   408
            yield entry
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   409
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   410
    if shortlog:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   411
        revcount = web.maxshortchanges
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   412
    else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   413
        revcount = web.maxchanges
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   414
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   415
    if 'revcount' in web.req.qsparams:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   416
        try:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   417
            revcount = int(web.req.qsparams.get('revcount', revcount))
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   418
            revcount = max(revcount, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   419
            web.tmpl.defaults['sessionvars']['revcount'] = revcount
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   420
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   421
            pass
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   422
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   423
    lessvars = copy.copy(web.tmpl.defaults['sessionvars'])
36582
24897a9d18ac webcommands: use explicit integer division for Python 3 compat
Augie Fackler <augie@google.com>
parents: 36464
diff changeset
   424
    lessvars['revcount'] = max(revcount // 2, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
   425
    morevars = copy.copy(web.tmpl.defaults['sessionvars'])
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   426
    morevars['revcount'] = revcount * 2
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   427
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   428
    count = len(web.repo)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   429
    pos = ctx.rev()
19486
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   430
    parity = paritygen(web.stripecount)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   431
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   432
    changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   433
38780
ede3bf31fe63 hgweb: load revcount + 1 entries to fill nextentry in log page (issue5972)
Yuya Nishihara <yuya@tcha.org>
parents: 38768
diff changeset
   434
    entries = list(changelist(revcount + 1))
19737
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   435
    latestentry = entries[:1]
19738
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   436
    if len(entries) > revcount:
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   437
        nextentry = entries[-1:]
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   438
        entries = entries[:-1]
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   439
    else:
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   440
        nextentry = []
19737
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   441
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   442
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   443
        'shortlog' if shortlog else 'changelog',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   444
        changenav=changenav,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   445
        node=ctx.hex(),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   446
        rev=pos,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   447
        symrev=symrev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   448
        changesets=count,
38094
d3b4c4769b5c hgweb: wrap {entries}* of changelog with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38093
diff changeset
   449
        entries=templateutil.mappinglist(entries),
d3b4c4769b5c hgweb: wrap {entries}* of changelog with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38093
diff changeset
   450
        latestentry=templateutil.mappinglist(latestentry),
d3b4c4769b5c hgweb: wrap {entries}* of changelog with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38093
diff changeset
   451
        nextentry=templateutil.mappinglist(nextentry),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   452
        archives=web.archivelist('tip'),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   453
        revcount=revcount,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   454
        morevars=morevars,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   455
        lessvars=lessvars,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   456
        query=query)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   457
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   458
@webcommand('shortlog')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   459
def shortlog(web):
24086
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   460
    """
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   461
    /shortlog
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   462
    ---------
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   463
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   464
    Show basic information about a set of changesets.
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   465
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   466
    This accepts the same parameters as the ``changelog`` handler. The only
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   467
    difference is the ``shortlog`` template will be rendered instead of the
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   468
    ``changelog`` template.
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   469
    """
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   470
    return changelog(web, shortlog=True)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   471
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   472
@webcommand('changeset')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   473
def changeset(web):
24085
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   474
    """
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   475
    /changeset[/{revision}]
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   476
    -----------------------
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   477
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   478
    Show information about a single changeset.
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   479
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   480
    A URL path argument is the changeset identifier to show. See ``hg help
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   481
    revisions`` for possible values. If not defined, the ``tip`` changeset
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   482
    will be shown.
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   483
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   484
    The ``changeset`` template is rendered. Contents of the ``changesettag``,
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   485
    ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   486
    templates related to diffs may all be used to produce the output.
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   487
    """
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   488
    ctx = webutil.changectx(web.repo, web.req)
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   489
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   490
    return web.sendtemplate(
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   491
        'changeset',
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   492
        **webutil.changesetentry(web, ctx))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   493
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   494
rev = webcommand('rev')(changeset)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   495
16448
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   496
def decodepath(path):
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   497
    """Hook for mapping a path in the repository to a path in the
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   498
    working copy.
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   499
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   500
    Extensions (e.g., largefiles) can override this to remap files in
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   501
    the virtual file system presented by the manifest command below."""
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   502
    return path
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   503
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   504
@webcommand('manifest')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   505
def manifest(web):
24090
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   506
    """
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   507
    /manifest[/{revision}[/{path}]]
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   508
    -------------------------------
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   509
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   510
    Show information about a directory.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   511
24868
9668c653eb9d webcommands: fix description of manifest default behavior
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 24867
diff changeset
   512
    If the URL path arguments are omitted, information about the root
24090
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   513
    directory for the ``tip`` changeset will be shown.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   514
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   515
    Because this handler can only show information for directories, it
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   516
    is recommended to use the ``file`` handler instead, as it can handle both
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   517
    directories and files.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   518
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   519
    The ``manifest`` template will be rendered for this handler.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   520
    """
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   521
    if 'node' in web.req.qsparams:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   522
        ctx = webutil.changectx(web.repo, web.req)
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   523
        symrev = webutil.symrevorshortnode(web.req, ctx)
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
   524
    else:
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
   525
        ctx = web.repo['tip']
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
   526
        symrev = 'tip'
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   527
    path = webutil.cleanpath(web.repo, web.req.qsparams.get('file', ''))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   528
    mf = ctx.manifest()
39810
4f44f747f094 hgweb: use scmutil.binnode() to translate None to wdir hash (issue5988)
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
   529
    node = scmutil.binnode(ctx)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   530
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   531
    files = {}
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   532
    dirs = {}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   533
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   534
36737
250f3168d907 hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents: 36582
diff changeset
   535
    if path and path[-1:] != "/":
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   536
        path += "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   537
    l = len(path)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   538
    abspath = "/" + path
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   539
16448
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   540
    for full, n in mf.iteritems():
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   541
        # the virtual path (working copy path) used for the full
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   542
        # (repository) path
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   543
        f = decodepath(full)
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   544
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   545
        if f[:l] != path:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   546
            continue
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   547
        remain = f[l:]
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   548
        elements = remain.split('/')
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   549
        if len(elements) == 1:
16448
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   550
            files[remain] = full
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   551
        else:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   552
            h = dirs # need to retain ref to dirs (root)
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   553
            for elem in elements[0:-1]:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   554
                if elem not in h:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   555
                    h[elem] = {}
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   556
                h = h[elem]
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   557
                if len(h) > 1:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   558
                    break
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   559
            h[None] = None # denotes files present
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   560
7565
5f162f61e479 hgweb: fix problems with empty repositories
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7434
diff changeset
   561
    if mf and not files and not dirs:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   562
        raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   563
38095
17f7b44367bb hgweb: wrap {fentries} and {dentries} of manifest with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38094
diff changeset
   564
    def filelist(context):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 7966
diff changeset
   565
        for f in sorted(files):
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   566
            full = files[f]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   567
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   568
            fctx = ctx.filectx(full)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   569
            yield {"file": full,
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   570
                   "parity": next(parity),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   571
                   "basename": f,
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   572
                   "date": fctx.date(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   573
                   "size": fctx.size(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   574
                   "permissions": mf.flags(full)}
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   575
38095
17f7b44367bb hgweb: wrap {fentries} and {dentries} of manifest with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38094
diff changeset
   576
    def dirlist(context):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 7966
diff changeset
   577
        for d in sorted(dirs):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   578
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   579
            emptydirs = []
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   580
            h = dirs[d]
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   581
            while isinstance(h, dict) and len(h) == 1:
36307
a748a5d1d7c3 webcommands: unpack contents of length-1 dict portably
Augie Fackler <augie@google.com>
parents: 36281
diff changeset
   582
                k, v = next(iter(h.items()))
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   583
                if v:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   584
                    emptydirs.append(k)
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   585
                h = v
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   586
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   587
            path = "%s%s" % (abspath, d)
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   588
            yield {"parity": next(parity),
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   589
                   "path": path,
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   590
                   "emptydirs": "/".join(emptydirs),
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   591
                   "basename": d}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   592
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   593
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   594
        'manifest',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   595
        symrev=symrev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   596
        path=abspath,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   597
        up=webutil.up(abspath),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   598
        upparity=next(parity),
38095
17f7b44367bb hgweb: wrap {fentries} and {dentries} of manifest with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38094
diff changeset
   599
        fentries=templateutil.mappinggenerator(filelist),
17f7b44367bb hgweb: wrap {fentries} and {dentries} of manifest with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38094
diff changeset
   600
        dentries=templateutil.mappinggenerator(dirlist),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   601
        archives=web.archivelist(hex(node)),
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   602
        **pycompat.strkwargs(webutil.commonentry(web.repo, ctx)))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   603
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   604
@webcommand('tags')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   605
def tags(web):
24084
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   606
    """
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   607
    /tags
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   608
    -----
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   609
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   610
    Show information about tags.
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   611
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   612
    No arguments are accepted.
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   613
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   614
    The ``tags`` template is rendered.
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   615
    """
18029
109a6a9dcca8 hgweb: fix iterator reuse in atom feed generation
Matt Mackall <mpm@selenic.com>
parents: 17322
diff changeset
   616
    i = list(reversed(web.repo.tagslist()))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   617
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   618
38096
3c995af3066e hgweb: wrap {entries}* of tags with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38095
diff changeset
   619
    def entries(context, notip, latestonly):
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   620
        t = i
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   621
        if notip:
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   622
            t = [(k, n) for k, n in i if k != "tip"]
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   623
        if latestonly:
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   624
            t = t[:1]
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   625
        for k, n in t:
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   626
            yield {"parity": next(parity),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   627
                   "tag": k,
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   628
                   "date": web.repo[n].date(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   629
                   "node": hex(n)}
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   630
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   631
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   632
        'tags',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   633
        node=hex(web.repo.changelog.tip()),
38096
3c995af3066e hgweb: wrap {entries}* of tags with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38095
diff changeset
   634
        entries=templateutil.mappinggenerator(entries, args=(False, False)),
3c995af3066e hgweb: wrap {entries}* of tags with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38095
diff changeset
   635
        entriesnotip=templateutil.mappinggenerator(entries,
3c995af3066e hgweb: wrap {entries}* of tags with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38095
diff changeset
   636
                                                   args=(True, False)),
3c995af3066e hgweb: wrap {entries}* of tags with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38095
diff changeset
   637
        latestentry=templateutil.mappinggenerator(entries, args=(True, True)))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   638
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   639
@webcommand('bookmarks')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   640
def bookmarks(web):
24083
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   641
    """
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   642
    /bookmarks
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   643
    ----------
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   644
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   645
    Show information about bookmarks.
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   646
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   647
    No arguments are accepted.
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   648
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   649
    The ``bookmarks`` template is rendered.
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   650
    """
18478
886936ecc21b hgweb: don't attempt to show hidden bookmarks (issue3774)
Kevin Bullock <kbullock@ringworld.org>
parents: 18477
diff changeset
   651
    i = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
28711
06ae7a6daad0 hgweb: sort bookmarks in revlog order of their nodes
Anton Shestakov <av6@dwimlabs.net>
parents: 28710
diff changeset
   652
    sortkey = lambda b: (web.repo[b[1]].rev(), b[0])
06ae7a6daad0 hgweb: sort bookmarks in revlog order of their nodes
Anton Shestakov <av6@dwimlabs.net>
parents: 28710
diff changeset
   653
    i = sorted(i, key=sortkey, reverse=True)
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   654
    parity = paritygen(web.stripecount)
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   655
38167
edacd831afab hgweb: wrap {entries}* of bookmarks with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38096
diff changeset
   656
    def entries(context, latestonly):
28710
ca0c0ca30c62 hgweb: sort bookmarks early
Anton Shestakov <av6@dwimlabs.net>
parents: 28212
diff changeset
   657
        t = i
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   658
        if latestonly:
28710
ca0c0ca30c62 hgweb: sort bookmarks early
Anton Shestakov <av6@dwimlabs.net>
parents: 28212
diff changeset
   659
            t = i[:1]
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   660
        for k, n in t:
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   661
            yield {"parity": next(parity),
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   662
                   "bookmark": k,
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   663
                   "date": web.repo[n].date(),
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   664
                   "node": hex(n)}
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   665
28712
80e922479891 hgweb: generate last change date for an empty atom-bookmarks feed (issue5022)
Anton Shestakov <av6@dwimlabs.net>
parents: 28711
diff changeset
   666
    if i:
80e922479891 hgweb: generate last change date for an empty atom-bookmarks feed (issue5022)
Anton Shestakov <av6@dwimlabs.net>
parents: 28711
diff changeset
   667
        latestrev = i[0][1]
80e922479891 hgweb: generate last change date for an empty atom-bookmarks feed (issue5022)
Anton Shestakov <av6@dwimlabs.net>
parents: 28711
diff changeset
   668
    else:
80e922479891 hgweb: generate last change date for an empty atom-bookmarks feed (issue5022)
Anton Shestakov <av6@dwimlabs.net>
parents: 28711
diff changeset
   669
        latestrev = -1
38168
5e94d07b290a hgweb: wrap {lastchange} of bookmarks with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38167
diff changeset
   670
    lastdate = web.repo[latestrev].date()
28712
80e922479891 hgweb: generate last change date for an empty atom-bookmarks feed (issue5022)
Anton Shestakov <av6@dwimlabs.net>
parents: 28711
diff changeset
   671
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   672
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   673
        'bookmarks',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   674
        node=hex(web.repo.changelog.tip()),
38168
5e94d07b290a hgweb: wrap {lastchange} of bookmarks with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38167
diff changeset
   675
        lastchange=templateutil.mappinglist([{'date': lastdate}]),
38167
edacd831afab hgweb: wrap {entries}* of bookmarks with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38096
diff changeset
   676
        entries=templateutil.mappinggenerator(entries, args=(False,)),
edacd831afab hgweb: wrap {entries}* of bookmarks with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38096
diff changeset
   677
        latestentry=templateutil.mappinggenerator(entries, args=(True,)))
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   678
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   679
@webcommand('branches')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   680
def branches(web):
24082
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   681
    """
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   682
    /branches
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   683
    ---------
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   684
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   685
    Show information about branches.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   686
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   687
    All known branches are contained in the output, even closed branches.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   688
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   689
    No arguments are accepted.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   690
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   691
    The ``branches`` template is rendered.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   692
    """
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25660
diff changeset
   693
    entries = webutil.branchentries(web.repo, web.stripecount)
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25660
diff changeset
   694
    latestentry = webutil.branchentries(web.repo, web.stripecount, 1)
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   695
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   696
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   697
        'branches',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   698
        node=hex(web.repo.changelog.tip()),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   699
        entries=entries,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   700
        latestentry=latestentry)
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   701
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   702
@webcommand('summary')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   703
def summary(web):
24091
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   704
    """
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   705
    /summary
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   706
    --------
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   707
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   708
    Show a summary of repository state.
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   709
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   710
    Information about the latest changesets, bookmarks, tags, and branches
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   711
    is captured by this handler.
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   712
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   713
    The ``summary`` template is rendered.
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   714
    """
17261
c0068b058fcd webcommands: do not modify repo.tagslist()
Patrick Mezard <patrick@mezard.eu>
parents: 17202
diff changeset
   715
    i = reversed(web.repo.tagslist())
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   716
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   717
    def tagentries(context):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   718
        parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   719
        count = 0
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   720
        for k, n in i:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   721
            if k == "tip": # skip tip
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   722
                continue
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   723
6659
bc553c6d1ef9 webcommands: fix increments lost by 894875eae49b
Andrew Beekhof <beekhof@gmail.com>
parents: 6657
diff changeset
   724
            count += 1
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   725
            if count > 10: # limit to 10 tags
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   726
                break
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   727
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   728
            yield {
37022
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   729
                'parity': next(parity),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   730
                'tag': k,
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   731
                'node': hex(n),
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   732
                'date': web.repo[n].date(),
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   733
            }
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   734
38169
e4a43d261715 hgweb: wrap {bookmarks} of summary with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38168
diff changeset
   735
    def bookmarks(context):
13924
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   736
        parity = paritygen(web.stripecount)
18563
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   737
        marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
28711
06ae7a6daad0 hgweb: sort bookmarks in revlog order of their nodes
Anton Shestakov <av6@dwimlabs.net>
parents: 28710
diff changeset
   738
        sortkey = lambda b: (web.repo[b[1]].rev(), b[0])
06ae7a6daad0 hgweb: sort bookmarks in revlog order of their nodes
Anton Shestakov <av6@dwimlabs.net>
parents: 28710
diff changeset
   739
        marks = sorted(marks, key=sortkey, reverse=True)
06ae7a6daad0 hgweb: sort bookmarks in revlog order of their nodes
Anton Shestakov <av6@dwimlabs.net>
parents: 28710
diff changeset
   740
        for k, n in marks[:10]:  # limit to 10 bookmarks
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   741
            yield {'parity': next(parity),
13924
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   742
                   'bookmark': k,
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   743
                   'date': web.repo[n].date(),
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   744
                   'node': hex(n)}
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   745
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   746
    def changelist(context):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   747
        parity = paritygen(web.stripecount, offset=start - end)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   748
        l = [] # build a list in forward order for efficiency
18563
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   749
        revs = []
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   750
        if start < end:
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   751
            revs = web.repo.changelog.revs(start, end - 1)
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   752
        for i in revs:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   753
            ctx = web.repo[i]
37022
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   754
            lm = webutil.commonentry(web.repo, ctx)
c97b936d8bb5 templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents: 36983
diff changeset
   755
            lm['parity'] = next(parity)
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   756
            l.append(lm)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   757
29382
e4b777fe1576 templates: add support for summary webcommand in json style
Laura Médioni <laura.medioni@logilab.fr>
parents: 29325
diff changeset
   758
        for entry in reversed(l):
e4b777fe1576 templates: add support for summary webcommand in json style
Laura Médioni <laura.medioni@logilab.fr>
parents: 29325
diff changeset
   759
            yield entry
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   760
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   761
    tip = web.repo['tip']
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   762
    count = len(web.repo)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   763
    start = max(0, count - web.maxchanges)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   764
    end = min(count, start + web.maxchanges)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   765
34245
a6c18628dff1 configitems: register the 'web.description' config
Boris Feld <boris.feld@octobus.net>
parents: 34100
diff changeset
   766
    desc = web.config("web", "description")
a6c18628dff1 configitems: register the 'web.description' config
Boris Feld <boris.feld@octobus.net>
parents: 34100
diff changeset
   767
    if not desc:
a6c18628dff1 configitems: register the 'web.description' config
Boris Feld <boris.feld@octobus.net>
parents: 34100
diff changeset
   768
        desc = 'unknown'
37510
876d54f800cf hgweb: wrap {labels} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37403
diff changeset
   769
    labels = web.configlist('web', 'labels')
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   770
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   771
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   772
        'summary',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   773
        desc=desc,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   774
        owner=get_contact(web.config) or 'unknown',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   775
        lastchange=tip.date(),
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   776
        tags=templateutil.mappinggenerator(tagentries, name='tagentry'),
38169
e4a43d261715 hgweb: wrap {bookmarks} of summary with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38168
diff changeset
   777
        bookmarks=templateutil.mappinggenerator(bookmarks),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   778
        branches=webutil.branchentries(web.repo, web.stripecount, 10),
37401
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   779
        shortlog=templateutil.mappinggenerator(changelist,
7d94fe3ea0ac hgweb: fix summary {tags} and {shortlog} to not forcibly expand template
Yuya Nishihara <yuya@tcha.org>
parents: 37400
diff changeset
   780
                                               name='shortlogentry'),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   781
        node=tip.hex(),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   782
        symrev='tip',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   783
        archives=web.archivelist('tip'),
37510
876d54f800cf hgweb: wrap {labels} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents: 37403
diff changeset
   784
        labels=templateutil.hybridlist(labels, name='label'))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   785
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   786
@webcommand('filediff')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   787
def filediff(web):
24092
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   788
    """
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   789
    /diff/{revision}/{path}
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   790
    -----------------------
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   791
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   792
    Show how a file changed in a particular commit.
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   793
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   794
    The ``filediff`` template is rendered.
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   795
26781
1aee2ab0f902 spelling: trivial spell checking
Mads Kiilerich <madski@unity3d.com>
parents: 26136
diff changeset
   796
    This handler is registered under both the ``/diff`` and ``/filediff``
24092
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   797
    paths. ``/diff`` is used in modern code.
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   798
    """
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   799
    fctx, ctx = None, None
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   800
    try:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   801
        fctx = webutil.filectx(web.repo, web.req)
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7183
diff changeset
   802
    except LookupError:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   803
        ctx = webutil.changectx(web.repo, web.req)
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   804
        path = webutil.cleanpath(web.repo, web.req.qsparams['file'])
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   805
        if path not in ctx.files():
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   806
            raise
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   807
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   808
    if fctx is not None:
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   809
        path = fctx.path()
16722
7bf48bc7de23 hgweb: fix filediff base calculation
Matt Mackall <mpm@selenic.com>
parents: 16469
diff changeset
   810
        ctx = fctx.changectx()
31099
abb92b3d370e hgweb: explictly pass basectx in webutil.diffs
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31044
diff changeset
   811
    basectx = ctx.p1()
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   812
34253
db63872e10cc configitems: register the 'web.style' config
Boris Feld <boris.feld@octobus.net>
parents: 34245
diff changeset
   813
    style = web.config('web', 'style')
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   814
    if 'style' in web.req.qsparams:
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   815
        style = web.req.qsparams['style']
9402
5d49fdef6fd0 hgweb: show diff header line in raw diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8842
diff changeset
   816
36891
c68e79dcf21c hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36890
diff changeset
   817
    diffs = webutil.diffs(web, ctx, basectx, [path], style)
27160
c533435cbc37 webcommands: test that fctx is not None in filediff()
Anton Shestakov <av6@dwimlabs.net>
parents: 27159
diff changeset
   818
    if fctx is not None:
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   819
        rename = webutil.renamelink(fctx)
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   820
        ctx = fctx
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   821
    else:
37946
2095331ff926 hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   822
        rename = templateutil.mappinglist([])
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   823
        ctx = ctx
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   824
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   825
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   826
        'filediff',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   827
        file=path,
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   828
        symrev=webutil.symrevorshortnode(web.req, ctx),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   829
        rename=rename,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   830
        diff=diffs,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   831
        **pycompat.strkwargs(webutil.commonentry(web.repo, ctx)))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   832
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   833
diff = webcommand('diff')(filediff)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   834
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   835
@webcommand('comparison')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   836
def comparison(web):
24093
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   837
    """
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   838
    /comparison/{revision}/{path}
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   839
    -----------------------------
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   840
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   841
    Show a comparison between the old and new versions of a file from changes
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   842
    made on a particular revision.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   843
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   844
    This is similar to the ``diff`` handler. However, this form features
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   845
    a split or side-by-side diff rather than a unified diff.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   846
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   847
    The ``context`` query string argument can be used to control the lines of
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   848
    context in the diff.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   849
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   850
    The ``filecomparison`` template is rendered.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   851
    """
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   852
    ctx = webutil.changectx(web.repo, web.req)
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   853
    if 'file' not in web.req.qsparams:
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17261
diff changeset
   854
        raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   855
    path = webutil.cleanpath(web.repo, web.req.qsparams['file'])
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   856
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   857
    parsecontext = lambda v: v == 'full' and -1 or int(v)
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   858
    if 'context' in web.req.qsparams:
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
   859
        context = parsecontext(web.req.qsparams['context'])
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   860
    else:
40464
4265bfb53dd3 hgweb: register web.comparisoncontext to the config table
Matt Harbison <matt_harbison@yahoo.com>
parents: 40295
diff changeset
   861
        context = parsecontext(web.config('web', 'comparisoncontext'))
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   862
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   863
    def filelines(f):
32189
f238a483a1fd webcommands: use fctx.isbinary
Jun Wu <quark@fb.com>
parents: 32070
diff changeset
   864
        if f.isbinary():
40158
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   865
            mt = pycompat.sysbytes(
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   866
                mimetypes.guess_type(pycompat.fsdecode(f.path()))[0]
40211
d216ae4cc3f6 py3: r'' prefix default values for mimetypes.guess_mime()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40158
diff changeset
   867
                or r'application/octet-stream')
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   868
            return [_('(binary file %s, hash: %s)') % (mt, hex(f.filenode()))]
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   869
        return f.data().splitlines()
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   870
27158
522ffc189671 webcommands: get correct parents when comparing a removed file (issue4962)
Anton Shestakov <av6@dwimlabs.net>
parents: 27081
diff changeset
   871
    fctx = None
21123
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
   872
    parent = ctx.p1()
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
   873
    leftrev = parent.rev()
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
   874
    leftnode = parent.node()
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
   875
    rightrev = ctx.rev()
39810
4f44f747f094 hgweb: use scmutil.binnode() to translate None to wdir hash (issue5988)
Yuya Nishihara <yuya@tcha.org>
parents: 39809
diff changeset
   876
    rightnode = scmutil.binnode(ctx)
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   877
    if path in ctx:
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   878
        fctx = ctx[path]
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   879
        rightlines = filelines(fctx)
21121
8c9e84b44221 hgweb: make "comparison" get parent from not filelog but changelog
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20761
diff changeset
   880
        if path not in parent:
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   881
            leftlines = ()
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   882
        else:
21121
8c9e84b44221 hgweb: make "comparison" get parent from not filelog but changelog
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20761
diff changeset
   883
            pfctx = parent[path]
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   884
            leftlines = filelines(pfctx)
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   885
    else:
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   886
        rightlines = ()
41419
0bd56c291359 cleanup: use p1() and p2() instead of parents()[0] and parents()[1]
Martin von Zweigbergk <martinvonz@google.com>
parents: 40953
diff changeset
   887
        pfctx = ctx.p1()[path]
27158
522ffc189671 webcommands: get correct parents when comparing a removed file (issue4962)
Anton Shestakov <av6@dwimlabs.net>
parents: 27081
diff changeset
   888
        leftlines = filelines(pfctx)
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   889
38036
623dc2651d26 hgweb: drop unused argument 'tmpl' from webutil.compare()
Yuya Nishihara <yuya@tcha.org>
parents: 37998
diff changeset
   890
    comparison = webutil.compare(context, leftlines, rightlines)
27158
522ffc189671 webcommands: get correct parents when comparing a removed file (issue4962)
Anton Shestakov <av6@dwimlabs.net>
parents: 27081
diff changeset
   891
    if fctx is not None:
27159
7e10b860c174 webcommands: stop using ersatz if-else ternary operator for rename variable
Anton Shestakov <av6@dwimlabs.net>
parents: 27158
diff changeset
   892
        rename = webutil.renamelink(fctx)
27158
522ffc189671 webcommands: get correct parents when comparing a removed file (issue4962)
Anton Shestakov <av6@dwimlabs.net>
parents: 27081
diff changeset
   893
        ctx = fctx
522ffc189671 webcommands: get correct parents when comparing a removed file (issue4962)
Anton Shestakov <av6@dwimlabs.net>
parents: 27081
diff changeset
   894
    else:
37946
2095331ff926 hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37698
diff changeset
   895
        rename = templateutil.mappinglist([])
27158
522ffc189671 webcommands: get correct parents when comparing a removed file (issue4962)
Anton Shestakov <av6@dwimlabs.net>
parents: 27081
diff changeset
   896
        ctx = ctx
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   897
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   898
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   899
        'filecomparison',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   900
        file=path,
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   901
        symrev=webutil.symrevorshortnode(web.req, ctx),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   902
        rename=rename,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   903
        leftrev=leftrev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   904
        leftnode=hex(leftnode),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   905
        rightrev=rightrev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   906
        rightnode=hex(rightnode),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   907
        comparison=comparison,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   908
        **pycompat.strkwargs(webutil.commonentry(web.repo, ctx)))
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   909
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   910
@webcommand('annotate')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
   911
def annotate(web):
24094
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   912
    """
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   913
    /annotate/{revision}/{path}
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   914
    ---------------------------
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   915
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   916
    Show changeset information for each line in a file.
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   917
34391
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34253
diff changeset
   918
    The ``ignorews``, ``ignorewsamount``, ``ignorewseol``, and
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34253
diff changeset
   919
    ``ignoreblanklines`` query string arguments have the same meaning as
34404
407ebe7a9b93 hgweb: use parsebool for parsing diff query string options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34392
diff changeset
   920
    their ``[annotate]`` config equivalents. It uses the hgrc boolean
407ebe7a9b93 hgweb: use parsebool for parsing diff query string options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34392
diff changeset
   921
    parsing logic to interpret the value. e.g. ``0`` and ``false`` are
407ebe7a9b93 hgweb: use parsebool for parsing diff query string options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34392
diff changeset
   922
    false and ``1`` and ``true`` are true. If not defined, the server
407ebe7a9b93 hgweb: use parsebool for parsing diff query string options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34392
diff changeset
   923
    default settings are used.
34391
f6492f482c60 hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34253
diff changeset
   924
24094
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   925
    The ``fileannotate`` template is rendered.
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   926
    """
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   927
    fctx = webutil.filectx(web.repo, web.req)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   928
    f = fctx.path()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   929
    parity = paritygen(web.stripecount)
39800
be0f32ca2671 hgweb: use heads() instead of headrevs()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39443
diff changeset
   930
    ishead = fctx.filenode() in fctx.filelog().heads()
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   931
30252
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   932
    # parents() is called once per line and several lines likely belong to
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   933
    # same revision. So it is worth caching.
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   934
    # TODO there are still redundant operations within basefilectx.parents()
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   935
    # and from the fctx.annotate() call itself that could be cached.
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   936
    parentscache = {}
38171
8e9ce73ceb15 hgweb: wrap {parents} of {annotate} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38170
diff changeset
   937
    def parents(context, f):
30252
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   938
        rev = f.rev()
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   939
        if rev not in parentscache:
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   940
            parentscache[rev] = []
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   941
            for p in f.parents():
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   942
                entry = {
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   943
                    'node': p.hex(),
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   944
                    'rev': p.rev(),
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   945
                }
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   946
                parentscache[rev].append(entry)
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   947
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   948
        for p in parentscache[rev]:
4ed8bb8a153f hgweb: cache fctx.parents() in annotate command (issue5414)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30081
diff changeset
   949
            yield p
29522
9c37df347485 hgweb: add link to parents of annotated revision in annotate view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29471
diff changeset
   950
38170
3e6253438bf9 hgweb: wrap {annotate} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38169
diff changeset
   951
    def annotate(context):
32189
f238a483a1fd webcommands: use fctx.isbinary
Jun Wu <quark@fb.com>
parents: 32070
diff changeset
   952
        if fctx.isbinary():
40158
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   953
            mt = pycompat.sysbytes(
9310037f0636 py3: pass str and return bytes from mimetypes.guess_type()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39810
diff changeset
   954
                mimetypes.guess_type(pycompat.fsdecode(fctx.path()))[0]
40211
d216ae4cc3f6 py3: r'' prefix default values for mimetypes.guess_mime()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40158
diff changeset
   955
                or r'application/octet-stream')
37069
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   956
            lines = [dagop.annotateline(fctx=fctx.filectx(fctx.filerev()),
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   957
                                        lineno=1, text='(binary:%s)' % mt)]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   958
        else:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   959
            lines = webutil.annotate(web.req, fctx, web.repo.ui)
30081
dd0ff715a82c hgweb: make fctx.annotate a separated function so it could be wrapped
Jun Wu <quark@fb.com>
parents: 29572
diff changeset
   960
29388
f694e20193f2 hgweb: display blamed revision once per block in annotate view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29382
diff changeset
   961
        previousrev = None
29572
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   962
        blockparitygen = paritygen(1)
37069
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   963
        for lineno, aline in enumerate(lines):
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34404
diff changeset
   964
            f = aline.fctx
29388
f694e20193f2 hgweb: display blamed revision once per block in annotate view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29382
diff changeset
   965
            rev = f.rev()
29572
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   966
            if rev != previousrev:
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   967
                blockhead = True
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   968
                blockparity = next(blockparitygen)
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   969
            else:
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   970
                blockhead = None
29388
f694e20193f2 hgweb: display blamed revision once per block in annotate view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29382
diff changeset
   971
            previousrev = rev
29216
ead25aa27a43 py3: convert to next() function
timeless <timeless@mozdev.org>
parents: 28712
diff changeset
   972
            yield {"parity": next(parity),
14055
421d56a055fd drop {short,hex}(ctx.node()) calls in favor of ctx methods
Alexander Solovyov <alexander@solovyov.net>
parents: 14043
diff changeset
   973
                   "node": f.hex(),
29388
f694e20193f2 hgweb: display blamed revision once per block in annotate view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29382
diff changeset
   974
                   "rev": rev,
6564
ccc2481e3954 webcommands: pass full author to annotate, fix templates (issue 1054)
Patrick Mezard <pmezard@gmail.com>
parents: 6437
diff changeset
   975
                   "author": f.user(),
38171
8e9ce73ceb15 hgweb: wrap {parents} of {annotate} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38170
diff changeset
   976
                   "parents": templateutil.mappinggenerator(parents, args=(f,)),
6657
a51093361e1c hgweb: show cset node and description when hovering over annotate prefix
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6564
diff changeset
   977
                   "desc": f.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   978
                   "extra": f.extra(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   979
                   "file": f.path(),
29388
f694e20193f2 hgweb: display blamed revision once per block in annotate view
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 29382
diff changeset
   980
                   "blockhead": blockhead,
29572
d86b54d9bb0c paper: make different blocks of annotated lines have different colors
Anton Shestakov <av6@dwimlabs.net>
parents: 29538
diff changeset
   981
                   "blockparity": blockparity,
34433
2e32c6a31cc7 annotate: introduce attr for storing per-line annotate data
Siddharth Agarwal <sid0@fb.com>
parents: 34404
diff changeset
   982
                   "targetline": aline.lineno,
37069
b33b91ca2ec2 annotate: pack line content into annotateline object (API)
Yuya Nishihara <yuya@tcha.org>
parents: 37022
diff changeset
   983
                   "line": aline.text,
24712
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24306
diff changeset
   984
                   "lineno": lineno + 1,
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   985
                   "lineid": "l%d" % (lineno + 1),
13199
a38df1250945 hgweb: added revision date to annotate line data
Oli Thissen <oli@tonick.net>
parents: 12696
diff changeset
   986
                   "linenumber": "% 6d" % (lineno + 1),
a38df1250945 hgweb: added revision date to annotate line data
Oli Thissen <oli@tonick.net>
parents: 12696
diff changeset
   987
                   "revdate": f.date()}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   988
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   989
    diffopts = webutil.difffeatureopts(web.req, web.repo.ui, 'annotate')
34392
6797f1fbc642 hgweb: add HTML elements to control whitespace settings for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34391
diff changeset
   990
    diffopts = {k: getattr(diffopts, k) for k in diffopts.defaults}
6797f1fbc642 hgweb: add HTML elements to control whitespace settings for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents: 34391
diff changeset
   991
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
   992
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   993
        'fileannotate',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   994
        file=f,
38170
3e6253438bf9 hgweb: wrap {annotate} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38169
diff changeset
   995
        annotate=templateutil.mappinggenerator(annotate),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   996
        path=webutil.up(f),
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
   997
        symrev=webutil.symrevorshortnode(web.req, fctx),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   998
        rename=webutil.renamelink(fctx),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
   999
        permissions=fctx.manifest().flags(f),
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1000
        ishead=int(ishead),
38172
d32f07069dd1 hgweb: wrap {diffopts} of annotate by hybriddict()
Yuya Nishihara <yuya@tcha.org>
parents: 38171
diff changeset
  1001
        diffopts=templateutil.hybriddict(diffopts),
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1002
        **pycompat.strkwargs(webutil.commonentry(web.repo, fctx)))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1003
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1004
@webcommand('filelog')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
  1005
def filelog(web):
24095
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1006
    """
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1007
    /filelog/{revision}/{path}
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1008
    --------------------------
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1009
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1010
    Show information about the history of a file in the repository.
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1011
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1012
    The ``revcount`` query string argument can be defined to control the
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1013
    maximum number of entries to show.
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1014
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1015
    The ``filelog`` template will be rendered.
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
  1016
    """
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1017
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1018
    try:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1019
        fctx = webutil.filectx(web.repo, web.req)
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1020
        f = fctx.path()
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1021
        fl = fctx.filelog()
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7622
diff changeset
  1022
    except error.LookupError:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1023
        f = webutil.cleanpath(web.repo, web.req.qsparams['file'])
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1024
        fl = web.repo.file(f)
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1025
        numrevs = len(fl)
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1026
        if not numrevs: # file doesn't exist at all
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1027
            raise
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1028
        rev = webutil.changectx(web.repo, web.req).rev()
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
  1029
        first = fl.linkrev(0)
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1030
        if rev < first: # current rev is from before file existed
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1031
            raise
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1032
        frev = numrevs - 1
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
  1033
        while fl.linkrev(frev) > rev:
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1034
            frev -= 1
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
  1035
        fctx = web.repo.filectx(f, fl.linkrev(frev))
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1036
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1037
    revcount = web.maxshortchanges
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1038
    if 'revcount' in web.req.qsparams:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1039
        try:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1040
            revcount = int(web.req.qsparams.get('revcount', revcount))
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1041
            revcount = max(revcount, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1042
            web.tmpl.defaults['sessionvars']['revcount'] = revcount
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1043
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1044
            pass
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1045
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1046
    lrange = webutil.linerange(web.req)
31670
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1047
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1048
    lessvars = copy.copy(web.tmpl.defaults['sessionvars'])
36582
24897a9d18ac webcommands: use explicit integer division for Python 3 compat
Augie Fackler <augie@google.com>
parents: 36464
diff changeset
  1049
    lessvars['revcount'] = max(revcount // 2, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1050
    morevars = copy.copy(web.tmpl.defaults['sessionvars'])
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1051
    morevars['revcount'] = revcount * 2
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1052
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1053
    patch = 'patch' in web.req.qsparams
31666
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1054
    if patch:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1055
        lessvars['patch'] = morevars['patch'] = web.req.qsparams['patch']
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1056
    descend = 'descend' in web.req.qsparams
31939
604d31507f86 hgweb: handle a "descend" query parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31732
diff changeset
  1057
    if descend:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1058
        lessvars['descend'] = morevars['descend'] = web.req.qsparams['descend']
31666
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1059
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
  1060
    count = fctx.filerev() + 1
30826
923336cf8b8a hgweb: simplify calculation of first revision in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30825
diff changeset
  1061
    start = max(0, count - revcount) # first rev on this page
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1062
    end = min(count, start + revcount) # last rev on this page
30825
4deb7c1a07ab hgweb: restore ascending iteration on revs in filelog web command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30816
diff changeset
  1063
    parity = paritygen(web.stripecount, offset=start - end)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1064
30816
96f811bceb85 hgweb: build the "entries" list directly in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30734
diff changeset
  1065
    repo = web.repo
37363
d3a2344446e6 hgweb: don't include hidden revisions in /filelog/ view
Martin von Zweigbergk <martinvonz@google.com>
parents: 37087
diff changeset
  1066
    filelog = fctx.filelog()
d3a2344446e6 hgweb: don't include hidden revisions in /filelog/ view
Martin von Zweigbergk <martinvonz@google.com>
parents: 37087
diff changeset
  1067
    revs = [filerev for filerev in filelog.revs(start, end - 1)
d3a2344446e6 hgweb: don't include hidden revisions in /filelog/ view
Martin von Zweigbergk <martinvonz@google.com>
parents: 37087
diff changeset
  1068
            if filelog.linkrev(filerev) in repo]
30816
96f811bceb85 hgweb: build the "entries" list directly in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 30734
diff changeset
  1069
    entries = []
31666
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1070
34253
db63872e10cc configitems: register the 'web.style' config
Boris Feld <boris.feld@octobus.net>
parents: 34245
diff changeset
  1071
    diffstyle = web.config('web', 'style')
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1072
    if 'style' in web.req.qsparams:
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1073
        diffstyle = web.req.qsparams['style']
31666
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1074
31672
e540846c67e0 hgweb: filter diff hunks when 'linerange' and 'patch' are specified in filelog
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31670
diff changeset
  1075
    def diff(fctx, linerange=None):
31666
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1076
        ctx = fctx.changectx()
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1077
        basectx = ctx.p1()
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1078
        path = fctx.path()
36891
c68e79dcf21c hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36890
diff changeset
  1079
        return webutil.diffs(web, ctx, basectx, [path], diffstyle,
31732
6be6e4becaaf hgweb: prefix line id by ctx shortnode in filelog when patches are shown
Denis Laxalde <denis@laxalde.org>
parents: 31672
diff changeset
  1080
                             linerange=linerange,
6be6e4becaaf hgweb: prefix line id by ctx shortnode in filelog when patches are shown
Denis Laxalde <denis@laxalde.org>
parents: 31672
diff changeset
  1081
                             lineidprefix='%s-' % ctx.hex()[:12])
31666
f36dc643ffdc hgweb: add a "patch" query parameter to filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31665
diff changeset
  1082
31670
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1083
    linerange = None
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1084
    if lrange is not None:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1085
        linerange = webutil.formatlinerange(*lrange)
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1086
        # deactivate numeric nav links when linerange is specified as this
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1087
        # would required a dedicated "revnav" class
37698
7738ae638b62 hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 37674
diff changeset
  1088
        nav = templateutil.mappinglist([])
31939
604d31507f86 hgweb: handle a "descend" query parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31732
diff changeset
  1089
        if descend:
32922
582080a4a812 dagop: move blockancestors() and blockdescendants() from context
Yuya Nishihara <yuya@tcha.org>
parents: 32599
diff changeset
  1090
            it = dagop.blockdescendants(fctx, *lrange)
31939
604d31507f86 hgweb: handle a "descend" query parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31732
diff changeset
  1091
        else:
32922
582080a4a812 dagop: move blockancestors() and blockdescendants() from context
Yuya Nishihara <yuya@tcha.org>
parents: 32599
diff changeset
  1092
            it = dagop.blockancestors(fctx, *lrange)
31939
604d31507f86 hgweb: handle a "descend" query parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31732
diff changeset
  1093
        for i, (c, lr) in enumerate(it, 1):
31670
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1094
            diffs = None
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1095
            if patch:
31672
e540846c67e0 hgweb: filter diff hunks when 'linerange' and 'patch' are specified in filelog
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31670
diff changeset
  1096
                diffs = diff(c, linerange=lr)
31670
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1097
            # follow renames accross filtered (not in range) revisions
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1098
            path = c.path()
38173
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1099
            lm = webutil.commonentry(repo, c)
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1100
            lm.update({
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1101
                'parity': next(parity),
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1102
                'filerev': c.rev(),
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1103
                'file': path,
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1104
                'diff': diffs,
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1105
                'linerange': webutil.formatlinerange(*lr),
38226
2aa0217bb655 hgweb: fill {rename} even if ?linerange is specified
Yuya Nishihara <yuya@tcha.org>
parents: 38225
diff changeset
  1106
                'rename': templateutil.mappinglist([]),
38173
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1107
            })
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1108
            entries.append(lm)
31670
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1109
            if i == revcount:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1110
                break
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1111
        lessvars['linerange'] = webutil.formatlinerange(*lrange)
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1112
        morevars['linerange'] = lessvars['linerange']
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1113
    else:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1114
        for i in revs:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1115
            iterfctx = fctx.filectx(i)
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1116
            diffs = None
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1117
            if patch:
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1118
                diffs = diff(iterfctx)
38173
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1119
            lm = webutil.commonentry(repo, iterfctx)
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1120
            lm.update({
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1121
                'parity': next(parity),
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1122
                'filerev': i,
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1123
                'file': f,
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1124
                'diff': diffs,
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1125
                'rename': webutil.renamelink(iterfctx),
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1126
            })
220058198be6 hgweb: don't use dict(key=value) to build a mapping dict in filelog
Yuya Nishihara <yuya@tcha.org>
parents: 38172
diff changeset
  1127
            entries.append(lm)
31670
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1128
        entries.reverse()
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1129
        revnav = webutil.filerevnav(web.repo, fctx.path())
5e6d44511317 hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents: 31666
diff changeset
  1130
        nav = revnav.gen(end - 1, revcount, count)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1131
20022
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1132
    latestentry = entries[:1]
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1133
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1134
    return web.sendtemplate(
36876
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1135
        'filelog',
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1136
        file=f,
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1137
        nav=nav,
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1138
        symrev=webutil.symrevorshortnode(web.req, fctx),
38174
53cc81a8caf6 hgweb: wrap {entries}* of filelog with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38173
diff changeset
  1139
        entries=templateutil.mappinglist(entries),
36876
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1140
        descend=descend,
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1141
        patch=patch,
38174
53cc81a8caf6 hgweb: wrap {entries}* of filelog with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38173
diff changeset
  1142
        latestentry=templateutil.mappinglist(latestentry),
36876
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1143
        linerange=linerange,
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1144
        revcount=revcount,
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1145
        morevars=morevars,
1f42d621f090 hgweb: support using new response object for web commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36871
diff changeset
  1146
        lessvars=lessvars,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1147
        **pycompat.strkwargs(webutil.commonentry(web.repo, fctx)))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1148
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1149
@webcommand('archive')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
  1150
def archive(web):
24096
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1151
    """
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1152
    /archive/{revision}.{format}[/{path}]
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1153
    -------------------------------------
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1154
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1155
    Obtain an archive of repository content.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1156
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1157
    The content and type of the archive is defined by a URL path parameter.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1158
    ``format`` is the file extension of the archive type to be generated. e.g.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1159
    ``zip`` or ``tar.bz2``. Not all archive types may be allowed by your
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1160
    server configuration.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1161
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1162
    The optional ``path`` URL parameter controls content to include in the
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1163
    archive. If omitted, every file in the specified revision is present in the
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1164
    archive. If included, only the specified file or contents of the specified
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1165
    directory will be included in the archive.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1166
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1167
    No template is used for this handler. Raw, binary content is generated.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1168
    """
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1169
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1170
    type_ = web.req.qsparams.get('type')
38227
f715faeaceee config: rename allow_archive to allow-archive
David Demelier <markand@malikania.fr>
parents: 38226
diff changeset
  1171
    allowed = web.configlist("web", "allow-archive")
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1172
    key = web.req.qsparams['node']
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1173
37512
aac97d043e6d hgweb: drop archivespecs from requestcontext
Yuya Nishihara <yuya@tcha.org>
parents: 37510
diff changeset
  1174
    if type_ not in webutil.archivespecs:
40248
b24c23f7c1f9 webcommands: use stringutil.pprint() to repr invalid archive types
Augie Fackler <augie@google.com>
parents: 40211
diff changeset
  1175
        msg = 'Unsupported archive type: %s' % stringutil.pprint(type_)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1176
        raise ErrorResponse(HTTP_NOT_FOUND, msg)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1177
7029
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1178
    if not ((type_ in allowed or
34654
4182d2065e7a configitems: drop redundant default of web.allow<archtype>
Yuya Nishihara <yuya@tcha.org>
parents: 34608
diff changeset
  1179
             web.configbool("web", "allow" + type_))):
7029
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1180
        msg = 'Archive type not allowed: %s' % type_
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1181
        raise ErrorResponse(HTTP_FORBIDDEN, msg)
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1182
36415
caa3d42f616d py3: make regex bytes in hgweb/webcommands.py
Pulkit Goyal <7895pulkit@gmail.com>
parents: 36308
diff changeset
  1183
    reponame = re.sub(br"\W+", "-", os.path.basename(web.reponame))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1184
    cnode = web.repo.lookup(key)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1185
    arch_version = key
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1186
    if cnode == key or key == 'tip':
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1187
        arch_version = short(cnode)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1188
    name = "%s-%s" % (reponame, arch_version)
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1189
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1190
    ctx = webutil.changectx(web.repo, web.req)
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1191
    pats = []
34100
08346a8fa65f cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33554
diff changeset
  1192
    match = scmutil.match(ctx, [])
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1193
    file = web.req.qsparams.get('file')
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1194
    if file:
36871
3d60a22e27f5 hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36869
diff changeset
  1195
        pats = ['path:' + file]
34100
08346a8fa65f cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33554
diff changeset
  1196
        match = scmutil.match(ctx, pats, default='path')
18968
7d2a7f8e9da4 hgweb: respond HTTP_NOT_FOUND when an archive request does not match any files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18771
diff changeset
  1197
        if pats:
34100
08346a8fa65f cleanup: rename "matchfn" to "match" where obviously a matcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 33554
diff changeset
  1198
            files = [f for f in ctx.manifest().keys() if match(f)]
18968
7d2a7f8e9da4 hgweb: respond HTTP_NOT_FOUND when an archive request does not match any files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18771
diff changeset
  1199
            if not files:
7d2a7f8e9da4 hgweb: respond HTTP_NOT_FOUND when an archive request does not match any files
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18771
diff changeset
  1200
                raise ErrorResponse(HTTP_NOT_FOUND,
36871
3d60a22e27f5 hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36869
diff changeset
  1201
                    'file(s) not found: %s' % file)
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1202
37512
aac97d043e6d hgweb: drop archivespecs from requestcontext
Yuya Nishihara <yuya@tcha.org>
parents: 37510
diff changeset
  1203
    mimetype, artype, extension, encoding = webutil.archivespecs[type_]
36882
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1204
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1205
    web.res.headers['Content-Type'] = mimetype
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1206
    web.res.headers['Content-Disposition'] = 'attachment; filename=%s%s' % (
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1207
        name, extension)
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1208
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1209
    if encoding:
36882
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1210
        web.res.headers['Content-Encoding'] = encoding
17933
8243dd66e0e3 webcommands: allow hgweb's archive to recurse into subrepos
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17322
diff changeset
  1211
36882
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1212
    web.res.setbodywillwrite()
36983
a82fc3922446 hgweb: convert an assert to a ProgrammingError
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36893
diff changeset
  1213
    if list(web.res.sendresponse()):
a82fc3922446 hgweb: convert an assert to a ProgrammingError
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36893
diff changeset
  1214
        raise error.ProgrammingError('sendresponse() should not emit data '
a82fc3922446 hgweb: convert an assert to a ProgrammingError
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36893
diff changeset
  1215
                                     'if writing later')
36882
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1216
97f44b0720e2 hgweb: port archive command to modern response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36881
diff changeset
  1217
    bodyfh = web.res.getbodyfile()
36881
16499427f6de hgweb: refactor fake file object proxy for archiving
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36879
diff changeset
  1218
40483
3d76a8e627a6 archive: change "matcnfn" argument to a real matcher
Martin von Zweigbergk <martinvonz@google.com>
parents: 40295
diff changeset
  1219
    archival.archive(web.repo, bodyfh, cnode, artype, prefix=name, match=match,
17933
8243dd66e0e3 webcommands: allow hgweb's archive to recurse into subrepos
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17322
diff changeset
  1220
                     subrepos=web.configbool("web", "archivesubrepos"))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1221
36886
67fb0dca29bc hgweb: always return iterable from @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36882
diff changeset
  1222
    return []
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1223
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1224
@webcommand('static')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
  1225
def static(web):
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1226
    fname = web.req.qsparams['file']
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1227
    # a repo owner may set web.static in .hg/hgrc to get any file
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1228
    # readable by the user running the CGI script
39809
536f22d6c2c5 hgweb: register web.static to the config table
Yuya Nishihara <yuya@tcha.org>
parents: 39800
diff changeset
  1229
    static = web.config("web", "static", untrusted=False)
7107
125c8fedcbe0 Allow hgweb to search for templates in more than one path.
Brendan Cully <brendan@kublai.com>
parents: 7102
diff changeset
  1230
    if not static:
22634
e48a5d3996c2 templater: introduce templatepaths for getting paths searched for templates
Mads Kiilerich <madski@unity3d.com>
parents: 22199
diff changeset
  1231
        tp = web.templatepath or templater.templatepaths()
7107
125c8fedcbe0 Allow hgweb to search for templates in more than one path.
Brendan Cully <brendan@kublai.com>
parents: 7102
diff changeset
  1232
        if isinstance(tp, str):
125c8fedcbe0 Allow hgweb to search for templates in more than one path.
Brendan Cully <brendan@kublai.com>
parents: 7102
diff changeset
  1233
            tp = [tp]
7288
9c399c53469d Allow per-file shadowing of static directory in templatepath
Brendan Cully <brendan@kublai.com>
parents: 7280
diff changeset
  1234
        static = [os.path.join(p, 'static') for p in tp]
36879
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36878
diff changeset
  1235
98baf8dea553 hgweb: port static file handling to new response API
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36878
diff changeset
  1236
    staticfile(static, fname, web.res)
36886
67fb0dca29bc hgweb: always return iterable from @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36882
diff changeset
  1237
    return web.res.sendresponse()
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1238
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1239
@webcommand('graph')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
  1240
def graph(web):
24097
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1241
    """
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1242
    /graph[/{revision}]
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1243
    -------------------
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1244
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1245
    Show information about the graphical topology of the repository.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1246
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1247
    Information rendered by this handler can be used to create visual
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1248
    representations of repository topology.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1249
35418
0fe5d99804bb hgweb: update graph function docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 35416
diff changeset
  1250
    The ``revision`` URL parameter controls the starting changeset. If it's
0fe5d99804bb hgweb: update graph function docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 35416
diff changeset
  1251
    absent, the default is ``tip``.
24097
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1252
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1253
    The ``revcount`` query string argument can define the number of changesets
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1254
    to show information for.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1255
35418
0fe5d99804bb hgweb: update graph function docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 35416
diff changeset
  1256
    The ``graphtop`` query string argument can specify the starting changeset
0fe5d99804bb hgweb: update graph function docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 35416
diff changeset
  1257
    for producing ``jsdata`` variable that is used for rendering graph in
0fe5d99804bb hgweb: update graph function docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 35416
diff changeset
  1258
    JavaScript. By default it has the same value as ``revision``.
0fe5d99804bb hgweb: update graph function docstring
Anton Shestakov <av6@dwimlabs.net>
parents: 35416
diff changeset
  1259
24097
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1260
    This handler will render the ``graph`` template.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1261
    """
10245
207b94f6b65d hgweb: make graph page size equal to shortlog
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9404
diff changeset
  1262
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1263
    if 'node' in web.req.qsparams:
36892
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1264
        ctx = webutil.changectx(web.repo, web.req)
563fd95a6efb hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36891
diff changeset
  1265
        symrev = webutil.symrevorshortnode(web.req, ctx)
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
  1266
    else:
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
  1267
        ctx = web.repo['tip']
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25251
diff changeset
  1268
        symrev = 'tip'
17318
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1269
    rev = ctx.rev()
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1270
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1271
    bg_height = 39
10245
207b94f6b65d hgweb: make graph page size equal to shortlog
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9404
diff changeset
  1272
    revcount = web.maxshortchanges
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1273
    if 'revcount' in web.req.qsparams:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1274
        try:
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1275
            revcount = int(web.req.qsparams.get('revcount', revcount))
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1276
            revcount = max(revcount, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1277
            web.tmpl.defaults['sessionvars']['revcount'] = revcount
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1278
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1279
            pass
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1280
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1281
    lessvars = copy.copy(web.tmpl.defaults['sessionvars'])
36582
24897a9d18ac webcommands: use explicit integer division for Python 3 compat
Augie Fackler <augie@google.com>
parents: 36464
diff changeset
  1282
    lessvars['revcount'] = max(revcount // 2, 1)
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1283
    morevars = copy.copy(web.tmpl.defaults['sessionvars'])
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1284
    morevars['revcount'] = revcount * 2
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1285
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1286
    graphtop = web.req.qsparams.get('graphtop', ctx.hex())
36890
ece242db5000 hgweb: use templater on requestcontext instance
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36889
diff changeset
  1287
    graphvars = copy.copy(web.tmpl.defaults['sessionvars'])
35416
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1288
    graphvars['graphtop'] = graphtop
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1289
17318
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1290
    count = len(web.repo)
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1291
    pos = rev
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1292
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1293
    uprev = min(max(0, count - 1), rev + revcount)
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1294
    downrev = max(0, rev - revcount)
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
  1295
    changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1296
18428
8c10f760ca34 hgweb: walk the graph through the changelog
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18427
diff changeset
  1297
    tree = []
35416
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1298
    nextentry = []
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1299
    lastrev = 0
19487
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1300
    if pos != -1:
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1301
        allrevs = web.repo.changelog.revs(pos, 0)
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1302
        revs = []
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1303
        for i in allrevs:
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1304
            revs.append(i)
35416
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1305
            if len(revs) >= revcount + 1:
19487
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1306
                break
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1307
35416
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1308
        if len(revs) > revcount:
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1309
            nextentry = [webutil.commonentry(web.repo, web.repo[revs[-1]])]
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1310
            revs = revs[:-1]
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1311
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1312
        lastrev = revs[-1]
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1313
20761
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1314
        # We have to feed a baseset to dagwalker as it is expecting smartset
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1315
        # object. This does not have a big impact on hgweb performance itself
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1316
        # since hgweb graphing code is not itself lazy yet.
31043
aea06029919e revset: import set classes directly from smartset module
Yuya Nishihara <yuya@tcha.org>
parents: 30826
diff changeset
  1317
        dag = graphmod.dagwalker(web.repo, smartset.baseset(revs))
20761
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1318
        # As we said one line above... not lazy.
35413
76dcdc4e707b hgweb: filter graphmod.colored() output before iterating over it
Anton Shestakov <av6@dwimlabs.net>
parents: 35397
diff changeset
  1319
        tree = list(item for item in graphmod.colored(dag, web.repo)
76dcdc4e707b hgweb: filter graphmod.colored() output before iterating over it
Anton Shestakov <av6@dwimlabs.net>
parents: 35397
diff changeset
  1320
                    if item[1] == graphmod.CHANGESET)
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1321
35416
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1322
    def fulltree():
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1323
        pos = web.repo[graphtop].rev()
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1324
        tree = []
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1325
        if pos != -1:
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1326
            revs = web.repo.changelog.revs(pos, lastrev)
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1327
            dag = graphmod.dagwalker(web.repo, smartset.baseset(revs))
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1328
            tree = list(item for item in graphmod.colored(dag, web.repo)
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1329
                        if item[1] == graphmod.CHANGESET)
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1330
        return tree
f84b01257e06 hgweb: render next pages on /graph incrementally
Anton Shestakov <av6@dwimlabs.net>
parents: 35415
diff changeset
  1331
38221
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1332
    def jsdata(context):
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1333
        for (id, type, ctx, vtx, edges) in fulltree():
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1334
            yield {'node': pycompat.bytestr(ctx),
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1335
                   'graphnode': webutil.getgraphnode(web.repo, ctx),
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1336
                   'vertex': vtx,
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1337
                   'edges': edges}
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1338
38222
fb5803f4fb87 hgweb: wrap {nodes} of graph with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38221
diff changeset
  1339
    def nodes(context):
35534
acd8a2454b47 monoblue: make actual changeset entries have backgrounds on /graph
Anton Shestakov <av6@dwimlabs.net>
parents: 35418
diff changeset
  1340
        parity = paritygen(web.stripecount)
35415
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1341
        for row, (id, type, ctx, vtx, edges) in enumerate(tree):
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1342
            entry = webutil.commonentry(web.repo, ctx)
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1343
            edgedata = [{'col': edge[0],
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1344
                         'nextcol': edge[1],
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1345
                         'color': (edge[2] - 1) % 6 + 1,
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1346
                         'width': edge[3],
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1347
                         'bcolor': edge[4]}
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1348
                        for edge in edges]
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1349
35415
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1350
            entry.update({'col': vtx[0],
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1351
                          'color': (vtx[1] - 1) % 6 + 1,
35534
acd8a2454b47 monoblue: make actual changeset entries have backgrounds on /graph
Anton Shestakov <av6@dwimlabs.net>
parents: 35418
diff changeset
  1352
                          'parity': next(parity),
38223
86f980a8cacf hgweb: wrap {edges} of {nodes} of graph with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38222
diff changeset
  1353
                          'edges': templateutil.mappinglist(edgedata),
35415
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1354
                          'row': row,
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1355
                          'nextrow': row + 1})
35119
23bba755cf80 hgweb: use webutil.commonentry() for nodes (but not for jsdata yet) in /graph
Anton Shestakov <av6@dwimlabs.net>
parents: 35118
diff changeset
  1356
35415
a48af4993aa0 hgweb: split graphdata() into jsdata() and nodes()
Anton Shestakov <av6@dwimlabs.net>
parents: 35414
diff changeset
  1357
            yield entry
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1358
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1359
    rows = len(tree)
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1360
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1361
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1362
        'graph',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1363
        rev=rev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1364
        symrev=symrev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1365
        revcount=revcount,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1366
        uprev=uprev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1367
        lessvars=lessvars,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1368
        morevars=morevars,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1369
        downrev=downrev,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1370
        graphvars=graphvars,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1371
        rows=rows,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1372
        bg_height=bg_height,
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1373
        changesets=count,
38220
b10a9ace2738 hgweb: wrap {nextentry} of graph with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38174
diff changeset
  1374
        nextentry=templateutil.mappinglist(nextentry),
38221
215021e506e2 hgweb: adapt {jsdata} of graph to mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38220
diff changeset
  1375
        jsdata=templateutil.mappinggenerator(jsdata),
38222
fb5803f4fb87 hgweb: wrap {nodes} of graph with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38221
diff changeset
  1376
        nodes=templateutil.mappinggenerator(nodes),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1377
        node=ctx.hex(),
38486
5faaa31a6082 hgweb: add archive entries to graph page
Anton Shestakov <av6@dwimlabs.net>
parents: 38227
diff changeset
  1378
        archives=web.archivelist('tip'),
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1379
        changenav=changenav)
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1380
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1381
def _getdoc(e):
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1382
    doc = e[0].__doc__
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1383
    if doc:
26846
7c1b4840c2cd hgweb: replace some str.split() calls by str.partition() or str.rpartition()
Anton Shestakov <av6@dwimlabs.net>
parents: 26781
diff changeset
  1384
        doc = _(doc).partition('\n')[0]
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1385
    else:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1386
        doc = _('(no help text available)')
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1387
    return doc
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1388
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1389
@webcommand('help')
36893
4daa22071d5d hgweb: stop passing req and tmpl into @webcommand functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36892
diff changeset
  1390
def help(web):
24081
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1391
    """
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1392
    /help[/{topic}]
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1393
    ---------------
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1394
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1395
    Render help documentation.
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1396
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1397
    This web command is roughly equivalent to :hg:`help`. If a ``topic``
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1398
    is defined, that help topic will be rendered. If not, an index of
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1399
    available help topics will be rendered.
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1400
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1401
    The ``help`` template will be rendered when requesting help for a topic.
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1402
    ``helptopics`` will be rendered for the index of help topics.
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1403
    """
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27009
diff changeset
  1404
    from .. import commands, help as helpmod  # avoid cycle
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1405
36888
66f62d120ba2 hgweb: use web.req instead of req.req
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36886
diff changeset
  1406
    topicname = web.req.qsparams.get('node')
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1407
    if not topicname:
38224
0b932b43868f hgweb: wrap {topics}es of help with mappinggenerator or mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38223
diff changeset
  1408
        def topics(context):
40292
9c6473d2038b help: splitting the topics by category
Rodrigo Damazio <rdamazio@google.com>
parents: 40248
diff changeset
  1409
            for h in helpmod.helptable:
9c6473d2038b help: splitting the topics by category
Rodrigo Damazio <rdamazio@google.com>
parents: 40248
diff changeset
  1410
                entries, summary, _doc = h[0:3]
17322
7124f984dc8d help: use the first topic name from helptable, not the longest alias
Mads Kiilerich <mads@kiilerich.com>
parents: 17318
diff changeset
  1411
                yield {'topic': entries[0], 'summary': summary}
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1412
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1413
        early, other = [], []
26846
7c1b4840c2cd hgweb: replace some str.split() calls by str.partition() or str.rpartition()
Anton Shestakov <av6@dwimlabs.net>
parents: 26781
diff changeset
  1414
        primary = lambda s: s.partition('|')[0]
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1415
        for c, e in commands.table.iteritems():
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1416
            doc = _getdoc(e)
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1417
            if 'DEPRECATED' in doc or c.startswith('debug'):
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1418
                continue
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1419
            cmd = primary(c)
40295
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40292
diff changeset
  1420
            if getattr(e[0], 'helpbasic', False):
fa88170c10bb help: adding a proper declaration for shortlist/basic commands (API)
Rodrigo Damazio <rdamazio@google.com>
parents: 40292
diff changeset
  1421
                early.append((cmd, doc))
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1422
            else:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1423
                other.append((cmd, doc))
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1424
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1425
        early.sort()
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1426
        other.sort()
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1427
38225
c3df415037cd hgweb: wrap {earlycommands} and {othercommands} of help with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38224
diff changeset
  1428
        def earlycommands(context):
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1429
            for c, doc in early:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1430
                yield {'topic': c, 'summary': doc}
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1431
38225
c3df415037cd hgweb: wrap {earlycommands} and {othercommands} of help with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38224
diff changeset
  1432
        def othercommands(context):
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1433
            for c, doc in other:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1434
                yield {'topic': c, 'summary': doc}
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1435
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1436
        return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1437
            'helptopics',
38224
0b932b43868f hgweb: wrap {topics}es of help with mappinggenerator or mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38223
diff changeset
  1438
            topics=templateutil.mappinggenerator(topics),
38225
c3df415037cd hgweb: wrap {earlycommands} and {othercommands} of help with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38224
diff changeset
  1439
            earlycommands=templateutil.mappinggenerator(earlycommands),
c3df415037cd hgweb: wrap {earlycommands} and {othercommands} of help with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents: 38224
diff changeset
  1440
            othercommands=templateutil.mappinggenerator(othercommands),
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1441
            title='Index')
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1442
27581
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1443
    # Render an index of sub-topics.
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1444
    if topicname in helpmod.subtopics:
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1445
        topics = []
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1446
        for entries, summary, _doc in helpmod.subtopics[topicname]:
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1447
            topics.append({
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1448
                'topic': '%s.%s' % (topicname, entries[0]),
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1449
                'basename': entries[0],
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1450
                'summary': summary,
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1451
            })
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1452
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1453
        return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1454
            'helptopics',
38224
0b932b43868f hgweb: wrap {topics}es of help with mappinggenerator or mappinglist
Yuya Nishihara <yuya@tcha.org>
parents: 38223
diff changeset
  1455
            topics=templateutil.mappinglist(topics),
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1456
            title=topicname,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1457
            subindex=True)
27581
3aa6a8135557 hgweb: support rendering sub-topic indexes
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27294
diff changeset
  1458
30564
d83ca854fa21 ui: factor out ui.load() to create a ui without loading configs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 30252
diff changeset
  1459
    u = webutil.wsgiui.load()
17146
6b40cc67ceb4 hgweb: show help with verbose sections included
Adrian Buehlmann <adrian@cadifra.com>
parents: 16773
diff changeset
  1460
    u.verbose = True
27582
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1461
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1462
    # Render a page from a sub-topic.
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1463
    if '.' in topicname:
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1464
        # TODO implement support for rendering sections, like
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1465
        # `hg help` works.
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1466
        topic, subtopic = topicname.split('.', 1)
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1467
        if topic not in helpmod.subtopics:
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1468
            raise ErrorResponse(HTTP_NOT_FOUND)
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1469
    else:
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1470
        topic = topicname
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1471
        subtopic = None
8f8f3b13252d hgweb: support rendering a sub-topic
Gregory Szorc <gregory.szorc@gmail.com>
parents: 27581
diff changeset
  1472
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1473
    try:
32599
1b90036f42f0 help: pass commands module by argument
Yuya Nishihara <yuya@tcha.org>
parents: 32189
diff changeset
  1474
        doc = helpmod.help_(u, commands, topic, subtopic=subtopic)
36281
0ef50a5e3ae1 hgweb: translate Abort in help command to 404 error
Yuya Nishihara <yuya@tcha.org>
parents: 35566
diff changeset
  1475
    except error.Abort:
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1476
        raise ErrorResponse(HTTP_NOT_FOUND)
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1477
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1478
    return web.sendtemplate(
36877
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1479
        'help',
9fc3d814646e hgweb: port most @webcommand to use modern response type
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36876
diff changeset
  1480
        topic=topicname,
36889
061635d4221c hgweb: add a sendtemplate() helper function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 36888
diff changeset
  1481
        doc=doc)
24859
64e3f97bdf08 i18n: extract doc string of each web commands as translatable one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24712
diff changeset
  1482
64e3f97bdf08 i18n: extract doc string of each web commands as translatable one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24712
diff changeset
  1483
# tell hggettext to extract docstrings from these functions:
64e3f97bdf08 i18n: extract doc string of each web commands as translatable one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24712
diff changeset
  1484
i18nfunctions = commands.values()