Mercurial > hg
changeset 15887:12dea4d998ec
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.
author | Mads Kiilerich <mads@kiilerich.com> |
---|---|
date | Fri, 13 Jan 2012 02:30:43 +0100 |
parents | a5917346c72e |
children | 2072e4031994 |
files | mercurial/bookmarks.py mercurial/hg.py |
diffstat | 2 files changed, 13 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- 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()