changeset 42811:3332bde53714 stable

exchange: abort on pushing bookmarks pointing to secret changesets (issue6159) Until now, if there is a bookmark points to a changeset which is in secret phase, hg will push the bookmark, but not the changeset referenced by that bookmark. This leaves the server bookmarks in a bad state, because that bookmark now points to a revision that does not exist on the server. This patch makes hg to abort on such cases. Differential Revision: https://phab.mercurial-scm.org/D6731
author Navaneeth Suresh <navaneeths1998@gmail.com>
date Sat, 17 Aug 2019 01:49:28 +0530
parents cf9dbc7377de
children a4e32fd539ab
files mercurial/exchange.py tests/test-bookmarks-pushpull.t
diffstat 2 files changed, 9 insertions(+), 31 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/exchange.py	Sun Aug 18 02:47:32 2019 +0530
+++ b/mercurial/exchange.py	Sat Aug 17 01:49:28 2019 +0530
@@ -1034,6 +1034,12 @@
         return 'delete'
     return 'update'
 
+def _abortonsecretctx(pushop, node, b):
+    """abort if a given bookmark points to a secret changeset"""
+    if node and pushop.repo[node].phase() == phases.secret:
+        raise error.Abort(_('cannot push bookmark %s as it points to a secret'
+                            ' changeset') % b)
+
 def _pushb2bookmarkspart(pushop, bundler):
     pushop.stepsdone.add('bookmarks')
     if not pushop.outbookmarks:
@@ -1042,6 +1048,7 @@
     allactions = []
     data = []
     for book, old, new in pushop.outbookmarks:
+        _abortonsecretctx(pushop, new, book)
         new = bin(new)
         data.append((book, new))
         allactions.append((book, _bmaction(old, new)))
@@ -1070,6 +1077,7 @@
         assert False
 
     for book, old, new in pushop.outbookmarks:
+        _abortonsecretctx(pushop, new, book)
         part = bundler.newpart('pushkey')
         part.addparam('namespace', enc('bookmarks'))
         part.addparam('key', enc(book))
--- a/tests/test-bookmarks-pushpull.t	Sun Aug 18 02:47:32 2019 +0530
+++ b/tests/test-bookmarks-pushpull.t	Sat Aug 17 01:49:28 2019 +0530
@@ -1344,39 +1344,9 @@
   $ hg commit -qAm_ --config phases.new-commit=secret
 
 Pushing the bookmark "foo" now fails as it contains a secret changeset
-#if b2-pushkey
-  $ hg push -r foo
-  pushing to $TESTTMP/issue6159remote
-  searching for changes
-  no changes found (ignored 1 secret changesets)
-  abort: updating bookmark foo failed!
-  [255]
-#endif
-
-#if b2-binary
   $ hg push -r foo
   pushing to $TESTTMP/issue6159remote
   searching for changes
   no changes found (ignored 1 secret changesets)
-  updating bookmark foo
-  [1]
-#endif
-
-Now the "remote" repo contains a bookmark pointing to a nonexistent revision
-  $ cd ../issue6159remote
-#if b2-pushkey
-  $ hg bookmark
-   * foo                       0:1599bc8b897a
-  $ hg log -r 1599bc8b897a
-  0:1599bc8b897a _ (no-eol)
-#endif
-
-#if b2-binary
-  $ hg bookmark
-  no bookmarks set
-  $ cat .hg/bookmarks
-  cf489fd8a374cab73c2dc19e899bde6fe3a43f8f foo
-  $ hg log -r cf489fd8a374
-  abort: unknown revision 'cf489fd8a374'!
+  abort: cannot push bookmark foo as it points to a secret changeset
   [255]
-#endif