comparison mercurial/localrepo.py @ 4168:bbfe5a3fc80c

Add a features list to branches.cache to detect caches of old hg versions. The leading space in the written file makes sure that the feature list never can match an existing version, even if the first feature can be read as hex. Additionally old hg versions display the id with --debug, too.
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 09 Mar 2007 19:12:03 +0100
parents 4574a8cb080f
children ac9e891f2c0f 7b5723c95a82
comparison
equal deleted inserted replaced
4167:4574a8cb080f 4168:bbfe5a3fc80c
15 demandload(globals(), "os revlog time util") 15 demandload(globals(), "os revlog time util")
16 16
17 class localrepository(repo.repository): 17 class localrepository(repo.repository):
18 capabilities = ('lookup', 'changegroupsubset') 18 capabilities = ('lookup', 'changegroupsubset')
19 supported = ('revlogv1', 'store') 19 supported = ('revlogv1', 'store')
20 branchcache_features = ('unnamed',)
20 21
21 def __del__(self): 22 def __del__(self):
22 self.transhandle = None 23 self.transhandle = None
23 def __init__(self, parentui, path=None, create=0): 24 def __init__(self, parentui, path=None, create=0):
24 repo.repository.__init__(self) 25 repo.repository.__init__(self)
374 partial = {} 375 partial = {}
375 try: 376 try:
376 f = self.opener("branches.cache") 377 f = self.opener("branches.cache")
377 lines = f.read().split('\n') 378 lines = f.read().split('\n')
378 f.close() 379 f.close()
380 features = lines.pop(0).strip()
381 if not features.startswith('features: '):
382 raise ValueError(_('branch cache: no features specified'))
383 features = features.split(' ', 1)[1].split()
384 missing_features = []
385 for feature in self.branchcache_features:
386 try:
387 features.remove(feature)
388 except ValueError, inst:
389 missing_features.append(feature)
390 if missing_features:
391 raise ValueError(_('branch cache: missing features: %s')
392 % ', '.join(missing_features))
393 if features:
394 raise ValueError(_('branch cache: unknown features: %s')
395 % ', '.join(features))
379 last, lrev = lines.pop(0).split(" ", 1) 396 last, lrev = lines.pop(0).split(" ", 1)
380 last, lrev = bin(last), int(lrev) 397 last, lrev = bin(last), int(lrev)
381 if not (lrev < self.changelog.count() and 398 if not (lrev < self.changelog.count() and
382 self.changelog.node(lrev) == last): # sanity check 399 self.changelog.node(lrev) == last): # sanity check
383 # invalidate the cache 400 # invalidate the cache
395 return partial, last, lrev 412 return partial, last, lrev
396 413
397 def _writebranchcache(self, branches, tip, tiprev): 414 def _writebranchcache(self, branches, tip, tiprev):
398 try: 415 try:
399 f = self.opener("branches.cache", "w") 416 f = self.opener("branches.cache", "w")
417 f.write(" features: %s\n" % ' '.join(self.branchcache_features))
400 f.write("%s %s\n" % (hex(tip), tiprev)) 418 f.write("%s %s\n" % (hex(tip), tiprev))
401 for label, node in branches.iteritems(): 419 for label, node in branches.iteritems():
402 f.write("%s %s\n" % (hex(node), label)) 420 f.write("%s %s\n" % (hex(node), label))
403 except IOError: 421 except IOError:
404 pass 422 pass