bookmarks: avoid traceback when two pushes race to delete the same bookmark
authorValentin Gatien-Baron <valentin.gatienbaron@gmail.com>
Sat, 15 Feb 2020 14:51:33 -0500
changeset 44370 edaae3616ba3
parent 44369 815c63526d1d
child 44371 0275000564c4
bookmarks: avoid traceback when two pushes race to delete the same bookmark `hg push -f -B remote-only-bookmark` can raise server-side in `bookmarks._del` (specifically in `self._refmap.pop(mark)`), if the remote-only bookmark got deleted concurrently. Fix this by simply not deleting the non-existent bookmark in that case. For avoidance of doubt, refusing to delete a bookmark that doesn't exist when the push starts is taking care of elsewhere; no change of behavior there. Differential Revision: https://phab.mercurial-scm.org/D8124
mercurial/bookmarks.py
relnotes/next
--- a/mercurial/bookmarks.py	Sat Feb 15 15:06:41 2020 -0500
+++ b/mercurial/bookmarks.py	Sat Feb 15 14:51:33 2020 -0500
@@ -173,6 +173,8 @@
             nrefs.sort()
 
     def _del(self, mark):
+        if mark not in self._refmap:
+            return
         self._clean = False
         node = self._refmap.pop(mark)
         nrefs = self._nodemap[node]
--- a/relnotes/next	Sat Feb 15 15:06:41 2020 -0500
+++ b/relnotes/next	Sat Feb 15 14:51:33 2020 -0500
@@ -27,6 +27,7 @@
 
 == Bug Fixes  ==
 
+ * Fix server exception when concurrent pushes delete the same bookmark
 
 == Backwards Compatibility Changes ==