mercurial/localrepo.py
changeset 1531 2ba8bf7defda
parent 1516 0b1b029b4de3
child 1532 27077812fffb
equal deleted inserted replaced
1530:abfab59fce79 1531:2ba8bf7defda
   230         else:
   230         else:
   231             self.ui.warn(_("no interrupted transaction available\n"))
   231             self.ui.warn(_("no interrupted transaction available\n"))
   232             return False
   232             return False
   233 
   233 
   234     def undo(self):
   234     def undo(self):
       
   235         wlock = self.wlock()
   235         lock = self.lock()
   236         lock = self.lock()
   236         if os.path.exists(self.join("undo")):
   237         if os.path.exists(self.join("undo")):
   237             self.ui.status(_("rolling back last transaction\n"))
   238             self.ui.status(_("rolling back last transaction\n"))
   238             transaction.rollback(self.opener, self.join("undo"))
   239             transaction.rollback(self.opener, self.join("undo"))
   239             self.dirstate = None
       
   240             util.rename(self.join("undo.dirstate"), self.join("dirstate"))
   240             util.rename(self.join("undo.dirstate"), self.join("dirstate"))
   241             self.dirstate = dirstate.dirstate(self.opener, self.ui, self.root)
   241             self.dirstate.read()
   242         else:
   242         else:
   243             self.ui.warn(_("no undo information available\n"))
   243             self.ui.warn(_("no undo information available\n"))
   244 
   244 
   245     def lock(self, wait=1):
   245     def lock(self, wait=1):
   246         try:
   246         try:
   248         except lock.LockHeld, inst:
   248         except lock.LockHeld, inst:
   249             if wait:
   249             if wait:
   250                 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0])
   250                 self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0])
   251                 return lock.lock(self.join("lock"), wait)
   251                 return lock.lock(self.join("lock"), wait)
   252             raise inst
   252             raise inst
       
   253 
       
   254     def wlock(self, wait=1):
       
   255         try:
       
   256             wlock = lock.lock(self.join("wlock"), 0, self.dirstate.write)
       
   257         except lock.LockHeld, inst:
       
   258             if not wait:
       
   259                 raise inst
       
   260             self.ui.warn(_("waiting for lock held by %s\n") % inst.args[0])
       
   261             wlock = lock.lock(self.join("wlock"), wait, self.dirstate.write)
       
   262         self.dirstate.read()
       
   263         return wlock
   253 
   264 
   254     def rawcommit(self, files, text, user, date, p1=None, p2=None):
   265     def rawcommit(self, files, text, user, date, p1=None, p2=None):
   255         orig_parent = self.dirstate.parents()[0] or nullid
   266         orig_parent = self.dirstate.parents()[0] or nullid
   256         p1 = p1 or self.dirstate.parents()[0] or nullid
   267         p1 = p1 or self.dirstate.parents()[0] or nullid
   257         p2 = p2 or self.dirstate.parents()[1] or nullid
   268         p2 = p2 or self.dirstate.parents()[1] or nullid
   265         if orig_parent == p1:
   276         if orig_parent == p1:
   266             update_dirstate = 1
   277             update_dirstate = 1
   267         else:
   278         else:
   268             update_dirstate = 0
   279             update_dirstate = 0
   269 
   280 
       
   281         wlock = self.wlock()
       
   282         lock = self.lock()
   270         tr = self.transaction()
   283         tr = self.transaction()
   271         mm = m1.copy()
   284         mm = m1.copy()
   272         mfm = mf1.copy()
   285         mfm = mf1.copy()
   273         linkrev = self.changelog.count()
   286         linkrev = self.changelog.count()
   274         for f in files:
   287         for f in files:
   353             return None
   366             return None
   354 
   367 
   355         if not self.hook("precommit"):
   368         if not self.hook("precommit"):
   356             return None
   369             return None
   357 
   370 
       
   371         wlock = self.wlock()
   358         lock = self.lock()
   372         lock = self.lock()
   359         tr = self.transaction()
   373         tr = self.transaction()
   360 
   374 
   361         # check in files
   375         # check in files
   362         new = {}
   376         new = {}
   524             l.sort()
   538             l.sort()
   525 
   539 
   526         return (c, a, d, u)
   540         return (c, a, d, u)
   527 
   541 
   528     def add(self, list):
   542     def add(self, list):
       
   543         wlock = self.wlock()
   529         for f in list:
   544         for f in list:
   530             p = self.wjoin(f)
   545             p = self.wjoin(f)
   531             if not os.path.exists(p):
   546             if not os.path.exists(p):
   532                 self.ui.warn(_("%s does not exist!\n") % f)
   547                 self.ui.warn(_("%s does not exist!\n") % f)
   533             elif not os.path.isfile(p):
   548             elif not os.path.isfile(p):
   536                 self.ui.warn(_("%s already tracked!\n") % f)
   551                 self.ui.warn(_("%s already tracked!\n") % f)
   537             else:
   552             else:
   538                 self.dirstate.update([f], "a")
   553                 self.dirstate.update([f], "a")
   539 
   554 
   540     def forget(self, list):
   555     def forget(self, list):
       
   556         wlock = self.wlock()
   541         for f in list:
   557         for f in list:
   542             if self.dirstate.state(f) not in 'ai':
   558             if self.dirstate.state(f) not in 'ai':
   543                 self.ui.warn(_("%s not added!\n") % f)
   559                 self.ui.warn(_("%s not added!\n") % f)
   544             else:
   560             else:
   545                 self.dirstate.forget([f])
   561                 self.dirstate.forget([f])
   549             for f in list:
   565             for f in list:
   550                 try:
   566                 try:
   551                     util.unlink(self.wjoin(f))
   567                     util.unlink(self.wjoin(f))
   552                 except OSError, inst:
   568                 except OSError, inst:
   553                     if inst.errno != errno.ENOENT: raise
   569                     if inst.errno != errno.ENOENT: raise
       
   570         wlock = self.wlock()
   554         for f in list:
   571         for f in list:
   555             p = self.wjoin(f)
   572             p = self.wjoin(f)
   556             if os.path.exists(p):
   573             if os.path.exists(p):
   557                 self.ui.warn(_("%s still exists!\n") % f)
   574                 self.ui.warn(_("%s still exists!\n") % f)
   558             elif self.dirstate.state(f) == 'a':
   575             elif self.dirstate.state(f) == 'a':
   566     def undelete(self, list):
   583     def undelete(self, list):
   567         p = self.dirstate.parents()[0]
   584         p = self.dirstate.parents()[0]
   568         mn = self.changelog.read(p)[0]
   585         mn = self.changelog.read(p)[0]
   569         mf = self.manifest.readflags(mn)
   586         mf = self.manifest.readflags(mn)
   570         m = self.manifest.read(mn)
   587         m = self.manifest.read(mn)
       
   588         wlock = self.wlock()
   571         for f in list:
   589         for f in list:
   572             if self.dirstate.state(f) not in  "r":
   590             if self.dirstate.state(f) not in  "r":
   573                 self.ui.warn("%s not removed!\n" % f)
   591                 self.ui.warn("%s not removed!\n" % f)
   574             else:
   592             else:
   575                 t = self.file(f).read(m[f])
   593                 t = self.file(f).read(m[f])
   582         if not os.path.exists(p):
   600         if not os.path.exists(p):
   583             self.ui.warn(_("%s does not exist!\n") % dest)
   601             self.ui.warn(_("%s does not exist!\n") % dest)
   584         elif not os.path.isfile(p):
   602         elif not os.path.isfile(p):
   585             self.ui.warn(_("copy failed: %s is not a file\n") % dest)
   603             self.ui.warn(_("copy failed: %s is not a file\n") % dest)
   586         else:
   604         else:
       
   605             wlock = self.wlock()
   587             if self.dirstate.state(dest) == '?':
   606             if self.dirstate.state(dest) == '?':
   588                 self.dirstate.update([dest], "a")
   607                 self.dirstate.update([dest], "a")
   589             self.dirstate.copy(source, dest)
   608             self.dirstate.copy(source, dest)
   590 
   609 
   591     def heads(self):
   610     def heads(self):
  1372 
  1391 
  1373         for f in a + c + u:
  1392         for f in a + c + u:
  1374             mw[f] = ""
  1393             mw[f] = ""
  1375             mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False))
  1394             mfw[f] = util.is_exec(self.wjoin(f), mfw.get(f, False))
  1376 
  1395 
       
  1396         if moddirstate:
       
  1397             wlock = self.wlock()
       
  1398 
  1377         for f in d:
  1399         for f in d:
  1378             if f in mw: del mw[f]
  1400             if f in mw: del mw[f]
  1379 
  1401 
  1380             # If we're jumping between revisions (as opposed to merging),
  1402             # If we're jumping between revisions (as opposed to merging),
  1381             # and if neither the working directory nor the target rev has
  1403             # and if neither the working directory nor the target rev has