Mercurial > public > mercurial-scm > hg-stable
diff mercurial/exchange.py @ 35273:a1e70c1dbec0
bookmark: use the 'bookmarks' bundle2 part to push bookmark update (issue5165)
We use the new binary parts we introduced earlier to exchange bookmark. The
payload is a bit more compact since we use binary and the length of bookmarks
is no longer constrained to 255.
.. fix:: Issue 5165
Bookmark, whose name is longer than 255, can again be exchanged again
between 4.4+ client and servers.
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Tue, 17 Oct 2017 12:38:13 +0200 |
parents | 3fd5f05a5b87 |
children | cb4dcd7fabe7 |
line wrap: on
line diff
--- a/mercurial/exchange.py Tue Oct 17 12:37:39 2017 +0200 +++ b/mercurial/exchange.py Tue Oct 17 12:38:13 2017 +0200 @@ -897,9 +897,45 @@ if 'bookmarks' in pushop.stepsdone: return b2caps = bundle2.bundle2caps(pushop.remote) - if 'pushkey' in b2caps: + + legacy = pushop.repo.ui.configlist('devel', 'legacy.exchange') + legacybooks = 'bookmarks' in legacy + + if not legacybooks and 'bookmarks' in b2caps: + return _pushb2bookmarkspart(pushop, bundler) + elif 'pushkey' in b2caps: return _pushb2bookmarkspushkey(pushop, bundler) +def _bmaction(old, new): + """small utility for bookmark pushing""" + if not old: + return 'export' + elif not new: + return 'delete' + return 'update' + +def _pushb2bookmarkspart(pushop, bundler): + pushop.stepsdone.add('bookmarks') + if not pushop.outbookmarks: + return + + allactions = [] + data = [] + for book, old, new in pushop.outbookmarks: + new = bin(new) + data.append((book, new)) + allactions.append((book, _bmaction(old, new))) + checkdata = bookmod.binaryencode(data) + bundler.newpart('bookmarks', data=checkdata) + + def handlereply(op): + ui = pushop.ui + # if success + for book, action in allactions: + ui.status(bookmsgmap[action][0] % book) + + return handlereply + def _pushb2bookmarkspushkey(pushop, bundler): pushop.stepsdone.add('bookmarks') part2book = []