mercurial/localrepo.py
changeset 4917 126f527b3ba3
parent 4916 5c5d23d93447
child 4970 30d4d8985dd8
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: