comparison mercurial/hgweb/webutil.py @ 18403:bfaee31a83d2

hgweb: move revnavgen into an object For later compatibility with changelog filtering some part of the navigation generation logic will be altered. Those altered part will be different when in the changelog case and in the filelog case. Moving this into an object will allow to use inheritance to override just the part of the logic we need. The aimed logic are for example: - generation of revision 'hex' (different logic for changelog and filelog) - revlog emptyness test - fetching of the first revision of a revlog (may not be 0)
author Pierre-Yves David <pierre-yves.david@logilab.fr>
date Tue, 15 Jan 2013 21:17:18 +0100
parents 88a37b19dc0e
children 1da84a6b136a
comparison
equal deleted inserted replaced
18402:bfba6d954108 18403:bfaee31a83d2
37 while True: 37 while True:
38 yield 1 * step 38 yield 1 * step
39 yield 3 * step 39 yield 3 * step
40 step *= 10 40 step *= 10
41 41
42 def revnavgen(pos, pagelen, limit, nodefunc): 42 class revnav(object):
43 """computes label and revision id for navigation link 43
44 44 def gen(self, pos, pagelen, limit, nodefunc):
45 :pos: is the revision relative to which we generate navigation. 45 """computes label and revision id for navigation link
46 :pagelen: the size of each navigation page 46
47 :limit: how far shall we link 47 :pos: is the revision relative to which we generate navigation.
48 :nodefun: factory for a changectx from a revision 48 :pagelen: the size of each navigation page
49 49 :limit: how far shall we link
50 The return is: 50 :nodefun: factory for a changectx from a revision
51 - a single element tuple 51
52 - containing a dictionary with a `before` and `after` key 52 The return is:
53 - values are generator functions taking an arbitrary number of kwargs 53 - a single element tuple
54 - yield items are dictionaries with `label` and `node` keys 54 - containing a dictionary with a `before` and `after` key
55 """ 55 - values are generator functions taking arbitrary number of kwargs
56 56 - yield items are dictionaries with `label` and `node` keys
57 navbefore = [] 57 """
58 navafter = [] 58
59 59 navbefore = []
60 for f in _navseq(1, pagelen): 60 navafter = []
61 if f > limit: 61
62 break 62 for f in _navseq(1, pagelen):
63 if pos + f < limit: 63 if f > limit:
64 navafter.append(("+%d" % f, hex(nodefunc(pos + f).node()))) 64 break
65 if pos - f >= 0: 65 if pos + f < limit:
66 navbefore.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node()))) 66 navafter.append(("+%d" % f, hex(nodefunc(pos + f).node())))
67 67 if pos - f >= 0:
68 navafter.append(("tip", "tip")) 68 navbefore.insert(0, ("-%d" % f, hex(nodefunc(pos - f).node())))
69 try: 69
70 navbefore.insert(0, ("(0)", hex(nodefunc(0).node()))) 70 navafter.append(("tip", "tip"))
71 except error.RepoError: 71 try:
72 pass 72 navbefore.insert(0, ("(0)", hex(nodefunc(0).node())))
73 73 except error.RepoError:
74 data = lambda i: {"label": i[0], "node": i[1]} 74 pass
75 return ({'before': lambda **map: (data(i) for i in navbefore), 75
76 'after': lambda **map: (data(i) for i in navafter)},) 76 data = lambda i: {"label": i[0], "node": i[1]}
77 return ({'before': lambda **map: (data(i) for i in navbefore),
78 'after': lambda **map: (data(i) for i in navafter)},)
77 79
78 def _siblings(siblings=[], hiderev=None): 80 def _siblings(siblings=[], hiderev=None):
79 siblings = [s for s in siblings if s.node() != nullid] 81 siblings = [s for s in siblings if s.node() != nullid]
80 if len(siblings) == 1 and siblings[0].rev() == hiderev: 82 if len(siblings) == 1 and siblings[0].rev() == hiderev:
81 return 83 return