bookmarks: primarily use repo lock, not wlock
authorMads Kiilerich <mads@kiilerich.com>
Fri, 13 Jan 2012 02:30:43 +0100
changeset 15887 12dea4d998ec
parent 15886 a5917346c72e
child 15888 2072e4031994
bookmarks: primarily use repo lock, not wlock Bookmarks are repository data, not working directory data. Only the current bookmark is working directory data. Some lock shuffling is required to avoid lockout between the initial mock lock and locking of the localrepo instance that is created after copying.
mercurial/bookmarks.py
mercurial/hg.py
--- a/mercurial/bookmarks.py	Fri Jan 13 02:29:38 2012 +0100
+++ b/mercurial/bookmarks.py	Fri Jan 13 02:30:43 2012 +0100
@@ -84,7 +84,7 @@
             raise util.Abort(_("bookmark '%s' contains illegal "
                 "character" % mark))
 
-    wlock = repo.wlock()
+    lock = repo.lock()
     try:
 
         file = repo.opener('bookmarks', 'w', atomictemp=True)
@@ -99,7 +99,7 @@
             pass
 
     finally:
-        wlock.release()
+        lock.release()
 
 def setcurrent(repo, mark):
     '''Set the name of the bookmark that we are currently on
@@ -117,13 +117,13 @@
         raise util.Abort(_("bookmark '%s' contains illegal "
             "character" % mark))
 
-    wlock = repo.wlock()
+    lock = repo.lock()
     try:
         file = repo.opener('bookmarks.current', 'w', atomictemp=True)
         file.write(encoding.fromlocal(mark))
         file.close()
     finally:
-        wlock.release()
+        lock.release()
     repo._bookmarkcurrent = mark
 
 def updatecurrentbookmark(repo, oldnode, curbranch):
@@ -162,7 +162,7 @@
     return d
 
 def pushbookmark(repo, key, old, new):
-    w = repo.wlock()
+    lock = repo.lock()
     try:
         marks = repo._bookmarks
         if hex(marks.get(key, '')) != old:
@@ -176,7 +176,7 @@
         write(repo)
         return True
     finally:
-        w.release()
+        lock.release()
 
 def updatefromremote(ui, repo, remote, path):
     ui.debug("checking for updated bookmarks\n")
--- a/mercurial/hg.py	Fri Jan 13 02:29:38 2012 +0100
+++ b/mercurial/hg.py	Fri Jan 13 02:30:43 2012 +0100
@@ -279,7 +279,7 @@
             if self.dir_:
                 self.rmtree(self.dir_, True)
 
-    srclock = destlock = dircleanup = None
+    srclock = destwlock = destlock = dircleanup = None
     try:
         abspath = origsource
         if islocal(origsource):
@@ -325,6 +325,11 @@
             # we need to re-init the repo after manually copying the data
             # into it
             destrepo = repository(remoteui(ui, peeropts), dest)
+            # we need full recursive locking of the new repo instance
+            destwlock = destrepo.wlock()
+            if destlock:
+                destlock.release() # a little race condition - but no deadlock
+            destlock = destrepo.lock()
             srcrepo.hook('outgoing', source='clone',
                           node=node.hex(node.nullid))
         else:
@@ -401,7 +406,7 @@
 
         return srcrepo, destrepo
     finally:
-        release(srclock, destlock)
+        release(srclock, destlock, destwlock)
         if dircleanup is not None:
             dircleanup.cleanup()