diff -r 0e4af72cbd7f -r 3f5e75c22585 mercurial/localrepo.py --- a/mercurial/localrepo.py Tue Apr 30 10:51:25 2013 +0200 +++ b/mercurial/localrepo.py Tue Apr 30 21:19:56 2013 +0200 @@ -1764,9 +1764,29 @@ unfi = self.unfiltered() def localphasemove(nodes, phase=phases.public): """move to in the local source repo""" - phases.advanceboundary(self, phase, nodes) + if locallock is not None: + phases.advanceboundary(self, phase, nodes) + else: + # repo is not locked, do not change any phases! + # Informs the user that phases should have been moved when + # applicable. + actualmoves = [n for n in nodes if phase < self[n].phase()] + phasestr = phases.phasenames[phase] + if actualmoves: + self.ui.status(_('cannot lock source repo, skipping local' + ' %s phase update\n') % phasestr) # get local lock as we might write phase data - locallock = self.lock() + locallock = None + try: + locallock = self.lock() + except IOError, err: + if err.errno != errno.EACCES: + raise + # source repo cannot be locked. + # We do not abort the push, but just disable the local phase + # synchronisation. + msg = 'cannot lock source repository: %s\n' % err + self.ui.debug(msg) try: self.checkpush(force, revs) lock = None @@ -1918,7 +1938,8 @@ if lock is not None: lock.release() finally: - locallock.release() + if locallock is not None: + locallock.release() self.ui.debug("checking for updated bookmarks\n") rb = remote.listkeys('bookmarks')