Fix bug for Python 2.6.2: '[default]' -> '[primary]' in the config. I shouldn't have been using 'default' in the first place. ConfigParser throws a ValueError for it under 2.6.2.
diff --git a/infocalypse/config.py b/infocalypse/config.py --- a/infocalypse/config.py +++ b/infocalypse/config.py @@ -57,6 +57,38 @@ def norm_path(dir_name): fixed = split[0].replace(':', '') + split[1] return fixed +# NOTE: +# The bug prevents ConfigParser from even reading +# the file. That's why I'm operating on the file +# directly. +# +# This is a HACK which should eventually be removed. +def detect_and_fix_default_bug(ui_, file_path): + """ INTERNAL: Fix old (pre: 466307bc98bc) config files. """ + raw = open(file_path, 'rb').read() + if raw.find('[default]') == -1: + return + + justin_case = os.path.join(os.path.dirname(file_path), 'INFOCALYPSE.BAK') + ui_.warn("Hit '[default'] bug in your config file.\n" + "Saving existing config as:\n%s\n" % justin_case) + if os.path.exists(justin_case): + ui_.warn("Refused to overwrite backup!\n" + +"Move:\n%s\n" % justin_case + +"out of the way and try again.\n") + raise util.Abort("Refused to overwrite backup config file.") + out_file = open(justin_case, 'wb') + try: + out_file.write(raw) + finally: + out_file.close() + fixed_file = open(file_path, 'wb') + try: + fixed_file.write(raw.replace('[default]', '[primary]')) + finally: + fixed_file.close() + ui_.warn("Applied fix.\n") + # Eventually set state from fms feed. i.e. latest repo updates. class Config: """ Persisted state used by the Infocalypse mercurial extension. """ @@ -151,37 +183,40 @@ class Config: @classmethod def update_defaults(cls, parser, cfg): """ INTERNAL: Helper function to simplify from_file. """ - if parser.has_section('default'): - if parser.has_option('default', 'format_version'): - cfg.defaults['FORMAT_VERSION'] = parser.get('default', + if parser.has_section('primary'): + if parser.has_option('primary', 'format_version'): + cfg.defaults['FORMAT_VERSION'] = parser.get('primary', 'format_version') - if parser.has_option('default','host'): - cfg.defaults['HOST'] = parser.get('default','host') - if parser.has_option('default','port'): - cfg.defaults['PORT'] = parser.getint('default','port') - if parser.has_option('default','tmp_dir'): - cfg.defaults['TMP_DIR'] = parser.get('default', 'tmp_dir') - if parser.has_option('default','default_private_key'): + if parser.has_option('primary','host'): + cfg.defaults['HOST'] = parser.get('primary','host') + if parser.has_option('primary','port'): + cfg.defaults['PORT'] = parser.getint('primary','port') + if parser.has_option('primary','tmp_dir'): + cfg.defaults['TMP_DIR'] = parser.get('primary', 'tmp_dir') + if parser.has_option('primary','default_private_key'): cfg.defaults['DEFAULT_PRIVATE_KEY'] = ( - parser.get('default','default_private_key')) + parser.get('primary','default_private_key')) - if parser.has_option('default','fms_host'): - cfg.defaults['FMS_HOST'] = parser.get('default','fms_host') - if parser.has_option('default','fms_port'): - cfg.defaults['FMS_PORT'] = parser.getint('default','fms_port') - if parser.has_option('default','fms_id'): - cfg.defaults['FMS_ID'] = parser.get('default','fms_id') - if parser.has_option('default','fmsnotify_group'): - cfg.defaults['FMSNOTIFY_GROUP'] = parser.get('default', + if parser.has_option('primary','fms_host'): + cfg.defaults['FMS_HOST'] = parser.get('primary','fms_host') + if parser.has_option('primary','fms_port'): + cfg.defaults['FMS_PORT'] = parser.getint('primary','fms_port') + if parser.has_option('primary','fms_id'): + cfg.defaults['FMS_ID'] = parser.get('primary','fms_id') + if parser.has_option('primary','fmsnotify_group'): + cfg.defaults['FMSNOTIFY_GROUP'] = parser.get('primary', 'fmsnotify_group') - if parser.has_option('default','fmsread_groups'): - cfg.fmsread_groups = (parser.get('default','fmsread_groups'). + if parser.has_option('primary','fmsread_groups'): + cfg.fmsread_groups = (parser.get('primary','fmsread_groups'). strip().split('|')) + # Hmmm... would be better to detect_and_fix_default_bug() + # here, but don't have ui. @classmethod def from_file(cls, file_name): """ Make a Config from a file. """ file_name = os.path.expanduser(file_name) + parser = ConfigParser() # IMPORTANT: Turn off downcasing of option names. parser.optionxform = str @@ -238,6 +273,9 @@ class Config: if not os.path.exists(file_name): ui_.warn("Couldn't read config file: %s\n" % file_name) raise util.Abort("Run fn-setup.\n") + + detect_and_fix_default_bug(ui_, file_name) + return Config.from_file(file_name) @classmethod @@ -255,20 +293,20 @@ class Config: # IMPORTANT: Turn off downcasing of option names. parser.optionxform = str - parser.add_section('default') - parser.set('default', 'format_version', FORMAT_VERSION) - parser.set('default', 'host', cfg.defaults['HOST']) - parser.set('default', 'port', cfg.defaults['PORT']) - parser.set('default', 'tmp_dir', cfg.defaults['TMP_DIR']) - parser.set('default', 'default_private_key', + parser.add_section('primary') + parser.set('primary', 'format_version', FORMAT_VERSION) + parser.set('primary', 'host', cfg.defaults['HOST']) + parser.set('primary', 'port', cfg.defaults['PORT']) + parser.set('primary', 'tmp_dir', cfg.defaults['TMP_DIR']) + parser.set('primary', 'default_private_key', cfg.defaults['DEFAULT_PRIVATE_KEY']) - parser.set('default', 'fms_host', cfg.defaults['FMS_HOST']) - parser.set('default', 'fms_port', cfg.defaults['FMS_PORT']) - parser.set('default', 'fms_id', cfg.defaults['FMS_ID']) - parser.set('default', 'fmsnotify_group', + parser.set('primary', 'fms_host', cfg.defaults['FMS_HOST']) + parser.set('primary', 'fms_port', cfg.defaults['FMS_PORT']) + parser.set('primary', 'fms_id', cfg.defaults['FMS_ID']) + parser.set('primary', 'fmsnotify_group', cfg.defaults['FMSNOTIFY_GROUP']) - parser.set('default', 'fmsread_groups', '|'.join(cfg.fmsread_groups)) + parser.set('primary', 'fmsread_groups', '|'.join(cfg.fmsread_groups)) parser.add_section('index_values') for repo_id in cfg.version_table: