(Steve Dougherty)
2013-06-18: Add support for resolving local identities by key. Add support for resolving local identities by key.
diff --git a/infocalypse/wot.py b/infocalypse/wot.py
--- a/infocalypse/wot.py
+++ b/infocalypse/wot.py
@@ -89,8 +89,6 @@ def execute_setup_wot(ui_, opts):
def resolve_local_identity(ui, identity):
"""
Mercurial ui for error messages.
- # TODO: Does not support duplicate nicknames between local identities.
- # Could support looking at identity to resolve further.
Returns a dictionary of the nickname, insert and request URIs,
and identity that match the given criteria.
@@ -127,24 +125,42 @@ def resolve_local_identity(ui, identity)
# TODO: Cleaner flow of control between key-only and nick-and-optional-key
# Find nicknames starting with the supplied nickname prefix.
prefix = 'Replies.Nickname'
- nickname = None
+ # Key: nickname, value (id_num, public key hash).
+ matches = {}
for key in response.iterkeys():
if key.startswith(prefix) and\
response[key].startswith(nickname_prefix):
- if nickname is not None:
- # More than one matched.
- ui.warn("Prefix '{0}' is ambiguous.\n".format(nickname_prefix))
- return
- nickname = response[key]
# Key is Replies.Nickname<number>, where number is used in
# the other attributes returned for that identity.
id_num = key[len(prefix):]
- if nickname is None:
- ui.warn("No nicknames start with '{0}'.\n".format(nickname_prefix))
+ nickname = response[key]
+ pubkey_hash = response['Replies.Identity{0}'.format(id_num)]
+
+ matches[nickname] = (id_num, pubkey_hash)
+
+ # Remove matching nicknames not also matching the (possibly partial)
+ # public key hash.
+ for key in matches.keys():
+ # public key hash is second member of value tuple.
+ if not matches[key][1].startswith(key_prefix):
+ del matches[key]
+
+ if len(matches) > 1:
+ ui.warn("'{0}' is ambiguous.".format(identity))
return
+ if len(matches) == 0:
+ ui.warn("No local identities match '{0}'.\n".format(identity))
+ return
+
+ assert len(matches) == 1
+
+ # id_num is first member of value tuple.
+ only_key = matches.keys()[0]
+ id_num = matches[only_key][0]
+
return read_local_identity(response, id_num)