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: |