[PATCH 01 of 12 V3] bookmark: add methods to binary encode and decode bookmark values
Boris Feld
boris.feld at octobus.net
Mon Nov 27 11:27:51 EST 2017
Any update on the review status of this series?
On Mon, 2017-11-20 at 17:51 +0100, Boris Feld wrote:
> # HG changeset patch
> # User Boris Feld <boris.feld at octobus.net>
> # Date 1508072395 -7200
> # Sun Oct 15 14:59:55 2017 +0200
> # Node ID d3d4513977af55bd80afee86818d7ef4e9c25aca
> # Parent 62e10bf001a9014d181966c6bca9958d105ef359
> # EXP-Topic b2.bookmarks
> # Available At https://bitbucket.org/octobus/mercurial-devel/
> # hg pull https://bitbucket.org/octobus/mercurial-devel/
> -r d3d4513977af
> bookmark: add methods to binary encode and decode bookmark values
>
> Coming new bundle2 parts related to bookmark will use a binary
> encoding. It
> encodes a series of '(bookmark, node)' pairs. Bookmark name has a
> high enough
> size limit to not be affected by issue5165. (64K length, we are well
> covered)
>
> diff --git a/mercurial/bookmarks.py b/mercurial/bookmarks.py
> --- a/mercurial/bookmarks.py
> +++ b/mercurial/bookmarks.py
> @@ -8,12 +8,14 @@
> from __future__ import absolute_import
>
> import errno
> +import struct
>
> from .i18n import _
> from .node import (
> bin,
> hex,
> short,
> + wdirid,
> )
> from . import (
> encoding,
> @@ -550,6 +552,60 @@ def unhexlifybookmarks(marks):
> binremotemarks[name] = bin(node)
> return binremotemarks
>
> +_binaryentry = struct.Struct('>20sH')
> +
> +def binaryencode(bookmarks):
> + """encode a '(bookmark, node)' iterable into a binary stream
> +
> + the binary format is:
> +
> + <node><bookmark-length><bookmark-name>
> +
> + :node: is a 20 bytes binary node,
> + :bookmark-length: an unsigned short,
> + :bookmark-name: the name of the bookmark (of length <bookmark-
> length>)
> +
> + wdirid (all bits set) will be used as a special value for
> "missing"
> + """
> + binarydata = []
> + for book, node in bookmarks:
> + if not node: # None or ''
> + node = wdirid
> + binarydata.append(_binaryentry.pack(node, len(book)))
> + binarydata.append(book)
> + return ''.join(binarydata)
> +
> +def binarydecode(stream):
> + """decode a binary stream into an '(bookmark, node)' iterable
> +
> + the binary format is:
> +
> + <node><bookmark-length><bookmark-name>
> +
> + :node: is a 20 bytes binary node,
> + :bookmark-length: an unsigned short,
> + :bookmark-name: the name of the bookmark (of length <bookmark-
> length>))
> +
> + wdirid (all bits set) will be used as a special value for
> "missing"
> + """
> + entrysize = _binaryentry.size
> + books = []
> + while True:
> + entry = stream.read(entrysize)
> + if len(entry) < entrysize:
> + if entry:
> + raise error.Abort(_('bad bookmark stream'))
> + break
> + node, length = _binaryentry.unpack(entry)
> + bookmark = stream.read(length)
> + if len(bookmark) < length:
> + if entry:
> + raise error.Abort(_('bad bookmark stream'))
> + if node == wdirid:
> + node = None
> + books.append((bookmark, node))
> + return books
> +
> def updatefromremote(ui, repo, remotemarks, path, trfunc,
> explicit=()):
> ui.debug("checking for updated bookmarks\n")
> localmarks = repo._bookmarks
More information about the Mercurial-devel
mailing list