sapling/eden/scm/edenscm/mercurial/pushkey.py
Durham Goode a876c6a13b py3: fix pushkey encoding by removing local encoding
Summary:
Now that bundle2 has strings everywhere, pushkey needs to also handle
encoding correctly. Previously it used local encoding, which seems strange.
Let's drop the encoding entirely since we're only dealing with since we're only dealing with utf8 string and bytes.

Reviewed By: farnz

Differential Revision: D19665894

fbshipit-source-id: ed054ab25636ac52de646329f26681ae843b6de3
2020-01-31 13:12:13 -08:00

71 lines
2.0 KiB
Python

# Portions Copyright (c) Facebook, Inc. and its affiliates.
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2.
# pushkey.py - dispatching for pushing and pulling keys
#
# Copyright 2010 Matt Mackall <mpm@selenic.com>
#
# This software may be used and distributed according to the terms of the
# GNU General Public License version 2 or any later version.
from __future__ import absolute_import
from . import bookmarks, encoding, obsolete, phases, util
from .pycompat import decodeutf8, encodeutf8
def _nslist(repo):
n = {}
for k in _namespaces:
n[k] = ""
if not obsolete.isenabled(repo, obsolete.exchangeopt):
n.pop("obsolete")
return n
_namespaces = {
"namespaces": (lambda *x: False, _nslist),
"bookmarks": (bookmarks.pushbookmark, bookmarks.listbookmarks),
"phases": (phases.pushphase, phases.listphases),
"obsolete": (obsolete.pushmarker, obsolete.listmarkers),
}
def register(namespace, pushkey, listkeys):
_namespaces[namespace] = (pushkey, listkeys)
def _get(namespace):
return _namespaces.get(namespace, (lambda *x: False, lambda *x: {}))
def push(repo, namespace, key, old, new):
"""should succeed iff value was old"""
pk = _get(namespace)[0]
return pk(repo, key, old, new)
def list(repo, namespace):
"""return a dict"""
lk = _get(namespace)[1]
return lk(repo)
def encodekeys(keys):
"""encode the content of a pushkey namespace for exchange over the wire"""
return b"\n".join([b"%s\t%s" % (encodeutf8(k), encodeutf8(v)) for k, v in keys])
def decodekeys(data):
"""decode the content of a pushkey namespace from exchange over the wire"""
# Note that the order is required in some cases. E.g. pullbackup needs to
# retrieve commits in the same order of creation to mantain the order of
# revision codes. See T24417531
result = util.sortdict()
for l in data.splitlines():
k, v = l.split(b"\t")
result[decodeutf8(k)] = decodeutf8(v)
return result