push: continue without locking on lock failure other than EEXIST (
issue5882)
This code was added by
3f5e75c22585 "push: make locking of source optional
(
issue3684)", but EACCES isn't the only error that could be triggered by
filesystem permission. I think catching LockUnavailable is more appropriate
than testing errno value by caller.
--- a/mercurial/exchange.py Sat May 12 22:29:28 2018 +0200
+++ b/mercurial/exchange.py Tue May 15 22:12:55 2018 +0900
@@ -8,7 +8,6 @@
from __future__ import absolute_import
import collections
-import errno
import hashlib
from .i18n import _
@@ -513,9 +512,7 @@
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.
--- a/tests/test-phases-exchange.t Sat May 12 22:29:28 2018 +0200
+++ b/tests/test-phases-exchange.t Tue May 15 22:12:55 2018 +0900
@@ -1307,6 +1307,18 @@
[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