push: continue without locking on lock failure other than EEXIST (issue5882) stable
authorYuya Nishihara <yuya@tcha.org>
Tue, 15 May 2018 22:12:55 +0900
branchstable
changeset 38000 7c05198cd1ca
parent 37980 273ea09f6550
child 38032 f9dc1d5b676b
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.
mercurial/exchange.py
tests/test-phases-exchange.t
--- 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