Mercurial > public > mercurial-scm > hg
comparison mercurial/localrepo.py @ 4917:126f527b3ba3
Make repo locks recursive, eliminate all passing of lock/wlock
author | Matt Mackall <mpm@selenic.com> |
---|---|
date | Sat, 21 Jul 2007 16:02:10 -0500 |
parents | 5c5d23d93447 |
children | 30d4d8985dd8 |
comparison
equal
deleted
inserted
replaced
4916:5c5d23d93447 | 4917:126f527b3ba3 |
---|---|
528 self.ui.warn(_("no interrupted transaction available\n")) | 528 self.ui.warn(_("no interrupted transaction available\n")) |
529 return False | 529 return False |
530 finally: | 530 finally: |
531 del l | 531 del l |
532 | 532 |
533 def rollback(self, wlock=None, lock=None): | 533 def rollback(self): |
534 try: | 534 wlock = lock = None |
535 if not wlock: | 535 try: |
536 wlock = self.wlock() | 536 wlock = self.wlock() |
537 if not lock: | 537 lock = self.lock() |
538 lock = self.lock() | |
539 if os.path.exists(self.sjoin("undo")): | 538 if os.path.exists(self.sjoin("undo")): |
540 self.ui.status(_("rolling back last transaction\n")) | 539 self.ui.status(_("rolling back last transaction\n")) |
541 transaction.rollback(self.sopener, self.sjoin("undo")) | 540 transaction.rollback(self.sopener, self.sjoin("undo")) |
542 util.rename(self.join("undo.dirstate"), self.join("dirstate")) | 541 util.rename(self.join("undo.dirstate"), self.join("dirstate")) |
543 self.invalidate() | 542 self.invalidate() |
568 if acquirefn: | 567 if acquirefn: |
569 acquirefn() | 568 acquirefn() |
570 return l | 569 return l |
571 | 570 |
572 def lock(self, wait=True): | 571 def lock(self, wait=True): |
573 return self._lock(self.sjoin("lock"), wait, None, self.invalidate, | 572 if self._lockref and self._lockref(): |
574 _('repository %s') % self.origroot) | 573 return self._lockref() |
574 | |
575 l = self._lock(self.sjoin("lock"), wait, None, self.invalidate, | |
576 _('repository %s') % self.origroot) | |
577 self._lockref = weakref.ref(l) | |
578 return l | |
575 | 579 |
576 def wlock(self, wait=True): | 580 def wlock(self, wait=True): |
577 return self._lock(self.join("wlock"), wait, self.dirstate.write, | 581 if self._wlockref and self._wlockref(): |
578 self.dirstate.invalidate, | 582 return self._wlockref() |
579 _('working directory of %s') % self.origroot) | 583 |
584 l = self._lock(self.join("wlock"), wait, self.dirstate.write, | |
585 self.dirstate.invalidate, _('working directory of %s') % | |
586 self.origroot) | |
587 self._wlockref = weakref.ref(l) | |
588 return l | |
580 | 589 |
581 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): | 590 def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist): |
582 """ | 591 """ |
583 commit an individual file as part of a larger transaction | 592 commit an individual file as part of a larger transaction |
584 """ | 593 """ |
636 return fp1 | 645 return fp1 |
637 | 646 |
638 changelist.append(fn) | 647 changelist.append(fn) |
639 return fl.add(t, meta, transaction, linkrev, fp1, fp2) | 648 return fl.add(t, meta, transaction, linkrev, fp1, fp2) |
640 | 649 |
641 def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None, extra={}): | 650 def rawcommit(self, files, text, user, date, p1=None, p2=None, extra={}): |
642 if p1 is None: | 651 if p1 is None: |
643 p1, p2 = self.dirstate.parents() | 652 p1, p2 = self.dirstate.parents() |
644 return self.commit(files=files, text=text, user=user, date=date, | 653 return self.commit(files=files, text=text, user=user, date=date, |
645 p1=p1, p2=p2, wlock=wlock, extra=extra) | 654 p1=p1, p2=p2, extra=extra) |
646 | 655 |
647 def commit(self, files=None, text="", user=None, date=None, | 656 def commit(self, files=None, text="", user=None, date=None, |
648 match=util.always, force=False, lock=None, wlock=None, | 657 match=util.always, force=False, force_editor=False, |
649 force_editor=False, p1=None, p2=None, extra={}): | 658 p1=None, p2=None, extra={}): |
650 tr = None | 659 wlock = lock = tr = None |
651 try: | 660 try: |
652 commit = [] | 661 commit = [] |
653 remove = [] | 662 remove = [] |
654 changed = [] | 663 changed = [] |
655 use_dirstate = (p1 is None) # not rawcommit | 664 use_dirstate = (p1 is None) # not rawcommit |
705 if p2 == nullid: xp2 = '' | 714 if p2 == nullid: xp2 = '' |
706 else: xp2 = hex(p2) | 715 else: xp2 = hex(p2) |
707 | 716 |
708 self.hook("precommit", throw=True, parent1=xp1, parent2=xp2) | 717 self.hook("precommit", throw=True, parent1=xp1, parent2=xp2) |
709 | 718 |
710 if not wlock: | 719 wlock = self.wlock() |
711 wlock = self.wlock() | 720 lock = self.lock() |
712 if not lock: | |
713 lock = self.lock() | |
714 tr = self.transaction() | 721 tr = self.transaction() |
715 | 722 |
716 # check in files | 723 # check in files |
717 new = {} | 724 new = {} |
718 linkrev = self.changelog.count() | 725 linkrev = self.changelog.count() |
852 else: | 859 else: |
853 for src, fn in self.dirstate.walk(files, match, badmatch=badmatch): | 860 for src, fn in self.dirstate.walk(files, match, badmatch=badmatch): |
854 yield src, fn | 861 yield src, fn |
855 | 862 |
856 def status(self, node1=None, node2=None, files=[], match=util.always, | 863 def status(self, node1=None, node2=None, files=[], match=util.always, |
857 wlock=None, list_ignored=False, list_clean=False): | 864 list_ignored=False, list_clean=False): |
858 """return status of files between two nodes or node and working directory | 865 """return status of files between two nodes or node and working directory |
859 | 866 |
860 If node1 is None, use the first dirstate parent instead. | 867 If node1 is None, use the first dirstate parent instead. |
861 If node2 is None, compare node1 with working directory. | 868 If node2 is None, compare node1 with working directory. |
862 """ | 869 """ |
906 if list_clean: | 913 if list_clean: |
907 clean.append(f) | 914 clean.append(f) |
908 | 915 |
909 # update dirstate for files that are actually clean | 916 # update dirstate for files that are actually clean |
910 if fixup: | 917 if fixup: |
911 fixlock = wlock | 918 wlock = None |
912 try: | 919 try: |
913 if not fixlock: | 920 try: |
914 try: | 921 wlock = self.wlock(False) |
915 fixlock = self.wlock(False) | 922 except lock.LockException: |
916 except lock.LockException: | 923 pass |
917 pass | 924 if wlock: |
918 if fixlock: | |
919 for f in fixup: | 925 for f in fixup: |
920 self.dirstate.normal(f) | 926 self.dirstate.normal(f) |
921 finally: | 927 finally: |
922 del fixlock | 928 del wlock |
923 else: | 929 else: |
924 # we are comparing working dir against non-parent | 930 # we are comparing working dir against non-parent |
925 # generate a pseudo-manifest for the working dir | 931 # generate a pseudo-manifest for the working dir |
926 # XXX: create it in dirstate.py ? | 932 # XXX: create it in dirstate.py ? |
927 mf2 = mfmatches(self.dirstate.parents()[0]) | 933 mf2 = mfmatches(self.dirstate.parents()[0]) |
964 # sort and return results: | 970 # sort and return results: |
965 for l in modified, added, removed, deleted, unknown, ignored, clean: | 971 for l in modified, added, removed, deleted, unknown, ignored, clean: |
966 l.sort() | 972 l.sort() |
967 return (modified, added, removed, deleted, unknown, ignored, clean) | 973 return (modified, added, removed, deleted, unknown, ignored, clean) |
968 | 974 |
969 def add(self, list, wlock=None): | 975 def add(self, list): |
970 try: | 976 wlock = self.wlock() |
971 if not wlock: | 977 try: |
972 wlock = self.wlock() | |
973 for f in list: | 978 for f in list: |
974 p = self.wjoin(f) | 979 p = self.wjoin(f) |
975 try: | 980 try: |
976 st = os.lstat(p) | 981 st = os.lstat(p) |
977 except: | 982 except: |
990 else: | 995 else: |
991 self.dirstate.add(f) | 996 self.dirstate.add(f) |
992 finally: | 997 finally: |
993 del wlock | 998 del wlock |
994 | 999 |
995 def forget(self, list, wlock=None): | 1000 def forget(self, list): |
996 try: | 1001 wlock = self.wlock() |
997 if not wlock: | 1002 try: |
998 wlock = self.wlock() | |
999 for f in list: | 1003 for f in list: |
1000 if self.dirstate[f] != 'a': | 1004 if self.dirstate[f] != 'a': |
1001 self.ui.warn(_("%s not added!\n") % f) | 1005 self.ui.warn(_("%s not added!\n") % f) |
1002 else: | 1006 else: |
1003 self.dirstate.forget(f) | 1007 self.dirstate.forget(f) |
1004 finally: | 1008 finally: |
1005 del wlock | 1009 del wlock |
1006 | 1010 |
1007 def remove(self, list, unlink=False, wlock=None): | 1011 def remove(self, list, unlink=False): |
1012 wlock = None | |
1008 try: | 1013 try: |
1009 if unlink: | 1014 if unlink: |
1010 for f in list: | 1015 for f in list: |
1011 try: | 1016 try: |
1012 util.unlink(self.wjoin(f)) | 1017 util.unlink(self.wjoin(f)) |
1013 except OSError, inst: | 1018 except OSError, inst: |
1014 if inst.errno != errno.ENOENT: | 1019 if inst.errno != errno.ENOENT: |
1015 raise | 1020 raise |
1016 if not wlock: | 1021 wlock = self.wlock() |
1017 wlock = self.wlock() | |
1018 for f in list: | 1022 for f in list: |
1019 if unlink and os.path.exists(self.wjoin(f)): | 1023 if unlink and os.path.exists(self.wjoin(f)): |
1020 self.ui.warn(_("%s still exists!\n") % f) | 1024 self.ui.warn(_("%s still exists!\n") % f) |
1021 elif self.dirstate[f] == 'a': | 1025 elif self.dirstate[f] == 'a': |
1022 self.dirstate.forget(f) | 1026 self.dirstate.forget(f) |
1025 else: | 1029 else: |
1026 self.dirstate.remove(f) | 1030 self.dirstate.remove(f) |
1027 finally: | 1031 finally: |
1028 del wlock | 1032 del wlock |
1029 | 1033 |
1030 def undelete(self, list, wlock=None): | 1034 def undelete(self, list): |
1035 wlock = None | |
1031 try: | 1036 try: |
1032 p = self.dirstate.parents()[0] | 1037 p = self.dirstate.parents()[0] |
1033 mn = self.changelog.read(p)[0] | 1038 mn = self.changelog.read(p)[0] |
1034 m = self.manifest.read(mn) | 1039 m = self.manifest.read(mn) |
1035 if not wlock: | 1040 wlock = self.wlock() |
1036 wlock = self.wlock() | |
1037 for f in list: | 1041 for f in list: |
1038 if self.dirstate[f] != 'r': | 1042 if self.dirstate[f] != 'r': |
1039 self.ui.warn("%s not removed!\n" % f) | 1043 self.ui.warn("%s not removed!\n" % f) |
1040 else: | 1044 else: |
1041 t = self.file(f).read(m[f]) | 1045 t = self.file(f).read(m[f]) |
1042 self.wwrite(f, t, m.flags(f)) | 1046 self.wwrite(f, t, m.flags(f)) |
1043 self.dirstate.normal(f) | 1047 self.dirstate.normal(f) |
1044 finally: | 1048 finally: |
1045 del wlock | 1049 del wlock |
1046 | 1050 |
1047 def copy(self, source, dest, wlock=None): | 1051 def copy(self, source, dest): |
1052 wlock = None | |
1048 try: | 1053 try: |
1049 p = self.wjoin(dest) | 1054 p = self.wjoin(dest) |
1050 if not (os.path.exists(p) or os.path.islink(p)): | 1055 if not (os.path.exists(p) or os.path.islink(p)): |
1051 self.ui.warn(_("%s does not exist!\n") % dest) | 1056 self.ui.warn(_("%s does not exist!\n") % dest) |
1052 elif not (os.path.isfile(p) or os.path.islink(p)): | 1057 elif not (os.path.isfile(p) or os.path.islink(p)): |
1053 self.ui.warn(_("copy failed: %s is not a file or a " | 1058 self.ui.warn(_("copy failed: %s is not a file or a " |
1054 "symbolic link\n") % dest) | 1059 "symbolic link\n") % dest) |
1055 else: | 1060 else: |
1056 if not wlock: | 1061 wlock = self.wlock() |
1057 wlock = self.wlock() | |
1058 if dest not in self.dirstate: | 1062 if dest not in self.dirstate: |
1059 self.dirstate.add(dest) | 1063 self.dirstate.add(dest) |
1060 self.dirstate.copy(source, dest) | 1064 self.dirstate.copy(source, dest) |
1061 finally: | 1065 finally: |
1062 del wlock | 1066 del wlock |
1334 if heads: | 1338 if heads: |
1335 return subset, updated_heads.keys() | 1339 return subset, updated_heads.keys() |
1336 else: | 1340 else: |
1337 return subset | 1341 return subset |
1338 | 1342 |
1339 def pull(self, remote, heads=None, force=False, lock=None): | 1343 def pull(self, remote, heads=None, force=False): |
1340 try: | 1344 lock = self.lock() |
1341 if not lock: | 1345 try: |
1342 lock = self.lock() | |
1343 fetch = self.findincoming(remote, force=force) | 1346 fetch = self.findincoming(remote, force=force) |
1344 if fetch == [nullid]: | 1347 if fetch == [nullid]: |
1345 self.ui.status(_("requesting all changes\n")) | 1348 self.ui.status(_("requesting all changes\n")) |
1346 | 1349 |
1347 if not fetch: | 1350 if not fetch: |