infocalypse
 
(Steve Dougherty)
2013-08-28: Add support for querying remote repo lists.

Add support for querying remote repo lists.

diff --git a/infocalypse/plugin_connect.py b/infocalypse/plugin_connect.py
--- a/infocalypse/plugin_connect.py
+++ b/infocalypse/plugin_connect.py
@@ -5,6 +5,8 @@ import threading
 from mercurial import util
 import sys
 from config import Config
+from wot_id import WoT_ID, Local_WoT_ID
+import wot
 
 PLUGIN_NAME = "org.freenetproject.plugin.dvcs_webui.main.Plugin"
 
@@ -69,6 +71,7 @@ def connect(ui, repo):
 
     while True:
         # Load the config each time - it could change.
+        # TODO: Monitor config file for change events instead.
         cfg = Config.from_ui(ui)
 
         query_identifier = node._getUniqueId()
@@ -90,9 +93,12 @@ def connect(ui, repo):
         if response not in handlers:
             raise util.Abort("Unsupported query '{0}'\n".format(response))
 
+        ui.status("Got query: {0}\n".format(response))
+
         # Handlers are indexed by the query message name, take the query
         # message, and return (result_name, plugin_params).
-        result_name, plugin_params = handlers[response](command, cfg=cfg)
+        result_name, plugin_params = handlers[response](command, cfg=cfg,
+                                                        ui=ui)
 
         plugin_params['Message'] = result_name
         plugin_params['QueryIdentifier'] = query_identifier
@@ -105,6 +111,8 @@ def connect(ui, repo):
             raise util.Abort("Received unexpected message instead of result "
                              "acknowledgement:\n{0}\n".format(ack))
 
+        ui.status("Query complete.\n")
+
 
 # Handlers return two items: result message name, message-specific parameters.
 # The sending code handles the plugin name, required parameters and plugin name.
@@ -129,6 +137,24 @@ def LocalRepoQuery(_, cfg, **opts):
 
     return "LocalRepoResult", params
 
+
+def RepoListQuery(command, ui, **opts):
+    params = {}
+
+    # TODO: Failure should result in an error message sent to the plugin.
+    # Truster is the ID of the identity only. Prepend '@' for identifier.
+    truster = Local_WoT_ID('@' + command['Replies.Truster'])
+    identity = WoT_ID(command['Replies.RemoteIdentifier'], truster)
+
+    repo_list = wot.read_repo_listing(ui, identity)
+
+    for name, key in repo_list.iteritems():
+        params['Repo.' + name] = key
+
+    return "RepoListResult", params
+
+
 # TODO: Perhaps look up method by name directly?
 handlers = {'VoidQuery': VoidQuery,
+            'RepoListQuery': RepoListQuery,
             'LocalRepoQuery': LocalRepoQuery}