Pylint cleanups.
diff --git a/infocalypse/__init__.py b/infocalypse/__init__.py --- a/infocalypse/__init__.py +++ b/infocalypse/__init__.py @@ -235,7 +235,9 @@ from mercurial import commands, util from infcmds import get_config_info, execute_create, execute_pull, \ execute_push, execute_setup, execute_copy, execute_reinsert, \ - execute_info, execute_fmsread, execute_fmsnotify + execute_info + +from fmscmds import execute_fmsread, execute_fmsnotify def set_target_version(ui_, repo, opts, params, msg_fmt): """ INTERNAL: Update TARGET_VERSION in params. """ diff --git a/infocalypse/fmscmds.py b/infocalypse/fmscmds.py new file mode 100644 --- /dev/null +++ b/infocalypse/fmscmds.py @@ -0,0 +1,223 @@ +""" Implementation of fms update and notification commands for + Infocalypse mercurial extension. + + Copyright (C) 2009 Darrell Karbott + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public + License as published by the Free Software Foundation; either + version 2.0 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + Author: djk@isFiaD04zgAgnrEC5XJt1i4IE7AkNPqhBG5bONi6Yks +""" + +from fcpclient import get_usk_hash + +from fms import USKAnnouncementParser, USKIndexUpdateParser, recv_msgs, \ + to_msg_string, MSG_TEMPLATE, send_msgs + +from config import Config +from infcmds import do_key_setup, setup, cleanup + +def handled_list(ui_, params, stored_cfg): + """ INTERNAL: Helper function to simplify execute_fmsread. """ + if params['FMSREAD'] != 'list' and params['FMSREAD'] != 'listall': + return False + + if params['FMSREAD'] == 'listall': + parser = USKAnnouncementParser(None, True) + if params['VERBOSITY'] >= 2: + ui_.status('Listing all repo USKs.\n') + else: + trust_map = stored_cfg.fmsread_trust_map.copy() # paranoid copy + if params['VERBOSITY'] >= 2: + fms_ids = trust_map.keys() + fms_ids.sort() + ui_.status(("Only listing repo USKs from trusted " + + "fms IDs:\n%s\n\n") % '\n'.join(fms_ids)) + parser = USKAnnouncementParser(trust_map, True) + + recv_msgs(stored_cfg.defaults['FMS_HOST'], + stored_cfg.defaults['FMS_PORT'], + parser, + stored_cfg.fmsread_groups) + + if len(parser.usks) == 0: + ui_.status("No USKs found.\n") + return True + + ui_.status("\n") + for usk in parser.usks: + usk_entry = parser.usks[usk] + ui_.status("USK Hash: %s\n%s\n%s\n\n" % + (get_usk_hash(usk), usk, + '\n'.join(usk_entry))) + + return True + +def dump_trust_map(ui_, params, trust_map): + """ Show verbose trust map information. """ + if params['VERBOSITY'] < 2: + return + + if not params['REQUEST_URI'] is None: + ui_.status("USK Hash: %s\n" % get_usk_hash(params['REQUEST_URI'])) + fms_ids = trust_map.keys() + fms_ids.sort() + ui_.status("Update Trust Map:\n") + for fms_id in fms_ids: + ui_.status(" %s: %s\n" % (fms_id, + ' '.join(trust_map[fms_id]))) + ui_.status("\n") + +def execute_fmsread(ui_, params, stored_cfg): + """ Run the fmsread command. """ + if params['VERBOSITY'] >= 2: + ui_.status(('Connecting to fms on %s:%i\n' + + 'Searching groups: %s\n') % + (stored_cfg.defaults['FMS_HOST'], + stored_cfg.defaults['FMS_PORT'], + ' '.join(stored_cfg.fmsread_groups))) + + # Listing announced Repo USKs + if handled_list(ui_, params, stored_cfg): + return + + # Updating Repo USK indices for repos which are + # listed int the fmsread_trust_map section of the + # config file. + trust_map = stored_cfg.fmsread_trust_map.copy() # paranoid copy + + dump_trust_map(ui_, params, trust_map) + + ui_.status("Raking through fms messages. This make take a while...\n") + parser = USKIndexUpdateParser(trust_map, True) + recv_msgs(stored_cfg.defaults['FMS_HOST'], + stored_cfg.defaults['FMS_PORT'], + parser, + stored_cfg.fmsread_groups) + changed = parser.updated(stored_cfg.version_table) + + if params['VERBOSITY'] >= 2: + if parser.untrusted and len(parser.untrusted) > 0: + text = 'Skipped Untrusted Updates:\n' + for usk_hash in parser.untrusted: + text += usk_hash + ':\n' + fms_ids = parser.untrusted[usk_hash] + for fms_id in fms_ids: + text += ' ' + fms_id + '\n' + text += '\n' + ui_.status(text) + + if len(changed) == 0: + ui_.status('No updates found.\n') + return + + # Back map to uris ? Can't always do it. + if len(changed) > 0: + text = 'Updates:\n' + for usk_hash in changed: + text += '%s:%i\n' % (usk_hash, changed[usk_hash]) + ui_.status(text) + if ((not params['REQUEST_URI'] is None) and + get_usk_hash(params['REQUEST_URI']) in changed): + ui_.status("Current repo has update to index %s.\n" % + changed[get_usk_hash(params['REQUEST_URI'])]) + + if params['DRYRUN']: + ui_.status('Exiting without saving because --dryrun was set.\n') + return + + for usk_hash in changed: + stored_cfg.update_index(usk_hash, changed[usk_hash]) + + Config.to_file(stored_cfg) + ui_.status('Saved updated indices.\n') + + +# REDFLAG: Catch this in config when depersisting? +def is_none(value): + """ Return True if value is None or 'None', False otherwise. """ + return value is None or value == 'None' + +def execute_fmsnotify(ui_, repo, params, stored_cfg): + """ Run fmsnotify command. """ + update_sm = None + try: + # Insert URI MUST be stored. + update_sm = setup(ui_, repo, params, stored_cfg) + request_uri, dummy = do_key_setup(ui_, update_sm, + params, stored_cfg) + if request_uri is None: # Just assert? + ui_.warn("Only works for USK file URIs.\n") + return + + usk_hash = get_usk_hash(request_uri) + index = stored_cfg.get_index(usk_hash) + if index is None: + ui_.warn("Can't notify because there's no stored index " + + "for %s.\n" % usk_hash) + return + + if is_none(stored_cfg.defaults['FMS_ID']): + ui_.warn("Can't notify because the fms ID isn't set in the " + + "config file.\n") + ui_.status("Update the fms_id = line and try again.\n") + return + + if is_none(stored_cfg.defaults['FMSNOTIFY_GROUP']): + ui_.warn("Can't notify because fms group isn't set in the " + + "config file.\n") + ui_.status("Update the fmsnotify_group = line and try again.\n") + return + + if params['ANNOUNCE']: + text = to_msg_string(None, (request_uri, )) + else: + text = to_msg_string(((usk_hash, index), )) + + subject = 'Update:' + '/'.join(request_uri.split('/')[1:]) + msg_tuple = (stored_cfg.defaults['FMS_ID'], + stored_cfg.defaults['FMSNOTIFY_GROUP'], + subject, + text) + + if params['VERBOSITY'] >= 2: + ui_.status('Connecting to fms on %s:%i\n' % + (stored_cfg.defaults['FMS_HOST'], + stored_cfg.defaults['FMS_PORT'])) + + ui_.status('Sender : %s\nGroup : %s\nSubject: %s\n%s\n' % + (stored_cfg.defaults['FMS_ID'], + stored_cfg.defaults['FMSNOTIFY_GROUP'], + subject, text)) + + if params['VERBOSITY'] >= 5: + raw_msg = MSG_TEMPLATE % (msg_tuple[0], + msg_tuple[1], + msg_tuple[2], + msg_tuple[3]) + ui_.status('--- Raw Message ---\n%s\n---\n' % raw_msg) + + if params['DRYRUN']: + ui_.status('Exiting without sending because --dryrun was set.\n') + return + + send_msgs(stored_cfg.defaults['FMS_HOST'], + stored_cfg.defaults['FMS_PORT'], + (msg_tuple, )) + + ui_.status('Notification message sent.\n' + 'Be patient. It may take up to a day to show up.\n') + finally: + cleanup(update_sm) + diff --git a/infocalypse/infcmds.py b/infocalypse/infcmds.py --- a/infocalypse/infcmds.py +++ b/infocalypse/infcmds.py @@ -30,8 +30,7 @@ import time 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, \ - get_usk_hash + get_usk_for_usk_version, FCPClient, is_usk_file, is_negative_usk from fcpconnection import FCPConnection, PolledSocket, CONNECTION_STATES, \ get_code, FCPError @@ -46,9 +45,6 @@ from updatesm import UpdateStateMachine, from config import Config, DEFAULT_CFG_PATH, normalize -from fms import USKAnnouncementParser, USKIndexUpdateParser, recv_msgs, \ - to_msg_string, MSG_TEMPLATE, send_msgs - DEFAULT_PARAMS = { # FCP params 'MaxRetries':3, @@ -714,192 +710,6 @@ def execute_info(ui_, params, stored_cfg ui_.status(INFO_FMT % (usk_hash, max_index or -1, request_uri, insert_uri)) -def handled_list(ui_, params, stored_cfg): - """ INTERNAL: Helper function to simplify execute_fmsread. """ - if params['FMSREAD'] != 'list' and params['FMSREAD'] != 'listall': - return False - - if params['FMSREAD'] == 'listall': - parser = USKAnnouncementParser(None, True) - if params['VERBOSITY'] >= 2: - ui_.status('Listing all repo USKs.\n') - else: - trust_map = stored_cfg.fmsread_trust_map.copy() # paranoid copy - if params['VERBOSITY'] >= 2: - fms_ids = trust_map.keys() - fms_ids.sort() - ui_.status(("Only listing repo USKs from trusted " - + "fms IDs:\n%s\n\n") % '\n'.join(fms_ids)) - parser = USKAnnouncementParser(trust_map, True) - - recv_msgs(stored_cfg.defaults['FMS_HOST'], - stored_cfg.defaults['FMS_PORT'], - parser, - stored_cfg.fmsread_groups) - - if len(parser.usks) == 0: - ui_.status("No USKs found.\n") - return True - - ui_.status("\n") - for usk in parser.usks: - usk_entry = parser.usks[usk] - ui_.status("USK Hash: %s\n%s\n%s\n\n" % - (get_usk_hash(usk), usk, - '\n'.join(usk_entry))) - - return True - -def execute_fmsread(ui_, params, stored_cfg): - """ Run the fmsread command. """ - if params['VERBOSITY'] >= 2: - ui_.status(('Connecting to fms on %s:%i\n' - + 'Searching groups: %s\n') % - (stored_cfg.defaults['FMS_HOST'], - stored_cfg.defaults['FMS_PORT'], - ' '.join(stored_cfg.fmsread_groups))) - - # Listing announced Repo USKs - if handled_list(ui_, params, stored_cfg): - return - - # Updating Repo USK indices for repos which are - # listed int the fmsread_trust_map section of the - # config file. - trust_map = stored_cfg.fmsread_trust_map.copy() # paranoid copy - if params['VERBOSITY'] >= 2: - if not params['REQUEST_URI'] is None: - ui_.status("USK Hash: %s\n" % get_usk_hash(params['REQUEST_URI'])) - fms_ids = trust_map.keys() - fms_ids.sort() - ui_.status("Update Trust Map:\n") - for fms_id in fms_ids: - ui_.status(" %s: %s\n" % (fms_id, - ' '.join(trust_map[fms_id]))) - ui_.status("\n") - ui_.status("Raking through fms messages. This make take a while...\n") - parser = USKIndexUpdateParser(trust_map, True) - recv_msgs(stored_cfg.defaults['FMS_HOST'], - stored_cfg.defaults['FMS_PORT'], - parser, - stored_cfg.fmsread_groups) - changed = parser.updated(stored_cfg.version_table) - - if params['VERBOSITY'] >= 2: - if parser.untrusted and len(parser.untrusted) > 0: - text = 'Skipped Untrusted Updates:\n' - for usk_hash in parser.untrusted: - text += usk_hash + ':\n' - fms_ids = parser.untrusted[usk_hash] - for fms_id in fms_ids: - text += ' ' + fms_id + '\n' - text += '\n' - ui_.status(text) - - if len(changed) == 0: - ui_.status('No updates found.\n') - return - - # Back map to uris ? Can't always do it. - if len(changed) > 0: - text = 'Updates:\n' - for usk_hash in changed: - text += '%s:%i\n' % (usk_hash, changed[usk_hash]) - ui_.status(text) - if ((not params['REQUEST_URI'] is None) and - get_usk_hash(params['REQUEST_URI']) in changed): - ui_.status("Current repo has update to index %s.\n" % - changed[get_usk_hash(params['REQUEST_URI'])]) - - if params['DRYRUN']: - ui_.status('Exiting without saving because --dryrun was set.\n') - return - - for usk_hash in changed: - stored_cfg.update_index(usk_hash, changed[usk_hash]) - - - Config.to_file(stored_cfg) - ui_.status('Saved updated indices.\n') - - -# REDFLAG: Catch this in config when depersisting? -def is_none(value): - """ Return True if value is None or 'None', False otherwise. """ - return value is None or value == 'None' - -def execute_fmsnotify(ui_, repo, params, stored_cfg): - """ Run fmsnotify command. """ - update_sm = None - try: - # Insert URI MUST be stored. - update_sm = setup(ui_, repo, params, stored_cfg) - request_uri, dummy = do_key_setup(ui_, update_sm, - params, stored_cfg) - if request_uri is None: # Just assert? - ui_.warn("Only works for USK file URIs.\n") - return - - usk_hash = get_usk_hash(request_uri) - index = stored_cfg.get_index(usk_hash) - if index is None: - ui_.warn("Can't notify because there's no stored index " - + "for %s.\n" % usk_hash) - return - - if is_none(stored_cfg.defaults['FMS_ID']): - ui_.warn("Can't notify because the fms ID isn't set in the " - + "config file.\n") - ui_.status("Update the fms_id = line and try again.\n") - return - - if is_none(stored_cfg.defaults['FMSNOTIFY_GROUP']): - ui_.warn("Can't notify because fms group isn't set in the " - + "config file.\n") - ui_.status("Update the fmsnotify_group = line and try again.\n") - return - - if params['ANNOUNCE']: - text = to_msg_string(None, (request_uri, )) - else: - text = to_msg_string(((usk_hash, index), )) - - subject = 'Update:' + '/'.join(request_uri.split('/')[1:]) - msg_tuple = (stored_cfg.defaults['FMS_ID'], - stored_cfg.defaults['FMSNOTIFY_GROUP'], - subject, - text) - - if params['VERBOSITY'] >= 2: - ui_.status('Connecting to fms on %s:%i\n' % - (stored_cfg.defaults['FMS_HOST'], - stored_cfg.defaults['FMS_PORT'])) - - ui_.status('Sender : %s\nGroup : %s\nSubject: %s\n%s\n' % - (stored_cfg.defaults['FMS_ID'], - stored_cfg.defaults['FMSNOTIFY_GROUP'], - subject, text)) - - if params['VERBOSITY'] >= 5: - raw_msg = MSG_TEMPLATE % (msg_tuple[0], - msg_tuple[1], - msg_tuple[2], - msg_tuple[3]) - ui_.status('--- Raw Message ---\n%s\n---\n' % raw_msg) - - if params['DRYRUN']: - ui_.status('Exiting without sending because --dryrun was set.\n') - return - - send_msgs(stored_cfg.defaults['FMS_HOST'], - stored_cfg.defaults['FMS_PORT'], - (msg_tuple, )) - - ui_.status('Notification message sent.\n' - 'Be patient. It may take up to a day to show up.\n') - finally: - cleanup(update_sm) - def setup_tmp_dir(ui_, tmp): """ INTERNAL: Setup the temp directory. """ tmp = os.path.expanduser(tmp)