(Steve Dougherty)
2013-08-02: Fix "clone" requiring the target repository exist. Fix "clone" requiring the target repository exist. When looking up a push URI for a clone operation the edition lookup is now skipped.
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py --- a/infocalypse/__init__.py +++ b/infocalypse/__init__.py @@ -568,12 +568,24 @@ extensions.wrapfunction(discovery, 'find # wrap the commands -def freenetpathtouri(ui, path, repo=None, pull=True): +def freenetpathtouri(ui, path, operation, repo=None): """ Return a usable request or insert URI. Expects a freenet:// or freenet: protocol to be specified. If the key is not a USK it will be resolved as a WoT identity. + + + :param repo: Mercurial localrepository, used to resolve the truster set + for the repository. + :param operation: A string name of the operation the URI will be used to + perform. Used to return the appropriate result with + WoT-integrated URI resolution. Valid operations are: + * "pull" - request URI for existing repository. + * "push" - insert URI for existing repository. + * "clone-push" - insert URI for repository that might + not exist. (Skips looking up + published name and edition.) """ # TODO: Is this the only URL encoding that may happen? Why not use a more # semantically meaningful function? @@ -587,11 +599,16 @@ def freenetpathtouri(ui, path, repo=None # nick to be "USK", but this is a corner case. Using --wot will still work. if not path.startswith("USK"): import wot - if pull: + if operation == "pull": truster = get_truster(ui, repo) return wot.resolve_pull_uri(ui, path, truster) + elif operation == "push": + return wot.resolve_push_uri(ui, path) + elif operation == "clone-push": + return wot.resolve_push_uri(ui, path, resolve_edition=False) else: - return wot.resolve_push_uri(ui, path) + raise util.Abort("Internal error: invalid operation '{0}' when " + "resolving WoT-integrated URI.".format(operation)) else: return path @@ -613,7 +630,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(ui, path, repo) + uri = freenetpathtouri(ui, path, "pull", repo) opts["uri"] = uri opts["aggressive"] = True # always search for the latest revision. return infocalypse_pull(ui, repo, **opts) @@ -650,7 +667,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 = parse_repo_path(freenetpathtouri(ui, path, repo, pull=False)) + uri = parse_repo_path(freenetpathtouri(ui, path, "push", repo)) if uri is None: return # if the uri is the short form (USK@/name/#), generate the key and preprocess the uri. @@ -706,10 +723,10 @@ def freenetclone(orig, *args, **opts): # check whether to create, pull or copy pulluri, pushuri = None, None if isfreenetpath(source): - pulluri = parse_repo_path(freenetpathtouri(ui, source)) + pulluri = parse_repo_path(freenetpathtouri(ui, source, "pull")) if isfreenetpath(dest): - pushuri = parse_repo_path(freenetpathtouri(ui, dest, pull=False), + pushuri = parse_repo_path(freenetpathtouri(ui, dest, "clone-push"), assume_redundancy=True) # decide which infocalypse command to use. diff --git a/infocalypse/wot.py b/infocalypse/wot.py --- a/infocalypse/wot.py +++ b/infocalypse/wot.py @@ -423,11 +423,16 @@ def resolve_pull_uri(ui, path, truster): return find_repo(ui, identity, repo_name) -def resolve_push_uri(ui, path): +def resolve_push_uri(ui, path, resolve_edition=True): """ Return a push URI for the given path. Raise util.Abort if unable to resolve identity or repository. + :param resolve_edition: Defaults to True. If False, skips resolving the + repository, uses the edition number 0. and does + not modify the repository name. This is useful + for finding a push URI for a repository that does + not already exist. :param ui: For feedback. :param path: path describing a repo - nick@key/repo_name, where the identity is a local one. (Such that the insert URI is known.) @@ -437,17 +442,25 @@ def resolve_push_uri(ui, path): local_id = Local_WoT_ID(wot_id) - # TODO: find_repo should make it clearer that it returns a request URI, - # and return a USK. - repo = find_repo(ui, local_id, repo_name) + if resolve_edition: + # TODO: find_repo should make it clearer that it returns a request URI, + # and return a USK. + repo = find_repo(ui, local_id, repo_name) - # Request URI - repo_uri = USK(repo) + # Request URI + repo_uri = USK(repo) - # Maintains name, edition. - repo_uri.key = local_id.insert_uri.key + # Maintains name, edition. + repo_uri.key = local_id.insert_uri.key - return str(repo_uri) + return str(repo_uri) + else: + repo_uri = local_id.insert_uri.clone() + + repo_uri.name = repo_name + repo_uri.edition = 0 + + return str(repo_uri) def execute_setup_wot(ui_, local_id):