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