mercurial/localrepo.py
changeset 4917 126f527b3ba3
parent 4916 5c5d23d93447
child 4970 30d4d8985dd8
--- a/mercurial/localrepo.py	Sat Jul 21 16:02:10 2007 -0500
+++ b/mercurial/localrepo.py	Sat Jul 21 16:02:10 2007 -0500
@@ -530,12 +530,11 @@
         finally:
             del l
 
-    def rollback(self, wlock=None, lock=None):
+    def rollback(self):
+        wlock = lock = None
         try:
-            if not wlock:
-                wlock = self.wlock()
-            if not lock:
-                lock = self.lock()
+            wlock = self.wlock()
+            lock = self.lock()
             if os.path.exists(self.sjoin("undo")):
                 self.ui.status(_("rolling back last transaction\n"))
                 transaction.rollback(self.sopener, self.sjoin("undo"))
@@ -570,13 +569,23 @@
         return l
 
     def lock(self, wait=True):
-        return self._lock(self.sjoin("lock"), wait, None, self.invalidate,
-                          _('repository %s') % self.origroot)
+        if self._lockref and self._lockref():
+            return self._lockref()
+
+        l = self._lock(self.sjoin("lock"), wait, None, self.invalidate,
+                       _('repository %s') % self.origroot)
+        self._lockref = weakref.ref(l)
+        return l
 
     def wlock(self, wait=True):
-        return self._lock(self.join("wlock"), wait, self.dirstate.write,
-                          self.dirstate.invalidate,
-                          _('working directory of %s') % self.origroot)
+        if self._wlockref and self._wlockref():
+            return self._wlockref()
+
+        l = self._lock(self.join("wlock"), wait, self.dirstate.write,
+                       self.dirstate.invalidate, _('working directory of %s') %
+                       self.origroot)
+        self._wlockref = weakref.ref(l)
+        return l
 
     def filecommit(self, fn, manifest1, manifest2, linkrev, transaction, changelist):
         """
@@ -638,16 +647,16 @@
         changelist.append(fn)
         return fl.add(t, meta, transaction, linkrev, fp1, fp2)
 
-    def rawcommit(self, files, text, user, date, p1=None, p2=None, wlock=None, extra={}):
+    def rawcommit(self, files, text, user, date, p1=None, p2=None, extra={}):
         if p1 is None:
             p1, p2 = self.dirstate.parents()
         return self.commit(files=files, text=text, user=user, date=date,
-                           p1=p1, p2=p2, wlock=wlock, extra=extra)
+                           p1=p1, p2=p2, extra=extra)
 
     def commit(self, files=None, text="", user=None, date=None,
-               match=util.always, force=False, lock=None, wlock=None,
-               force_editor=False, p1=None, p2=None, extra={}):
-        tr = None
+               match=util.always, force=False, force_editor=False,
+               p1=None, p2=None, extra={}):
+        wlock = lock = tr = None
         try:
             commit = []
             remove = []
@@ -707,10 +716,8 @@
 
             self.hook("precommit", throw=True, parent1=xp1, parent2=xp2)
 
-            if not wlock:
-                wlock = self.wlock()
-            if not lock:
-                lock = self.lock()
+            wlock = self.wlock()
+            lock = self.lock()
             tr = self.transaction()
 
             # check in files
@@ -854,7 +861,7 @@
                 yield src, fn
 
     def status(self, node1=None, node2=None, files=[], match=util.always,
-                wlock=None, list_ignored=False, list_clean=False):
+               list_ignored=False, list_clean=False):
         """return status of files between two nodes or node and working directory
 
         If node1 is None, use the first dirstate parent instead.
@@ -908,18 +915,17 @@
 
                     # update dirstate for files that are actually clean
                     if fixup:
-                        fixlock = wlock
+                        wlock = None
                         try:
-                            if not fixlock:
-                                try:
-                                    fixlock = self.wlock(False)
-                                except lock.LockException:
-                                    pass
-                            if fixlock:
+                            try:
+                                wlock = self.wlock(False)
+                            except lock.LockException:
+                                pass
+                            if wlock:
                                 for f in fixup:
                                     self.dirstate.normal(f)
                         finally:
-                            del fixlock
+                            del wlock
             else:
                 # we are comparing working dir against non-parent
                 # generate a pseudo-manifest for the working dir
@@ -966,10 +972,9 @@
             l.sort()
         return (modified, added, removed, deleted, unknown, ignored, clean)
 
-    def add(self, list, wlock=None):
+    def add(self, list):
+        wlock = self.wlock()
         try:
-            if not wlock:
-                wlock = self.wlock()
             for f in list:
                 p = self.wjoin(f)
                 try:
@@ -992,10 +997,9 @@
         finally:
             del wlock
 
-    def forget(self, list, wlock=None):
+    def forget(self, list):
+        wlock = self.wlock()
         try:
-            if not wlock:
-                wlock = self.wlock()
             for f in list:
                 if self.dirstate[f] != 'a':
                     self.ui.warn(_("%s not added!\n") % f)
@@ -1004,7 +1008,8 @@
         finally:
             del wlock
 
-    def remove(self, list, unlink=False, wlock=None):
+    def remove(self, list, unlink=False):
+        wlock = None
         try:
             if unlink:
                 for f in list:
@@ -1013,8 +1018,7 @@
                     except OSError, inst:
                         if inst.errno != errno.ENOENT:
                             raise
-            if not wlock:
-                wlock = self.wlock()
+            wlock = self.wlock()
             for f in list:
                 if unlink and os.path.exists(self.wjoin(f)):
                     self.ui.warn(_("%s still exists!\n") % f)
@@ -1027,13 +1031,13 @@
         finally:
             del wlock
 
-    def undelete(self, list, wlock=None):
+    def undelete(self, list):
+        wlock = None
         try:
             p = self.dirstate.parents()[0]
             mn = self.changelog.read(p)[0]
             m = self.manifest.read(mn)
-            if not wlock:
-                wlock = self.wlock()
+            wlock = self.wlock()
             for f in list:
                 if self.dirstate[f] != 'r':
                     self.ui.warn("%s not removed!\n" % f)
@@ -1044,7 +1048,8 @@
         finally:
             del wlock
 
-    def copy(self, source, dest, wlock=None):
+    def copy(self, source, dest):
+        wlock = None
         try:
             p = self.wjoin(dest)
             if not (os.path.exists(p) or os.path.islink(p)):
@@ -1053,8 +1058,7 @@
                 self.ui.warn(_("copy failed: %s is not a file or a "
                                "symbolic link\n") % dest)
             else:
-                if not wlock:
-                    wlock = self.wlock()
+                wlock = self.wlock()
                 if dest not in self.dirstate:
                     self.dirstate.add(dest)
                 self.dirstate.copy(source, dest)
@@ -1336,10 +1340,9 @@
         else:
             return subset
 
-    def pull(self, remote, heads=None, force=False, lock=None):
+    def pull(self, remote, heads=None, force=False):
+        lock = self.lock()
         try:
-            if not lock:
-                lock = self.lock()
             fetch = self.findincoming(remote, force=force)
             if fetch == [nullid]:
                 self.ui.status(_("requesting all changes\n"))