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.
--- 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()