Mercurial > hg
annotate mercurial/hgweb/webutil.py @ 39641:aa7e312375cf
wireprotov2: let clients drive delta behavior
Previously, the "manifestdata" and "filedata" commands assumed the
receiver had all parent revisions for requested nodes. Unless the
revision had no parents, they emitted a delta instead of a fulltext.
This strategy isn't appropriate for shallow clones and for clients
that only want to access fulltext revision data for a single node
without fetching their parent revisions.
This commit adds an "haveparents" argument to the "manifestdata"
and "filedata" commands that controls delta generation behavior.
Unless "haveparents" is set, the server assumes that the client
doesn't have parent revisions unless they were previously sent
as part of the current group of revisions.
This change allows the fulltext revision data of any individual
revision to be obtained. This will facilitate shallow clones
and other data retrieval strategies that don't require all previous
revisions of an entity to be fetched.
Differential Revision: https://phab.mercurial-scm.org/D4492
author | Gregory Szorc <gregory.szorc@gmail.com> |
---|---|
date | Thu, 30 Aug 2018 14:55:34 -0700 |
parents | 15e8250a82da |
children | 4f44f747f094 |
rev | line source |
---|---|
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
1 # hgweb/webutil.py - utility library for the web interface. |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
2 # |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net> |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com> |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
5 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
7717
diff
changeset
|
6 # This software may be used and distributed according to the terms of the |
10263 | 7 # GNU General Public License version 2 or any later version. |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
8 |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
9 from __future__ import absolute_import |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
10 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
11 import copy |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
12 import difflib |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
13 import os |
26162
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
14 import re |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
15 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
16 from ..i18n import _ |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
17 from ..node import hex, nullid, short |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
18 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
19 from .common import ( |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
20 ErrorResponse, |
31665
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
21 HTTP_BAD_REQUEST, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
22 HTTP_NOT_FOUND, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
23 paritygen, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
24 ) |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
25 |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
26 from .. import ( |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
27 context, |
38588
1c93e0237a24
diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents:
38585
diff
changeset
|
28 diffutil, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
29 error, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
30 match, |
31808
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31727
diff
changeset
|
31 mdiff, |
36955
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
32 obsutil, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
33 patch, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
34 pathutil, |
34807
3caec3c032c8
webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
34403
diff
changeset
|
35 pycompat, |
37335
956260cbc564
hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37334
diff
changeset
|
36 scmutil, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
37 templatefilters, |
35485
1721ce06100a
hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
35454
diff
changeset
|
38 templatekw, |
37515
8a5ee6aa8870
hgweb: wrap {archives} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37514
diff
changeset
|
39 templateutil, |
27046
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
40 ui as uimod, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
41 util, |
37fcfe52c68c
hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents:
27023
diff
changeset
|
42 ) |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
43 |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37069
diff
changeset
|
44 from ..utils import ( |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37069
diff
changeset
|
45 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37069
diff
changeset
|
46 ) |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37069
diff
changeset
|
47 |
37511
356e61e82c2a
hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37503
diff
changeset
|
48 archivespecs = util.sortdict(( |
356e61e82c2a
hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37503
diff
changeset
|
49 ('zip', ('application/zip', 'zip', '.zip', None)), |
356e61e82c2a
hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37503
diff
changeset
|
50 ('gz', ('application/x-gzip', 'tgz', '.tar.gz', None)), |
356e61e82c2a
hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37503
diff
changeset
|
51 ('bz2', ('application/x-bzip2', 'tbz2', '.tar.bz2', None)), |
356e61e82c2a
hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37503
diff
changeset
|
52 )) |
356e61e82c2a
hgweb: move archivespecs to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37503
diff
changeset
|
53 |
37514
034a422aeaff
hgweb: forward archivelist() of hgweb to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37513
diff
changeset
|
54 def archivelist(ui, nodeid, url=None): |
38215
f715faeaceee
config: rename allow_archive to allow-archive
David Demelier <markand@malikania.fr>
parents:
38059
diff
changeset
|
55 allowed = ui.configlist('web', 'allow-archive', untrusted=True) |
37513
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
56 archives = [] |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
57 |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
58 for typ, spec in archivespecs.iteritems(): |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
59 if typ in allowed or ui.configbool('web', 'allow' + typ, |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
60 untrusted=True): |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
61 archives.append({ |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
62 'type': typ, |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
63 'extension': spec[2], |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
64 'node': nodeid, |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
65 'url': url, |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
66 }) |
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
67 |
37515
8a5ee6aa8870
hgweb: wrap {archives} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37514
diff
changeset
|
68 return templateutil.mappinglist(archives) |
37513
40a7c1dd2df9
hgweb: move archivelist() of hgwebdir to webutil
Yuya Nishihara <yuya@tcha.org>
parents:
37511
diff
changeset
|
69 |
6393
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
70 def up(p): |
36714
250f3168d907
hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents:
36711
diff
changeset
|
71 if p[0:1] != "/": |
6393
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
72 p = "/" + p |
36714
250f3168d907
hgweb: fix up trailing slash detection on Python 3
Augie Fackler <augie@google.com>
parents:
36711
diff
changeset
|
73 if p[-1:] == "/": |
6393
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
74 p = p[:-1] |
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
75 up = os.path.dirname(p) |
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
76 if up == "/": |
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
77 return "/" |
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
78 return up + "/" |
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
79 |
18391
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
80 def _navseq(step, firststep=None): |
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
81 if firststep: |
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
82 yield firststep |
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
83 if firststep >= 20 and firststep <= 40: |
18392
88a37b19dc0e
hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18391
diff
changeset
|
84 firststep = 50 |
88a37b19dc0e
hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18391
diff
changeset
|
85 yield firststep |
88a37b19dc0e
hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18391
diff
changeset
|
86 assert step > 0 |
88a37b19dc0e
hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18391
diff
changeset
|
87 assert firststep > 0 |
88a37b19dc0e
hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18391
diff
changeset
|
88 while step <= firststep: |
88a37b19dc0e
hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18391
diff
changeset
|
89 step *= 10 |
18390
28fa9443f751
hgweb: drop recursivity in _navseq
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18389
diff
changeset
|
90 while True: |
18391
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
91 yield 1 * step |
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
92 yield 3 * step |
833eb34e90e4
hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18390
diff
changeset
|
93 step *= 10 |
18389
82572533bc00
hgweb: move the `seq` function out of the revnavgen scope
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18388
diff
changeset
|
94 |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
95 class revnav(object): |
18320
60680d691a0b
hgweb: document the revnavgen function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17991
diff
changeset
|
96 |
18409
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
97 def __init__(self, repo): |
18404
1da84a6b136a
hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18403
diff
changeset
|
98 """Navigation generation object |
1da84a6b136a
hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18403
diff
changeset
|
99 |
18409
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
100 :repo: repo object we generate nav for |
18404
1da84a6b136a
hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18403
diff
changeset
|
101 """ |
18409
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
102 # used for hex generation |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
103 self._revlog = repo.changelog |
18404
1da84a6b136a
hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18403
diff
changeset
|
104 |
18406
20cf53932b6f
hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18405
diff
changeset
|
105 def __nonzero__(self): |
20cf53932b6f
hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18405
diff
changeset
|
106 """return True if any revision to navigate over""" |
19094
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
107 return self._first() is not None |
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
108 |
31476
413b44003462
py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31434
diff
changeset
|
109 __bool__ = __nonzero__ |
413b44003462
py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
31434
diff
changeset
|
110 |
19094
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
111 def _first(self): |
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
112 """return the minimum non-filtered changeset or None""" |
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
113 try: |
29216
ead25aa27a43
py3: convert to next() function
timeless <timeless@mozdev.org>
parents:
28709
diff
changeset
|
114 return next(iter(self._revlog)) |
19094
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
115 except StopIteration: |
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
116 return None |
18406
20cf53932b6f
hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18405
diff
changeset
|
117 |
18405
1eaf0d017b2c
hgweb: move hex creation into an object method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18404
diff
changeset
|
118 def hex(self, rev): |
18409
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
119 return hex(self._revlog.node(rev)) |
18405
1eaf0d017b2c
hgweb: move hex creation into an object method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18404
diff
changeset
|
120 |
18404
1da84a6b136a
hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18403
diff
changeset
|
121 def gen(self, pos, pagelen, limit): |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
122 """computes label and revision id for navigation link |
18320
60680d691a0b
hgweb: document the revnavgen function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17991
diff
changeset
|
123 |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
124 :pos: is the revision relative to which we generate navigation. |
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
125 :pagelen: the size of each navigation page |
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
126 :limit: how far shall we link |
6393
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
127 |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
128 The return is: |
37698
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
129 - a single element mappinglist |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
130 - containing a dictionary with a `before` and `after` key |
37697
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
131 - values are dictionaries with `label` and `node` keys |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
132 """ |
18406
20cf53932b6f
hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18405
diff
changeset
|
133 if not self: |
20cf53932b6f
hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18405
diff
changeset
|
134 # empty repo |
37698
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
135 return templateutil.mappinglist([ |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
136 {'before': templateutil.mappinglist([]), |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
137 'after': templateutil.mappinglist([])}, |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
138 ]) |
6393
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
139 |
18425
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
140 targets = [] |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
141 for f in _navseq(1, pagelen): |
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
142 if f > limit: |
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
143 break |
18425
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
144 targets.append(pos + f) |
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
145 targets.append(pos - f) |
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
146 targets.sort() |
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
147 |
19094
fc1b77db123f
hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
19093
diff
changeset
|
148 first = self._first() |
37697
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
149 navbefore = [{'label': '(%i)' % first, 'node': self.hex(first)}] |
18425
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
150 navafter = [] |
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
151 for rev in targets: |
18426
01638b51df44
hgweb: ignore filtered revision in revnav
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18425
diff
changeset
|
152 if rev not in self._revlog: |
01638b51df44
hgweb: ignore filtered revision in revnav
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18425
diff
changeset
|
153 continue |
18425
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
154 if pos < rev < limit: |
37697
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
155 navafter.append({'label': '+%d' % abs(rev - pos), |
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
156 'node': self.hex(rev)}) |
18425
6da1e979340a
hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18409
diff
changeset
|
157 if 0 < rev < pos: |
37697
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
158 navbefore.append({'label': '-%d' % abs(rev - pos), |
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
159 'node': self.hex(rev)}) |
10254
8d5de52431f2
hgweb: changenav: separate pages before and after the current position
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents:
9402
diff
changeset
|
160 |
37697
6fb50e912aa8
hgweb: make revnav.gen() simply build a list of mappings by one pass
Yuya Nishihara <yuya@tcha.org>
parents:
37696
diff
changeset
|
161 navafter.append({'label': 'tip', 'node': 'tip'}) |
18403
bfaee31a83d2
hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18392
diff
changeset
|
162 |
37698
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
163 # TODO: maybe this can be a scalar object supporting tomap() |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
164 return templateutil.mappinglist([ |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
165 {'before': templateutil.mappinglist(navbefore), |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
166 'after': templateutil.mappinglist(navafter)}, |
7738ae638b62
hgweb: wrap {changenav} and {nav} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37697
diff
changeset
|
167 ]) |
6393
894875eae49b
hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
6392
diff
changeset
|
168 |
18408
f332a64fef51
hgweb: introduction a filerevnav subclass
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18407
diff
changeset
|
169 class filerevnav(revnav): |
18409
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
170 |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
171 def __init__(self, repo, path): |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
172 """Navigation generation object |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
173 |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
174 :repo: repo object we generate nav for |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
175 :path: path of the file we generate nav for |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
176 """ |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
177 # used for iteration |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
178 self._changelog = repo.unfiltered().changelog |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
179 # used for hex generation |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
180 self._revlog = repo.file(path) |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
181 |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
182 def hex(self, rev): |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
183 return hex(self._changelog.node(self._revlog.linkrev(rev))) |
e3f5cef11d6a
hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
18408
diff
changeset
|
184 |
37699
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
185 # TODO: maybe this can be a wrapper class for changectx/filectx list, which |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
186 # yields {'ctx': ctx} |
37700
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
187 def _ctxsgen(context, ctxs): |
37699
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
188 for s in ctxs: |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
189 d = { |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
190 'node': s.hex(), |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
191 'rev': s.rev(), |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
192 'user': s.user(), |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
193 'date': s.date(), |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
194 'description': s.description(), |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
195 'branch': s.branch(), |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
196 } |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
197 if util.safehasattr(s, 'path'): |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
198 d['file'] = s.path() |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
199 yield d |
0e02eb838b96
hgweb: extract a generator function of _siblings class
Yuya Nishihara <yuya@tcha.org>
parents:
37698
diff
changeset
|
200 |
37700
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
201 def _siblings(siblings=None, hiderev=None): |
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
202 if siblings is None: |
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
203 siblings = [] |
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
204 siblings = [s for s in siblings if s.node() != nullid] |
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
205 if len(siblings) == 1 and siblings[0].rev() == hiderev: |
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
206 siblings = [] |
495fbeae63cc
hgweb: convert _siblings to a factory function of mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37699
diff
changeset
|
207 return templateutil.mappinggenerator(_ctxsgen, args=(siblings,)) |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
208 |
34390
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
209 def difffeatureopts(req, ui, section): |
38566
1770416de208
webutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
210 diffopts = diffutil.difffeatureopts(ui, untrusted=True, |
1770416de208
webutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
211 section=section, whitespace=True) |
34390
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
212 |
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
213 for k in ('ignorews', 'ignorewsamount', 'ignorewseol', 'ignoreblanklines'): |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
214 v = req.qsparams.get(k) |
34390
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
215 if v is not None: |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
37069
diff
changeset
|
216 v = stringutil.parsebool(v) |
34403
407ebe7a9b93
hgweb: use parsebool for parsing diff query string options
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34390
diff
changeset
|
217 setattr(diffopts, k, v if v is not None else True) |
34390
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
218 |
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
219 return diffopts |
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
220 |
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
221 def annotate(req, fctx, ui): |
f6492f482c60
hgweb: query string arguments to control whitespace for annotate
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34246
diff
changeset
|
222 diffopts = difffeatureopts(req, ui, 'annotate') |
37065
b235bde38a83
annotate: drop linenumber flag from fctx.annotate() (API)
Yuya Nishihara <yuya@tcha.org>
parents:
37019
diff
changeset
|
223 return fctx.annotate(follow=True, diffopts=diffopts) |
30081
dd0ff715a82c
hgweb: make fctx.annotate a separated function so it could be wrapped
Jun Wu <quark@fb.com>
parents:
29216
diff
changeset
|
224 |
7671
06cf09c822c4
hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7637
diff
changeset
|
225 def parents(ctx, hide=None): |
24136
46d6cdfce4bf
hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents:
23745
diff
changeset
|
226 if isinstance(ctx, context.basefilectx): |
46d6cdfce4bf
hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents:
23745
diff
changeset
|
227 introrev = ctx.introrev() |
46d6cdfce4bf
hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents:
23745
diff
changeset
|
228 if ctx.changectx().rev() != introrev: |
24340
567ae5365754
hgweb: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents:
24306
diff
changeset
|
229 return _siblings([ctx.repo()[introrev]], hide) |
7671
06cf09c822c4
hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7637
diff
changeset
|
230 return _siblings(ctx.parents(), hide) |
06cf09c822c4
hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7637
diff
changeset
|
231 |
06cf09c822c4
hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7637
diff
changeset
|
232 def children(ctx, hide=None): |
06cf09c822c4
hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7637
diff
changeset
|
233 return _siblings(ctx.children(), hide) |
06cf09c822c4
hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7637
diff
changeset
|
234 |
6434
62e0bb41e682
hgweb: minor improvements for new web style
Matt Mackall <mpm@selenic.com>
parents:
6413
diff
changeset
|
235 def renamelink(fctx): |
6437 | 236 r = fctx.renamed() |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
237 if r: |
37902
2095331ff926
hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37700
diff
changeset
|
238 return templateutil.mappinglist([{'file': r[0], 'node': hex(r[1])}]) |
2095331ff926
hgweb: wrap {rename} with mappinglist
Yuya Nishihara <yuya@tcha.org>
parents:
37700
diff
changeset
|
239 return templateutil.mappinglist([]) |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
240 |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
241 def nodetagsdict(repo, node): |
37903
450de9cb0b36
hgweb: wrap {tags} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37902
diff
changeset
|
242 return templateutil.hybridlist(repo.nodetags(node), name='name') |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
243 |
13596
270f57d35525
hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents:
12691
diff
changeset
|
244 def nodebookmarksdict(repo, node): |
37904
40a664bd06fa
hgweb: wrap {bookmarks} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37903
diff
changeset
|
245 return templateutil.hybridlist(repo.nodebookmarks(node), name='name') |
13596
270f57d35525
hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents:
12691
diff
changeset
|
246 |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
247 def nodebranchdict(repo, ctx): |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
248 branches = [] |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
249 branch = ctx.branch() |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
250 # If this is an empty repo, ctx.node() == nullid, |
16719
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
251 # ctx.branch() == 'default'. |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
252 try: |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
253 branchnode = repo.branchtip(branch) |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
254 except error.RepoLookupError: |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
255 branchnode = None |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
256 if branchnode == ctx.node(): |
37905
f5155bca5023
hgweb: wrap {branches} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37904
diff
changeset
|
257 branches.append(branch) |
f5155bca5023
hgweb: wrap {branches} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37904
diff
changeset
|
258 return templateutil.hybridlist(branches, name='name') |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
259 |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
260 def nodeinbranch(repo, ctx): |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
261 branches = [] |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
262 branch = ctx.branch() |
16719
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
263 try: |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
264 branchnode = repo.branchtip(branch) |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
265 except error.RepoLookupError: |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
266 branchnode = None |
e7bf09acd410
localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents:
16308
diff
changeset
|
267 if branch != 'default' and branchnode != ctx.node(): |
37906
a5d16f23a2c9
hgweb: wrap {inbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37905
diff
changeset
|
268 branches.append(branch) |
a5d16f23a2c9
hgweb: wrap {inbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37905
diff
changeset
|
269 return templateutil.hybridlist(branches, name='name') |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
270 |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
271 def nodebranchnodefault(ctx): |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
272 branches = [] |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
273 branch = ctx.branch() |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
274 if branch != 'default': |
37907
3b3d818bde8b
hgweb: wrap {branch} and {changesetbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37906
diff
changeset
|
275 branches.append(branch) |
3b3d818bde8b
hgweb: wrap {branch} and {changesetbranch} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37906
diff
changeset
|
276 return templateutil.hybridlist(branches, name='name') |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
277 |
37911
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
278 def _nodenamesgen(context, f, node, name): |
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
279 for t in f(node): |
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
280 yield {name: t} |
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
281 |
37912
16c7a6ac8f94
hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents:
37911
diff
changeset
|
282 def showtag(repo, t1, node=nullid): |
37911
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
283 args = (repo.nodetags, node, 'tag') |
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
284 return templateutil.mappinggenerator(_nodenamesgen, args=args, name=t1) |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
285 |
37912
16c7a6ac8f94
hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents:
37911
diff
changeset
|
286 def showbookmark(repo, t1, node=nullid): |
37911
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
287 args = (repo.nodebookmarks, node, 'bookmark') |
26aed0d561e8
hgweb: wrap {changelogtag}, {changesettag}, and {changesetbookmark}
Yuya Nishihara <yuya@tcha.org>
parents:
37910
diff
changeset
|
288 return templateutil.mappinggenerator(_nodenamesgen, args=args, name=t1) |
13596
270f57d35525
hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents:
12691
diff
changeset
|
289 |
26129
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
290 def branchentries(repo, stripecount, limit=0): |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
291 tips = [] |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
292 heads = repo.heads() |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
293 parity = paritygen(stripecount) |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
294 sortkey = lambda item: (not item[1], item[0].rev()) |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
295 |
37913
89db78126f7f
hgweb: wrap {branches} and {entries} of branches with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37912
diff
changeset
|
296 def entries(context): |
26129
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
297 count = 0 |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
298 if not tips: |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
299 for tag, hs, tip, closed in repo.branchmap().iterbranches(): |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
300 tips.append((repo[tip], closed)) |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
301 for ctx, closed in sorted(tips, key=sortkey, reverse=True): |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
302 if limit > 0 and count >= limit: |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
303 return |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
304 count += 1 |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
305 if closed: |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
306 status = 'closed' |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
307 elif ctx.node() not in heads: |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
308 status = 'inactive' |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
309 else: |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
310 status = 'open' |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
311 yield { |
29216
ead25aa27a43
py3: convert to next() function
timeless <timeless@mozdev.org>
parents:
28709
diff
changeset
|
312 'parity': next(parity), |
26129
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
313 'branch': ctx.branch(), |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
314 'status': status, |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
315 'node': ctx.hex(), |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
316 'date': ctx.date() |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
317 } |
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
318 |
37913
89db78126f7f
hgweb: wrap {branches} and {entries} of branches with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37912
diff
changeset
|
319 return templateutil.mappinggenerator(entries) |
26129
a103ecb8a04a
hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents:
25999
diff
changeset
|
320 |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
321 def cleanpath(repo, path): |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
322 path = path.lstrip('/') |
39471
15e8250a82da
hgweb: do not audit URL path as working-directory path
Yuya Nishihara <yuya@tcha.org>
parents:
38929
diff
changeset
|
323 auditor = pathutil.pathauditor(repo.root, realfs=False) |
15e8250a82da
hgweb: do not audit URL path as working-directory path
Yuya Nishihara <yuya@tcha.org>
parents:
38929
diff
changeset
|
324 return pathutil.canonpath(repo.root, '', path, auditor=auditor) |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
325 |
25999
1c75249e159b
style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents:
25778
diff
changeset
|
326 def changectx(repo, req): |
17991
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
327 changeid = "tip" |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
328 if 'node' in req.qsparams: |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
329 changeid = req.qsparams['node'] |
25999
1c75249e159b
style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents:
25778
diff
changeset
|
330 ipos = changeid.find(':') |
17991
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
331 if ipos != -1: |
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
332 changeid = changeid[(ipos + 1):] |
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
333 |
37335
956260cbc564
hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37334
diff
changeset
|
334 return scmutil.revsymbol(repo, changeid) |
17991
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
335 |
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
336 def basechangectx(repo, req): |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
337 if 'node' in req.qsparams: |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
338 changeid = req.qsparams['node'] |
25999
1c75249e159b
style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents:
25778
diff
changeset
|
339 ipos = changeid.find(':') |
17991
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
340 if ipos != -1: |
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
341 changeid = changeid[:ipos] |
37335
956260cbc564
hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37334
diff
changeset
|
342 return scmutil.revsymbol(repo, changeid) |
17991
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
343 |
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
344 return None |
d605a82cf189
hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents:
17302
diff
changeset
|
345 |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
346 def filectx(repo, req): |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
347 if 'file' not in req.qsparams: |
17289
f2d6b4f8e78c
hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
17202
diff
changeset
|
348 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given') |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
349 path = cleanpath(repo, req.qsparams['file']) |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
350 if 'node' in req.qsparams: |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
351 changeid = req.qsparams['node'] |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
352 elif 'filenode' in req.qsparams: |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
353 changeid = req.qsparams['filenode'] |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
354 else: |
17289
f2d6b4f8e78c
hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents:
17202
diff
changeset
|
355 raise ErrorResponse(HTTP_NOT_FOUND, 'node or filenode not given') |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
356 try: |
37335
956260cbc564
hgweb: use revsymbol() for creating context from changeid
Martin von Zweigbergk <martinvonz@google.com>
parents:
37334
diff
changeset
|
357 fctx = scmutil.revsymbol(repo, changeid)[path] |
7637 | 358 except error.RepoError: |
6392
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
359 fctx = repo.filectx(path, fileid=changeid) |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
360 |
2540521dc7c1
hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff
changeset
|
361 return fctx |
7310
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
362 |
31665
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
363 def linerange(req): |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
364 linerange = req.qsparams.getall('linerange') |
36865
3d60a22e27f5
hgweb: perform all parameter lookup via qsparams
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36863
diff
changeset
|
365 if not linerange: |
31665
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
366 return None |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
367 if len(linerange) > 1: |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
368 raise ErrorResponse(HTTP_BAD_REQUEST, |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
369 'redundant linerange parameter') |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
370 try: |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
371 fromline, toline = map(int, linerange[0].split(':', 1)) |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
372 except ValueError: |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
373 raise ErrorResponse(HTTP_BAD_REQUEST, |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
374 'invalid linerange parameter') |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
375 try: |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
376 return util.processlinerange(fromline, toline) |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
377 except error.ParseError as exc: |
36258
af0a19d8812b
py3: get bytes-repr of network errors portably
Augie Fackler <augie@google.com>
parents:
36183
diff
changeset
|
378 raise ErrorResponse(HTTP_BAD_REQUEST, pycompat.bytestr(exc)) |
31665
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
379 |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
380 def formatlinerange(fromline, toline): |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
381 return '%d:%d' % (fromline + 1, toline) |
5e6d44511317
hgweb: handle a "linerange" request parameter in filelog command
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31660
diff
changeset
|
382 |
37914
10d3dc8123c5
hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37913
diff
changeset
|
383 def _succsandmarkersgen(context, mapping): |
36594
59ee648870a7
templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents:
36518
diff
changeset
|
384 repo = context.resource(mapping, 'repo') |
37503
49a8c2cc7978
templatekw: fix return type of {succsandmarkers} (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
37335
diff
changeset
|
385 itemmappings = templatekw.showsuccsandmarkers(context, mapping) |
49a8c2cc7978
templatekw: fix return type of {succsandmarkers} (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
37335
diff
changeset
|
386 for item in itemmappings.tovalue(context, mapping): |
35486
4c7ae95e1c71
hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
35485
diff
changeset
|
387 item['successors'] = _siblings(repo[successor] |
4c7ae95e1c71
hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
35485
diff
changeset
|
388 for successor in item['successors']) |
4c7ae95e1c71
hgweb: link to successors of obsoleted changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
35485
diff
changeset
|
389 yield item |
35485
1721ce06100a
hgweb: display fate of obsolete changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
35454
diff
changeset
|
390 |
37914
10d3dc8123c5
hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37913
diff
changeset
|
391 def succsandmarkers(context, mapping): |
10d3dc8123c5
hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37913
diff
changeset
|
392 return templateutil.mappinggenerator(_succsandmarkersgen, args=(mapping,)) |
10d3dc8123c5
hgweb: wrap {succsandmarkers} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37913
diff
changeset
|
393 |
36594
59ee648870a7
templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents:
36518
diff
changeset
|
394 # teach templater succsandmarkers is switched to (context, mapping) API |
37069
724f2e21d870
templatekw: stop using _showlist() which is about to be deprecated
Yuya Nishihara <yuya@tcha.org>
parents:
37065
diff
changeset
|
395 succsandmarkers._requires = {'repo', 'ctx'} |
36594
59ee648870a7
templatekw: switch obsfate-related template keywords to new API
Yuya Nishihara <yuya@tcha.org>
parents:
36518
diff
changeset
|
396 |
37915
3dc4045db164
hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37914
diff
changeset
|
397 def _whyunstablegen(context, mapping): |
36955
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
398 repo = context.resource(mapping, 'repo') |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
399 ctx = context.resource(mapping, 'ctx') |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
400 |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
401 entries = obsutil.whyunstable(repo, ctx) |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
402 for entry in entries: |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
403 if entry.get('divergentnodes'): |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
404 entry['divergentnodes'] = _siblings(entry['divergentnodes']) |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
405 yield entry |
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
406 |
37915
3dc4045db164
hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37914
diff
changeset
|
407 def whyunstable(context, mapping): |
3dc4045db164
hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37914
diff
changeset
|
408 return templateutil.mappinggenerator(_whyunstablegen, args=(mapping,)) |
3dc4045db164
hgweb: wrap {whyunstable} with mappinggenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37914
diff
changeset
|
409 |
37069
724f2e21d870
templatekw: stop using _showlist() which is about to be deprecated
Yuya Nishihara <yuya@tcha.org>
parents:
37065
diff
changeset
|
410 whyunstable._requires = {'repo', 'ctx'} |
36955
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
411 |
38929
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
412 # helper to mark a function as a new-style template keyword; can be removed |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
413 # once old-style function gets unsupported and new-style becomes the default |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
414 def _kwfunc(f): |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
415 f._requires = () |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
416 return f |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
417 |
27294
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
418 def commonentry(repo, ctx): |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
419 node = ctx.node() |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
420 return { |
36518
7937850a523d
hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents:
36434
diff
changeset
|
421 # TODO: perhaps ctx.changectx() should be assigned if ctx is a |
7937850a523d
hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents:
36434
diff
changeset
|
422 # filectx, but I'm not pretty sure if that would always work because |
7937850a523d
hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents:
36434
diff
changeset
|
423 # fctx.parents() != fctx.changectx.parents() for example. |
7937850a523d
hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents:
36434
diff
changeset
|
424 'ctx': ctx, |
27294
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
425 'rev': ctx.rev(), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
426 'node': hex(node), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
427 'author': ctx.user(), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
428 'desc': ctx.description(), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
429 'date': ctx.date(), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
430 'extra': ctx.extra(), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
431 'phase': ctx.phasestr(), |
35088
a9454beb9dd8
context: add obsolete() method to basefilectx
Anton Shestakov <av6@dwimlabs.net>
parents:
34855
diff
changeset
|
432 'obsolete': ctx.obsolete(), |
36518
7937850a523d
hgweb: make templater mostly compatible with log templates
Yuya Nishihara <yuya@tcha.org>
parents:
36434
diff
changeset
|
433 'succsandmarkers': succsandmarkers, |
37916
34f259a1c153
hgweb: wrap {instabilities} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37915
diff
changeset
|
434 'instabilities': templateutil.hybridlist(ctx.instabilities(), |
34f259a1c153
hgweb: wrap {instabilities} by hybridlist()
Yuya Nishihara <yuya@tcha.org>
parents:
37915
diff
changeset
|
435 name='instability'), |
36955
f21798a6bc20
hgweb: explain instabilities of unstable changesets
Anton Shestakov <av6@dwimlabs.net>
parents:
36886
diff
changeset
|
436 'whyunstable': whyunstable, |
27294
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
437 'branch': nodebranchnodefault(ctx), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
438 'inbranch': nodeinbranch(repo, ctx), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
439 'branches': nodebranchdict(repo, ctx), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
440 'tags': nodetagsdict(repo, node), |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
441 'bookmarks': nodebookmarksdict(repo, node), |
38929
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
442 'parent': _kwfunc(lambda context, mapping: parents(ctx)), |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
443 'child': _kwfunc(lambda context, mapping: children(ctx)), |
27294
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
444 } |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
445 |
36885
c68e79dcf21c
hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36865
diff
changeset
|
446 def changelistentry(web, ctx): |
23745
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
447 '''Obtain a dictionary to be used for entries in a changelist. |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
448 |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
449 This function is called when producing items for the "entries" list passed |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
450 to the "shortlog" and "changelog" templates. |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
451 ''' |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
452 repo = web.repo |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
453 rev = ctx.rev() |
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
454 n = ctx.node() |
37912
16c7a6ac8f94
hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents:
37911
diff
changeset
|
455 showtags = showtag(repo, 'changelogtag', n) |
37954
9482498b96b0
hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37953
diff
changeset
|
456 files = listfilediffs(ctx.files(), n, web.maxfiles) |
23745
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
457 |
27294
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
458 entry = commonentry(repo, ctx) |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
459 entry.update( |
38929
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
460 allparents=_kwfunc(lambda context, mapping: parents(ctx)), |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
461 parent=_kwfunc(lambda context, mapping: parents(ctx, rev - 1)), |
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
462 child=_kwfunc(lambda context, mapping: children(ctx, rev + 1)), |
27294
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
463 changelogtag=showtags, |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
464 files=files, |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
465 ) |
5aa2afb4f81a
hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents:
27046
diff
changeset
|
466 return entry |
23745
513d47905114
hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
21122
diff
changeset
|
467 |
38043
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
468 def changelistentries(web, revs, maxcount, parityfn): |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
469 """Emit up to N records for an iterable of revisions.""" |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
470 repo = web.repo |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
471 |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
472 count = 0 |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
473 for rev in revs: |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
474 if count >= maxcount: |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
475 break |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
476 |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
477 count += 1 |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
478 |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
479 entry = changelistentry(web, repo[rev]) |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
480 entry['parity'] = next(parityfn) |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
481 |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
482 yield entry |
5989261a8356
hgweb: extract code for emitting multiple changelist records
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37993
diff
changeset
|
483 |
25602
85fb416f2fa7
hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents:
25278
diff
changeset
|
484 def symrevorshortnode(req, ctx): |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
485 if 'node' in req.qsparams: |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
486 return templatefilters.revescape(req.qsparams['node']) |
25602
85fb416f2fa7
hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents:
25278
diff
changeset
|
487 else: |
85fb416f2fa7
hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents:
25278
diff
changeset
|
488 return short(ctx.node()) |
85fb416f2fa7
hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents:
25278
diff
changeset
|
489 |
37951
c4313a9fde7b
hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37950
diff
changeset
|
490 def _listfilesgen(context, ctx, stripecount): |
37949
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
491 parity = paritygen(stripecount) |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
492 for blockno, f in enumerate(ctx.files()): |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
493 template = 'filenodelink' if f in ctx else 'filenolink' |
37951
c4313a9fde7b
hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37950
diff
changeset
|
494 yield context.process(template, { |
37949
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
495 'node': ctx.hex(), |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
496 'file': f, |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
497 'blockno': blockno + 1, |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
498 'parity': next(parity), |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
499 }) |
1129e444fd6c
hgweb: extract generator of {files} from changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37916
diff
changeset
|
500 |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
501 def changesetentry(web, ctx): |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
502 '''Obtain a dictionary to be used to render the "changeset" template.''' |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
503 |
37912
16c7a6ac8f94
hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents:
37911
diff
changeset
|
504 showtags = showtag(web.repo, 'changesettag', ctx.node()) |
16c7a6ac8f94
hgweb: drop tmpl argument from webutil.showtag() and showbookmark()
Yuya Nishihara <yuya@tcha.org>
parents:
37911
diff
changeset
|
505 showbookmarks = showbookmark(web.repo, 'changesetbookmark', ctx.node()) |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
506 showbranch = nodebranchnodefault(ctx) |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
507 |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
508 basectx = basechangectx(web.repo, web.req) |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
509 if basectx is None: |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
510 basectx = ctx.p1() |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
511 |
34246
db63872e10cc
configitems: register the 'web.style' config
Boris Feld <boris.feld@octobus.net>
parents:
31808
diff
changeset
|
512 style = web.config('web', 'style') |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
513 if 'style' in web.req.qsparams: |
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
514 style = web.req.qsparams['style'] |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
515 |
36885
c68e79dcf21c
hgweb: don't redundantly pass templater with requestcontext (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36865
diff
changeset
|
516 diff = diffs(web, ctx, basectx, None, style) |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
517 |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
518 parity = paritygen(web.stripecount) |
38585
66eb74f9d87d
hgweb: pass ui to diffstatgen() explicitly
Yuya Nishihara <yuya@tcha.org>
parents:
38566
diff
changeset
|
519 diffstatsgen = diffstatgen(web.repo.ui, ctx, basectx) |
38059
4c3ab15f3532
hgweb: drop unused argument 'tmpl' from webutil.diffstat()
Yuya Nishihara <yuya@tcha.org>
parents:
38058
diff
changeset
|
520 diffstats = diffstat(ctx, diffstatsgen, parity) |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
521 |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
522 return dict( |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
523 diff=diff, |
36886
563fd95a6efb
hgweb: pass modern request type into various webutil functions (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
36885
diff
changeset
|
524 symrev=symrevorshortnode(web.req, ctx), |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
525 basenode=basectx.hex(), |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
526 changesettag=showtags, |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
527 changesetbookmark=showbookmarks, |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
528 changesetbranch=showbranch, |
37950
790ca0c11fd4
hgweb: wrap {files} of changesetentry() with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37949
diff
changeset
|
529 files=templateutil.mappedgenerator(_listfilesgen, |
37951
c4313a9fde7b
hgweb: use template context to render {files} of changesetentry()
Yuya Nishihara <yuya@tcha.org>
parents:
37950
diff
changeset
|
530 args=(ctx, web.stripecount)), |
38929
d7e6e109eaae
hgweb: mark all lambda template keywords as new-style function
Yuya Nishihara <yuya@tcha.org>
parents:
38783
diff
changeset
|
531 diffsummary=_kwfunc(lambda context, mapping: diffsummary(diffstatsgen)), |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
532 diffstat=diffstats, |
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
533 archives=web.archivelist(ctx.hex()), |
36434
1fb9e01328e4
py3: use pycompat.strkwargs to convert kwargs keys to str
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36258
diff
changeset
|
534 **pycompat.strkwargs(commonentry(web.repo, ctx))) |
24177
f53b7174facf
hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
24136
diff
changeset
|
535 |
37953
4237d07fad2c
hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents:
37952
diff
changeset
|
536 def _listfilediffsgen(context, files, node, max): |
7311
de9c87fe1620
hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7310
diff
changeset
|
537 for f in files[:max]: |
37953
4237d07fad2c
hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents:
37952
diff
changeset
|
538 yield context.process('filedifflink', {'node': hex(node), 'file': f}) |
7311
de9c87fe1620
hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7310
diff
changeset
|
539 if len(files) > max: |
37953
4237d07fad2c
hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents:
37952
diff
changeset
|
540 yield context.process('fileellipses', {}) |
7311
de9c87fe1620
hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7310
diff
changeset
|
541 |
37954
9482498b96b0
hgweb: remove unused argument 'tmpl' from listfilediffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37953
diff
changeset
|
542 def listfilediffs(files, node, max): |
37952
028d7c24f2e5
hgweb: wrap {files} of changelist entries with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37951
diff
changeset
|
543 return templateutil.mappedgenerator(_listfilediffsgen, |
37953
4237d07fad2c
hgweb: use template context to render {files} of changelist entries
Yuya Nishihara <yuya@tcha.org>
parents:
37952
diff
changeset
|
544 args=(files, node, max)) |
37952
028d7c24f2e5
hgweb: wrap {files} of changelist entries with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37951
diff
changeset
|
545 |
37986
7a9e9fbaa559
hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents:
37985
diff
changeset
|
546 def _prettyprintdifflines(context, lines, blockno, lineidprefix): |
37984
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
547 for lineno, l in enumerate(lines, 1): |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
548 difflineno = "%d.%d" % (blockno, lineno) |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
549 if l.startswith('+'): |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
550 ltype = "difflineplus" |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
551 elif l.startswith('-'): |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
552 ltype = "difflineminus" |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
553 elif l.startswith('@'): |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
554 ltype = "difflineat" |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
555 else: |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
556 ltype = "diffline" |
37986
7a9e9fbaa559
hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents:
37985
diff
changeset
|
557 yield context.process(ltype, { |
37984
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
558 'line': l, |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
559 'lineno': lineno, |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
560 'lineid': lineidprefix + "l%s" % difflineno, |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
561 'linenumber': "% 8s" % difflineno, |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
562 }) |
3f70466ec7aa
hgweb: move prettyprintlines() closure out of diffs()
Yuya Nishihara <yuya@tcha.org>
parents:
37954
diff
changeset
|
563 |
37987
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
564 def _diffsgen(context, repo, ctx, basectx, files, style, stripecount, |
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
565 linerange, lineidprefix): |
7310
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
566 if files: |
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
567 m = match.exact(repo.root, repo.getcwd(), files) |
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
568 else: |
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
569 m = match.always(repo.root, repo.getcwd()) |
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
570 |
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
571 diffopts = patch.diffopts(repo.ui, untrusted=True) |
31082
abb92b3d370e
hgweb: explictly pass basectx in webutil.diffs
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
30375
diff
changeset
|
572 node1 = basectx.node() |
7310
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
573 node2 = ctx.node() |
37987
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
574 parity = paritygen(stripecount) |
7310
bd522d09d5e3
hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7294
diff
changeset
|
575 |
31276
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
576 diffhunks = patch.diffhunks(repo, node1, node2, m, opts=diffopts) |
34855
35c6a54ec1ff
diff: also yield file context objects in patch.trydiff() (API)
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
34807
diff
changeset
|
577 for blockno, (fctx1, fctx2, header, hunks) in enumerate(diffhunks, 1): |
31276
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
578 if style != 'raw': |
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
579 header = header[1:] |
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
580 lines = [h + '\n' for h in header] |
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
581 for hunkrange, hunklines in hunks: |
31666
aaebc80c9f1d
hgweb: add a 'linerange' parameter to webutil.diffs()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31665
diff
changeset
|
582 if linerange is not None and hunkrange is not None: |
aaebc80c9f1d
hgweb: add a 'linerange' parameter to webutil.diffs()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31665
diff
changeset
|
583 s1, l1, s2, l2 = hunkrange |
31808
ca3b4a2b7e54
mdiff: add a hunkinrange helper function
Denis Laxalde <denis@laxalde.org>
parents:
31727
diff
changeset
|
584 if not mdiff.hunkinrange((s2, l2), linerange): |
31666
aaebc80c9f1d
hgweb: add a 'linerange' parameter to webutil.diffs()
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31665
diff
changeset
|
585 continue |
31276
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
586 lines.extend(hunklines) |
cd29673cebdb
hgweb: use patch.diffhunks in webutil.diffs to simplify the algorithm
Denis Laxalde <denis.laxalde@logilab.fr>
parents:
31275
diff
changeset
|
587 if lines: |
37985
6a4de2dc78dd
hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37984
diff
changeset
|
588 l = templateutil.mappedgenerator(_prettyprintdifflines, |
37986
7a9e9fbaa559
hgweb: use template context to render {lines} of {diff}
Yuya Nishihara <yuya@tcha.org>
parents:
37985
diff
changeset
|
589 args=(lines, blockno, |
37985
6a4de2dc78dd
hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37984
diff
changeset
|
590 lineidprefix)) |
37987
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
591 yield { |
37019
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
592 'parity': next(parity), |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
593 'blockno': blockno, |
37985
6a4de2dc78dd
hgweb: wrap {lines} of {diff} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
37984
diff
changeset
|
594 'lines': l, |
37987
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
595 } |
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
596 |
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
597 def diffs(web, ctx, basectx, files, style, linerange=None, lineidprefix=''): |
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
598 args = (web.repo, ctx, basectx, files, style, web.stripecount, |
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
599 linerange, lineidprefix) |
8cc23a46df37
hgweb: convert {diff} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37986
diff
changeset
|
600 return templateutil.mappinggenerator(_diffsgen, args=args, name='diffblock') |
7345
55651328dfcc
hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7311
diff
changeset
|
601 |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
602 def _compline(type, leftlineno, leftline, rightlineno, rightline): |
37988
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
603 lineid = leftlineno and ("l%d" % leftlineno) or '' |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
604 lineid += rightlineno and ("r%d" % rightlineno) or '' |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
605 llno = '%d' % leftlineno if leftlineno else '' |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
606 rlno = '%d' % rightlineno if rightlineno else '' |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
607 return { |
37988
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
608 'type': type, |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
609 'lineid': lineid, |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
610 'leftlineno': leftlineno, |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
611 'leftlinenumber': "% 6s" % llno, |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
612 'leftline': leftline or '', |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
613 'rightlineno': rightlineno, |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
614 'rightlinenumber': "% 6s" % rlno, |
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
615 'rightline': rightline or '', |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
616 } |
37988
406f945c5814
hgweb: move compline() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37987
diff
changeset
|
617 |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
618 def _getcompblockgen(context, leftlines, rightlines, opcodes): |
37989
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
619 for type, llo, lhi, rlo, rhi in opcodes: |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
620 len1 = lhi - llo |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
621 len2 = rhi - rlo |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
622 count = min(len1, len2) |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38588
diff
changeset
|
623 for i in pycompat.xrange(count): |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
624 yield _compline(type=type, |
37989
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
625 leftlineno=llo + i + 1, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
626 leftline=leftlines[llo + i], |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
627 rightlineno=rlo + i + 1, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
628 rightline=rightlines[rlo + i]) |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
629 if len1 > len2: |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38588
diff
changeset
|
630 for i in pycompat.xrange(llo + count, lhi): |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
631 yield _compline(type=type, |
37989
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
632 leftlineno=i + 1, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
633 leftline=leftlines[i], |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
634 rightlineno=None, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
635 rightline=None) |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
636 elif len2 > len1: |
38783
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
38588
diff
changeset
|
637 for i in pycompat.xrange(rlo + count, rhi): |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
638 yield _compline(type=type, |
37989
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
639 leftlineno=None, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
640 leftline=None, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
641 rightlineno=i + 1, |
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
642 rightline=rightlines[i]) |
17202
1ae119269ddc
hgweb: side-by-side comparison functionality
wujek srujek
parents:
16719
diff
changeset
|
643 |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
644 def _getcompblock(leftlines, rightlines, opcodes): |
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
645 args = (leftlines, rightlines, opcodes) |
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
646 return templateutil.mappinggenerator(_getcompblockgen, args=args, |
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
647 name='comparisonline') |
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
648 |
37992
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
649 def _comparegen(context, contextnum, leftlines, rightlines): |
37989
53b0a51aed72
hgweb: move getblock() closure out of compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37988
diff
changeset
|
650 '''Generator function that provides side-by-side comparison data.''' |
17202
1ae119269ddc
hgweb: side-by-side comparison functionality
wujek srujek
parents:
16719
diff
changeset
|
651 s = difflib.SequenceMatcher(None, leftlines, rightlines) |
37991
4e407c7b1fbd
hgweb: rename 'context' argument of webutil.compare() to avoid name conflicts
Yuya Nishihara <yuya@tcha.org>
parents:
37990
diff
changeset
|
652 if contextnum < 0: |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
653 l = _getcompblock(leftlines, rightlines, s.get_opcodes()) |
37992
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
654 yield {'lines': l} |
17202
1ae119269ddc
hgweb: side-by-side comparison functionality
wujek srujek
parents:
16719
diff
changeset
|
655 else: |
37991
4e407c7b1fbd
hgweb: rename 'context' argument of webutil.compare() to avoid name conflicts
Yuya Nishihara <yuya@tcha.org>
parents:
37990
diff
changeset
|
656 for oc in s.get_grouped_opcodes(n=contextnum): |
37990
c0ccbf4fbe47
hgweb: convert comparison {lines} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37989
diff
changeset
|
657 l = _getcompblock(leftlines, rightlines, oc) |
37992
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
658 yield {'lines': l} |
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
659 |
37993
623dc2651d26
hgweb: drop unused argument 'tmpl' from webutil.compare()
Yuya Nishihara <yuya@tcha.org>
parents:
37992
diff
changeset
|
660 def compare(contextnum, leftlines, rightlines): |
37992
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
661 args = (contextnum, leftlines, rightlines) |
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
662 return templateutil.mappinggenerator(_comparegen, args=args, |
b3992c21b7f3
hgweb: convert {comparison} to a mappinggenerator with named template
Yuya Nishihara <yuya@tcha.org>
parents:
37991
diff
changeset
|
663 name='comparisonblock') |
17202
1ae119269ddc
hgweb: side-by-side comparison functionality
wujek srujek
parents:
16719
diff
changeset
|
664 |
38585
66eb74f9d87d
hgweb: pass ui to diffstatgen() explicitly
Yuya Nishihara <yuya@tcha.org>
parents:
38566
diff
changeset
|
665 def diffstatgen(ui, ctx, basectx): |
14570
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
666 '''Generator function that provides the diffstat data.''' |
14490
1d3e2349304a
web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14055
diff
changeset
|
667 |
38585
66eb74f9d87d
hgweb: pass ui to diffstatgen() explicitly
Yuya Nishihara <yuya@tcha.org>
parents:
38566
diff
changeset
|
668 diffopts = patch.diffopts(ui, {'noprefix': False}) |
35429
0279c2267d00
hgweb: disable diff.noprefix option for diffstat
Yuya Nishihara <yuya@tcha.org>
parents:
34855
diff
changeset
|
669 stats = patch.diffstatdata( |
38566
1770416de208
webutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
670 util.iterlines(ctx.diff(basectx, opts=diffopts))) |
14490
1d3e2349304a
web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14055
diff
changeset
|
671 maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats) |
14570
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
672 while True: |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
673 yield stats, maxname, maxtotal, addtotal, removetotal, binary |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
674 |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
675 def diffsummary(statgen): |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
676 '''Return a short summary of the diff.''' |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
677 |
29216
ead25aa27a43
py3: convert to next() function
timeless <timeless@mozdev.org>
parents:
28709
diff
changeset
|
678 stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen) |
14570
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
679 return _(' %d files changed, %d insertions(+), %d deletions(-)\n') % ( |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
680 len(stats), addtotal, removetotal) |
9f908ef5a595
web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14562
diff
changeset
|
681 |
38058
6369e21e97ac
hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents:
38057
diff
changeset
|
682 def _diffstattmplgen(context, ctx, statgen, parity): |
29216
ead25aa27a43
py3: convert to next() function
timeless <timeless@mozdev.org>
parents:
28709
diff
changeset
|
683 stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen) |
14561
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
684 files = ctx.files() |
14490
1d3e2349304a
web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14055
diff
changeset
|
685 |
14561
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
686 def pct(i): |
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
687 if maxtotal == 0: |
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
688 return 0 |
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
689 return (float(i) / maxtotal) * 100 |
14490
1d3e2349304a
web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14055
diff
changeset
|
690 |
14562
fccd3b966da7
web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents:
14561
diff
changeset
|
691 fileno = 0 |
14561
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
692 for filename, adds, removes, isbinary in stats: |
35314
1fe3c8296cfe
hgweb: rewrite `template = A and B or C` to be a proper ternary operator
Anton Shestakov <av6@dwimlabs.net>
parents:
35131
diff
changeset
|
693 template = 'diffstatlink' if filename in files else 'diffstatnolink' |
14561
925d9f2b188b
web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents:
14490
diff
changeset
|
694 total = adds + removes |
14562
fccd3b966da7
web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents:
14561
diff
changeset
|
695 fileno += 1 |
38058
6369e21e97ac
hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents:
38057
diff
changeset
|
696 yield context.process(template, { |
37019
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
697 'node': ctx.hex(), |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
698 'file': filename, |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
699 'fileno': fileno, |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
700 'total': total, |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
701 'addpct': pct(adds), |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
702 'removepct': pct(removes), |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
703 'parity': next(parity), |
c97b936d8bb5
templater: use named function to expand template against mapping dict (API)
Yuya Nishihara <yuya@tcha.org>
parents:
36955
diff
changeset
|
704 }) |
14490
1d3e2349304a
web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents:
14055
diff
changeset
|
705 |
38059
4c3ab15f3532
hgweb: drop unused argument 'tmpl' from webutil.diffstat()
Yuya Nishihara <yuya@tcha.org>
parents:
38058
diff
changeset
|
706 def diffstat(ctx, statgen, parity): |
38057
f0ee627162f4
hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
38043
diff
changeset
|
707 '''Return a diffstat template for each file in the diff.''' |
38058
6369e21e97ac
hgweb: use template context to render {diffstat}
Yuya Nishihara <yuya@tcha.org>
parents:
38057
diff
changeset
|
708 args = (ctx, statgen, parity) |
38057
f0ee627162f4
hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
38043
diff
changeset
|
709 return templateutil.mappedgenerator(_diffstattmplgen, args=args) |
f0ee627162f4
hgweb: wrap {diffstat} with mappedgenerator
Yuya Nishihara <yuya@tcha.org>
parents:
38043
diff
changeset
|
710 |
37696
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
711 class sessionvars(templateutil.wrapped): |
7345
55651328dfcc
hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7311
diff
changeset
|
712 def __init__(self, vars, start='?'): |
37694
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
713 self._start = start |
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
714 self._vars = vars |
37695
570a4426c5b8
hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents:
37694
diff
changeset
|
715 |
7345
55651328dfcc
hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7311
diff
changeset
|
716 def __getitem__(self, key): |
37694
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
717 return self._vars[key] |
37695
570a4426c5b8
hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents:
37694
diff
changeset
|
718 |
7345
55651328dfcc
hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7311
diff
changeset
|
719 def __setitem__(self, key, value): |
37694
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
720 self._vars[key] = value |
37695
570a4426c5b8
hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents:
37694
diff
changeset
|
721 |
7345
55651328dfcc
hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7311
diff
changeset
|
722 def __copy__(self): |
37694
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
723 return sessionvars(copy.copy(self._vars), self._start) |
37695
570a4426c5b8
hgweb: make sessionvars class less dense
Yuya Nishihara <yuya@tcha.org>
parents:
37694
diff
changeset
|
724 |
38267
fb874fc1d9b4
templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38265
diff
changeset
|
725 def contains(self, context, mapping, item): |
fb874fc1d9b4
templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38265
diff
changeset
|
726 item = templateutil.unwrapvalue(context, mapping, item) |
fb874fc1d9b4
templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38265
diff
changeset
|
727 return item in self._vars |
fb874fc1d9b4
templater: abstract ifcontains() over wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38265
diff
changeset
|
728 |
38243
06d11cd90516
templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38215
diff
changeset
|
729 def getmember(self, context, mapping, key): |
38244
688fbb758ba9
templater: resolve type of dict key in getmember()
Yuya Nishihara <yuya@tcha.org>
parents:
38243
diff
changeset
|
730 key = templateutil.unwrapvalue(context, mapping, key) |
38243
06d11cd90516
templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38215
diff
changeset
|
731 return self._vars.get(key) |
06d11cd90516
templater: promote getmember() to an interface of wrapped types
Yuya Nishihara <yuya@tcha.org>
parents:
38215
diff
changeset
|
732 |
38265
41ae9b3cbfb9
templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents:
38244
diff
changeset
|
733 def getmin(self, context, mapping): |
41ae9b3cbfb9
templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents:
38244
diff
changeset
|
734 raise error.ParseError(_('not comparable')) |
41ae9b3cbfb9
templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents:
38244
diff
changeset
|
735 |
41ae9b3cbfb9
templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents:
38244
diff
changeset
|
736 def getmax(self, context, mapping): |
41ae9b3cbfb9
templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents:
38244
diff
changeset
|
737 raise error.ParseError(_('not comparable')) |
41ae9b3cbfb9
templater: abstract min/max away
Yuya Nishihara <yuya@tcha.org>
parents:
38244
diff
changeset
|
738 |
38448
dae829b4de78
templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents:
38289
diff
changeset
|
739 def filter(self, context, mapping, select): |
dae829b4de78
templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents:
38289
diff
changeset
|
740 # implement if necessary |
dae829b4de78
templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents:
38289
diff
changeset
|
741 raise error.ParseError(_('not filterable')) |
dae829b4de78
templater: introduce filter() function to remove empty items from list
Yuya Nishihara <yuya@tcha.org>
parents:
38289
diff
changeset
|
742 |
37696
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
743 def itermaps(self, context): |
37694
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
744 separator = self._start |
d14dbf46e5c7
hgweb: prefix private variables of sessionvars with '_'
Yuya Nishihara <yuya@tcha.org>
parents:
37515
diff
changeset
|
745 for key, value in sorted(self._vars.iteritems()): |
34807
3caec3c032c8
webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
34403
diff
changeset
|
746 yield {'name': key, |
3caec3c032c8
webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
34403
diff
changeset
|
747 'value': pycompat.bytestr(value), |
3caec3c032c8
webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
34403
diff
changeset
|
748 'separator': separator, |
3caec3c032c8
webutil: use pycompat.bytestr() instead of str()
Augie Fackler <augie@google.com>
parents:
34403
diff
changeset
|
749 } |
7345
55651328dfcc
hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
7311
diff
changeset
|
750 separator = '&' |
12691
1b1a9038a71a
hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents:
10282
diff
changeset
|
751 |
37696
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
752 def join(self, context, mapping, sep): |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
753 # could be '{separator}{name}={value|urlescape}' |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
754 raise error.ParseError(_('not displayable without template')) |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
755 |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
756 def show(self, context, mapping): |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
757 return self.join(context, '') |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
758 |
38289
f9c426385853
templater: abstract truth testing to fix {if(list_of_empty_strings)}
Yuya Nishihara <yuya@tcha.org>
parents:
38267
diff
changeset
|
759 def tobool(self, context, mapping): |
f9c426385853
templater: abstract truth testing to fix {if(list_of_empty_strings)}
Yuya Nishihara <yuya@tcha.org>
parents:
38267
diff
changeset
|
760 return bool(self._vars) |
f9c426385853
templater: abstract truth testing to fix {if(list_of_empty_strings)}
Yuya Nishihara <yuya@tcha.org>
parents:
38267
diff
changeset
|
761 |
37696
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
762 def tovalue(self, context, mapping): |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
763 return self._vars |
9ac3e97b299b
hgweb: lift {sessionvars} to a wrapped type
Yuya Nishihara <yuya@tcha.org>
parents:
37695
diff
changeset
|
764 |
27007
c8cbef073645
hgweb: alias ui module as uimod
Yuya Nishihara <yuya@tcha.org>
parents:
26894
diff
changeset
|
765 class wsgiui(uimod.ui): |
12691
1b1a9038a71a
hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents:
10282
diff
changeset
|
766 # default termwidth breaks under mod_wsgi |
1b1a9038a71a
hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents:
10282
diff
changeset
|
767 def termwidth(self): |
1b1a9038a71a
hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents:
10282
diff
changeset
|
768 return 80 |
26162
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
769 |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
770 def getwebsubs(repo): |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
771 websubtable = [] |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
772 websubdefs = repo.ui.configitems('websub') |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
773 # we must maintain interhg backwards compatibility |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
774 websubdefs += repo.ui.configitems('interhg') |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
775 for key, pattern in websubdefs: |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
776 # grab the delimiter from the character after the "s" |
36180
34e850440271
py3: slice over bytes to prevent getting ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35486
diff
changeset
|
777 unesc = pattern[1:2] |
38475
67dc32d4e790
cleanup: migrate from re.escape to stringutil.reescape
Augie Fackler <augie@google.com>
parents:
38448
diff
changeset
|
778 delim = stringutil.reescape(unesc) |
26162
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
779 |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
780 # identify portions of the pattern, taking care to avoid escaped |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
781 # delimiters. the replace format and flags are optional, but |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
782 # delimiters are required. |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
783 match = re.match( |
36183
44a519ec5077
py3: add b'' to make sure regex pattern are bytes in hgweb/webutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36180
diff
changeset
|
784 br'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$' |
26162
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
785 % (delim, delim, delim), pattern) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
786 if not match: |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
787 repo.ui.warn(_("websub: invalid pattern for %s: %s\n") |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
788 % (key, pattern)) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
789 continue |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
790 |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
791 # we need to unescape the delimiter for regexp and format |
36183
44a519ec5077
py3: add b'' to make sure regex pattern are bytes in hgweb/webutil.py
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36180
diff
changeset
|
792 delim_re = re.compile(br'(?<!\\)\\%s' % delim) |
26162
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
793 regexp = delim_re.sub(unesc, match.group(1)) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
794 format = delim_re.sub(unesc, match.group(2)) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
795 |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
796 # the pattern allows for 6 regexp flags, so set them if necessary |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
797 flagin = match.group(3) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
798 flags = 0 |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
799 if flagin: |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
800 for flag in flagin.upper(): |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
801 flags |= re.__dict__[flag] |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
802 |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
803 try: |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
804 regexp = re.compile(regexp, flags) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
805 websubtable.append((regexp, format)) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
806 except re.error: |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
807 repo.ui.warn(_("websub: invalid regexp for %s: %s\n") |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
808 % (key, regexp)) |
268b39770c28
hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents:
26129
diff
changeset
|
809 return websubtable |
37909
7fae76c2c564
hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents:
37907
diff
changeset
|
810 |
7fae76c2c564
hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents:
37907
diff
changeset
|
811 def getgraphnode(repo, ctx): |
7fae76c2c564
hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents:
37907
diff
changeset
|
812 return (templatekw.getgraphnodecurrent(repo, ctx) + |
7fae76c2c564
hgweb: reuse graph node-related functions from templates
Anton Shestakov <av6@dwimlabs.net>
parents:
37907
diff
changeset
|
813 templatekw.getgraphnodesymbol(ctx)) |