comparison mercurial/branchmap.py @ 24723:467a33142425

repoview: move function for computing filtered hash An upcoming patch will establish per-filter tags caches. We'll want to use the same cache validation logic as the branch cache. Prepare for that by moving the logic for computing a filtered view hash to somewhere central.
author Gregory Szorc <gregory.szorc@gmail.com>
date Wed, 01 Apr 2015 18:43:29 -0700
parents 9347c15d8136
children 75688a6f0bca
comparison
equal deleted inserted replaced
24722:02a5618e2fbf 24723:467a33142425
5 # This software may be used and distributed according to the terms of the 5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version. 6 # GNU General Public License version 2 or any later version.
7 7
8 from node import bin, hex, nullid, nullrev 8 from node import bin, hex, nullid, nullrev
9 import encoding 9 import encoding
10 import scmutil
10 import util 11 import util
11 import time 12 import time
12 from array import array 13 from array import array
13 from struct import calcsize, pack, unpack 14 from struct import calcsize, pack, unpack
14 15
134 if closednodes is None: 135 if closednodes is None:
135 self._closednodes = set() 136 self._closednodes = set()
136 else: 137 else:
137 self._closednodes = closednodes 138 self._closednodes = closednodes
138 139
139 def _hashfiltered(self, repo):
140 """build hash of revision filtered in the current cache
141
142 Tracking tipnode and tiprev is not enough to ensure validity of the
143 cache as they do not help to distinct cache that ignored various
144 revision bellow tiprev.
145
146 To detect such difference, we build a cache of all ignored revisions.
147 """
148 cl = repo.changelog
149 if not cl.filteredrevs:
150 return None
151 key = None
152 revs = sorted(r for r in cl.filteredrevs if r <= self.tiprev)
153 if revs:
154 s = util.sha1()
155 for rev in revs:
156 s.update('%s;' % rev)
157 key = s.digest()
158 return key
159
160 def validfor(self, repo): 140 def validfor(self, repo):
161 """Is the cache content valid regarding a repo 141 """Is the cache content valid regarding a repo
162 142
163 - False when cached tipnode is unknown or if we detect a strip. 143 - False when cached tipnode is unknown or if we detect a strip.
164 - True when cache is up to date or a subset of current repo.""" 144 - True when cache is up to date or a subset of current repo."""
165 try: 145 try:
166 return ((self.tipnode == repo.changelog.node(self.tiprev)) 146 return ((self.tipnode == repo.changelog.node(self.tiprev))
167 and (self.filteredhash == self._hashfiltered(repo))) 147 and (self.filteredhash == \
148 scmutil.filteredhash(repo, self.tiprev)))
168 except IndexError: 149 except IndexError:
169 return False 150 return False
170 151
171 def _branchtip(self, heads): 152 def _branchtip(self, heads):
172 '''Return tuple with last open head in heads and false, 153 '''Return tuple with last open head in heads and false,
281 for heads in self.values(): 262 for heads in self.values():
282 tiprev = max(cl.rev(node) for node in heads) 263 tiprev = max(cl.rev(node) for node in heads)
283 if tiprev > self.tiprev: 264 if tiprev > self.tiprev:
284 self.tipnode = cl.node(tiprev) 265 self.tipnode = cl.node(tiprev)
285 self.tiprev = tiprev 266 self.tiprev = tiprev
286 self.filteredhash = self._hashfiltered(repo) 267 self.filteredhash = scmutil.filteredhash(repo, self.tiprev)
287 268
288 duration = time.time() - starttime 269 duration = time.time() - starttime
289 repo.ui.log('branchcache', 'updated %s branch cache in %.4f seconds\n', 270 repo.ui.log('branchcache', 'updated %s branch cache in %.4f seconds\n',
290 repo.filtername, duration) 271 repo.filtername, duration)
291 272