[PATCH 05 of 10 V8] bookmarks: make bookmarks.compare accept binary nodes
Stanislau Hlebik
stash at fb.com
Sat Nov 12 20:19:55 UTC 2016
# HG changeset patch
# User Stanislau Hlebik <stash at fb.com>
# Date 1478980606 28800
# Sat Nov 12 11:56:46 2016 -0800
# Branch stable
# Node ID 745156544137985fe5c6b31fe99232e84d596ec4
# Parent 767dc51625be5f1ca62fe15cfa17f96dcd1b7cec
bookmarks: make bookmarks.compare accept binary nodes
New `bookmarks` bundle2 part will contain byte nodes, and since bookmarks are
stored in binary format, it doesn't make sense to convert them from binary to
hex and then back to binary again
diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
--- a/mercurial/bookmarks.py
+++ b/mercurial/bookmarks.py
@@ -390,8 +390,7 @@
finally:
lockmod.release(tr, l, w)
-def compare(repo, srcmarks, dstmarks,
- srchex=None, dsthex=None, targets=None):
+def compare(repo, srcmarks, dstmarks, targets=None):
'''Compare bookmarks between srcmarks and dstmarks
This returns tuple "(addsrc, adddst, advsrc, advdst, diverge,
@@ -414,19 +413,9 @@
Changeset IDs of tuples in "addsrc", "adddst", "differ" or
"invalid" list may be unknown for repo.
- This function expects that "srcmarks" and "dstmarks" return
- changeset ID in 40 hexadecimal digit string for specified
- bookmark. If not so (e.g. bmstore "repo._bookmarks" returning
- binary value), "srchex" or "dsthex" should be specified to convert
- into such form.
-
If "targets" is specified, only bookmarks listed in it are
examined.
'''
- if not srchex:
- srchex = lambda x: x
- if not dsthex:
- dsthex = lambda x: x
if targets:
bset = set(targets)
@@ -448,14 +437,14 @@
for b in sorted(bset):
if b not in srcmarks:
if b in dstmarks:
- adddst((b, None, dsthex(dstmarks[b])))
+ adddst((b, None, dstmarks[b]))
else:
invalid((b, None, None))
elif b not in dstmarks:
- addsrc((b, srchex(srcmarks[b]), None))
+ addsrc((b, srcmarks[b], None))
else:
- scid = srchex(srcmarks[b])
- dcid = dsthex(dstmarks[b])
+ scid = srcmarks[b]
+ dcid = dstmarks[b]
if scid == dcid:
same((b, scid, dcid))
elif scid in repo and dcid in repo:
@@ -506,11 +495,17 @@
return None
+def hexifybookmarks(marks):
+ binremotemarks = {}
+ for name, node in marks.items():
+ binremotemarks[name] = bin(node)
+ return binremotemarks
+
def updatefromremote(ui, repo, remotemarks, path, trfunc, explicit=()):
ui.debug("checking for updated bookmarks\n")
localmarks = repo._bookmarks
(addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same
- ) = compare(repo, remotemarks, localmarks, dsthex=hex)
+ ) = compare(repo, remotemarks, localmarks)
status = ui.status
warn = ui.warn
@@ -521,15 +516,15 @@
changed = []
for b, scid, dcid in addsrc:
if scid in repo: # add remote bookmarks for changes we already have
- changed.append((b, bin(scid), status,
+ changed.append((b, scid, status,
_("adding remote bookmark %s\n") % (b)))
elif b in explicit:
explicit.remove(b)
ui.warn(_("remote bookmark %s points to locally missing %s\n")
- % (b, scid[:12]))
+ % (b, hex(scid)[:12]))
for b, scid, dcid in advsrc:
- changed.append((b, bin(scid), status,
+ changed.append((b, scid, status,
_("updating bookmark %s\n") % (b)))
# remove normal movement from explicit set
explicit.difference_update(d[0] for d in changed)
@@ -537,13 +532,12 @@
for b, scid, dcid in diverge:
if b in explicit:
explicit.discard(b)
- changed.append((b, bin(scid), status,
+ changed.append((b, scid, status,
_("importing bookmark %s\n") % (b)))
else:
- snode = bin(scid)
- db = _diverge(ui, b, path, localmarks, snode)
+ db = _diverge(ui, b, path, localmarks, scid)
if db:
- changed.append((db, snode, warn,
+ changed.append((db, scid, warn,
_("divergent bookmark %s stored as %s\n") %
(b, db)))
else:
@@ -552,13 +546,13 @@
for b, scid, dcid in adddst + advdst:
if b in explicit:
explicit.discard(b)
- changed.append((b, bin(scid), status,
+ changed.append((b, scid, status,
_("importing bookmark %s\n") % (b)))
for b, scid, dcid in differ:
if b in explicit:
explicit.remove(b)
ui.warn(_("remote bookmark %s points to locally missing %s\n")
- % (b, scid[:12]))
+ % (b, hex(scid)[:12]))
if changed:
tr = trfunc()
@@ -572,8 +566,8 @@
'''
ui.status(_("searching for changed bookmarks\n"))
- r = compare(repo, other.listkeys('bookmarks'), repo._bookmarks,
- dsthex=hex)
+ remotemarks = hexifybookmarks(other.listkeys('bookmarks'))
+ r = compare(repo, remotemarks, repo._bookmarks)
addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
incomings = []
@@ -589,16 +583,16 @@
incomings.append(" %-25s %s\n" % (b, getid(id)))
for b, scid, dcid in addsrc:
# i18n: "added" refers to a bookmark
- add(b, scid, _('added'))
+ add(b, hex(scid), _('added'))
for b, scid, dcid in advsrc:
# i18n: "advanced" refers to a bookmark
- add(b, scid, _('advanced'))
+ add(b, hex(scid), _('advanced'))
for b, scid, dcid in diverge:
# i18n: "diverged" refers to a bookmark
- add(b, scid, _('diverged'))
+ add(b, hex(scid), _('diverged'))
for b, scid, dcid in differ:
# i18n: "changed" refers to a bookmark
- add(b, scid, _('changed'))
+ add(b, hex(scid), _('changed'))
if not incomings:
ui.status(_("no changed bookmarks found\n"))
@@ -614,8 +608,8 @@
'''
ui.status(_("searching for changed bookmarks\n"))
- r = compare(repo, repo._bookmarks, other.listkeys('bookmarks'),
- srchex=hex)
+ remotemarks = hexifybookmarks(other.listkeys('bookmarks'))
+ r = compare(repo, repo._bookmarks, remotemarks)
addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
outgoings = []
@@ -631,19 +625,19 @@
outgoings.append(" %-25s %s\n" % (b, getid(id)))
for b, scid, dcid in addsrc:
# i18n: "added refers to a bookmark
- add(b, scid, _('added'))
+ add(b, hex(scid), _('added'))
for b, scid, dcid in adddst:
# i18n: "deleted" refers to a bookmark
add(b, ' ' * 40, _('deleted'))
for b, scid, dcid in advsrc:
# i18n: "advanced" refers to a bookmark
- add(b, scid, _('advanced'))
+ add(b, hex(scid), _('advanced'))
for b, scid, dcid in diverge:
# i18n: "diverged" refers to a bookmark
- add(b, scid, _('diverged'))
+ add(b, hex(scid), _('diverged'))
for b, scid, dcid in differ:
# i18n: "changed" refers to a bookmark
- add(b, scid, _('changed'))
+ add(b, hex(scid), _('changed'))
if not outgoings:
ui.status(_("no changed bookmarks found\n"))
@@ -659,8 +653,8 @@
This returns "(# of incoming, # of outgoing)" tuple.
'''
- r = compare(repo, other.listkeys('bookmarks'), repo._bookmarks,
- dsthex=hex)
+ remotemarks = hexifybookmarks(other.listkeys('bookmarks'))
+ r = compare(repo, remotemarks, repo._bookmarks)
addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = r
return (len(addsrc), len(adddst))
diff --git a/mercurial/exchange.py b/mercurial/exchange.py
--- a/mercurial/exchange.py
+++ b/mercurial/exchange.py
@@ -608,8 +608,21 @@
explicit = set([repo._bookmarks.expandname(bookmark)
for bookmark in pushop.bookmarks])
- comp = bookmod.compare(repo, repo._bookmarks, remotebookmark, srchex=hex)
+ remotebookmark = bookmod.hexifybookmarks(remotebookmark)
+ comp = bookmod.compare(repo, repo._bookmarks, remotebookmark)
+
+ def safehex(x):
+ if x is None:
+ return x
+ return hex(x)
+
+ def hexifycompbookmarks(bookmarks):
+ for b, scid, dcid in bookmarks:
+ yield b, safehex(scid), safehex(dcid)
+
+ comp = [hexifycompbookmarks(marks) for marks in comp]
addsrc, adddst, advsrc, advdst, diverge, differ, invalid, same = comp
+
for b, scid, dcid in advsrc:
if b in explicit:
explicit.remove(b)
@@ -621,7 +634,7 @@
explicit.remove(b)
pushop.outbookmarks.append((b, '', scid))
# search for overwritten bookmark
- for b, scid, dcid in advdst + diverge + differ:
+ for b, scid, dcid in list(advdst) + list(diverge) + list(differ):
if b in explicit:
explicit.remove(b)
pushop.outbookmarks.append((b, dcid, scid))
@@ -1460,6 +1473,7 @@
pullop.stepsdone.add('bookmarks')
repo = pullop.repo
remotebookmarks = pullop.remotebookmarks
+ remotebookmarks = bookmod.hexifybookmarks(remotebookmarks)
bookmod.updatefromremote(repo.ui, repo, remotebookmarks,
pullop.remote.url(),
pullop.gettransaction,
More information about the Mercurial-devel
mailing list