comparison mercurial/localrepo.py @ 4170:ac9e891f2c0f

merge with crew-stable
author Thomas Arendsen Hein <thomas@intevation.de>
date Fri, 09 Mar 2007 20:08:13 +0100
parents c0271aba6abe bbfe5a3fc80c
children ba51a8225a60
comparison
equal deleted inserted replaced
4166:c0271aba6abe 4170:ac9e891f2c0f
13 import os, revlog, time, util 13 import os, revlog, time, util
14 14
15 class localrepository(repo.repository): 15 class localrepository(repo.repository):
16 capabilities = ('lookup', 'changegroupsubset') 16 capabilities = ('lookup', 'changegroupsubset')
17 supported = ('revlogv1', 'store') 17 supported = ('revlogv1', 'store')
18 branchcache_features = ('unnamed',)
18 19
19 def __del__(self): 20 def __del__(self):
20 self.transhandle = None 21 self.transhandle = None
21 def __init__(self, parentui, path=None, create=0): 22 def __init__(self, parentui, path=None, create=0):
22 repo.repository.__init__(self) 23 repo.repository.__init__(self)
395 partial = {} 396 partial = {}
396 try: 397 try:
397 f = self.opener("branches.cache") 398 f = self.opener("branches.cache")
398 lines = f.read().split('\n') 399 lines = f.read().split('\n')
399 f.close() 400 f.close()
400 last, lrev = lines.pop(0).rstrip().split(" ", 1) 401 features = lines.pop(0).strip()
402 if not features.startswith('features: '):
403 raise ValueError(_('branch cache: no features specified'))
404 features = features.split(' ', 1)[1].split()
405 missing_features = []
406 for feature in self.branchcache_features:
407 try:
408 features.remove(feature)
409 except ValueError, inst:
410 missing_features.append(feature)
411 if missing_features:
412 raise ValueError(_('branch cache: missing features: %s')
413 % ', '.join(missing_features))
414 if features:
415 raise ValueError(_('branch cache: unknown features: %s')
416 % ', '.join(features))
417 last, lrev = lines.pop(0).split(" ", 1)
401 last, lrev = bin(last), int(lrev) 418 last, lrev = bin(last), int(lrev)
402 if not (lrev < self.changelog.count() and 419 if not (lrev < self.changelog.count() and
403 self.changelog.node(lrev) == last): # sanity check 420 self.changelog.node(lrev) == last): # sanity check
404 # invalidate the cache 421 # invalidate the cache
405 raise ValueError('Invalid branch cache: unknown tip') 422 raise ValueError('Invalid branch cache: unknown tip')
406 for l in lines: 423 for l in lines:
407 if not l: continue 424 if not l: continue
408 node, label = l.rstrip().split(" ", 1) 425 node, label = l.split(" ", 1)
409 partial[label] = bin(node) 426 partial[label.strip()] = bin(node)
410 except (KeyboardInterrupt, util.SignalInterrupt): 427 except (KeyboardInterrupt, util.SignalInterrupt):
411 raise 428 raise
412 except Exception, inst: 429 except Exception, inst:
413 if self.ui.debugflag: 430 if self.ui.debugflag:
414 self.ui.warn(str(inst), '\n') 431 self.ui.warn(str(inst), '\n')
416 return partial, last, lrev 433 return partial, last, lrev
417 434
418 def _writebranchcache(self, branches, tip, tiprev): 435 def _writebranchcache(self, branches, tip, tiprev):
419 try: 436 try:
420 f = self.opener("branches.cache", "w") 437 f = self.opener("branches.cache", "w")
438 f.write(" features: %s\n" % ' '.join(self.branchcache_features))
421 f.write("%s %s\n" % (hex(tip), tiprev)) 439 f.write("%s %s\n" % (hex(tip), tiprev))
422 for label, node in branches.iteritems(): 440 for label, node in branches.iteritems():
423 f.write("%s %s\n" % (hex(node), label)) 441 f.write("%s %s\n" % (hex(node), label))
424 except IOError: 442 except IOError:
425 pass 443 pass
426 444
427 def _updatebranchcache(self, partial, start, end): 445 def _updatebranchcache(self, partial, start, end):
428 for r in xrange(start, end): 446 for r in xrange(start, end):
429 c = self.changectx(r) 447 c = self.changectx(r)
430 b = c.branch() 448 b = c.branch()
431 if b: 449 partial[b] = c.node()
432 partial[b] = c.node()
433 450
434 def lookup(self, key): 451 def lookup(self, key):
435 if key == '.': 452 if key == '.':
436 key = self.dirstate.parents()[0] 453 key = self.dirstate.parents()[0]
437 if key == nullid: 454 if key == nullid: