# HG changeset patch # User Pierre-Yves David # Date 1411876313 25200 # Node ID b901645a8784c0e2b1fb6387eba26a1b99fe4c62 # Parent 36952c91e6c33f37145d5a1ba8a9d8cf1544d687 push: gather all bookmark decisions together The discovery phases for bookmarks now use the list of explicitly pushed bookmarks to do addition, removal and overwriting. Tests are impacted because this reduces the amount of listkeys calls issued, removes some duplicated messages and improves the accuracy of some messages. diff -r 36952c91e6c3 -r b901645a8784 mercurial/exchange.py --- a/mercurial/exchange.py Fri Sep 26 18:33:11 2014 -0700 +++ b/mercurial/exchange.py Sat Sep 27 20:51:53 2014 -0700 @@ -226,10 +226,6 @@ if locallock is not None: locallock.release() - if pushop.bookmarks: - pushop.bkresult = bookmod.pushtoremote(repo.ui, repo, remote, - pushop.bookmarks) - return pushop # list of steps to perform discovery before push @@ -334,11 +330,40 @@ ancestors = repo.changelog.ancestors(revnums, inclusive=True) remotebookmark = remote.listkeys('bookmarks') + explicit = set(pushop.bookmarks) + comp = bookmod.compare(repo, repo._bookmarks, remotebookmark, srchex=hex) addsrc, adddst, advsrc, advdst, diverge, differ, invalid = comp for b, scid, dcid in advsrc: + if b in explicit: + explicit.remove(b) if not ancestors or repo[scid].rev() in ancestors: pushop.outbookmarks.append((b, dcid, scid)) + # search added bookmark + for b, scid, dcid in addsrc: + if b in explicit: + explicit.remove(b) + pushop.outbookmarks.append((b, '', scid)) + # search for overwritten bookmark + for b, scid, dcid in advdst + diverge + differ: + if b in explicit: + explicit.remove(b) + pushop.outbookmarks.append((b, dcid, scid)) + # search for bookmark to delete + for b, scid, dcid in adddst: + if b in explicit: + explicit.remove(b) + # treat as "deleted locally" + pushop.outbookmarks.append((b, dcid, '')) + + if explicit: + explicit = sorted(explicit) + # we should probably list all of them + ui.warn(_('bookmark %s does not exist on the local ' + 'or remote repository!\n') % explicit[0]) + pushop.bkresult = 2 + + pushop.outbookmarks.sort() def _pushcheckoutgoing(pushop): outgoing = pushop.outgoing diff -r 36952c91e6c3 -r b901645a8784 tests/test-bookmarks-pushpull.t --- a/tests/test-bookmarks-pushpull.t Fri Sep 26 18:33:11 2014 -0700 +++ b/tests/test-bookmarks-pushpull.t Sat Sep 27 20:51:53 2014 -0700 @@ -99,8 +99,8 @@ $ hg push -B badname ../a pushing to ../a searching for changes + bookmark badname does not exist on the local or remote repository! no changes found - bookmark badname does not exist on the local or remote repository! [2] $ hg pull -B anotherbadname ../a pulling from ../a @@ -356,7 +356,7 @@ pushing to http://localhost:$HGPORT/ searching for changes no changes found - exporting bookmark Z + updating bookmark Z [1] $ hg book -d Z $ hg in -B http://localhost:$HGPORT/ diff -r 36952c91e6c3 -r b901645a8784 tests/test-bundle2.t --- a/tests/test-bundle2.t Fri Sep 26 18:33:11 2014 -0700 +++ b/tests/test-bundle2.t Sat Sep 27 20:51:53 2014 -0700 @@ -881,7 +881,6 @@ remote: added 1 changesets with 0 changes to 0 files (-1 heads) remote: 1 new obsolescence markers updating bookmark book_eea1 - exporting bookmark book_eea1 $ hg -R other log -G o 3:eea13746799a public Nicolas Dumazet book_eea1 G |\ @@ -950,7 +949,6 @@ remote: added 1 changesets with 1 changes to 1 files remote: 1 new obsolescence markers updating bookmark book_5fdd - exporting bookmark book_5fdd $ hg -R other log -G o 6:5fddd98957c8 draft Nicolas Dumazet book_5fdd C | @@ -989,7 +987,6 @@ remote: added 1 changesets with 1 changes to 1 files remote: 1 new obsolescence markers updating bookmark book_32af - exporting bookmark book_32af $ cat other-error.log Check final content. diff -r 36952c91e6c3 -r b901645a8784 tests/test-hook.t --- a/tests/test-hook.t Fri Sep 26 18:33:11 2014 -0700 +++ b/tests/test-hook.t Sat Sep 27 20:51:53 2014 -0700 @@ -183,8 +183,8 @@ pushing to ../a searching for changes no changes found + pushkey hook: HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1 exporting bookmark foo - pushkey hook: HG_KEY=foo HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 HG_RET=1 [1] $ cd ../a @@ -215,8 +215,6 @@ listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} no changes found listkeys hook: HG_NAMESPACE=phases HG_VALUES={'cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b': '1', 'publishing': 'True'} - listkeys hook: HG_NAMESPACE=bookmarks HG_VALUES={'bar': '0000000000000000000000000000000000000000', 'foo': '0000000000000000000000000000000000000000'} - exporting bookmark baz prepushkey.forbid hook: HG_KEY=baz HG_NAMESPACE=bookmarks HG_NEW=0000000000000000000000000000000000000000 abort: prepushkey hook exited with status 1 [255]