# HG changeset patch # User Mads Kiilerich # Date 2012-01-13 01:30:43 # 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 --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -84,7 +84,7 @@ def write(repo): 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 @@ def write(repo): 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 @@ def setcurrent(repo, mark): 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 @@ def listbookmarks(repo): 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 @@ def pushbookmark(repo, key, old, new): write(repo) return True finally: - w.release() + lock.release() def updatefromremote(ui, repo, remote, path): ui.debug("checking for updated bookmarks\n") diff --git a/mercurial/hg.py b/mercurial/hg.py --- a/mercurial/hg.py +++ b/mercurial/hg.py @@ -279,7 +279,7 @@ def clone(ui, peeropts, source, dest=Non 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 @@ def clone(ui, peeropts, source, dest=Non # 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 @@ def clone(ui, peeropts, source, dest=Non return srcrepo, destrepo finally: - release(srclock, destlock) + release(srclock, destlock, destwlock) if dircleanup is not None: dircleanup.cleanup()