infocalypse
 
(Steve Dougherty)
2013-06-10: Generate and insert WoT repo list on change.

Generate and insert WoT repo list on change.

diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py
--- a/infocalypse/__init__.py
+++ b/infocalypse/__init__.py
@@ -377,6 +377,7 @@ def infocalypse_create(ui_, repo, **opts
     params, stored_cfg = get_config_info(ui_, opts)
 
     insert_uri = ''
+    attributes = None
     if opts['uri'] != '' and opts['wot'] != '':
         ui_.warn("Please specify only one of --uri or --wot.\n")
         return
@@ -440,7 +441,13 @@ def infocalypse_create(ui_, repo, **opts
     set_target_version(ui_, repo, opts, params,
                        "Only inserting to version(s): %s\n")
     params['INSERT_URI'] = insert_uri
-    execute_create(ui_, repo, params, stored_cfg)
+    inserted_to = execute_create(ui_, repo, params, stored_cfg)
+
+    # TODO: Move into some function. How to separate local success context?
+    if inserted_to is not None and attributes is not None and \
+       stored_cfg.has_wot_identity(stored_cfg.get_request_uri(repo.root)):
+        import wot
+        wot.update_repo_listing(ui_, attributes['Identity'])
 
 def infocalypse_copy(ui_, repo, **opts):
     """ Copy an Infocalypse repository to a new URI. """
@@ -589,7 +596,13 @@ def infocalypse_push(ui_, repo, **opts):
     #               (opts['requesturi'], insert_uri))
     #    params['REQUEST_URI'] = opts['requesturi']
 
-    execute_push(ui_, repo, params, stored_cfg)
+    inserted_to = execute_push(ui_, repo, params, stored_cfg)
+    # TODO: Messy.
+    if inserted_to is not None and stored_cfg.has_wot_identity(stored_cfg
+    .get_request_uri(repo.root)):
+        import wot
+        wot.update_repo_listing(ui_, stored_cfg.get_wot_identity(stored_cfg
+    .get_request_uri(repo.root)))
 
 def infocalypse_info(ui_, repo, **opts):
     """ Display information about an Infocalypse repository.
diff --git a/infocalypse/wot.py b/infocalypse/wot.py
--- a/infocalypse/wot.py
+++ b/infocalypse/wot.py
@@ -1,5 +1,35 @@
 import fcp
 from config import Config
+import xml.etree.ElementTree as ET
+
+def update_repo_listing(ui, for_identity):
+    # TODO: WoT property containing edition. Used when requesting.
+    config = Config.from_ui(ui)
+    root = ET.Element('vcs', {'version': '0'})
+
+    # Add request URIs associated with the given identity.
+    for request_uri in config.request_usks.itervalues():
+        if config.get_wot_identity(request_uri) == for_identity:
+            repo = ET.SubElement(root, 'repository', {
+                'vcs': 'Infocalypse',
+            })
+            repo.text = request_uri
+
+    # TODO: Nonstandard IP and port.
+    node = fcp.FCPNode()
+    # TODO: Does it make sense to query the node here for the private key?
+    attributes = resolve_local_identity(ui, key_prefix=for_identity)
+    # TODO: Repetitive key parsing again!
+    insert_uri = attributes['InsertURI']
+    # Expecting USK@key/WebOfTrust/edition; want only key.
+    insert_uri = insert_uri.split('/', 1)[0]
+    uri = node.put(uri=insert_uri+'/vcs/0', mimetype='application/xml',
+                   data=ET.tostring(root))
+
+    if uri is None:
+        ui.warn("Failed to update repository listing.")
+    else:
+        ui.status("Updated repository listing:\n{0}\n".format(uri))
 
 # Support for querying WoT for own identities and identities meeting various
 # criteria.