Added --nosearch argument for fn-pull and fn-reinsert.
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py --- a/infocalypse/__init__.py +++ b/infocalypse/__init__.py @@ -183,11 +183,13 @@ def infocalypse_reinsert(ui_, repo, **op """ Reinsert the current version of an Infocalypse repository. """ params, stored_cfg = get_config_info(ui_, opts) - request_uri = stored_cfg.get_request_uri(repo.root) - if not request_uri: - ui_.warn("There is no stored request URI for this repo.\n" - "Do a fn-pull from a repository USK and try again.\n") - return + request_uri = opts['uri'] + if request_uri == '': + request_uri = stored_cfg.get_request_uri(repo.root) + if not request_uri: + ui_.warn("There is no stored request URI for this repo.\n" + "Do a fn-pull from a repository USK and try again.\n") + return insert_uri = stored_cfg.get_dir_insert_uri(repo.root) if not insert_uri: @@ -254,13 +256,14 @@ FCP_OPTS = [('', 'fcphost', '', 'fcp hos AGGRESSIVE_OPT = [('', 'aggressive', None, 'aggressively search for the ' + 'latest USK index'),] - +NOSEARCH_OPT = [('', 'nosearch', None, 'use USK version in URI'),] # Allow mercurial naming convention for command table. # pylint: disable-msg=C0103 cmdtable = { "fn-pull": (infocalypse_pull, [('', 'uri', '', 'request URI to pull from'),] + FCP_OPTS + + NOSEARCH_OPT + AGGRESSIVE_OPT, "[options]"), @@ -285,7 +288,9 @@ cmdtable = { "[options]"), "fn-reinsert": (infocalypse_reinsert, - FCP_OPTS, + [('', 'uri', '', 'request URI')] + + FCP_OPTS + + NOSEARCH_OPT, "[options]"), "fn-setup": (infocalypse_setup, diff --git a/infocalypse/infcmds.py b/infocalypse/infcmds.py --- a/infocalypse/infcmds.py +++ b/infocalypse/infcmds.py @@ -32,6 +32,7 @@ from mercurial import util from fcpclient import parse_progress, is_usk, is_ssk, get_version, \ get_usk_for_usk_version, FCPClient, is_usk_file, is_negative_usk + from fcpconnection import FCPConnection, PolledSocket, CONNECTION_STATES, \ get_code, FCPError from requestqueue import RequestRunner @@ -190,7 +191,14 @@ def get_config_info(ui_, opts): params['FCP_PORT'] = cfg.defaults['PORT'] params['TMP_DIR'] = cfg.defaults['TMP_DIR'] params['VERBOSITY'] = get_verbosity(ui_) - params['AGGRESSIVE_SEARCH'] = bool(opts.get('aggressive')) + params['NO_SEARCH'] = (bool(opts.get('nosearch')) and opts.get('uri', None)) + if bool(opts.get('nosearch')) and not opts.get('uri', None): + ui_.status('--nosearch ignored because --uri was not set.\n') + params['AGGRESSIVE_SEARCH'] = (bool(opts.get('aggressive')) and + not params['NO_SEARCH']) + if bool(opts.get('aggressive')) and params['NO_SEARCH']: + ui_.status('--aggressive ignored because --nosearch was set.\n') + return (params, cfg) # Hmmmm USK@/style_keys/0 @@ -303,9 +311,10 @@ def cleanup(update_sm): update_sm.ctx.bundle_cache.remove_files() +# This function needs cleanup. # REDFLAG: better name. 0) inverts 1) updates indices from cached state. # 2) key substitutions. -def handle_key_inversion(ui_, update_sm, params, stored_cfg): +def do_key_setup(ui_, update_sm, params, stored_cfg): """ INTERNAL: Handle inverting/updating keys before running a command.""" insert_uri = params.get('INSERT_URI') if not insert_uri is None and insert_uri.startswith('USK@/'): @@ -339,13 +348,21 @@ def handle_key_inversion(ui_, update_sm, inverted_uri, max_index) - # NO COUPLING # Update the index of the request uri using the stored config. request_uri = params.get('REQUEST_URI') - if not request_uri is None: - max_index = max(stored_cfg.get_index(request_uri), - get_version(request_uri)) - request_uri = get_usk_for_usk_version(request_uri, max_index) + if not request_uri is None and is_usk(request_uri): + assert not params['NO_SEARCH'] or not request_uri is None + if not request_uri is None and not params['NO_SEARCH']: + max_index = max(stored_cfg.get_index(request_uri), + get_version(request_uri)) + request_uri = get_usk_for_usk_version(request_uri, max_index) + + if (params['NO_SEARCH'] and + # Force the insert URI down to the version in the request URI. + usks_equal(request_uri, params['INVERTED_INSERT_URI'])): + params['INVERTED_INSERT_URI'] = request_uri + params['INSERT_URI'] = get_usk_for_usk_version(insert_uri, + get_version(request_uri)) # Skip key inversion if we already inverted the insert_uri. is_keypair = False @@ -422,7 +439,7 @@ def execute_create(ui_, repo, params, st # This call is not necessary, but I do it to set # 'INVERTED_INSERT_URI'. Write code to fish that # out of INSERTING_URI instead. - handle_key_inversion(ui_, update_sm, params, stored_cfg) + do_key_setup(ui_, update_sm, params, stored_cfg) ui_.status("%sInsert URI:\n%s\n" % (is_redundant(params['INSERT_URI']), params['INSERT_URI'])) @@ -451,7 +468,7 @@ def execute_copy(ui_, repo, params, stor update_sm = None try: update_sm = setup(ui_, repo, params, stored_cfg) - handle_key_inversion(ui_, update_sm, params, stored_cfg) + do_key_setup(ui_, update_sm, params, stored_cfg) ui_.status("%sInsert URI:\n%s\n" % (is_redundant(params['INSERT_URI']), params['INSERT_URI'])) @@ -471,16 +488,27 @@ def execute_copy(ui_, repo, params, stor finally: cleanup(update_sm) +def usks_equal(usk_a, usk_b): + """ Returns True if the USKs are equal disregarding version. """ + return (get_usk_for_usk_version(usk_a, 0) + == get_usk_for_usk_version(usk_b, 0)) + def execute_reinsert(ui_, repo, params, stored_cfg): """ Run the reinsert command. """ update_sm = None try: update_sm = setup(ui_, repo, params, stored_cfg) - request_uri, is_keypair = handle_key_inversion(ui_, update_sm, - params, stored_cfg) + request_uri, is_keypair = do_key_setup(ui_, update_sm, + params, stored_cfg) params['REQUEST_URI'] = request_uri if not params['INSERT_URI'] is None: + if (is_usk(params['INSERT_URI']) and + (not is_usk(params['REQUEST_URI'])) or + (not usks_equal(params['REQUEST_URI'], + params['INVERTED_INSERT_URI']))): + raise util.Abort("Request URI doesn't match insert URI.") + ui_.status("%sInsert URI:\n%s\n" % (is_redundant(params[ 'INSERT_URI']), params['INSERT_URI'])) @@ -518,8 +546,8 @@ def execute_push(ui_, repo, params, stor update_sm = None try: update_sm = setup(ui_, repo, params, stored_cfg) - request_uri, is_keypair = handle_key_inversion(ui_, update_sm, params, - stored_cfg) + request_uri, is_keypair = do_key_setup(ui_, update_sm, params, + stored_cfg) ui_.status("%sInsert URI:\n%s\n" % (is_redundant(params['INSERT_URI']), params['INSERT_URI'])) diff --git a/infocalypse/updatesm.py b/infocalypse/updatesm.py --- a/infocalypse/updatesm.py +++ b/infocalypse/updatesm.py @@ -86,9 +86,10 @@ def make_search_uris(uri): fields[-2] = fields[-2][:-2] + 'R0' return (uri, '/'.join(fields)) -# For insert -def make_insert_uris(uri, increment=True): - """ Returns a possibly redundant insert uri tuple. +def make_frozen_uris(uri, increment=True): + """ Returns a possibly redundant SSK tuple for the 'frozen' + version of file USK uris, a tuple containing uri for other uris. + NOTE: This increments the version by 1 if uri is a USK and increment is True. """ @@ -527,7 +528,7 @@ class InsertingUri(StaticRequestList): top_key_tuple = from_state.get_top_key_tuple() salt = {0:0x00, 1:0xff} # grrr.... less code. - insert_uris = make_insert_uris(self.parent.ctx['INSERT_URI'], + insert_uris = make_frozen_uris(self.parent.ctx['INSERT_URI'], self.parent.ctx.get('REINSERT', 0) < 1) assert len(insert_uris) < 3 for index, uri in enumerate(insert_uris): @@ -584,7 +585,12 @@ class RequestingUri(StaticRequestList): self.parent.params.get('AGGRESSIVE_SEARCH', False)): request_uri = get_negative_usk(request_uri) - request_uris = make_search_uris(request_uri) + if (is_usk(request_uri) and self.parent.params['NO_SEARCH']): + request_uris = make_frozen_uris(request_uri, False) + self.parent.ctx.ui_.status("Request URI index searching disabled.\n") + else: + request_uris = make_search_uris(request_uri) + for uri in request_uris: #[uri, tries, is_insert, raw_data, mime_type, last_msg] if self.parent.params.get('DUMP_URIS', False): @@ -632,6 +638,10 @@ class RequestingUri(StaticRequestList): def get_latest_uri(self): """ Returns the URI with the version part update if the URI is a USK.""" + if (is_usk(self.parent.ctx['REQUEST_URI']) and + self.parent.params['NO_SEARCH']): + return self.parent.ctx['REQUEST_URI'] + max_version = None for candidate in self.ordered: result = candidate[5]