annotate mercurial/hgweb/webutil.py @ 29010:e868d8ee7c8f stable

bdiff: unify duplicate normalize loops We're about to make the while loop check more complicated, so let's simplify first.
author Matt Mackall <mpm@selenic.com>
date Thu, 21 Apr 2016 21:37:13 -0500
parents 94494031f659
children ead25aa27a43
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9402
diff changeset
7 # GNU General Public License version 2 or any later version.
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
8
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
9 from __future__ import absolute_import
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
10
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
11 import copy
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
12 import difflib
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
13 import os
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
14 import re
27046
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
15
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
16 from ..i18n import _
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
17 from ..node import hex, nullid, short
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
18
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
19 from .common import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
20 ErrorResponse,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
21 HTTP_NOT_FOUND,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
22 paritygen,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
23 )
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 from .. import (
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
26 context,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
27 error,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
28 match,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
29 patch,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
30 pathutil,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
31 templatefilters,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
32 ui as uimod,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
33 util,
37fcfe52c68c hgweb: use absolute_import
Yuya Nishihara <yuya@tcha.org>
parents: 27023
diff changeset
34 )
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
35
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
36 def up(p):
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
37 if p[0] != "/":
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
38 p = "/" + p
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
39 if p[-1] == "/":
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
40 p = p[:-1]
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
41 up = os.path.dirname(p)
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
42 if up == "/":
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
43 return "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
44 return up + "/"
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
45
18391
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
46 def _navseq(step, firststep=None):
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
47 if firststep:
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
48 yield firststep
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
49 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
50 firststep = 50
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
51 yield firststep
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
52 assert step > 0
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
53 assert firststep > 0
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
54 while step <= firststep:
88a37b19dc0e hgweb: ensure _navseq yield strictly increasing numbers
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18391
diff changeset
55 step *= 10
18390
28fa9443f751 hgweb: drop recursivity in _navseq
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18389
diff changeset
56 while True:
18391
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
57 yield 1 * step
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
58 yield 3 * step
833eb34e90e4 hgweb: better names for _navseq arguments
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18390
diff changeset
59 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
60
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
61 class revnav(object):
18320
60680d691a0b hgweb: document the revnavgen function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17991
diff changeset
62
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
63 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
64 """Navigation generation object
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
65
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
66 :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
67 """
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
68 # used for hex generation
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
69 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
70
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
71 def __nonzero__(self):
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
72 """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
73 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
74
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
75 def _first(self):
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
76 """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
77 try:
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
78 return iter(self._revlog).next()
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
79 except StopIteration:
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
80 return None
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
81
18405
1eaf0d017b2c hgweb: move hex creation into an object method
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18404
diff changeset
82 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
83 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
84
18404
1da84a6b136a hgweb: pass nodefunc to the revnav object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18403
diff changeset
85 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
86 """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
87
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
88 :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
89 :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
90 :limit: how far shall we link
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
91
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
92 The return is:
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
93 - a single element tuple
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
94 - containing a dictionary with a `before` and `after` key
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
95 - values are generator functions taking arbitrary number of kwargs
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
96 - yield items are dictionaries with `label` and `node` keys
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
97 """
18406
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
98 if not self:
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
99 # empty repo
20cf53932b6f hgweb: simplify the handling of empty repo
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18405
diff changeset
100 return ({'before': (), 'after': ()},)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
101
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
102 targets = []
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
103 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
104 if f > limit:
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
105 break
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
106 targets.append(pos + f)
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
107 targets.append(pos - f)
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
108 targets.sort()
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
109
19094
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
110 first = self._first()
fc1b77db123f hgweb: handle filtered "0" rev in navigation
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 19093
diff changeset
111 navbefore = [("(%i)" % first, self.hex(first))]
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
112 navafter = []
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
113 for rev in targets:
18426
01638b51df44 hgweb: ignore filtered revision in revnav
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18425
diff changeset
114 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
115 continue
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
116 if pos < rev < limit:
18503
7f769d3a8ad2 hgweb: fix navigation label (issue3792)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18426
diff changeset
117 navafter.append(("+%d" % abs(rev - pos), self.hex(rev)))
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
118 if 0 < rev < pos:
18503
7f769d3a8ad2 hgweb: fix navigation label (issue3792)
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18426
diff changeset
119 navbefore.append(("-%d" % abs(rev - pos), self.hex(rev)))
18425
6da1e979340a hgweb: generate revnav in two phase
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18409
diff changeset
120
10254
8d5de52431f2 hgweb: changenav: separate pages before and after the current position
Nicolas Dumazet <nicdumz.commits@gmail.com>
parents: 9402
diff changeset
121
18403
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
122 navafter.append(("tip", "tip"))
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
123
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
124 data = lambda i: {"label": i[0], "node": i[1]}
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
125 return ({'before': lambda **map: (data(i) for i in navbefore),
bfaee31a83d2 hgweb: move revnavgen into an object
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18392
diff changeset
126 'after': lambda **map: (data(i) for i in navafter)},)
6393
894875eae49b hgweb: refactor hgweb code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 6392
diff changeset
127
18408
f332a64fef51 hgweb: introduction a filerevnav subclass
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18407
diff changeset
128 class filerevnav(revnav):
18409
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
129
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
130 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
131 """Navigation generation object
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
132
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
133 :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
134 :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
135 """
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
136 # used for iteration
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
137 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
138 # used for hex generation
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
139 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
140
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
141 def hex(self, rev):
e3f5cef11d6a hgweb: pass repo object to revnav construction
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18408
diff changeset
142 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
143
27023
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
144 class _siblings(object):
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
145 def __init__(self, siblings=[], hiderev=None):
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
146 self.siblings = [s for s in siblings if s.node() != nullid]
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
147 if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
148 self.siblings = []
18408
f332a64fef51 hgweb: introduction a filerevnav subclass
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18407
diff changeset
149
27023
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
150 def __iter__(self):
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
151 for s in self.siblings:
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
152 d = {
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
153 'node': s.hex(),
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
154 'rev': s.rev(),
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
155 'user': s.user(),
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
156 'date': s.date(),
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
157 'description': s.description(),
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
158 'branch': s.branch(),
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
159 }
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
160 if util.safehasattr(s, 'path'):
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
161 d['file'] = s.path()
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
162 yield d
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
163
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
164 def __len__(self):
0c8ef79b9fd7 webutil: make _siblings into an object with __iter__ and __len__
Anton Shestakov <av6@dwimlabs.net>
parents: 27008
diff changeset
165 return len(self.siblings)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
166
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
167 def parents(ctx, hide=None):
24136
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
168 if isinstance(ctx, context.basefilectx):
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
169 introrev = ctx.introrev()
46d6cdfce4bf hgweb: use introrev() for finding parents (issue4506)
Anton Shestakov <engored@ya.ru>
parents: 23745
diff changeset
170 if ctx.changectx().rev() != introrev:
24340
567ae5365754 hgweb: replace 'ctx._repo' with 'ctx.repo()'
Matt Harbison <matt_harbison@yahoo.com>
parents: 24306
diff changeset
171 return _siblings([ctx.repo()[introrev]], hide)
7671
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
172 return _siblings(ctx.parents(), hide)
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
173
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
174 def children(ctx, hide=None):
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
175 return _siblings(ctx.children(), hide)
06cf09c822c4 hgweb: simplify parents/children generation code
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7637
diff changeset
176
6434
62e0bb41e682 hgweb: minor improvements for new web style
Matt Mackall <mpm@selenic.com>
parents: 6413
diff changeset
177 def renamelink(fctx):
6437
101526031d06 hgweb: fix merge breakage
Matt Mackall <mpm@selenic.com>
parents: 6434
diff changeset
178 r = fctx.renamed()
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
179 if r:
20681
52e5aca15f0c webutil: move from dict() construction to {} literals
Augie Fackler <raf@durin42.com>
parents: 20033
diff changeset
180 return [{'file': r[0], 'node': hex(r[1])}]
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
181 return []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
182
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
183 def nodetagsdict(repo, node):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
184 return [{"name": i} for i in repo.nodetags(node)]
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
185
13596
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
186 def nodebookmarksdict(repo, node):
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
187 return [{"name": i} for i in repo.nodebookmarks(node)]
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
188
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
189 def nodebranchdict(repo, ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
190 branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
191 branch = ctx.branch()
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
192 # 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
193 # ctx.branch() == 'default'.
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
194 try:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
195 branchnode = repo.branchtip(branch)
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
196 except error.RepoLookupError:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
197 branchnode = None
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
198 if branchnode == ctx.node():
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
199 branches.append({"name": branch})
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
200 return branches
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
201
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
202 def nodeinbranch(repo, ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
203 branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
204 branch = ctx.branch()
16719
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
205 try:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
206 branchnode = repo.branchtip(branch)
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
207 except error.RepoLookupError:
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
208 branchnode = None
e7bf09acd410 localrepo: add branchtip() method for faster single-branch lookups
Brodie Rao <brodie@sf.io>
parents: 16308
diff changeset
209 if branch != 'default' and branchnode != ctx.node():
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
210 branches.append({"name": branch})
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
211 return branches
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
212
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
213 def nodebranchnodefault(ctx):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
214 branches = []
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
215 branch = ctx.branch()
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
216 if branch != 'default':
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
217 branches.append({"name": branch})
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
218 return branches
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
219
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
220 def showtag(repo, tmpl, t1, node=nullid, **args):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
221 for t in repo.nodetags(node):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
222 yield tmpl(t1, tag=t, **args)
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
223
13596
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
224 def showbookmark(repo, tmpl, t1, node=nullid, **args):
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
225 for t in repo.nodebookmarks(node):
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
226 yield tmpl(t1, bookmark=t, **args)
270f57d35525 hgweb: add display of bookmarks for changelog and changeset
Alexander Solovyov <alexander@solovyov.net>
parents: 12691
diff changeset
227
26129
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
228 def branchentries(repo, stripecount, limit=0):
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
229 tips = []
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
230 heads = repo.heads()
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
231 parity = paritygen(stripecount)
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
232 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
233
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
234 def entries(**map):
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
235 count = 0
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
236 if not tips:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
237 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
238 tips.append((repo[tip], closed))
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
239 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
240 if limit > 0 and count >= limit:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
241 return
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
242 count += 1
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
243 if closed:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
244 status = 'closed'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
245 elif ctx.node() not in heads:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
246 status = 'inactive'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
247 else:
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
248 status = 'open'
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
249 yield {
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
250 'parity': parity.next(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
251 'branch': ctx.branch(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
252 'status': status,
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
253 'node': ctx.hex(),
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
254 'date': ctx.date()
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
255 }
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
256
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
257 return entries
a103ecb8a04a hgweb: move branchentries code from webcommands to webutil
Anton Shestakov <av6@dwimlabs.net>
parents: 25999
diff changeset
258
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
259 def cleanpath(repo, path):
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
260 path = path.lstrip('/')
20033
f962870712da pathutil: tease out a new library to break an import cycle from canonpath use
Augie Fackler <raf@durin42.com>
parents: 19094
diff changeset
261 return pathutil.canonpath(repo.root, '', path)
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
262
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
263 def changeidctx(repo, changeid):
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
264 try:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6437
diff changeset
265 ctx = repo[changeid]
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
266 except error.RepoError:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
267 man = repo.manifest
7361
9fe97eea5510 linkrev: take a revision number rather than a hash
Matt Mackall <mpm@selenic.com>
parents: 7345
diff changeset
268 ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
269
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
270 return ctx
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
271
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
272 def changectx(repo, req):
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
273 changeid = "tip"
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
274 if 'node' in req.form:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
275 changeid = req.form['node'][0]
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
276 ipos = changeid.find(':')
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
277 if ipos != -1:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
278 changeid = changeid[(ipos + 1):]
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
279 elif 'manifest' in req.form:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
280 changeid = req.form['manifest'][0]
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
281
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
282 return changeidctx(repo, changeid)
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
283
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
284 def basechangectx(repo, req):
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
285 if 'node' in req.form:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
286 changeid = req.form['node'][0]
25999
1c75249e159b style: adjust whitespaces in webutil.py
Anton Shestakov <av6@dwimlabs.net>
parents: 25778
diff changeset
287 ipos = changeid.find(':')
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
288 if ipos != -1:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
289 changeid = changeid[:ipos]
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
290 return changeidctx(repo, changeid)
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
291
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
292 return None
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
293
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
294 def filectx(repo, req):
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
295 if 'file' not in req.form:
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
296 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
297 path = cleanpath(repo, req.form['file'][0])
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
298 if 'node' in req.form:
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
299 changeid = req.form['node'][0]
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
300 elif 'filenode' in req.form:
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
301 changeid = req.form['filenode'][0]
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
302 else:
17289
f2d6b4f8e78c hgweb: avoid traceback when file or node parameters are missing
Ross Lagerwall <rosslagerwall@gmail.com>
parents: 17202
diff changeset
303 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
304 try:
6747
f6c00b17387c use repo[changeid] to get a changectx
Matt Mackall <mpm@selenic.com>
parents: 6437
diff changeset
305 fctx = repo[changeid][path]
7637
1d54e2f6c0b7 error: move repo errors
Matt Mackall <mpm@selenic.com>
parents: 7361
diff changeset
306 except error.RepoError:
6392
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
307 fctx = repo.filectx(path, fileid=changeid)
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
308
2540521dc7c1 hgweb: separate out utility functions
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents:
diff changeset
309 return fctx
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
310
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
311 def commonentry(repo, ctx):
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
312 node = ctx.node()
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
313 return {
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
314 'rev': ctx.rev(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
315 'node': hex(node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
316 'author': ctx.user(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
317 'desc': ctx.description(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
318 'date': ctx.date(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
319 'extra': ctx.extra(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
320 'phase': ctx.phasestr(),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
321 'branch': nodebranchnodefault(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
322 'inbranch': nodeinbranch(repo, ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
323 'branches': nodebranchdict(repo, ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
324 'tags': nodetagsdict(repo, node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
325 'bookmarks': nodebookmarksdict(repo, node),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
326 'parent': lambda **x: parents(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
327 'child': lambda **x: children(ctx),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
328 }
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
329
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
330 def changelistentry(web, ctx, tmpl):
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
331 '''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
332
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
333 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
334 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
335 '''
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
336 repo = web.repo
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
337 rev = ctx.rev()
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
338 n = ctx.node()
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
339 showtags = showtag(repo, tmpl, 'changelogtag', n)
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
340 files = listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
341
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
342 entry = commonentry(repo, ctx)
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
343 entry.update(
28709
94494031f659 hgweb: add parents to json-log (issue5074)
Anton Shestakov <av6@dwimlabs.net>
parents: 27294
diff changeset
344 allparents=lambda **x: parents(ctx),
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
345 parent=lambda **x: parents(ctx, rev - 1),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
346 child=lambda **x: children(ctx, rev + 1),
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
347 changelogtag=showtags,
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
348 files=files,
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
349 )
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
350 return entry
23745
513d47905114 hgweb: extract changelist entry generation into own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 21122
diff changeset
351
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
352 def symrevorshortnode(req, ctx):
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
353 if 'node' in req.form:
27008
7f19f331ef59 hgweb: do not import templatefilters.revescape and websub as symbol
Yuya Nishihara <yuya@tcha.org>
parents: 27007
diff changeset
354 return templatefilters.revescape(req.form['node'][0])
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
355 else:
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
356 return short(ctx.node())
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
357
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
358 def changesetentry(web, req, tmpl, ctx):
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
359 '''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
360
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
361 showtags = showtag(web.repo, tmpl, 'changesettag', ctx.node())
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
362 showbookmarks = showbookmark(web.repo, tmpl, 'changesetbookmark',
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
363 ctx.node())
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
364 showbranch = nodebranchnodefault(ctx)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
365
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
366 files = []
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
367 parity = paritygen(web.stripecount)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
368 for blockno, f in enumerate(ctx.files()):
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
369 template = f in ctx and 'filenodelink' or 'filenolink'
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
370 files.append(tmpl(template,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
371 node=ctx.hex(), file=f, blockno=blockno + 1,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
372 parity=parity.next()))
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
373
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
374 basectx = basechangectx(web.repo, req)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
375 if basectx is None:
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
376 basectx = ctx.p1()
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
377
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
378 style = web.config('web', 'style', 'paper')
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
379 if 'style' in req.form:
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
380 style = req.form['style'][0]
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
381
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
382 parity = paritygen(web.stripecount)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
383 diff = diffs(web.repo, tmpl, ctx, basectx, None, parity, style)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
384
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
385 parity = paritygen(web.stripecount)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
386 diffstatsgen = diffstatgen(ctx, basectx)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
387 diffstats = diffstat(tmpl, ctx, diffstatsgen, parity)
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
388
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
389 return dict(
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
390 diff=diff,
25602
85fb416f2fa7 hgweb: provide symrev (symbolic revision) property to the templates
Anton Shestakov <av6@dwimlabs.net>
parents: 25278
diff changeset
391 symrev=symrevorshortnode(req, ctx),
24177
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
392 basenode=basectx.hex(),
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
393 changesettag=showtags,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
394 changesetbookmark=showbookmarks,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
395 changesetbranch=showbranch,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
396 files=files,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
397 diffsummary=lambda **x: diffsummary(diffstatsgen),
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
398 diffstat=diffstats,
f53b7174facf hgweb: extract changeset template mapping generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24136
diff changeset
399 archives=web.archivelist(ctx.hex()),
27294
5aa2afb4f81a hgweb: move entry-preparing code from webcommands to webutils.commonentry()
Anton Shestakov <av6@dwimlabs.net>
parents: 27046
diff changeset
400 **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
401
7311
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
402 def listfilediffs(tmpl, files, node, max):
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
403 for f in files[:max]:
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
404 yield tmpl('filedifflink', node=hex(node), file=f)
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
405 if len(files) > max:
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
406 yield tmpl('fileellipses')
de9c87fe1620 hgweb: move another utility function into the webutil module
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7310
diff changeset
407
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
408 def diffs(repo, tmpl, ctx, basectx, files, parity, style):
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
409
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
410 def countgen():
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
411 start = 1
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
412 while True:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
413 yield start
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
414 start += 1
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
415
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
416 blockcount = countgen()
16308
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
417 def prettyprintlines(diff, blockno):
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
418 for lineno, l in enumerate(diff.splitlines(True)):
24712
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24564
diff changeset
419 difflineno = "%d.%d" % (blockno, lineno + 1)
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
420 if l.startswith('+'):
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
421 ltype = "difflineplus"
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
422 elif l.startswith('-'):
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
423 ltype = "difflineminus"
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
424 elif l.startswith('@'):
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
425 ltype = "difflineat"
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
426 else:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
427 ltype = "diffline"
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
428 yield tmpl(ltype,
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
429 line=l,
24712
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24564
diff changeset
430 lineno=lineno + 1,
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24564
diff changeset
431 lineid="l%s" % difflineno,
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24564
diff changeset
432 linenumber="% 8s" % difflineno)
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
433
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
434 if files:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
435 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
436 else:
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
437 m = match.always(repo.root, repo.getcwd())
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
438
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
439 diffopts = patch.diffopts(repo.ui, untrusted=True)
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
440 if basectx is None:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
441 parents = ctx.parents()
24306
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
442 if parents:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
443 node1 = parents[0].node()
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
444 else:
6ddc86eedc3b style: kill ersatz if-else ternary operators
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 24177
diff changeset
445 node1 = nullid
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
446 else:
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
447 node1 = basectx.node()
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
448 node2 = ctx.node()
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
449
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
450 block = []
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
451 for chunk in patch.diff(repo, node1, node2, m, opts=diffopts):
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
452 if chunk.startswith('diff') and block:
16308
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
453 blockno = blockcount.next()
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
454 yield tmpl('diffblock', parity=parity.next(), blockno=blockno,
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
455 lines=prettyprintlines(''.join(block), blockno))
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
456 block = []
9402
5d49fdef6fd0 hgweb: show diff header line in raw diffs
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 8225
diff changeset
457 if chunk.startswith('diff') and style != 'raw':
7310
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
458 chunk = ''.join(chunk.splitlines(True)[1:])
bd522d09d5e3 hgweb: move the diffs() generator into webutil
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7294
diff changeset
459 block.append(chunk)
16308
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
460 blockno = blockcount.next()
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
461 yield tmpl('diffblock', parity=parity.next(), blockno=blockno,
2695aaf4eb72 hgweb: add block numbers to diff regions and related links
Paul Boddie <paul@boddie.org.uk>
parents: 14957
diff changeset
462 lines=prettyprintlines(''.join(block), blockno))
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
463
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
464 def compare(tmpl, context, leftlines, rightlines):
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
465 '''Generator function that provides side-by-side comparison data.'''
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
466
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
467 def compline(type, leftlineno, leftline, rightlineno, rightline):
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
468 lineid = leftlineno and ("l%s" % leftlineno) or ''
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
469 lineid += rightlineno and ("r%s" % rightlineno) or ''
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
470 return tmpl('comparisonline',
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
471 type=type,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
472 lineid=lineid,
24712
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24564
diff changeset
473 leftlineno=leftlineno,
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
474 leftlinenumber="% 6s" % (leftlineno or ''),
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
475 leftline=leftline or '',
24712
bbf1ae6b6a44 hgweb: expose raw line numbers to templates
Gregory Szorc <gregory.szorc@gmail.com>
parents: 24564
diff changeset
476 rightlineno=rightlineno,
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
477 rightlinenumber="% 6s" % (rightlineno or ''),
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
478 rightline=rightline or '')
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
479
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
480 def getblock(opcodes):
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
481 for type, llo, lhi, rlo, rhi in opcodes:
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
482 len1 = lhi - llo
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
483 len2 = rhi - rlo
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
484 count = min(len1, len2)
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
485 for i in xrange(count):
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
486 yield compline(type=type,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
487 leftlineno=llo + i + 1,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
488 leftline=leftlines[llo + i],
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
489 rightlineno=rlo + i + 1,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
490 rightline=rightlines[rlo + i])
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
491 if len1 > len2:
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
492 for i in xrange(llo + count, lhi):
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
493 yield compline(type=type,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
494 leftlineno=i + 1,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
495 leftline=leftlines[i],
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
496 rightlineno=None,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
497 rightline=None)
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
498 elif len2 > len1:
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
499 for i in xrange(rlo + count, rhi):
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
500 yield compline(type=type,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
501 leftlineno=None,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
502 leftline=None,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
503 rightlineno=i + 1,
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
504 rightline=rightlines[i])
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
505
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
506 s = difflib.SequenceMatcher(None, leftlines, rightlines)
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
507 if context < 0:
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
508 yield tmpl('comparisonblock', lines=getblock(s.get_opcodes()))
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
509 else:
17302
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
510 for oc in s.get_grouped_opcodes(n=context):
5c64ce6168da hgweb: fixes traceback for invalid files by removing top-level template
wujek srujek <wujek.srujek@googlemail.com>
parents: 17289
diff changeset
511 yield tmpl('comparisonblock', lines=getblock(oc))
17202
1ae119269ddc hgweb: side-by-side comparison functionality
wujek srujek
parents: 16719
diff changeset
512
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
513 def diffstatgen(ctx, basectx):
14570
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
514 '''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
515
17991
d605a82cf189 hgweb: display diff for a changeset against any parents (issue2810)
Weiwen <weiwen@fb.com>
parents: 17302
diff changeset
516 stats = patch.diffstatdata(util.iterlines(ctx.diff(basectx)))
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
517 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
518 while True:
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
519 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
520
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
521 def diffsummary(statgen):
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
522 '''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
523
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
524 stats, maxname, maxtotal, addtotal, removetotal, binary = statgen.next()
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
525 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
526 len(stats), addtotal, removetotal)
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
527
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
528 def diffstat(tmpl, ctx, statgen, parity):
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
529 '''Return a diffstat template for each file in the diff.'''
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
530
9f908ef5a595 web: provide diff summary to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14562
diff changeset
531 stats, maxname, maxtotal, addtotal, removetotal, binary = statgen.next()
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
532 files = ctx.files()
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
533
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
534 def pct(i):
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
535 if maxtotal == 0:
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
536 return 0
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
537 return (float(i) / maxtotal) * 100
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
538
14562
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
539 fileno = 0
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
540 for filename, adds, removes, isbinary in stats:
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
541 template = filename in files and 'diffstatlink' or 'diffstatnolink'
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
542 total = adds + removes
14562
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
543 fileno += 1
fccd3b966da7 web: provide the file number to the diffstat templates
Steven Brown <StevenGBrown@gmail.com>
parents: 14561
diff changeset
544 yield tmpl(template, node=ctx.hex(), file=filename, fileno=fileno,
14561
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
545 total=total, addpct=pct(adds), removepct=pct(removes),
925d9f2b188b web: include all files in the diffstat
Steven Brown <StevenGBrown@gmail.com>
parents: 14490
diff changeset
546 parity=parity.next())
14490
1d3e2349304a web: provide diffstat to the changeset page
Steven Brown <StevenGBrown@gmail.com>
parents: 14055
diff changeset
547
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
548 class sessionvars(object):
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
549 def __init__(self, vars, start='?'):
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
550 self.start = start
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
551 self.vars = vars
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
552 def __getitem__(self, key):
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
553 return self.vars[key]
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
554 def __setitem__(self, key, value):
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
555 self.vars[key] = value
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
556 def __copy__(self):
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
557 return sessionvars(copy.copy(self.vars), self.start)
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
558 def __iter__(self):
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
559 separator = self.start
18367
ae7215f4f7b9 hgweb: generate query strings with parameters sorted by key
Mads Kiilerich <mads@kiilerich.com>
parents: 18320
diff changeset
560 for key, value in sorted(self.vars.iteritems()):
7345
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
561 yield {'name': key, 'value': str(value), 'separator': separator}
55651328dfcc hgweb: fix up the less/more links on the graph page
Dirkjan Ochtman <dirkjan@ochtman.nl>
parents: 7311
diff changeset
562 separator = '&'
12691
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
563
27007
c8cbef073645 hgweb: alias ui module as uimod
Yuya Nishihara <yuya@tcha.org>
parents: 26894
diff changeset
564 class wsgiui(uimod.ui):
12691
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
565 # 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
566 def termwidth(self):
1b1a9038a71a hgweb: fix hgweb_mod as well as hgwebdir_mod
Augie Fackler <durin42@gmail.com>
parents: 10282
diff changeset
567 return 80
26162
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
568
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
569 def getwebsubs(repo):
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
570 websubtable = []
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
571 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
572 # 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
573 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
574 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
575 # grab the delimiter from the character after the "s"
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
576 unesc = pattern[1]
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
577 delim = re.escape(unesc)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
578
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
579 # 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
580 # 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
581 # delimiters are required.
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
582 match = re.match(
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
583 r'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$'
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
584 % (delim, delim, delim), pattern)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
585 if not match:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
586 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
587 % (key, pattern))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
588 continue
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
589
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
590 # we need to unescape the delimiter for regexp and format
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
591 delim_re = re.compile(r'(?<!\\)\\%s' % delim)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
592 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
593 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
594
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
595 # 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
596 flagin = match.group(3)
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
597 flags = 0
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
598 if flagin:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
599 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
600 flags |= re.__dict__[flag]
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
601
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
602 try:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
603 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
604 websubtable.append((regexp, format))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
605 except re.error:
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
606 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
607 % (key, regexp))
268b39770c28 hgweb: extract web substitutions table generation to own function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26129
diff changeset
608 return websubtable