mercurial/hgweb/webcommands.py
author Wagner Bruna <wbruna@softwareexpress.com.br>
Mon, 27 Apr 2015 19:13:55 -0300
branchstable
changeset 24868 9668c653eb9d
parent 24867 6d97ca3f05ba
child 25132 917b5a071888
permissions -rw-r--r--
webcommands: fix description of manifest default behavior
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
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
     8
import os, mimetypes, re, cgi, copy
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6368
diff changeset
     9
import webutil
11332
716e176a4e01 hgweb: specify a charset when sending raw text files
Julian Cowley <julian@lava.net>
parents: 10394
diff changeset
    10
from mercurial import error, encoding, archival, templater, templatefilters
21123
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
    11
from mercurial.node import short, hex
19657
145636d31bb4 hgweb: import the whole util module in webcommands instead of just one function
Alexander Plavin <alexander@plav.in>
parents: 19656
diff changeset
    12
from mercurial import util
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    13
from common import paritygen, staticfile, get_contact, ErrorResponse
7029
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
    14
from common import HTTP_OK, HTTP_FORBIDDEN, HTTP_NOT_FOUND
15528
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15004
diff changeset
    15
from mercurial import graphmod, patch
17933
8243dd66e0e3 webcommands: allow hgweb's archive to recurse into subrepos
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17322
diff changeset
    16
from mercurial import scmutil
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
    17
from mercurial.i18n import _
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
    18
from mercurial.error import ParseError, RepoLookupError, Abort
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
    19
from mercurial import revset
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    20
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    21
__all__ = []
24077
e8046ca0405d webcommands: define a dict of available commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24076
diff changeset
    22
commands = {}
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    23
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    24
class webcommand(object):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    25
    """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
    26
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    27
    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
    28
    command should be accessible under.
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    29
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    30
    Usage:
5963
5be210afe1b8 hgweb: explicitly check if requested command exists
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5960
diff changeset
    31
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    32
    @webcommand('mycommand')
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    33
    def mycommand(web, req, tmpl):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    34
        pass
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    35
    """
5963
5be210afe1b8 hgweb: explicitly check if requested command exists
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5960
diff changeset
    36
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    37
    def __init__(self, name):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    38
        self.name = name
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    39
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    40
    def __call__(self, func):
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    41
        __all__.append(self.name)
24077
e8046ca0405d webcommands: define a dict of available commands
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24076
diff changeset
    42
        commands[self.name] = func
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    43
        return func
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    44
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    45
@webcommand('log')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
    46
def log(web, req, tmpl):
24087
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    47
    """
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    48
    /log[/{revision}[/{path}]]
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    49
    --------------------------
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    50
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    51
    Show repository or file history.
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    52
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    53
    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
    54
    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
    55
    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
    56
    ``changelog`` handler.
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    57
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    58
    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
    59
    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
    60
    """
6f5b4393590c webcommands: document "log" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24086
diff changeset
    61
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5890
diff changeset
    62
    if 'file' in req.form and req.form['file'][0]:
5964
1cd1582ef25f hgweb: centralize req.write() calls
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5963
diff changeset
    63
        return filelog(web, req, tmpl)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    64
    else:
5964
1cd1582ef25f hgweb: centralize req.write() calls
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5963
diff changeset
    65
        return changelog(web, req, tmpl)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
    66
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
    67
@webcommand('rawfile')
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    68
def rawfile(web, req, tmpl):
15004
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
    69
    guessmime = web.configbool('web', 'guessmime', False)
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
    70
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6368
diff changeset
    71
    path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    72
    if not path:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    73
        content = manifest(web, req, tmpl)
5993
948a41e77902 hgweb: explicit response status
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5964
diff changeset
    74
        req.respond(HTTP_OK, web.ctype)
948a41e77902 hgweb: explicit response status
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5964
diff changeset
    75
        return content
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    76
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    77
    try:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6368
diff changeset
    78
        fctx = webutil.filectx(web.repo, req)
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7622
diff changeset
    79
    except error.LookupError, inst:
6368
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
    80
        try:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
    81
            content = manifest(web, req, tmpl)
6368
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
    82
            req.respond(HTTP_OK, web.ctype)
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
    83
            return content
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
    84
        except ErrorResponse:
2c370f08c486 hgweb: better error messages
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6217
diff changeset
    85
            raise inst
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    86
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    87
    path = fctx.path()
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    88
    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
    89
    mt = 'application/binary'
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
    90
    if guessmime:
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
    91
        mt = mimetypes.guess_type(path)[0]
d06b9c55ddab hgweb: raw file mimetype guessing configurable, off by default (BC) (issue2923)
Matt Mackall <mpm@selenic.com>
parents: 14771
diff changeset
    92
        if mt is None:
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
    93
            if util.binary(text):
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
    94
                mt = 'application/binary'
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
    95
            else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
    96
                mt = 'text/plain'
11332
716e176a4e01 hgweb: specify a charset when sending raw text files
Julian Cowley <julian@lava.net>
parents: 10394
diff changeset
    97
    if mt.startswith('text/'):
716e176a4e01 hgweb: specify a charset when sending raw text files
Julian Cowley <julian@lava.net>
parents: 10394
diff changeset
    98
        mt += '; charset="%s"' % encoding.encoding
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
    99
18352
e33b9b92a200 hgweb: pass the actual response body to request.response, not just the length
Mads Kiilerich <mads@kiilerich.com>
parents: 18348
diff changeset
   100
    req.respond(HTTP_OK, mt, path, body=text)
e33b9b92a200 hgweb: pass the actual response body to request.response, not just the length
Mads Kiilerich <mads@kiilerich.com>
parents: 18348
diff changeset
   101
    return []
5890
a0e20a5eba3c hgweb: fast path for sending raw files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5600
diff changeset
   102
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   103
def _filerevision(web, tmpl, fctx):
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   104
    f = fctx.path()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   105
    text = fctx.data()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   106
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   107
19657
145636d31bb4 hgweb: import the whole util module in webcommands instead of just one function
Alexander Plavin <alexander@plav.in>
parents: 19656
diff changeset
   108
    if util.binary(text):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   109
        mt = mimetypes.guess_type(f)[0] or 'application/octet-stream'
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   110
        text = '(binary:%s)' % mt
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   111
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   112
    def lines():
