pushkey.py
71 lines
| 1.7 KiB
| text/x-python
|
PythonLexer
/ mercurial / pushkey.py
Matt Mackall
|
r11367 | # 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. | ||||
Gregory Szorc
|
r25969 | from __future__ import absolute_import | ||
from . import ( | ||||
bookmarks, | ||||
encoding, | ||||
obsolete, | ||||
phases, | ||||
) | ||||
Matt Mackall
|
r13353 | |||
Augie Fackler
|
r43345 | |||
Matt Mackall
|
r11367 | def _nslist(repo): | ||
n = {} | ||||
for k in _namespaces: | ||||
Augie Fackler
|
r43347 | n[k] = b"" | ||
Durham Goode
|
r22953 | if not obsolete.isenabled(repo, obsolete.exchangeopt): | ||
Augie Fackler
|
r43347 | n.pop(b'obsolete') | ||
Matt Mackall
|
r11367 | return n | ||
Augie Fackler
|
r43345 | |||
_namespaces = { | ||||
Augie Fackler
|
r43347 | b"namespaces": (lambda *x: False, _nslist), | ||
b"bookmarks": (bookmarks.pushbookmark, bookmarks.listbookmarks), | ||||
b"phases": (phases.pushphase, phases.listphases), | ||||
b"obsolete": (obsolete.pushmarker, obsolete.listmarkers), | ||||
Augie Fackler
|
r43345 | } | ||
Matt Mackall
|
r11367 | |||
def register(namespace, pushkey, listkeys): | ||||
_namespaces[namespace] = (pushkey, listkeys) | ||||
Augie Fackler
|
r43345 | |||
Matt Mackall
|
r11367 | def _get(namespace): | ||
return _namespaces.get(namespace, (lambda *x: False, lambda *x: {})) | ||||
Augie Fackler
|
r43345 | |||
Matt Mackall
|
r11367 | def push(repo, namespace, key, old, new): | ||
'''should succeed iff value was old''' | ||||
pk = _get(namespace)[0] | ||||
return pk(repo, key, old, new) | ||||
Augie Fackler
|
r43345 | |||
Matt Mackall
|
r11367 | def list(repo, namespace): | ||
'''return a dict''' | ||||
lk = _get(namespace)[1] | ||||
return lk(repo) | ||||
Augie Fackler
|
r43345 | |||
Pierre-Yves David
|
r21661 | encode = encoding.fromlocal | ||
Pierre-Yves David
|
r21659 | decode = encoding.tolocal | ||
Augie Fackler
|
r43345 | |||
Pierre-Yves David
|
r21650 | def encodekeys(keys): | ||
"""encode the content of a pushkey namespace for exchange over the wire""" | ||||
Augie Fackler
|
r43347 | return b'\n'.join([b'%s\t%s' % (encode(k), encode(v)) for k, v in keys]) | ||
Pierre-Yves David
|
r21652 | |||
Augie Fackler
|
r43345 | |||
Pierre-Yves David
|
r21652 | def decodekeys(data): | ||
"""decode the content of a pushkey namespace from exchange over the wire""" | ||||
result = {} | ||||
for l in data.splitlines(): | ||||
Augie Fackler
|
r43347 | k, v = l.split(b'\t') | ||
Pierre-Yves David
|
r21659 | result[decode(k)] = decode(v) | ||
Pierre-Yves David
|
r21652 | return result | ||