diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -8,7 +8,6 @@ from __future__ import absolute_import import collections -import errno import hashlib from .i18n import _ @@ -513,9 +512,7 @@ def push(repo, remote, force=False, revs pushop.trmanager = transactionmanager(pushop.repo, 'push-response', pushop.remote.url()) - except IOError as err: - if err.errno != errno.EACCES: - raise + except error.LockUnavailable as err: # source repo cannot be locked. # We do not abort the push, but just disable the local phase # synchronisation. diff --git a/tests/test-phases-exchange.t b/tests/test-phases-exchange.t --- a/tests/test-phases-exchange.t +++ b/tests/test-phases-exchange.t @@ -1307,6 +1307,18 @@ 2. Test that failed phases movement are [1] $ chmod -R +w .hg +3. Test that push is prevented if lock was already acquired (not a permission +error, but EEXIST) + + $ touch .hg/store/lock + $ hg push ../Phi --config ui.timeout=1 + pushing to ../Phi + waiting for lock on repository $TESTTMP/Upsilon held by '' + abort: repository $TESTTMP/Upsilon: timed out waiting for lock held by '' + (lock might be very busy) + [255] + $ rm .hg/store/lock + $ cd .. #endif