(Steve Dougherty)
2013-06-25: Add freenet://WoT path resolution. Add freenet://WoT path resolution.
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py
--- a/infocalypse/__init__.py
+++ b/infocalypse/__init__.py
@@ -552,13 +552,29 @@ extensions.wrapfunction(discovery, 'find
# wrap the commands
-def freenetpathtouri(path):
+
+def freenetpathtouri(ui, path, pull=True):
+ # TODO: Is this the only URL encoding that may happen? Why not use a more
+ # semantically meaningful function?
path = path.replace("%7E", "~").replace("%2C", ",")
if path.startswith("freenet://"):
- return path[len("freenet://"):]
- if path.startswith("freenet:"):
- return path[len("freenet:"):]
- return path
+ path = path[len("freenet://"):]
+ elif path.startswith("freenet:"):
+ path = path[len("freenet:"):]
+
+ # Guess whether it's WoT. This won't work if someone has chosen their WoT
+ # nick to be "USK", but this is a corner case. Using --wot will still work.
+ if not path.startswith("USK"):
+ import wot
+ if pull:
+ cfg = Config()
+ cfg.from_ui(ui)
+ truster = cfg.defaults['DEFAULT_TRUSTER']
+ return wot.resolve_pull_uri(ui, path, truster)
+ else:
+ return wot.resolve_push_uri(ui, path)
+ else:
+ return path
def freenetpull(orig, *args, **opts):
def parsepushargs(ui, repo, path=None):
@@ -578,7 +594,7 @@ def freenetpull(orig, *args, **opts):
# only act differently, if the target is an infocalypse repo.
if not isfreenetpath(path):
return orig(*args, **opts)
- uri = freenetpathtouri(path)
+ uri = freenetpathtouri(ui, path)
opts["uri"] = uri
opts["aggressive"] = True # always search for the latest revision.
return infocalypse_pull(ui, repo, **opts)
@@ -615,7 +631,7 @@ def freenetpush(orig, *args, **opts):
# only act differently, if the target is an infocalypse repo.
if not isfreenetpath(path):
return orig(*args, **opts)
- uri = freenetpathtouri(path)
+ uri = freenetpathtouri(ui, path, pull=False)
# if the uri is the short form (USK@/name/#), generate the key and preprocess the uri.
if uri.startswith("USK@/"):
ui.status("creating a new key for the repo. For a new repo with an existing key, use clone.\n")
diff --git a/infocalypse/commands.py b/infocalypse/commands.py
--- a/infocalypse/commands.py
+++ b/infocalypse/commands.py
@@ -189,22 +189,10 @@ def infocalypse_pull(ui_, repo, **opts):
truster = stored_cfg.get_wot_identity(
stored_cfg.get_dir_insert_uri(repo.root))
- # Expecting <id stuff>/reponame
- wot_id, repo_name = opts['wot'].split('/', 1)
+ request_uri = wot.resolve_pull_uri(ui_, opts['wot'], truster)
- # TODO: How to handle redundancy? Does Infocalypse automatically try
- # an R0 if an R1 fails?
-
- repositories = wot.read_repo_listing(ui_, truster, wot_id)
-
- if repositories is None:
+ if request_uri is None:
return
-
- if repo_name not in repositories:
- ui_.warn("Could not find repository named \"{0}\".\n".format(repo_name))
- return
-
- request_uri = repositories[repo_name]
else:
request_uri = opts['uri']
diff --git a/infocalypse/wot.py b/infocalypse/wot.py
--- a/infocalypse/wot.py
+++ b/infocalypse/wot.py
@@ -100,6 +100,58 @@ def read_repo_listing(ui, truster, ident
return repositories
+
+def resolve_pull_uri(ui, path, truster):
+ """
+ Return a pull URI for the given path.
+ Print an error message and return None on failure.
+ TODO: Is it appropriate to outline possible errors?
+ Possible failures are being unable to fetch a repo list for the given
+ identity, which may be a fetch failure or being unable to find the
+ identity, and not finding the requested repo in the list.
+
+ :param ui: For feedback.
+ :param path: path describing a repo: nick@key/reponame
+ :param truster: identity whose trust list to use.
+ :return:
+ """
+ # Expecting <id stuff>/reponame
+ wot_id, repo_name = path.split('/', 1)
+
+ # TODO: How to handle redundancy? Does Infocalypse automatically try
+ # an R0 if an R1 fails?
+
+ repositories = read_repo_listing(ui, truster, wot_id)
+
+ if repositories is None:
+ return
+
+ if repo_name not in repositories:
+ ui.warn("Could not find repository named \"{0}\".\n"
+ .format(repo_name))
+ return
+
+ return repositories[repo_name]
+
+
+def resolve_push_uri(ui, path):
+ """
+ Return a push URI for the given path.
+ Print an error message and return None on failure.
+
+ :param ui: For feedback.
+ :param path: path describing a repo: nick@key/reponame,
+ where the identity is a local one. (Such that the insert URI is known.)
+ """
+ # Expecting <id stuff>/reponame
+ # TODO: Duplcate with resolve_pull
+ wot_id, repo_name = path.split('/', 1)
+
+ local_id = resolve_local_identity(ui, )
+
+ # Get edition by checking one's own repo list.
+ repositories = read_repo_listing(ui, )
+
# Support for querying WoT for own identities and identities meeting various
# criteria.
# TODO: "cmds" suffix to module name to fit fms, arc, inf?