Mercurial > hg > mercurial-crew-with-dirclash
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') % |