diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py --- a/mercurial/bookmarks.py +++ b/mercurial/bookmarks.py @@ -487,6 +487,8 @@ def pushbookmark(repo, key, old, new): + if isdivergent(key): + return False if bookmarksinstore(repo): wlock = util.nullcontextmanager() else: diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py --- a/mercurial/bundle2.py +++ b/mercurial/bundle2.py @@ -2368,6 +2368,11 @@ b'prepushkey', throw=True, **pycompat.strkwargs(hookargs) ) + for book, node in changes: + if bookmarks.isdivergent(book): + msg = _(b'cannot accept divergent bookmark %s!') % book + raise error.Abort(msg) + bookstore.applychanges(op.repo, op.gettransaction(), changes) if pushkeycompat: diff --git a/mercurial/exchange.py b/mercurial/exchange.py --- a/mercurial/exchange.py +++ b/mercurial/exchange.py @@ -856,7 +856,11 @@ for b, scid, dcid in addsrc: if b in explicit: explicit.remove(b) - pushop.outbookmarks.append((b, b'', scid)) + if bookmod.isdivergent(b): + pushop.ui.warn(_(b'cannot push divergent bookmark %s!\n') % b) + pushop.bkresult = 2 + else: + pushop.outbookmarks.append((b, b'', scid)) # search for overwritten bookmark for b, scid, dcid in list(advdst) + list(diverge) + list(differ): if b in explicit: diff --git a/relnotes/next b/relnotes/next --- a/relnotes/next +++ b/relnotes/next @@ -24,6 +24,7 @@ * Use `hg copy --forget --at-rev REV` to unmark already committed copies. + * prevent pushes of divergent bookmarks (foo@remote) == Bug Fixes == diff --git a/tests/test-bookmarks-pushpull.t b/tests/test-bookmarks-pushpull.t --- a/tests/test-bookmarks-pushpull.t +++ b/tests/test-bookmarks-pushpull.t @@ -328,6 +328,17 @@ #endif +Divergent bookmark cannot be exported + + $ hg book W@default + $ hg push -B W@default ../a + pushing to ../a + searching for changes + cannot push divergent bookmark W@default! + no changes found + [2] + $ hg book -d W@default + export the active bookmark $ hg bookmark V