diff --git a/hgext/remotenames.py b/hgext/remotenames.py --- a/hgext/remotenames.py +++ b/hgext/remotenames.py @@ -22,6 +22,13 @@ remotenames.hoist Name of the peer whose remotebookmarks should be hoisted into the top-level namespace (default: 'default') + +remotenames.pushtobookmark + Boolean value to change the behavior of bookmark passed to push command using + `-B` flag. If set the true, the changesets will be pushed to that bookmark on + the server. Errors if bookmark does not exists on the server. If multiple + bookmarks are specified using `-B` flag, fallbacks to default behavior. + (default: False) """ from __future__ import absolute_import @@ -30,9 +37,12 @@ from mercurial.node import ( bin, + hex, ) from mercurial import ( bookmarks, + error, + exchange, extensions, logexchange, namespaces, @@ -70,6 +80,33 @@ configitem('remotenames', 'hoist', default='default', ) +configitem('remotenames', 'pushtobookmark', + default=False, +) + +def expushdiscoverybookmarks(pushop): + # config not set, fallback to normal push behavior + if not pushop.repo.ui.configbool('remotenames', 'pushtobookmark'): + return exchange._pushdiscoverybookmarks(pushop) + + # either zero or more than one bookmarks specified, fallback to normal + # push behavior, maybe we should error out in case of multiple bookmarks + if len(pushop.bookmarks) != 1: + return exchange._pushdiscoverybookmarks(pushop) + + remotemarks = pushop.remote.listkeys('bookmarks') + bookmark = pushop.bookmarks[0] + rev = pushop.revs[0] + + # allow new bookmark only if --create is specified + old = '' + if bookmark in remotemarks: + old = remotemarks[bookmark] + else: + msg = _("bookmark '%s' does not exists on remote") + raise error.Abort(msg % bookmark) + + pushop.outbookmarks.append((bookmark, old, hex(rev))) class lazyremotenamedict(mutablemapping): """ @@ -247,6 +284,7 @@ def extsetup(ui): extensions.wrapfunction(bookmarks, '_printbookmarks', wrapprintbookmarks) + exchange.pushdiscoverymapping['bookmarks'] = expushdiscoverybookmarks def reposetup(ui, repo): if not repo.local(): diff --git a/tests/test-logexchange.t b/tests/test-logexchange.t --- a/tests/test-logexchange.t +++ b/tests/test-logexchange.t @@ -333,3 +333,194 @@ default/bar 6:87d6d6676308 default/foo 3:62615734edd5 * foo 8:3e1487808078 + +Testing the remotenames.pushtobookmark config option to push to bookmark + + $ hg up . + 0 files updated, 0 files merged, 0 files removed, 0 files unresolved + (leaving bookmark foo) + $ echo foo > foobar + $ hg add foobar + $ hg ci -m "added foobar" + + $ hg log -G + @ changeset: 9:aa6a885086c0 + | branch: wat + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: added foobar + | + o changeset: 8:3e1487808078 + | branch: wat + | bookmark: foo + | remote branch: $TESTTMP/server2/wat + | remote branch: default/wat + | parent: 4:aa98ab95a928 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: added bar + | + | o changeset: 7:ec2426147f0e + | | remote branch: $TESTTMP/server2/default + | | remote branch: default/default + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: Added h + | | + | o changeset: 6:87d6d6676308 + | | remote bookmark: $TESTTMP/server2/bar + | | remote bookmark: default/bar + | | hoistedname: bar + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: Added g + | | + | o changeset: 5:825660c69f0c + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added f + | + o changeset: 4:aa98ab95a928 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added e + | + o changeset: 3:62615734edd5 + | remote bookmark: $TESTTMP/server2/foo + | remote bookmark: default/foo + | hoistedname: foo + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added d + | + o changeset: 2:28ad74487de9 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added c + | + o changeset: 1:29becc82797a + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added b + | + o changeset: 0:18d04c59bb5d + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: Added a + + $ echo '[remotenames]' >> .hg/hgrc + $ echo 'pushtobookmark = True' >> .hg/hgrc + +Trying to push a non-existing bookmark on the server + + $ hg push ../server/ -B nonexistentbm + pushing to ../server/ + searching for changes + abort: bookmark 'nonexistentbm' does not exists on remote + [255] + + $ hg push ../server/ -B nonexistinentbm -f + pushing to ../server/ + searching for changes + abort: bookmark 'nonexistinentbm' does not exists on remote + [255] + +Pushing changesets to a bookmark on the remote + + $ hg bookmarks -R ../server/ + bar 6:87d6d6676308 + foo 3:62615734edd5 + + $ hg push ../server/ -r . -B foo + pushing to ../server/ + searching for changes + adding changesets + adding manifests + adding file changes + added 1 changesets with 1 changes to 1 files + updating bookmark foo + +After this push, `foo` bookmark on the server is updated whereas the local +bookmark of that name stayed at its own place + + $ hg log -G -R ../server/ -r tip + o changeset: 9:aa6a885086c0 + | branch: wat + ~ bookmark: foo + tag: tip + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: added foobar + + $ hg bookmarks -R ../server/ + bar 6:87d6d6676308 + foo 9:aa6a885086c0 + +XXX: remotebookmarks should have been updated after this push + $ hg log -G + @ changeset: 9:aa6a885086c0 + | branch: wat + | tag: tip + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: added foobar + | + o changeset: 8:3e1487808078 + | branch: wat + | bookmark: foo + | remote branch: $TESTTMP/server2/wat + | remote branch: default/wat + | parent: 4:aa98ab95a928 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: added bar + | + | o changeset: 7:ec2426147f0e + | | remote branch: $TESTTMP/server2/default + | | remote branch: default/default + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: Added h + | | + | o changeset: 6:87d6d6676308 + | | remote bookmark: $TESTTMP/server2/bar + | | remote bookmark: default/bar + | | hoistedname: bar + | | user: test + | | date: Thu Jan 01 00:00:00 1970 +0000 + | | summary: Added g + | | + | o changeset: 5:825660c69f0c + |/ user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added f + | + o changeset: 4:aa98ab95a928 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added e + | + o changeset: 3:62615734edd5 + | remote bookmark: $TESTTMP/server2/foo + | remote bookmark: default/foo + | hoistedname: foo + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added d + | + o changeset: 2:28ad74487de9 + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added c + | + o changeset: 1:29becc82797a + | user: test + | date: Thu Jan 01 00:00:00 1970 +0000 + | summary: Added b + | + o changeset: 0:18d04c59bb5d + user: test + date: Thu Jan 01 00:00:00 1970 +0000 + summary: Added a +