# HG changeset patch # User Mads Kiilerich # Date 1326418243 -3600 # Node ID 12dea4d998ecb5f18969c51d9b86fd19eb0e09fc # Parent a5917346c72e7a52f4116ff1fab5f19060989b8a 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. diff -r a5917346c72e -r 12dea4d998ec mercurial/bookmarks.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") diff -r a5917346c72e -r 12dea4d998ec mercurial/hg.py --- 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()