comparison mercurial/repoview.py @ 18382:f3b21beb9802

filtering: rename filters to their antonyms Now that changelog filtering is in place, it's become evident that naming the filters according to the set of revs _not_ included in the filtered changelog is confusing. This is especially evident in the collaborative branch cache scheme. This changes the names of the filters to reflect the revs that _are_ included: hidden -> visible unserved -> served mutable -> immutable impactable -> base repoview.filteredrevs is renamed to filterrevs, so that callers read a bit more sensibly, e.g.: filterrevs('visible') # filter revs according to what's visible
author Kevin Bullock <kbullock@ringworld.org>
date Sun, 13 Jan 2013 01:39:16 -0600
parents 1f35d6737ed8
children 64848f7fb764
comparison
equal deleted inserted replaced
18381:7ac4449f0f39 18382:f3b21beb9802
42 """compute the set of revision that should be filtered when used a server 42 """compute the set of revision that should be filtered when used a server
43 43
44 Secret and hidden changeset should not pretend to be here.""" 44 Secret and hidden changeset should not pretend to be here."""
45 assert not repo.changelog.filteredrevs 45 assert not repo.changelog.filteredrevs
46 # fast path in simple case to avoid impact of non optimised code 46 # fast path in simple case to avoid impact of non optimised code
47 hiddens = filteredrevs(repo, 'hidden') 47 hiddens = filterrevs(repo, 'visible')
48 if phases.hassecret(repo): 48 if phases.hassecret(repo):
49 cl = repo.changelog 49 cl = repo.changelog
50 secret = phases.secret 50 secret = phases.secret
51 getphase = repo._phasecache.phase 51 getphase = repo._phasecache.phase
52 first = min(cl.rev(n) for n in repo._phasecache.phaseroots[secret]) 52 first = min(cl.rev(n) for n in repo._phasecache.phaseroots[secret])
63 Secret and hidden changeset should not pretend to be here.""" 63 Secret and hidden changeset should not pretend to be here."""
64 assert not repo.changelog.filteredrevs 64 assert not repo.changelog.filteredrevs
65 # fast check to avoid revset call on huge repo 65 # fast check to avoid revset call on huge repo
66 if util.any(repo._phasecache.phaseroots[1:]): 66 if util.any(repo._phasecache.phaseroots[1:]):
67 getphase = repo._phasecache.phase 67 getphase = repo._phasecache.phase
68 maymutable = filteredrevs(repo, 'impactable') 68 maymutable = filterrevs(repo, 'base')
69 return frozenset(r for r in maymutable if getphase(repo, r)) 69 return frozenset(r for r in maymutable if getphase(repo, r))
70 return frozenset() 70 return frozenset()
71 71
72 def computeimpactable(repo): 72 def computeimpactable(repo):
73 """Everything impactable by mutable revision 73 """Everything impactable by mutable revision
91 if roots: 91 if roots:
92 firstmutable = min(firstmutable, min(cl.rev(r) for r in roots)) 92 firstmutable = min(firstmutable, min(cl.rev(r) for r in roots))
93 return frozenset(xrange(firstmutable, len(cl))) 93 return frozenset(xrange(firstmutable, len(cl)))
94 94
95 # function to compute filtered set 95 # function to compute filtered set
96 filtertable = {'hidden': computehidden, 96 filtertable = {'visible': computehidden,
97 'unserved': computeunserved, 97 'served': computeunserved,
98 'mutable': computemutable, 98 'immutable': computemutable,
99 'impactable': computeimpactable} 99 'base': computeimpactable}
100 ### Nearest subset relation 100 ### Nearest subset relation
101 # Nearest subset of filter X is a filter Y so that: 101 # Nearest subset of filter X is a filter Y so that:
102 # * Y is included in X, 102 # * Y is included in X,
103 # * X - Y is as small as possible. 103 # * X - Y is as small as possible.
104 # This create and ordering used for branchmap purpose. 104 # This create and ordering used for branchmap purpose.
105 # the ordering may be partial 105 # the ordering may be partial
106 subsettable = {None: 'hidden', 106 subsettable = {None: 'visible',
107 'hidden': 'unserved', 107 'visible': 'served',
108 'unserved': 'mutable', 108 'served': 'immutable',
109 'mutable': 'impactable'} 109 'immutable': 'base'}
110 110
111 def filteredrevs(repo, filtername): 111 def filterrevs(repo, filtername):
112 """returns set of filtered revision for this filter name""" 112 """returns set of filtered revision for this filter name"""
113 if filtername not in repo.filteredrevcache: 113 if filtername not in repo.filteredrevcache:
114 func = filtertable[filtername] 114 func = filtertable[filtername]
115 repo.filteredrevcache[filtername] = func(repo.unfiltered()) 115 repo.filteredrevcache[filtername] = func(repo.unfiltered())
116 return repo.filteredrevcache[filtername] 116 return repo.filteredrevcache[filtername]
160 """return a filtered version of the changeset 160 """return a filtered version of the changeset
161 161
162 this changelog must not be used for writing""" 162 this changelog must not be used for writing"""
163 # some cache may be implemented later 163 # some cache may be implemented later
164 cl = copy.copy(self._unfilteredrepo.changelog) 164 cl = copy.copy(self._unfilteredrepo.changelog)
165 cl.filteredrevs = filteredrevs(self._unfilteredrepo, self.filtername) 165 cl.filteredrevs = filterrevs(self._unfilteredrepo, self.filtername)
166 return cl 166 return cl
167 167
168 def unfiltered(self): 168 def unfiltered(self):
169 """Return an unfiltered version of a repo""" 169 """Return an unfiltered version of a repo"""
170 return self._unfilteredrepo 170 return self._unfilteredrepo