diff options
Diffstat (limited to 'lib/python/qmk/cli/config.py')
| -rw-r--r-- | lib/python/qmk/cli/config.py | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/lib/python/qmk/cli/config.py b/lib/python/qmk/cli/config.py new file mode 100644 index 000000000..d6c774e65 --- /dev/null +++ b/lib/python/qmk/cli/config.py | |||
| @@ -0,0 +1,96 @@ | |||
| 1 | """Read and write configuration settings | ||
| 2 | """ | ||
| 3 | import os | ||
| 4 | import subprocess | ||
| 5 | |||
| 6 | from milc import cli | ||
| 7 | |||
| 8 | |||
| 9 | def print_config(section, key): | ||
| 10 | """Print a single config setting to stdout. | ||
| 11 | """ | ||
| 12 | cli.echo('%s.%s{fg_cyan}={fg_reset}%s', section, key, cli.config[section][key]) | ||
| 13 | |||
| 14 | |||
| 15 | @cli.argument('-ro', '--read-only', action='store_true', help='Operate in read-only mode.') | ||
| 16 | @cli.argument('configs', nargs='*', arg_only=True, help='Configuration options to read or write.') | ||
| 17 | @cli.subcommand("Read and write configuration settings.") | ||
| 18 | def config(cli): | ||
| 19 | """Read and write config settings. | ||
| 20 | |||
| 21 | This script iterates over the config_tokens supplied as argument. Each config_token has the following form: | ||
| 22 | |||
| 23 | section[.key][=value] | ||
| 24 | |||
| 25 | If only a section (EG 'compile') is supplied all keys for that section will be displayed. | ||
| 26 | |||
| 27 | If section.key is supplied the value for that single key will be displayed. | ||
| 28 | |||
| 29 | If section.key=value is supplied the value for that single key will be set. | ||
| 30 | |||
| 31 | If section.key=None is supplied the key will be deleted. | ||
| 32 | |||
| 33 | No validation is done to ensure that the supplied section.key is actually used by qmk scripts. | ||
| 34 | """ | ||
| 35 | if not cli.args.configs: | ||
| 36 | # Walk the config tree | ||
| 37 | for section in cli.config: | ||
| 38 | for key in cli.config[section]: | ||
| 39 | print_config(section, key) | ||
| 40 | |||
| 41 | return True | ||
| 42 | |||
| 43 | # Process config_tokens | ||
| 44 | save_config = False | ||
| 45 | |||
| 46 | for argument in cli.args.configs: | ||
| 47 | # Split on space in case they quoted multiple config tokens | ||
| 48 | for config_token in argument.split(' '): | ||
| 49 | # Extract the section, config_key, and value to write from the supplied config_token. | ||
| 50 | if '=' in config_token: | ||
| 51 | key, value = config_token.split('=') | ||
| 52 | else: | ||
| 53 | key = config_token | ||
| 54 | value = None | ||
| 55 | |||
| 56 | if '.' in key: | ||
| 57 | section, config_key = key.split('.', 1) | ||
| 58 | else: | ||
| 59 | section = key | ||
| 60 | config_key = None | ||
| 61 | |||
| 62 | # Validation | ||
| 63 | if config_key and '.' in config_key: | ||
| 64 | cli.log.error('Config keys may not have more than one period! "%s" is not valid.', key) | ||
| 65 | return False | ||
| 66 | |||
| 67 | # Do what the user wants | ||
| 68 | if section and config_key and value: | ||
| 69 | # Write a config key | ||
| 70 | log_string = '%s.%s{fg_cyan}:{fg_reset} %s {fg_cyan}->{fg_reset} %s' | ||
| 71 | if cli.args.read_only: | ||
| 72 | log_string += ' {fg_red}(change not written)' | ||
| 73 | |||
| 74 | cli.echo(log_string, section, config_key, cli.config[section][config_key], value) | ||
| 75 | |||
| 76 | if not cli.args.read_only: | ||
| 77 | if value == 'None': | ||
| 78 | del cli.config[section][config_key] | ||
| 79 | else: | ||
| 80 | cli.config[section][config_key] = value | ||
| 81 | save_config = True | ||
| 82 | |||
| 83 | elif section and config_key: | ||
| 84 | # Display a single key | ||
| 85 | print_config(section, config_key) | ||
| 86 | |||
| 87 | elif section: | ||
| 88 | # Display an entire section | ||
| 89 | for key in cli.config[section]: | ||
| 90 | print_config(section, key) | ||
| 91 | |||
| 92 | # Ending actions | ||
| 93 | if save_config: | ||
| 94 | cli.save_config() | ||
| 95 | |||
| 96 | return True | ||
