(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.