9136
31177742f54a for calls expecting bool args, pass bool instead of int
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 8842
diff changeset
   113
        for lineno, t in enumerate(text.splitlines(True)):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   114
            yield {"line": t,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   115
                   "lineid": "l%d" % (lineno + 1),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   116
                   "linenumber": "% 6d" % (lineno + 1),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   117
                   "parity": parity.next()}
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   118
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   119
    return tmpl("filerevision",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   120
                file=f,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   121
                path=webutil.up(f),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   122
                text=lines(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   123
                rev=fctx.rev(),
14055
421d56a055fd drop {short,hex}(ctx.node()) calls in favor of ctx methods
Alexander Solovyov <alexander@solovyov.net>
parents: 14043
diff changeset
   124
                node=fctx.hex(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   125
                author=fctx.user(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   126
                date=fctx.date(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   127
                desc=fctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   128
                extra=fctx.extra(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   129
                branch=webutil.nodebranchnodefault(fctx),
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   130
                parent=webutil.parents(fctx),
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   131
                child=webutil.children(fctx),
6434
62e0bb41e682 hgweb: minor improvements for new web style
Matt Mackall <mpm@selenic.com>
parents: 6410
diff changeset
   132
                rename=webutil.renamelink(fctx),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   133
                permissions=fctx.manifest().flags(f))
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   134
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   135
@webcommand('file')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   136
def file(web, req, tmpl):
24088
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   137
    """
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   138
    /file/{revision}[/{path}]
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   139
    -------------------------
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   140
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   141
    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
   142
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   143
    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
   144
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   145
    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
   146
    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
   147
    handler.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   148
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   149
    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
   150
    the ``filerevision`` template.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   151
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   152
    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
   153
    be rendered.
fe3ee31b039f webcommands: document "file" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24087
diff changeset
   154
    """
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6368
diff changeset
   155
    path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
6853
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   156
    if not path:
6857
e8c2dae47799 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 6762 6853
diff changeset
   157
        return manifest(web, req, tmpl)
6853
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   158
    try:
6857
e8c2dae47799 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 6762 6853
diff changeset
   159
        return _filerevision(web, tmpl, webutil.filectx(web.repo, req))
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7622
diff changeset
   160
    except error.LookupError, inst:
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   161
        try:
6857
e8c2dae47799 Merge with crew-stable
Patrick Mezard <pmezard@gmail.com>
parents: 6762 6853
diff changeset
   162
            return manifest(web, req, tmpl)
6853
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   163
        except ErrorResponse:
2ff0829bdae5 hgweb: do not use unassigned variables in exception handling
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6669
diff changeset
   164
            raise inst
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   165
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   166
def _search(web, req, tmpl):
19656
60ce14e41faf hgweb: add string constants for search mode names
Alexander Plavin <alexander@plav.in>
parents: 19634
diff changeset
   167
    MODE_REVISION = 'rev'
60ce14e41faf hgweb: add string constants for search mode names
Alexander Plavin <alexander@plav.in>
parents: 19634
diff changeset
   168
    MODE_KEYWORD = 'keyword'
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   169
    MODE_REVSET = 'revset'
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   170
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   171
    def revsearch(ctx):
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   172
        yield ctx
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   173
19632
299511aabf85 hgweb: pass arguments which a function depends on explicitly in search
Alexander Plavin <alexander@plav.in>
parents: 19631
diff changeset
   174
    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
   175
        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
   176
        qw = lower(query).split()
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   177
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   178
        def revgen():
18497
a58d8936647a hgweb: prevent traceback during search when filtered (issue3783)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18478
diff changeset
   179
            cl = web.repo.changelog
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   180
            for i in xrange(len(web.repo) - 1, 0, -100):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   181
                l = []
19491
e111d5e6bbbd hgweb: fix duplication for some search queries
Alexander Plavin <me@aplavin.ru>
parents: 19487
diff changeset
   182
                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
   183
                    ctx = web.repo[j]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   184
                    l.append(ctx)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   185
                l.reverse()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   186
                for e in l:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   187
                    yield e
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   188
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   189
        for ctx in revgen():
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   190
            miss = 0
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   191
            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
   192
                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
   193
                        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
   194
                        q in lower(" ".join(ctx.files()))):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   195
                    miss = 1
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   196
                    break
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   197
            if miss:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   198
                continue
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   199
19533
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   200
            yield ctx
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   201
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   202
    def revsetsearch(revs):
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   203
        for r in revs:
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   204
            yield web.repo[r]
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   205
19631
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   206
    searchfuncs = {
20004
06e118c097ff hgweb, i18n: do not translate search mode description
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 19951
diff changeset
   207
        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
   208
        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
   209
        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
   210
    }
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   211
19632
299511aabf85 hgweb: pass arguments which a function depends on explicitly in search
Alexander Plavin <alexander@plav.in>
parents: 19631
diff changeset
   212
    def getsearchmode(query):
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   213
        try:
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   214
            ctx = web.repo[query]
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   215
        except (error.RepoError, error.LookupError):
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   216
            # 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
   217
            # 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
   218
            pass
19633
217f2b9acee0 hgweb: search() function supports direct pointing to revision
Alexander Plavin <alexander@plav.in>
parents: 19632
diff changeset
   219
        else:
19656
60ce14e41faf hgweb: add string constants for search mode names
Alexander Plavin <alexander@plav.in>
parents: 19634
diff changeset
   220
            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
   221
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   222
        revdef = 'reverse(%s)' % query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   223
        try:
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   224
            tree, pos = revset.parse(revdef)
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   225
        except ParseError:
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   226
            # can't parse to a revset tree
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   227
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   228
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   229
        if revset.depth(tree) <= 2:
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   230
            # no revset syntax used
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   231
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   232
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   233
        if util.any((token, (value or '')[:3]) == ('string', 're:')
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   234
                    for token, value, pos in revset.tokenize(revdef)):
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   235
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   236
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   237
        funcsused = revset.funcsused(tree)
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   238
        if not funcsused.issubset(revset.safesymbols):
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   239
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   240
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   241
        mfunc = revset.match(web.repo.ui, revdef)
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   242
        try:
24114
fafd9a1284cf revset: make match function initiate query from full set by default
Yuya Nishihara <yuya@tcha.org>
parents: 24097
diff changeset
   243
            revs = mfunc(web.repo)
19722
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   244
            return MODE_REVSET, revs
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   245
            # ParseError: wrongly placed tokens, wrongs arguments, etc
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   246
            # 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
   247
            # Abort: bookmark/tag not exists
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   248
            # LookupError: ambiguous identifier, e.g. in '(bc)' on a large repo
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   249
        except (ParseError, RepoLookupError, Abort, LookupError):
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   250
            return MODE_KEYWORD, query
bf15935b68a3 hgweb: add revset syntax support to search
Alexander Plavin <alexander@plav.in>
parents: 19657
diff changeset
   251
19533
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   252
    def changelist(**map):
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   253
        count = 0
9a020b354d93 hgweb: separate search itself and template generation
Alexander Plavin <alexander@plav.in>
parents: 19499
diff changeset
   254
19765
521c373ff134 hgweb: pass variable with current search mode name to the search template
Alexander Plavin <alexander@plav.in>
parents: 19738
diff changeset
   255
        for ctx in searchfunc[0](funcarg):
6659
bc553c6d1ef9 webcommands: fix increments lost by 894875eae49b
Andrew Beekhof <beekhof@gmail.com>
parents: 6657
diff changeset
   256
            count += 1
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   257
            n = ctx.node()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   258
            showtags = webutil.showtag(web.repo, tmpl, 'changelogtag', n)
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
   259
            files = webutil.listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   260
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   261
            yield tmpl('searchentry',
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   262
                       parity=parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   263
                       author=ctx.user(),
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   264
                       parent=webutil.parents(ctx),
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   265
                       child=webutil.children(ctx),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   266
                       changelogtag=showtags,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   267
                       desc=ctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   268
                       extra=ctx.extra(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   269
                       date=ctx.date(),
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
   270
                       files=files,
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   271
                       rev=ctx.rev(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   272
                       node=hex(n),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   273
                       tags=webutil.nodetagsdict(web.repo, n),
13794
5c18a0bca26f hgweb: add bookmark labels to monoblue theme (based on 270f57d35525)
Yuya Nishihara <yuya@tcha.org>
parents: 13597
diff changeset
   274
                       bookmarks=webutil.nodebookmarksdict(web.repo, n),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   275
                       inbranch=webutil.nodeinbranch(web.repo, ctx),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   276
                       branches=webutil.nodebranchdict(web.repo, ctx))
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   277
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   278
            if count >= revcount:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   279
                break
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   280
19418
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   281
    query = req.form['rev'][0]
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   282
    revcount = web.maxchanges
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   283
    if 'revcount' in req.form:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   284
        try:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   285
            revcount = int(req.form.get('revcount', [revcount])[0])
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   286
            revcount = max(revcount, 1)
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   287
            tmpl.defaults['sessionvars']['revcount'] = revcount
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   288
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   289
            pass
19418
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   290
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   291
    lessvars = copy.copy(tmpl.defaults['sessionvars'])
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   292
    lessvars['revcount'] = max(revcount / 2, 1)
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   293
    lessvars['rev'] = query
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   294
    morevars = copy.copy(tmpl.defaults['sessionvars'])
55b9d98a1ef4 hgweb: move local changelist function to the beginning of the parent one
Alexander Plavin <me@aplavin.ru>
parents: 19396
diff changeset
   295
    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
   296
    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
   297
19632
299511aabf85 hgweb: pass arguments which a function depends on explicitly in search
Alexander Plavin <alexander@plav.in>
parents: 19631
diff changeset
   298
    mode, funcarg = getsearchmode(query)
19768
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   299
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   300
    if 'forcekw' in req.form:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   301
        showforcekw = ''
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   302
        showunforcekw = searchfuncs[mode][1]
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   303
        mode = MODE_KEYWORD
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   304
        funcarg = query
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   305
    else:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   306
        if mode != MODE_KEYWORD:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   307
            showforcekw = searchfuncs[MODE_KEYWORD][1]
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   308
        else:
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   309
            showforcekw = ''
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   310
        showunforcekw = ''
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   311
19631
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   312
    searchfunc = searchfuncs[mode]
cf9e5e45c1d3 hgweb: add dynamic search function selection, depending on the query
Alexander Plavin <alexander@plav.in>
parents: 19534
diff changeset
   313
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   314
    tip = web.repo['tip']
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   315
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   316
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   317
    return tmpl('search', query=query, node=tip.hex(),
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   318
                entries=changelist, archives=web.archivelist("tip"),
19765
521c373ff134 hgweb: pass variable with current search mode name to the search template
Alexander Plavin <alexander@plav.in>
parents: 19738
diff changeset
   319
                morevars=morevars, lessvars=lessvars,
19768
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   320
                modedesc=searchfunc[1],
186f54d40fdd hgweb: add link to force literal keyword search
Alexander Plavin <alexander@plav.in>
parents: 19765
diff changeset
   321
                showforcekw=showforcekw, showunforcekw=showunforcekw)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   322
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   323
@webcommand('changelog')
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   324
def changelog(web, req, tmpl, shortlog=False):
24089
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   325
    """
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   326
    /changelog[/{revision}]
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   327
    -----------------------
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   328
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   329
    Show information about multiple changesets.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   330
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   331
    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
   332
    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
   333
    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
   334
    revision.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   335
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   336
    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
   337
    defined. This will perform a search for changesets.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   338
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   339
    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
   340
    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
   341
    :hg:`log -k`).
24089
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   342
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   343
    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
   344
    changesets to render.
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   345
f17773432782 webcommands: document "changelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24088
diff changeset
   346
    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
   347
    """
10247
e8c7410371e0 hgweb: add less/more links for search logs (issue1972)
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10246
diff changeset
   348
19396
afc23eddc324 hgweb: show current search query in the input field
Alexander Plavin <me@aplavin.ru>
parents: 18968
diff changeset
   349
    query = ''
5915
d0576d065993 Prefer i in d over d.has_key(i)
Christian Ebert <blacktrash@gmx.net>
parents: 5890
diff changeset
   350
    if 'node' in req.form:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6368
diff changeset
   351
        ctx = webutil.changectx(web.repo, req)
19534
983bb4069004 hgweb: cleaner if conditions in changelog() function
Alexander Plavin <alexander@plav.in>
parents: 19533
diff changeset
   352
    elif 'rev' in req.form:
19634
49a068b8fb0c hgweb: always run search when a query is entered (bc)
Alexander Plavin <alexander@plav.in>
parents: 19633
diff changeset
   353
        return _search(web, req, tmpl)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   354
    else:
19534
983bb4069004 hgweb: cleaner if conditions in changelog() function
Alexander Plavin <alexander@plav.in>
parents: 19533
diff changeset
   355
        ctx = web.repo['tip']
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   356
19737
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   357
    def changelist():
18427
56ca4443a343 hgweb: use changelog for iteration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18409
diff changeset
   358
        revs = []
19486
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   359
        if pos != -1:
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   360
            revs = web.repo.changelog.revs(pos, 0)
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   361
        curcount = 0
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   362
        for rev in revs:
19486
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   363
            curcount += 1
19738
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   364
            if curcount > revcount + 1:
19486
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   365
                break
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   366
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   367
            entry = webutil.changelistentry(web, web.repo[rev], tmpl)
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   368
            entry['parity'] = parity.next()
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23740
diff changeset
   369
            yield entry
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   370
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   371
    if shortlog:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   372
        revcount = web.maxshortchanges
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   373
    else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   374
        revcount = web.maxchanges
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   375
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   376
    if 'revcount' in req.form:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   377
        try:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   378
            revcount = int(req.form.get('revcount', [revcount])[0])
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   379
            revcount = max(revcount, 1)
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   380
            tmpl.defaults['sessionvars']['revcount'] = revcount
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   381
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   382
            pass
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   383
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   384
    lessvars = copy.copy(tmpl.defaults['sessionvars'])
13931
c3372529247f hgweb: set minimum number of revision to display to 1 when revcount is 0
Md. O. Shayan <mdoshayan@gmail.com>
parents: 13924
diff changeset
   385
    lessvars['revcount'] = max(revcount / 2, 1)
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   386
    morevars = copy.copy(tmpl.defaults['sessionvars'])
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   387
    morevars['revcount'] = revcount * 2
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   388
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   389
    count = len(web.repo)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   390
    pos = ctx.rev()
19486
002b711a3e8a hgweb: fix incorrect way to count revisions in log (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19485
diff changeset
   391
    parity = paritygen(web.stripecount)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   392
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
   393
    changenav = webutil.revnav(web.repo).gen(pos, revcount, count)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   394
19737
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   395
    entries = list(changelist())
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   396
    latestentry = entries[:1]
19738
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   397
    if len(entries) > revcount:
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   398
        nextentry = entries[-1:]
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   399
        entries = entries[:-1]
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   400
    else:
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   401
        nextentry = []
19737
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   402
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   403
    return tmpl(shortlog and 'shortlog' or 'changelog', changenav=changenav,
14055
421d56a055fd drop {short,hex}(ctx.node()) calls in favor of ctx methods
Alexander Solovyov <alexander@solovyov.net>
parents: 14043
diff changeset
   404
                node=ctx.hex(), rev=pos, changesets=count,
19737
ab5442f45441 hgweb: always compute all entries and latestentry in changelog
Alexander Plavin <alexander@plav.in>
parents: 19735
diff changeset
   405
                entries=entries,
19738
93b8544c4482 hgweb: add nextentry variable for easy pagination in changelog
Alexander Plavin <alexander@plav.in>
parents: 19737
diff changeset
   406
                latestentry=latestentry, nextentry=nextentry,
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   407
                archives=web.archivelist("tip"), revcount=revcount,
19396
afc23eddc324 hgweb: show current search query in the input field
Alexander Plavin <me@aplavin.ru>
parents: 18968
diff changeset
   408
                morevars=morevars, lessvars=lessvars, query=query)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   409
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   410
@webcommand('shortlog')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   411
def shortlog(web, req, tmpl):
24086
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   412
    """
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   413
    /shortlog
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   414
    ---------
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   415
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   416
    Show basic information about a set of changesets.
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   417
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   418
    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
   419
    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
   420
    ``changelog`` template.
2d8e93554822 webcommands: document "shortlog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24085
diff changeset
   421
    """
19872
681f7b9213a4 check-code: check for spaces around = for named parameters
Mads Kiilerich <madski@unity3d.com>
parents: 19768
diff changeset
   422
    return changelog(web, req, tmpl, shortlog=True)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   423
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   424
@webcommand('changeset')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   425
def changeset(web, req, tmpl):
24085
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   426
    """
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   427
    /changeset[/{revision}]
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   428
    -----------------------
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   429
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   430
    Show information about a single changeset.
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   431
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   432
    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
   433
    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
   434
    will be shown.
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   435
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   436
    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
   437
    ``changesetbookmark``, ``filenodelink``, ``filenolink``, and the many
0bf61eae67ab webcommands: document "changeset" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24084
diff changeset
   438
    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
   439
    """
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   440
    ctx = webutil.changectx(web.repo, req)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   441
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24114
diff changeset
   442
    return tmpl('changeset', **webutil.changesetentry(web, req, tmpl, ctx))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   443
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   444
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
   445
16448
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   446
def decodepath(path):
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   447
    """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
   448
    working copy.
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   449
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   450
    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
   451
    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
   452
    return path
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   453
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   454
@webcommand('manifest')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   455
def manifest(web, req, tmpl):
24090
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   456
    """
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   457
    /manifest[/{revision}[/{path}]]
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   458
    -------------------------------
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   459
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   460
    Show information about a directory.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   461
24868
9668c653eb9d webcommands: fix description of manifest default behavior
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 24867
diff changeset
   462
    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
   463
    directory for the ``tip`` changeset will be shown.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   464
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   465
    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
   466
    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
   467
    directories and files.
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   468
a86b2922ea30 webcommands: document "manifest" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24089
diff changeset
   469
    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
   470
    """
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   471
    ctx = webutil.changectx(web.repo, req)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   472
    path = webutil.cleanpath(web.repo, req.form.get('file', [''])[0])
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   473
    mf = ctx.manifest()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   474
    node = ctx.node()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   475
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   476
    files = {}
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   477
    dirs = {}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   478
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   479
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   480
    if path and path[-1] != "/":
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   481
        path += "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   482
    l = len(path)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   483
    abspath = "/" + path
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   484
16448
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   485
    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
   486
        # 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
   487
        # (repository) path
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   488
        f = decodepath(full)
e6b45e9a75dc hgweb: add hook for remapping repository path into virtual paths
Martin Geisler <mg@lazybytes.net>
parents: 16308
diff changeset
   489
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   490
        if f[:l] != path:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   491
            continue
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   492
        remain = f[l:]
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   493
        elements = remain.split('/')
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   494
        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
   495
            files[remain] = full
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   496
        else:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   497
            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
   498
            for elem in elements[0:-1]:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   499
                if elem not in h:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   500
                    h[elem] = {}
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   501
                h = h[elem]
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   502
                if len(h) > 1:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   503
                    break
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   504
            h[None] = None # denotes files present
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   505
7565
5f162f61e479 hgweb: fix problems with empty repositories
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7434
diff changeset
   506
    if mf and not files and not dirs:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   507
        raise ErrorResponse(HTTP_NOT_FOUND, 'path not found: ' + path)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   508
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   509
    def filelist(**map):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 7966
diff changeset
   510
        for f in sorted(files):
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   511
            full = files[f]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   512
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   513
            fctx = ctx.filectx(full)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   514
            yield {"file": full,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   515
                   "parity": parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   516
                   "basename": f,
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   517
                   "date": fctx.date(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   518
                   "size": fctx.size(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   519
                   "permissions": mf.flags(full)}
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   520
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   521
    def dirlist(**map):
8209
a1a5a57efe90 replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents: 7966
diff changeset
   522
        for d in sorted(dirs):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   523
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   524
            emptydirs = []
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   525
            h = dirs[d]
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   526
            while isinstance(h, dict) and len(h) == 1:
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   527
                k, v = h.items()[0]
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   528
                if v:
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   529
                    emptydirs.append(k)
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   530
                h = v
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   531
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   532
            path = "%s%s" % (abspath, d)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   533
            yield {"parity": parity.next(),
7305
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   534
                   "path": path,
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   535
                   "emptydirs": "/".join(emptydirs),
c21d236ca897 hgweb: descend empty directories in web view
Ry4an Brase <ry4an-hg@ry4an.org>
parents: 7300
diff changeset
   536
                   "basename": d}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   537
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   538
    return tmpl("manifest",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   539
                rev=ctx.rev(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   540
                node=hex(node),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   541
                path=abspath,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   542
                up=webutil.up(abspath),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   543
                upparity=parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   544
                fentries=filelist,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   545
                dentries=dirlist,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   546
                archives=web.archivelist(hex(node)),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   547
                tags=webutil.nodetagsdict(web.repo, node),
13794
5c18a0bca26f hgweb: add bookmark labels to monoblue theme (based on 270f57d35525)
Yuya Nishihara <yuya@tcha.org>
parents: 13597
diff changeset
   548
                bookmarks=webutil.nodebookmarksdict(web.repo, node),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   549
                inbranch=webutil.nodeinbranch(web.repo, ctx),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   550
                branches=webutil.nodebranchdict(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
   551
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   552
@webcommand('tags')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   553
def tags(web, req, tmpl):
24084
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   554
    """
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   555
    /tags
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   556
    -----
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   557
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   558
    Show information about tags.
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   559
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   560
    No arguments are accepted.
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   561
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   562
    The ``tags`` template is rendered.
ef06e2b1a3d1 webcommands: document "tags" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24083
diff changeset
   563
    """
18029
109a6a9dcca8 hgweb: fix iterator reuse in atom feed generation
Matt Mackall <mpm@selenic.com>
parents: 17322
diff changeset
   564
    i = list(reversed(web.repo.tagslist()))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   565
    parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   566
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   567
    def entries(notip, latestonly, **map):
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   568
        t = i
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   569
        if notip:
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   570
            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
   571
        if latestonly:
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   572
            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
   573
        for k, n in t:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   574
            yield {"parity": parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   575
                   "tag": k,
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   576
                   "date": web.repo[n].date(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   577
                   "node": hex(n)}
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   578
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   579
    return tmpl("tags",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   580
                node=hex(web.repo.changelog.tip()),
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   581
                entries=lambda **x: entries(False, False, **x),
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   582
                entriesnotip=lambda **x: entries(True, False, **x),
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   583
                latestentry=lambda **x: entries(True, True, **x))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   584
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   585
@webcommand('bookmarks')
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   586
def bookmarks(web, req, tmpl):
24083
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   587
    """
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   588
    /bookmarks
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   589
    ----------
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   590
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   591
    Show information about bookmarks.
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   592
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   593
    No arguments are accepted.
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   594
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   595
    The ``bookmarks`` template is rendered.
5fbb5217a6c8 webcommands: document "bookmarks" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24082
diff changeset
   596
    """
18478
886936ecc21b hgweb: don't attempt to show hidden bookmarks (issue3774)
Kevin Bullock <kbullock@ringworld.org>
parents: 18477
diff changeset
   597
    i = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   598
    parity = paritygen(web.stripecount)
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   599
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   600
    def entries(latestonly, **map):
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   601
        if latestonly:
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   602
            t = [min(i)]
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   603
        else:
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   604
            t = sorted(i)
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   605
        for k, n in t:
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   606
            yield {"parity": parity.next(),
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   607
                   "bookmark": k,
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   608
                   "date": web.repo[n].date(),
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   609
                   "node": hex(n)}
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   610
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   611
    return tmpl("bookmarks",
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   612
                node=hex(web.repo.changelog.tip()),
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   613
                entries=lambda **x: entries(latestonly=False, **x),
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
   614
                latestentry=lambda **x: entries(latestonly=True, **x))
13597
38c9837b1f75 hgweb: add separate page with bookmarks listing
Alexander Solovyov <alexander@solovyov.net>
parents: 13596
diff changeset
   615
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   616
@webcommand('branches')
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   617
def branches(web, req, tmpl):
24082
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   618
    """
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   619
    /branches
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   620
    ---------
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   621
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   622
    Show information about branches.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   623
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   624
    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
   625
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   626
    No arguments are accepted.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   627
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   628
    The ``branches`` template is rendered.
32dabf811b39 webcommands: document "branches" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24081
diff changeset
   629
    """
18030
ebc0fa067c07 hgweb: avoid generator exhaustion with branches
Matt Mackall <mpm@selenic.com>
parents: 18029
diff changeset
   630
    tips = []
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8713
diff changeset
   631
    heads = web.repo.heads()
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   632
    parity = paritygen(web.stripecount)
20194
9985e188d940 hgweb: simplify branches with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20193
diff changeset
   633
    sortkey = lambda item: (not item[1], item[0].rev())
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   634
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   635
    def entries(limit, **map):
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   636
        count = 0
18030
ebc0fa067c07 hgweb: avoid generator exhaustion with branches
Matt Mackall <mpm@selenic.com>
parents: 18029
diff changeset
   637
        if not tips:
20194
9985e188d940 hgweb: simplify branches with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20193
diff changeset
   638
            for tag, hs, tip, closed in web.repo.branchmap().iterbranches():
9985e188d940 hgweb: simplify branches with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20193
diff changeset
   639
                tips.append((web.repo[tip], closed))
9985e188d940 hgweb: simplify branches with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20193
diff changeset
   640
        for ctx, closed in sorted(tips, key=sortkey, reverse=True):
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   641
            if limit > 0 and count >= limit:
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   642
                return
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   643
            count += 1
20194
9985e188d940 hgweb: simplify branches with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20193
diff changeset
   644
            if closed:
14771
0cc66f13bea0 hgweb: treat branch attribute `closed' as more important than `inactive'
Jesse Long <jpl@unknown.za.net>
parents: 14570
diff changeset
   645
                status = 'closed'
0cc66f13bea0 hgweb: treat branch attribute `closed' as more important than `inactive'
Jesse Long <jpl@unknown.za.net>
parents: 14570
diff changeset
   646
            elif ctx.node() not in heads:
8796
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8713
diff changeset
   647
                status = 'inactive'
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8713
diff changeset
   648
            else:
2bcef677a6c3 localrepo: remove 'closed' argument to heads(...) function
John Mulligan <phlogistonjohn@asynchrono.us>
parents: 8713
diff changeset
   649
                status = 'open'
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   650
            yield {'parity': parity.next(),
8354
418ea63f00fb hgweb: use context api in branches webcommand
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8352
diff changeset
   651
                   'branch': ctx.branch(),
8713
de6bb29e208a hgweb: allow distinction between open/closed branches on branches page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8390
diff changeset
   652
                   'status': status,
8354
418ea63f00fb hgweb: use context api in branches webcommand
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8352
diff changeset
   653
                   'node': ctx.hex(),
418ea63f00fb hgweb: use context api in branches webcommand
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8352
diff changeset
   654
                   'date': ctx.date()}
8352
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   655
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   656
    return tmpl('branches', node=hex(web.repo.changelog.tip()),
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   657
                entries=lambda **x: entries(0, **x),
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   658
                latestentry=lambda **x: entries(1, **x))
eefcb59d44d6 webcommands: add 'branches' command, similar to 'tags'
Sune Foldager <cryo@cyanite.org>
parents: 8236
diff changeset
   659
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   660
@webcommand('summary')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   661
def summary(web, req, tmpl):
24091
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   662
    """
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   663
    /summary
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   664
    --------
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   665
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   666
    Show a summary of repository state.
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   667
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   668
    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
   669
    is captured by this handler.
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   670
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   671
    The ``summary`` template is rendered.
6b6ec887c79b webcommands: document "summary" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24090
diff changeset
   672
    """
17261
c0068b058fcd webcommands: do not modify repo.tagslist()
Patrick Mezard <patrick@mezard.eu>
parents: 17202
diff changeset
   673
    i = reversed(web.repo.tagslist())
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   674
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   675
    def tagentries(**map):
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   676
        parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   677
        count = 0
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   678
        for k, n in i:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   679
            if k == "tip": # skip tip
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   680
                continue
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   681
6659
bc553c6d1ef9 webcommands: fix increments lost by 894875eae49b
Andrew Beekhof <beekhof@gmail.com>
parents: 6657
diff changeset
   682
            count += 1
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   683
            if count > 10: # limit to 10 tags
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   684
                break
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   685
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   686
            yield tmpl("tagentry",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   687
                       parity=parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   688
                       tag=k,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   689
                       node=hex(n),
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   690
                       date=web.repo[n].date())
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   691
13924
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   692
    def bookmarks(**map):
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   693
        parity = paritygen(web.stripecount)
18563
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   694
        marks = [b for b in web.repo._bookmarks.items() if b[1] in web.repo]
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   695
        for k, n in sorted(marks)[:10]:  # limit to 10 bookmarks
13924
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   696
            yield {'parity': parity.next(),
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   697
                   'bookmark': k,
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   698
                   '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
   699
                   'node': hex(n)}
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   700
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   701
    def branches(**map):
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   702
        parity = paritygen(web.stripecount)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   703
20193
7d40e706412c hgweb: simplify summary with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20095
diff changeset
   704
        b = web.repo.branchmap()
7d40e706412c hgweb: simplify summary with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20095
diff changeset
   705
        l = [(-web.repo.changelog.rev(tip), tip, tag)
7d40e706412c hgweb: simplify summary with repo.branchmap().iterbranches()
Brodie Rao <brodie@sf.io>
parents: 20095
diff changeset
   706
             for tag, heads, tip, closed in b.iterbranches()]
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   707
        for r, n, t in sorted(l):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   708
            yield {'parity': parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   709
                   'branch': t,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   710
                   'node': hex(n),
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   711
                   'date': web.repo[n].date()}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   712
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   713
    def changelist(**map):
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
   714
        parity = paritygen(web.stripecount, offset=start - end)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   715
        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
   716
        revs = []
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   717
        if start < end:
6d098adc5a46 hgweb: make 'summary' work with hidden changesets (issue3810)
Kevin Bullock <kbullock@ringworld.org>
parents: 18524
diff changeset
   718
            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
   719
        for i in revs:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6720
diff changeset
   720
            ctx = web.repo[i]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   721
            n = ctx.node()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   722
            hn = hex(n)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   723
18319
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
   724
            l.append(tmpl(
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   725
               'shortlogentry',
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   726
                parity=parity.next(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   727
                author=ctx.user(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   728
                desc=ctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   729
                extra=ctx.extra(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   730
                date=ctx.date(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   731
                rev=i,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   732
                node=hn,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   733
                tags=webutil.nodetagsdict(web.repo, n),
13794
5c18a0bca26f hgweb: add bookmark labels to monoblue theme (based on 270f57d35525)
Yuya Nishihara <yuya@tcha.org>
parents: 13597
diff changeset
   734
                bookmarks=webutil.nodebookmarksdict(web.repo, n),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   735
                inbranch=webutil.nodeinbranch(web.repo, ctx),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   736
                branches=webutil.nodebranchdict(web.repo, ctx)))
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   737
18319
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
   738
        l.reverse()
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   739
        yield l
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   740
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   741
    tip = web.repo['tip']
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   742
    count = len(web.repo)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   743
    start = max(0, count - web.maxchanges)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   744
    end = min(count, start + web.maxchanges)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   745
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   746
    return tmpl("summary",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   747
                desc=web.config("web", "description", "unknown"),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   748
                owner=get_contact(web.config) or "unknown",
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   749
                lastchange=tip.date(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   750
                tags=tagentries,
13924
ea726c97c1b6 hgweb: add bookmarks listing to summary page of gitweb/monoblue styles
Yuya Nishihara <yuya@tcha.org>
parents: 13923
diff changeset
   751
                bookmarks=bookmarks,
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   752
                branches=branches,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   753
                shortlog=changelist,
12059
0de6cfdcaad8 webcommands: remove unncessary access to repo.changelog
Patrick Mezard <pmezard@gmail.com>
parents: 11332
diff changeset
   754
                node=tip.hex(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   755
                archives=web.archivelist("tip"))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   756
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   757
@webcommand('filediff')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   758
def filediff(web, req, tmpl):
24092
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   759
    """
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   760
    /diff/{revision}/{path}
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   761
    -----------------------
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   762
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   763
    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
   764
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   765
    The ``filediff`` template is rendered.
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   766
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   767
    This hander is registered under both the ``/diff`` and ``/filediff``
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   768
    paths. ``/diff`` is used in modern code.
55dfea651b7f webcommands: document "filediff" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24091
diff changeset
   769
    """
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   770
    fctx, ctx = None, None
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   771
    try:
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   772
        fctx = webutil.filectx(web.repo, req)
7280
810ca383da9c remove unused variables
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7183
diff changeset
   773
    except LookupError:
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   774
        ctx = webutil.changectx(web.repo, req)
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   775
        path = webutil.cleanpath(web.repo, req.form['file'][0])
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   776
        if path not in ctx.files():
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   777
            raise
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   778
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   779
    if fctx is not None:
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   780
        n = fctx.node()
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   781
        path = fctx.path()
16722
7bf48bc7de23 hgweb: fix filediff base calculation
Matt Mackall <mpm@selenic.com>
parents: 16469
diff changeset
   782
        ctx = fctx.changectx()
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   783
    else:
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   784
        n = ctx.node()
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   785
        # path already defined in except clause
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   786
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7305
diff changeset
   787
    parity = paritygen(web.stripecount)
9402
5d49fdef6fd0 hgweb: show diff header line in raw diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8842
diff changeset
   788
    style = web.config('web', 'style', 'paper')
5d49fdef6fd0 hgweb: show diff header line in raw diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8842
diff changeset
   789
    if 'style' in req.form:
5d49fdef6fd0 hgweb: show diff header line in raw diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8842
diff changeset
   790
        style = req.form['style'][0]
5d49fdef6fd0 hgweb: show diff header line in raw diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8842
diff changeset
   791
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17933
diff changeset
   792
    diffs = webutil.diffs(web.repo, tmpl, ctx, None, [path], parity, style)
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   793
    if fctx:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   794
        rename = webutil.renamelink(fctx)
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   795
        ctx = fctx
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   796
    else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   797
        rename = []
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
   798
        ctx = ctx
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   799
    return tmpl("filediff",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   800
                file=path,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   801
                node=hex(n),
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   802
                rev=ctx.rev(),
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   803
                date=ctx.date(),
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   804
                desc=ctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   805
                extra=ctx.extra(),
7183
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   806
                author=ctx.user(),
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   807
                rename=rename,
099b4f9be5ab hgweb: working diff for removed files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7182
diff changeset
   808
                branch=webutil.nodebranchnodefault(ctx),
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   809
                parent=webutil.parents(ctx),
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   810
                child=webutil.children(ctx),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   811
                diff=diffs)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   812
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   813
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
   814
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   815
@webcommand('comparison')
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   816
def comparison(web, req, tmpl):
24093
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   817
    """
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   818
    /comparison/{revision}/{path}
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   819
    -----------------------------
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   820
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   821
    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
   822
    made on a particular revision.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   823
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   824
    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
   825
    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
   826
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   827
    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
   828
    context in the diff.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   829
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   830
    The ``filecomparison`` template is rendered.
c8639f90a715 webcommands: document "comparison" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24092
diff changeset
   831
    """
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   832
    ctx = webutil.changectx(web.repo, req)
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17261
diff changeset
   833
    if 'file' not in req.form:
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17261
diff changeset
   834
        raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   835
    path = webutil.cleanpath(web.repo, req.form['file'][0])
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   836
    rename = path in ctx and webutil.renamelink(ctx[path]) or []
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   837
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   838
    parsecontext = lambda v: v == 'full' and -1 or int(v)
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   839
    if 'context' in req.form:
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   840
        context = parsecontext(req.form['context'][0])
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   841
    else:
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   842
        context = parsecontext(web.config('web', 'comparisoncontext', '5'))
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   843
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   844
    def filelines(f):
19657
145636d31bb4 hgweb: import the whole util module in webcommands instead of just one function
Alexander Plavin <alexander@plav.in>
parents: 19656
diff changeset
   845
        if util.binary(f.data()):
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   846
            mt = mimetypes.guess_type(f.path())[0]
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   847
            if not mt:
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   848
                mt = 'application/octet-stream'
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   849
            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
   850
        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
   851
21123
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
   852
    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
   853
    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
   854
    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
   855
    rightrev = ctx.rev()
92fab48dfec1 hgweb: show revisions and hashes gotten from changelog in "comparison" page
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 21121
diff changeset
   856
    rightnode = ctx.node()
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   857
    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
   858
        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
   859
        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
   860
        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
   861
            leftlines = ()
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   862
        else:
21121
8c9e84b44221 hgweb: make "comparison" get parent from not filelog but changelog
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 20761
diff changeset
   863
            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
   864
            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
   865
    else:
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   866
        rightlines = ()
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   867
        fctx = ctx.parents()[0][path]
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   868
        leftlines = filelines(fctx)
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   869
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   870
    comparison = webutil.compare(tmpl, context, leftlines, rightlines)
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   871
    return tmpl('filecomparison',
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   872
                file=path,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   873
                node=hex(ctx.node()),
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   874
                rev=ctx.rev(),
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   875
                date=ctx.date(),
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   876
                desc=ctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   877
                extra=ctx.extra(),
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   878
                author=ctx.user(),
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   879
                rename=rename,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   880
                branch=webutil.nodebranchnodefault(ctx),
17303
06217d3cf8d9 hgweb: fixes invalid parents / children in comparison
wujek srujek <wujek.srujek@googlemail.com>
parents: 17302
diff changeset
   881
                parent=webutil.parents(fctx),
06217d3cf8d9 hgweb: fixes invalid parents / children in comparison
wujek srujek <wujek.srujek@googlemail.com>
parents: 17302
diff changeset
   882
                child=webutil.children(fctx),
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   883
                leftrev=leftrev,
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   884
                leftnode=hex(leftnode),
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   885
                rightrev=rightrev,
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
   886
                rightnode=hex(rightnode),
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   887
                comparison=comparison)
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 17146
diff changeset
   888
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   889
@webcommand('annotate')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   890
def annotate(web, req, tmpl):
24094
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   891
    """
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   892
    /annotate/{revision}/{path}
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   893
    ---------------------------
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   894
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   895
    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
   896
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   897
    The ``fileannotate`` template is rendered.
9c810d46a093 webcommands: document "annotate" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24093
diff changeset
   898
    """
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   899
    fctx = webutil.filectx(web.repo, req)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   900
    f = fctx.path()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   901
    parity = paritygen(web.stripecount)
23689
4fedf2a9b538 webcommands.annotate: explicitly only honor whitespace diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23232
diff changeset
   902
    diffopts = patch.difffeatureopts(web.repo.ui, untrusted=True,
4fedf2a9b538 webcommands.annotate: explicitly only honor whitespace diffopts
Siddharth Agarwal <sid0@fb.com>
parents: 23232
diff changeset
   903
                                     section='annotate', whitespace=True)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   904
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   905
    def annotate(**map):
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   906
        last = None
19657
145636d31bb4 hgweb: import the whole util module in webcommands instead of just one function
Alexander Plavin <alexander@plav.in>
parents: 19656
diff changeset
   907
        if util.binary(fctx.data()):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   908
            mt = (mimetypes.guess_type(fctx.path())[0]
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   909
                  or 'application/octet-stream')
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   910
            lines = enumerate([((fctx.filectx(fctx.filerev()), 1),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   911
                                '(binary:%s)' % mt)])
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   912
        else:
15528
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15004
diff changeset
   913
            lines = enumerate(fctx.annotate(follow=True, linenumber=True,
a84698badf0b annotate: support diff whitespace filtering flags (issue3030)
Patrick Mezard <pmezard@gmail.com>
parents: 15004
diff changeset
   914
                                            diffopts=diffopts))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   915
        for lineno, ((f, targetline), l) in lines:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   916
            fnode = f.filenode()
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   917
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   918
            if last != fnode:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   919
                last = fnode
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   920
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   921
            yield {"parity": parity.next(),
14055
421d56a055fd drop {short,hex}(ctx.node()) calls in favor of ctx methods
Alexander Solovyov <alexander@solovyov.net>
parents: 14043
diff changeset
   922
                   "node": f.hex(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   923
                   "rev": f.rev(),
6564
ccc2481e3954 webcommands: pass full author to annotate, fix templates (issue 1054)
Patrick Mezard <pmezard@gmail.com>
parents: 6437
diff changeset
   924
                   "author": f.user(),
6657
a51093361e1c hgweb: show cset node and description when hovering over annotate prefix
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6564
diff changeset
   925
                   "desc": f.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   926
                   "extra": f.extra(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   927
                   "file": f.path(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   928
                   "targetline": targetline,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   929
                   "line": l,
24712
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24306
diff changeset
   930
                   "lineno": lineno + 1,
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   931
                   "lineid": "l%d" % (lineno + 1),
13199
a38df1250945 hgweb: added revision date to annotate line data
Oli Thissen <oli@tonick.net>
parents: 12696
diff changeset
   932
                   "linenumber": "% 6d" % (lineno + 1),
a38df1250945 hgweb: added revision date to annotate line data
Oli Thissen <oli@tonick.net>
parents: 12696
diff changeset
   933
                   "revdate": f.date()}
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   934
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   935
    return tmpl("fileannotate",
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   936
                file=f,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   937
                annotate=annotate,
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   938
                path=webutil.up(f),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   939
                rev=fctx.rev(),
14055
421d56a055fd drop {short,hex}(ctx.node()) calls in favor of ctx methods
Alexander Solovyov <alexander@solovyov.net>
parents: 14043
diff changeset
   940
                node=fctx.hex(),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   941
                author=fctx.user(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   942
                date=fctx.date(),
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   943
                desc=fctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
   944
                extra=fctx.extra(),
6434
62e0bb41e682 hgweb: minor improvements for new web style
Matt Mackall <mpm@selenic.com>
parents: 6410
diff changeset
   945
                rename=webutil.renamelink(fctx),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   946
                branch=webutil.nodebranchnodefault(fctx),
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   947
                parent=webutil.parents(fctx),
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
   948
                child=webutil.children(fctx),
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
   949
                permissions=fctx.manifest().flags(f))
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
   950
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
   951
@webcommand('filelog')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
   952
def filelog(web, req, tmpl):
24095
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   953
    """
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   954
    /filelog/{revision}/{path}
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   955
    --------------------------
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   956
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   957
    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
   958
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   959
    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
   960
    maximum number of entries to show.
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   961
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   962
    The ``filelog`` template will be rendered.
1f48b157dccf webcommands: document "filelog" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24094
diff changeset
   963
    """
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   964
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   965
    try:
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   966
        fctx = webutil.filectx(web.repo, req)
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   967
        f = fctx.path()
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   968
        fl = fctx.filelog()
7633
08cabecfa8a8 errors: move revlog errors
Matt Mackall <mpm@selenic.com>
parents: 7622
diff changeset
   969
    except error.LookupError:
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   970
        f = webutil.cleanpath(web.repo, req.form['file'][0])
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   971
        fl = web.repo.file(f)
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   972
        numrevs = len(fl)
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   973
        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
   974
            raise
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   975
        rev = webutil.changectx(web.repo, req).rev()
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
   976
        first = fl.linkrev(0)
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   977
        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
   978
            raise
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   979
        frev = numrevs - 1
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
   980
        while fl.linkrev(frev) > rev:
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   981
            frev -= 1
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
   982
        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
   983
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   984
    revcount = web.maxshortchanges
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   985
    if 'revcount' in req.form:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   986
        try:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   987
            revcount = int(req.form.get('revcount', [revcount])[0])
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   988
            revcount = max(revcount, 1)
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   989
            tmpl.defaults['sessionvars']['revcount'] = revcount
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   990
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
   991
            pass
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   992
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   993
    lessvars = copy.copy(tmpl.defaults['sessionvars'])
13931
c3372529247f hgweb: set minimum number of revision to display to 1 when revcount is 0
Md. O. Shayan <mdoshayan@gmail.com>
parents: 13924
diff changeset
   994
    lessvars['revcount'] = max(revcount / 2, 1)
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   995
    morevars = copy.copy(tmpl.defaults['sessionvars'])
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   996
    morevars['revcount'] = revcount * 2
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   997
7300
591767e6ea7a hgweb: conditionally show file logs for deleted files
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7288
diff changeset
   998
    count = fctx.filerev() + 1
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
   999
    start = max(0, fctx.filerev() - revcount + 1) # first rev on this page
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1000
    end = min(count, start + revcount) # last rev on this page
10282
08a0f04b56bd many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents: 10264
diff changeset
  1001
    parity = paritygen(web.stripecount, offset=start - end)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1002
20022
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1003
    def entries():
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1004
        l = []
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1005
7612
069b29656401 web: use the correct filectx in filelog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7565
diff changeset
  1006
        repo = web.repo
20023
2771e59afac4 hgweb: use semantically suitable filelog.revs in filelog
Alexander Plavin <alexander@plav.in>
parents: 20022
diff changeset
  1007
        revs = fctx.filelog().revs(start, end - 1)
18402
bfba6d954108 hgweb: `limit` argument is actually `latestonly` renames and enforce
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18352
diff changeset
  1008
        for i in revs:
7612
069b29656401 web: use the correct filectx in filelog
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 7565
diff changeset
  1009
            iterfctx = fctx.filectx(i)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1010
18319
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1011
            l.append({"parity": parity.next(),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1012
                      "filerev": i,
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1013
                      "file": f,
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1014
                      "node": iterfctx.hex(),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1015
                      "author": iterfctx.user(),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1016
                      "date": iterfctx.date(),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1017
                      "rename": webutil.renamelink(iterfctx),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1018
                      "parent": webutil.parents(iterfctx),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1019
                      "child": webutil.children(iterfctx),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1020
                      "desc": iterfctx.description(),
18581
3490c91a1fcb templates: export extra as a dict to templates
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 18563
diff changeset
  1021
                      "extra": iterfctx.extra(),
18319
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1022
                      "tags": webutil.nodetagsdict(repo, iterfctx.node()),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1023
                      "bookmarks": webutil.nodebookmarksdict(
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1024
                          repo, iterfctx.node()),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1025
                      "branch": webutil.nodebranchnodefault(iterfctx),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1026
                      "inbranch": webutil.nodeinbranch(repo, iterfctx),
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1027
                      "branches": webutil.nodebranchdict(repo, iterfctx)})
e350ce798b63 hgweb: no do not use listinsert(0, ...)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18037
diff changeset
  1028
        for e in reversed(l):
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1029
            yield e
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1030
20022
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1031
    entries = list(entries())
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1032
    latestentry = entries[:1]
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1033
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
  1034
    revnav = webutil.filerevnav(web.repo, fctx.path())
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
  1035
    nav = revnav.gen(end - 1, revcount, count)
14055
421d56a055fd drop {short,hex}(ctx.node()) calls in favor of ctx methods
Alexander Solovyov <alexander@solovyov.net>
parents: 14043
diff changeset
  1036
    return tmpl("filelog", file=f, node=fctx.hex(), nav=nav,
20022
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1037
                entries=entries,
d85dfe211c71 hgweb: always compute all entries and latestentry in filelog
Alexander Plavin <alexander@plav.in>
parents: 20021
diff changeset
  1038
                latestentry=latestentry,
10246
b9d02695bde4 hgweb: add less/more links to shortlog/filelog nav
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 10245
diff changeset
  1039
                revcount=revcount, morevars=morevars, lessvars=lessvars)
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1040
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1041
@webcommand('archive')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
  1042
def archive(web, req, tmpl):
24096
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1043
    """
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1044
    /archive/{revision}.{format}[/{path}]
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1045
    -------------------------------------
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1046
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1047
    Obtain an archive of repository content.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1048
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1049
    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
  1050
    ``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
  1051
    ``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
  1052
    server configuration.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1053
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1054
    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
  1055
    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
  1056
    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
  1057
    directory will be included in the archive.
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1058
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1059
    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
  1060
    """
bb8b6d44fe1d webcommands: document "archive" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24095
diff changeset
  1061
6669
782dbbdfb1d7 fix traceback in hgweb when URL doesn't end in one of the archive specs
Ali Saidi <saidi@eecs.umich.edu>
parents: 6368
diff changeset
  1062
    type_ = req.form.get('type', [None])[0]
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1063
    allowed = web.configlist("web", "allow_archive")
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1064
    key = req.form['node'][0]
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1065
7029
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1066
    if type_ not in web.archives:
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1067
        msg = 'Unsupported archive type: %s' % type_
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1068
        raise ErrorResponse(HTTP_NOT_FOUND, msg)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1069
7029
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1070
    if not ((type_ in allowed or
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1071
        web.configbool("web", "allow" + type_, False))):
b84d27386285 hgweb: Respond with HTTP 403 for disabled archive types instead of 404
Rocco Rutte <pdmef@gmx.net>
parents: 6981
diff changeset
  1072
        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
  1073
        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
  1074
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1075
    reponame = re.sub(r"\W+", "-", os.path.basename(web.reponame))
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1076
    cnode = web.repo.lookup(key)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1077
    arch_version = key
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1078
    if cnode == key or key == 'tip':
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1079
        arch_version = short(cnode)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1080
    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
  1081
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1082
    ctx = webutil.changectx(web.repo, req)
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1083
    pats = []
23232
a0ccb66f344d hgweb: fix a crash when using web.archivesubrepos
Matt Harbison <matt_harbison@yahoo.com>
parents: 22634
diff changeset
  1084
    matchfn = scmutil.match(ctx, [])
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1085
    file = req.form.get('file', None)
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1086
    if file:
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
  1087
        pats = ['path:' + file[0]]
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
  1088
        matchfn = scmutil.match(ctx, pats, default='path')
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
  1089
        if pats:
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
  1090
            files = [f for f in ctx.manifest().keys() if matchfn(f)]
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
  1091
            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
  1092
                raise ErrorResponse(HTTP_NOT_FOUND,
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
  1093
                    'file(s) not found: %s' % file[0])
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1094
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1095
    mimetype, artype, extension, encoding = web.archive_specs[type_]
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1096
    headers = [
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1097
        ('Content-Disposition', 'attachment; filename=%s%s' % (name, extension))
18347
853221386f48 hgweb: make type a mandatory parameter to request.respond
Mads Kiilerich <mads@kiilerich.com>
parents: 18319
diff changeset
  1098
        ]
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1099
    if encoding:
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1100
        headers.append(('Content-Encoding', encoding))
18348
764a758780b6 hgweb: simplify wsgirequest header handling
Mads Kiilerich <mads@kiilerich.com>
parents: 18347
diff changeset
  1101
    req.headers.extend(headers)
18347
853221386f48 hgweb: make type a mandatory parameter to request.respond
Mads Kiilerich <mads@kiilerich.com>
parents: 18319
diff changeset
  1102
    req.respond(HTTP_OK, mimetype)
17933
8243dd66e0e3 webcommands: allow hgweb's archive to recurse into subrepos
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17322
diff changeset
  1103
8243dd66e0e3 webcommands: allow hgweb's archive to recurse into subrepos
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17322
diff changeset
  1104
    archival.archive(web.repo, req, cnode, artype, prefix=name,
18771
bb38f4f78104 hgweb: teach archive how to download a specific directory or file
Angel Ezquerra <angel.ezquerra@gmail.com>
parents: 18747
diff changeset
  1105
                     matchfn=matchfn,
17933
8243dd66e0e3 webcommands: allow hgweb's archive to recurse into subrepos
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 17322
diff changeset
  1106
                     subrepos=web.configbool("web", "archivesubrepos"))
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1107
    return []
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
  1108
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1109
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1110
@webcommand('static')
5600
9d900f7282e6 hgweb: explicitly pass around the templater
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 5598
diff changeset
  1111
def static(web, req, tmpl):
5591
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1112
    fname = req.form['file'][0]
08887121a652 split out hgweb commands into a separate file, move some code around
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
  1113
    # 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
  1114
    # readable by the user running the CGI script
7107
125c8fedcbe0 Allow hgweb to search for templates in more than one path.
Brendan Cully <brendan@kublai.com>
parents: 7102
diff changeset
  1115
    static = web.config("web", "static", None, untrusted=False)
125c8fedcbe0 Allow hgweb to search for templates in more than one path.
Brendan Cully <brendan@kublai.com>
parents: 7102
diff changeset
  1116
    if not static:
22634
e48a5d3996c2 templater: introduce templatepaths for getting paths searched for templates
Mads Kiilerich <madski@unity3d.com>
parents: 22199
diff changeset
  1117
        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
  1118
        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
  1119
            tp = [tp]
7288
9c399c53469d Allow per-file shadowing of static directory in templatepath
Brendan Cully <brendan@kublai.com>
parents: 7280
diff changeset
  1120
        static = [os.path.join(p, 'static') for p in tp]
18645
76ff3a715cf2 hgweb: simplify internal staticfile return codes
Mads Kiilerich <mads@kiilerich.com>
parents: 18581
diff changeset
  1121
    staticfile(static, fname, req)
76ff3a715cf2 hgweb: simplify internal staticfile return codes
Mads Kiilerich <mads@kiilerich.com>
parents: 18581
diff changeset
  1122
    return []
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1123
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1124
@webcommand('graph')
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1125
def graph(web, req, tmpl):
24097
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1126
    """
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1127
    /graph[/{revision}]
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1128
    -------------------
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1129
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1130
    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
  1131
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1132
    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
  1133
    representations of repository topology.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1134
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1135
    The ``revision`` URL parameter controls the starting changeset.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1136
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1137
    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
  1138
    to show information for.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1139
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1140
    This handler will render the ``graph`` template.
8e04a73b5502 webcommands: document "graph" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24096
diff changeset
  1141
    """
10245
207b94f6b65d hgweb: make graph page size equal to shortlog
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9404
diff changeset
  1142
17318
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1143
    ctx = webutil.changectx(web.repo, req)
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1144
    rev = ctx.rev()
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1145
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1146
    bg_height = 39
10245
207b94f6b65d hgweb: make graph page size equal to shortlog
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 9404
diff changeset
  1147
    revcount = web.maxshortchanges
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1148
    if 'revcount' in req.form:
20092
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1149
        try:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1150
            revcount = int(req.form.get('revcount', [revcount])[0])
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1151
            revcount = max(revcount, 1)
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1152
            tmpl.defaults['sessionvars']['revcount'] = revcount
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1153
        except ValueError:
77acd8ce01ce hgweb: ignore non numeric "revcount" parameter values (issue4091)
Isaac Jurado <diptongo@gmail.com>
parents: 20004
diff changeset
  1154
            pass
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1155
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1156
    lessvars = copy.copy(tmpl.defaults['sessionvars'])
13931
c3372529247f hgweb: set minimum number of revision to display to 1 when revcount is 0
Md. O. Shayan <mdoshayan@gmail.com>
parents: 13924
diff changeset
  1157
    lessvars['revcount'] = max(revcount / 2, 1)
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1158
    morevars = copy.copy(tmpl.defaults['sessionvars'])
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1159
    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
  1160
17318
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1161
    count = len(web.repo)
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1162
    pos = rev
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1163
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1164
    uprev = min(max(0, count - 1), rev + revcount)
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1165
    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
  1166
    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
  1167
18428
8c10f760ca34 hgweb: walk the graph through the changelog
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18427
diff changeset
  1168
    tree = []
19487
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1169
    if pos != -1:
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1170
        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
  1171
        revs = []
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1172
        for i in allrevs:
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1173
            revs.append(i)
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1174
            if len(revs) >= revcount:
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1175
                break
8cfa3a3664a5 hgweb: fix incorrect revisions count in graph (issue3977)
Alexander Plavin <me@aplavin.ru>
parents: 19486
diff changeset
  1176
20761
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1177
        # 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
  1178
        # 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
  1179
        # since hgweb graphing code is not itself lazy yet.
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1180
        dag = graphmod.dagwalker(web.repo, revset.baseset(revs))
46f93b7660b6 webcommands: changed code to use lazy classes when calling dagwalker
Lucas Moscovicz <lmoscovicz@fb.com>
parents: 20678
diff changeset
  1181
        # As we said one line above... not lazy.
18428
8c10f760ca34 hgweb: walk the graph through the changelog
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18427
diff changeset
  1182
        tree = list(graphmod.colored(dag, web.repo))
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1183
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1184
    def getcolumns(tree):
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1185
        cols = 0
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1186
        for (id, type, ctx, vtx, edges) in tree:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1187
            if type != graphmod.CHANGESET:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1188
                continue
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1189
            cols = max(cols, max([edge[0] for edge in edges] or [0]),
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1190
                             max([edge[1] for edge in edges] or [0]))
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1191
        return cols
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1192
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1193
    def graphdata(usetuples, **map):
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1194
        data = []
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1195
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1196
        row = 0
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1197
        for (id, type, ctx, vtx, edges) in tree:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1198
            if type != graphmod.CHANGESET:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1199
                continue
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1200
            node = str(ctx)
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1201
            age = templatefilters.age(ctx.date())
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1202
            desc = templatefilters.firstline(ctx.description())
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1203
            desc = cgi.escape(templatefilters.nonempty(desc))
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1204
            user = cgi.escape(templatefilters.person(ctx.user()))
19879
5cbf413ce658 hgweb: escape branch names in graph view
Matt Mackall <mpm@selenic.com>
parents: 19499
diff changeset
  1205
            branch = cgi.escape(ctx.branch())
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1206
            try:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1207
                branchnode = web.repo.branchtip(branch)
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1208
            except error.RepoLookupError:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1209
                branchnode = None
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1210
            branch = branch, branchnode == ctx.node()
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1211
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1212
            if usetuples:
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1213
                data.append((node, vtx, edges, desc, user, age, branch,
19883
904061628dc4 hgweb: add escaping of tags and bookmarks in graph view
Matt Mackall <mpm@selenic.com>
parents: 19879
diff changeset
  1214
                             [cgi.escape(x) for x in ctx.tags()],
904061628dc4 hgweb: add escaping of tags and bookmarks in graph view
Matt Mackall <mpm@selenic.com>
parents: 19879
diff changeset
  1215
                             [cgi.escape(x) for x in ctx.bookmarks()]))
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1216
            else:
20678
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1217
                edgedata = [{'col': edge[0], 'nextcol': edge[1],
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1218
                             'color': (edge[2] - 1) % 6 + 1,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1219
                             'width': edge[3], 'bcolor': edge[4]}
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1220
                            for edge in edges]
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1221
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1222
                data.append(
20678
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1223
                    {'node': node,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1224
                     'col': vtx[0],
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1225
                     'color': (vtx[1] - 1) % 6 + 1,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1226
                     'edges': edgedata,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1227
                     'row': row,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1228
                     'nextrow': row + 1,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1229
                     'desc': desc,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1230
                     'user': user,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1231
                     'age': age,
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1232
                     'bookmarks': webutil.nodebookmarksdict(
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1233
                         web.repo, ctx.node()),
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1234
                     'branches': webutil.nodebranchdict(web.repo, ctx),
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1235
                     'inbranch': webutil.nodeinbranch(web.repo, ctx),
da6bea33007b webcommands: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20364
diff changeset
  1236
                     'tags': webutil.nodetagsdict(web.repo, ctx.node())})
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1237
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1238
            row += 1
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1239
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1240
        return data
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1241
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1242
    cols = getcolumns(tree)
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1243
    rows = len(tree)
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1244
    canvasheight = (rows + 1) * bg_height - 27
6691
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1245
0dba955c2636 add graph page to hgweb
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6670
diff changeset
  1246
    return tmpl('graph', rev=rev, revcount=revcount, uprev=uprev,
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7332
diff changeset
  1247
                lessvars=lessvars, morevars=morevars, downrev=downrev,
16773
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1248
                cols=cols, rows=rows,
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1249
                canvaswidth=(cols + 1) * bg_height,
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1250
                truecanvasheight=rows * bg_height,
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1251
                canvasheight=canvasheight, bg_height=bg_height,
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1252
                jsdata=lambda **x: graphdata(True, **x),
d490edc71146 hgweb: make graph data suitable for template usage
Paul Boddie <paul@boddie.org.uk>
parents: 16727
diff changeset
  1253
                nodes=lambda **x: graphdata(False, **x),
17318
7ac5800dbc8f hgweb: fix graph view paging
Patrick Mezard <patrick@mezard.eu>
parents: 17303
diff changeset
  1254
                node=ctx.hex(), changenav=changenav)
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1255
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1256
def _getdoc(e):
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1257
    doc = e[0].__doc__
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1258
    if doc:
16469
dd68c972d089 i18n: show localized messages for commands/extensions in hgweb help top (issue3383)
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 16448
diff changeset
  1259
        doc = _(doc).split('\n')[0]
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1260
    else:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1261
        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
  1262
    return doc
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1263
24076
b53d2afd11fb webcommands: define web commands using a decorator
Gregory Szorc <gregory.szorc@gmail.com>
parents: 23992
diff changeset
  1264
@webcommand('help')
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1265
def help(web, req, tmpl):
24081
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1266
    """
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1267
    /help[/{topic}]
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1268
    ---------------
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1269
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1270
    Render help documentation.
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1271
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1272
    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
  1273
    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
  1274
    available help topics will be rendered.
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1275
ff42de48193c webcommands: document "help" web command
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24078
diff changeset
  1276
    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
  1277
    ``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
  1278
    """
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1279
    from mercurial import commands # avoid cycle
24078
e44586d9c207 webcommands: move help import into help command handler
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24077
diff changeset
  1280
    from mercurial import 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
  1281
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1282
    topicname = req.form.get('node', [None])[0]
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1283
    if not topicname:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1284
        def topics(**map):
22199
b3e51675f98e cleanup: avoid _ for local unused tmp variables - that is reserved for i18n
Mads Kiilerich <madski@unity3d.com>
parents: 21123
diff changeset
  1285
            for entries, summary, _doc in helpmod.helptable:
17322
7124f984dc8d help: use the first topic name from helptable, not the longest alias
Mads Kiilerich <mads@kiilerich.com>
parents: 17318
diff changeset
  1286
                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
  1287
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1288
        early, other = [], []
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1289
        primary = lambda s: s.split('|')[0]
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1290
        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
  1291
            doc = _getdoc(e)
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1292
            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
  1293
                continue
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1294
            cmd = primary(c)
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1295
            if cmd.startswith('^'):
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1296
                early.append((cmd[1:], doc))
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1297
            else:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1298
                other.append((cmd, doc))
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1299
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1300
        early.sort()
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1301
        other.sort()
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1302
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1303
        def earlycommands(**map):
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1304
            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
  1305
                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
  1306
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1307
        def othercommands(**map):
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1308
            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
  1309
                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
  1310
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1311
        return tmpl('helptopics', topics=topics, earlycommands=earlycommands,
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1312
                    othercommands=othercommands, title='Index')
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1313
12696
ef969e58a394 hgweb: another fix for the help termwidth bug
Matt Mackall <mpm@selenic.com>
parents: 12692
diff changeset
  1314
    u = webutil.wsgiui()
17146
6b40cc67ceb4 hgweb: show help with verbose sections included
Adrian Buehlmann <adrian@cadifra.com>
parents: 16773
diff changeset
  1315
    u.verbose = True
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1316
    try:
18747
f5db3092790f hgweb: generate HTML documentation
Dan Villiom Podlaski Christiansen <danchr@gmail.com>
parents: 18645
diff changeset
  1317
        doc = helpmod.help_(u, topicname)
12666
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1318
    except error.UnknownCommand:
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1319
        raise ErrorResponse(HTTP_NOT_FOUND)
ead4e21f49f1 web: add a help view for getting hg help output
Augie Fackler <durin42@gmail.com>
parents: 12063
diff changeset
  1320
    return tmpl('help', topic=topicname, 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
  1321
64e3f97bdf08 i18n: extract doc string of each web commands as translatable one
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 24712
diff changeset
  1322
# 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
  1323
i18nfunctions = commands.values()