annotate mercurial/hgweb/webcommands.py @ 42648:d80edcb0b30c stable

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