comparison mercurial/localrepo.py @ 3500:bd8339976504

Merge with mpm
author Brendan Cully <brendan@kublai.com>
date Tue, 24 Oct 2006 13:42:21 -0700
parents 23cffef5d424 ceaa3fefc10c
children 9383af6f236d
comparison
equal deleted inserted replaced
3493:e0db0b7934f2 3500:bd8339976504
45 45
46 self.root = os.path.abspath(path) 46 self.root = os.path.abspath(path)
47 self.origroot = path 47 self.origroot = path
48 self.ui = ui.ui(parentui=parentui) 48 self.ui = ui.ui(parentui=parentui)
49 self.opener = util.opener(self.path) 49 self.opener = util.opener(self.path)
50 self.sopener = util.opener(self.path)
50 self.wopener = util.opener(self.root) 51 self.wopener = util.opener(self.root)
51 52
52 try: 53 try:
53 self.ui.readconfig(self.join("hgrc"), self.root) 54 self.ui.readconfig(self.join("hgrc"), self.root)
54 except IOError: 55 except IOError:
64 flags |= revlog.flagstr(x) 65 flags |= revlog.flagstr(x)
65 elif self.revlogv1: 66 elif self.revlogv1:
66 flags = revlog.REVLOG_DEFAULT_FLAGS 67 flags = revlog.REVLOG_DEFAULT_FLAGS
67 68
68 v = self.revlogversion | flags 69 v = self.revlogversion | flags
69 self.manifest = manifest.manifest(self.opener, v) 70 self.manifest = manifest.manifest(self.sopener, v)
70 self.changelog = changelog.changelog(self.opener, v) 71 self.changelog = changelog.changelog(self.sopener, v)
71 72
72 # the changelog might not have the inline index flag 73 # the changelog might not have the inline index flag
73 # on. If the format of the changelog is the same as found in 74 # on. If the format of the changelog is the same as found in
74 # .hgrc, apply any flags found in the .hgrc as well. 75 # .hgrc, apply any flags found in the .hgrc as well.
75 # Otherwise, just version from the changelog 76 # Otherwise, just version from the changelog
243 # read the tags file from each head, ending with the tip, 244 # read the tags file from each head, ending with the tip,
244 # and add each tag found to the map, with "newer" ones 245 # and add each tag found to the map, with "newer" ones
245 # taking precedence 246 # taking precedence
246 heads = self.heads() 247 heads = self.heads()
247 heads.reverse() 248 heads.reverse()
248 fl = self.file(".hgtags") 249 seen = {}
249 for node in heads: 250 for node in heads:
250 change = self.changelog.read(node) 251 f = self.filectx('.hgtags', node)
251 rev = self.changelog.rev(node) 252 if not f or f.filerev() in seen: continue
252 fn, ff = self.manifest.find(change[0], '.hgtags') 253 seen[f.filerev()] = 1
253 if fn is None: continue
254 count = 0 254 count = 0
255 for l in fl.read(fn).splitlines(): 255 for l in f.data().splitlines():
256 count += 1 256 count += 1
257 parsetag(l, _(".hgtags (rev %d:%s), line %d") % 257 parsetag(l, _("%s, line %d") % (str(f), count))
258 (rev, short(node), count)) 258
259 try: 259 try:
260 f = self.opener("localtags") 260 f = self.opener("localtags")
261 count = 0 261 count = 0
262 for l in f: 262 for l in f:
263 count += 1 263 count += 1
342 def lookup(self, key): 342 def lookup(self, key):
343 if key == '.': 343 if key == '.':
344 key = self.dirstate.parents()[0] 344 key = self.dirstate.parents()[0]
345 if key == nullid: 345 if key == nullid:
346 raise repo.RepoError(_("no revision checked out")) 346 raise repo.RepoError(_("no revision checked out"))
347 n = self.changelog._match(key)
348 if n:
349 return n
347 if key in self.tags(): 350 if key in self.tags():
348 return self.tags()[key] 351 return self.tags()[key]
349 if key in self.branchtags(): 352 if key in self.branchtags():
350 return self.branchtags()[key] 353 return self.branchtags()[key]
351 try: 354 n = self.changelog._partialmatch(key)
352 return self.changelog.lookup(key) 355 if n:
353 except: 356 return n
354 raise repo.RepoError(_("unknown revision '%s'") % key) 357 raise repo.RepoError(_("unknown revision '%s'") % key)
355 358
356 def dev(self): 359 def dev(self):
357 return os.lstat(self.path).st_dev 360 return os.lstat(self.path).st_dev
358 361
359 def local(self): 362 def local(self):
360 return True 363 return True
361 364
362 def join(self, f): 365 def join(self, f):
366 return os.path.join(self.path, f)
367
368 def sjoin(self, f):
363 return os.path.join(self.path, f) 369 return os.path.join(self.path, f)
364 370
365 def wjoin(self, f): 371 def wjoin(self, f):
366 return os.path.join(self.root, f) 372 return os.path.join(self.root, f)
367 373
368 def file(self, f): 374 def file(self, f):
369 if f[0] == '/': 375 if f[0] == '/':
370 f = f[1:] 376 f = f[1:]
371 return filelog.filelog(self.opener, f, self.revlogversion) 377 return filelog.filelog(self.sopener, f, self.revlogversion)
372 378
373 def changectx(self, changeid=None): 379 def changectx(self, changeid=None):
374 return context.changectx(self, changeid) 380 return context.changectx(self, changeid)
375 381
376 def workingctx(self): 382 def workingctx(self):
446 ds = self.opener("dirstate").read() 452 ds = self.opener("dirstate").read()
447 except IOError: 453 except IOError:
448 ds = "" 454 ds = ""
449 self.opener("journal.dirstate", "w").write(ds) 455 self.opener("journal.dirstate", "w").write(ds)
450 456
451 tr = transaction.transaction(self.ui.warn, self.opener, 457 tr = transaction.transaction(self.ui.warn, self.sopener,
452 self.join("journal"), 458 self.sjoin("journal"),
453 aftertrans(self.path)) 459 aftertrans(self.path))
454 self.transhandle = tr 460 self.transhandle = tr
455 return tr 461 return tr
456 462
457 def recover(self): 463 def recover(self):
458 l = self.lock() 464 l = self.lock()
459 if os.path.exists(self.join("journal")): 465 if os.path.exists(self.sjoin("journal")):
460 self.ui.status(_("rolling back interrupted transaction\n")) 466 self.ui.status(_("rolling back interrupted transaction\n"))
461 transaction.rollback(self.opener, self.join("journal")) 467 transaction.rollback(self.sopener, self.sjoin("journal"))
462 self.reload() 468 self.reload()
463 return True 469 return True
464 else: 470 else:
465 self.ui.warn(_("no interrupted transaction available\n")) 471 self.ui.warn(_("no interrupted transaction available\n"))
466 return False 472 return False
467 473
468 def rollback(self, wlock=None): 474 def rollback(self, wlock=None):
469 if not wlock: 475 if not wlock:
470 wlock = self.wlock() 476 wlock = self.wlock()
471 l = self.lock() 477 l = self.lock()
472 if os.path.exists(self.join("undo")): 478 if os.path.exists(self.sjoin("undo")):
473 self.ui.status(_("rolling back last transaction\n")) 479 self.ui.status(_("rolling back last transaction\n"))
474 transaction.rollback(self.opener, self.join("undo")) 480 transaction.rollback(self.sopener, self.sjoin("undo"))
475 util.rename(self.join("undo.dirstate"), self.join("dirstate")) 481 util.rename(self.join("undo.dirstate"), self.join("dirstate"))
476 self.reload() 482 self.reload()
477 self.wreload() 483 self.wreload()
478 else: 484 else:
479 self.ui.warn(_("no rollback information available\n")) 485 self.ui.warn(_("no rollback information available\n"))
488 self.nodetagscache = None 494 self.nodetagscache = None
489 495
490 def do_lock(self, lockname, wait, releasefn=None, acquirefn=None, 496 def do_lock(self, lockname, wait, releasefn=None, acquirefn=None,
491 desc=None): 497 desc=None):
492 try: 498 try:
493 l = lock.lock(self.join(lockname), 0, releasefn, desc=desc) 499 l = lock.lock(lockname, 0, releasefn, desc=desc)
494 except lock.LockHeld, inst: 500 except lock.LockHeld, inst:
495 if not wait: 501 if not wait:
496 raise 502 raise
497 self.ui.warn(_("waiting for lock on %s held by %s\n") % 503 self.ui.warn(_("waiting for lock on %s held by %s\n") %
498 (desc, inst.args[0])) 504 (desc, inst.args[0]))
499 # default to 600 seconds timeout 505 # default to 600 seconds timeout
500 l = lock.lock(self.join(lockname), 506 l = lock.lock(lockname, int(self.ui.config("ui", "timeout", "600")),
501 int(self.ui.config("ui", "timeout") or 600),
502 releasefn, desc=desc) 507 releasefn, desc=desc)
503 if acquirefn: 508 if acquirefn:
504 acquirefn() 509 acquirefn()
505 return l 510 return l
506 511
507 def lock(self, wait=1): 512 def lock(self, wait=1):
508 return self.do_lock("lock", wait, acquirefn=self.reload, 513 return self.do_lock(self.sjoin("lock"), wait, acquirefn=self.reload,
509 desc=_('repository %s') % self.origroot) 514 desc=_('repository %s') % self.origroot)
510 515
511 def wlock(self, wait=1): 516 def wlock(self, wait=1):
512 return self.do_lock("wlock", wait, self.dirstate.write, 517 return self.do_lock(self.join("wlock"), wait, self.dirstate.write,
513 self.wreload, 518 self.wreload,
514 desc=_('working directory of %s') % self.origroot) 519 desc=_('working directory of %s') % self.origroot)
515 520
516 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): 521 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist):
517 """ 522 """
1690 1695
1691 # write changelog data to temp files so concurrent readers will not see 1696 # write changelog data to temp files so concurrent readers will not see
1692 # inconsistent view 1697 # inconsistent view
1693 cl = None 1698 cl = None
1694 try: 1699 try:
1695 cl = appendfile.appendchangelog(self.opener, self.changelog.version) 1700 cl = appendfile.appendchangelog(self.sopener,
1701 self.changelog.version)
1696 1702
1697 oldheads = len(cl.heads()) 1703 oldheads = len(cl.heads())
1698 1704
1699 # pull off the changeset group 1705 # pull off the changeset group
1700 self.ui.status(_("adding changesets\n")) 1706 self.ui.status(_("adding changesets\n"))
1733 finally: 1739 finally:
1734 if cl: 1740 if cl:
1735 cl.cleanup() 1741 cl.cleanup()
1736 1742
1737 # make changelog see real files again 1743 # make changelog see real files again
1738 self.changelog = changelog.changelog(self.opener, self.changelog.version) 1744 self.changelog = changelog.changelog(self.sopener,
1745 self.changelog.version)
1739 self.changelog.checkinlinesize(tr) 1746 self.changelog.checkinlinesize(tr)
1740 1747
1741 newheads = len(self.changelog.heads()) 1748 newheads = len(self.changelog.heads())
1742 heads = "" 1749 heads = ""
1743 if oldheads and newheads != oldheads: 1750 if oldheads and newheads != oldheads:
1777 start = time.time() 1784 start = time.time()
1778 for i in xrange(total_files): 1785 for i in xrange(total_files):
1779 name, size = fp.readline().split('\0', 1) 1786 name, size = fp.readline().split('\0', 1)
1780 size = int(size) 1787 size = int(size)
1781 self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size))) 1788 self.ui.debug('adding %s (%s)\n' % (name, util.bytecount(size)))
1782 ofp = self.opener(name, 'w') 1789 ofp = self.sopener(name, 'w')
1783 for chunk in util.filechunkiter(fp, limit=size): 1790 for chunk in util.filechunkiter(fp, limit=size):
1784 ofp.write(chunk) 1791 ofp.write(chunk)
1785 ofp.close() 1792 ofp.close()
1786 elapsed = time.time() - start 1793 elapsed = time.time() - start
1787 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') % 1794 self.ui.status(_('transferred %s in %.1f seconds (%s/sec)\n') %