* yapf changes * Fix the cformat test * Make the normpath test work when run from / * `qmk config`: Mark `--read-only` as arg_only
		
			
				
	
	
		
			97 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			97 lines
		
	
	
		
			3.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| """Read and write configuration settings
 | |
| """
 | |
| import os
 | |
| import subprocess
 | |
| 
 | |
| from milc import cli
 | |
| 
 | |
| 
 | |
| def print_config(section, key):
 | |
|     """Print a single config setting to stdout.
 | |
|     """
 | |
|     cli.echo('%s.%s{fg_cyan}={fg_reset}%s', section, key, cli.config[section][key])
 | |
| 
 | |
| 
 | |
| @cli.argument('-ro', '--read-only', arg_only=True, action='store_true', help='Operate in read-only mode.')
 | |
| @cli.argument('configs', nargs='*', arg_only=True, help='Configuration options to read or write.')
 | |
| @cli.subcommand("Read and write configuration settings.")
 | |
| def config(cli):
 | |
|     """Read and write config settings.
 | |
| 
 | |
|     This script iterates over the config_tokens supplied as argument. Each config_token has the following form:
 | |
| 
 | |
|         section[.key][=value]
 | |
| 
 | |
|     If only a section (EG 'compile') is supplied all keys for that section will be displayed.
 | |
| 
 | |
|     If section.key is supplied the value for that single key will be displayed.
 | |
| 
 | |
|     If section.key=value is supplied the value for that single key will be set.
 | |
| 
 | |
|     If section.key=None is supplied the key will be deleted.
 | |
| 
 | |
|     No validation is done to ensure that the supplied section.key is actually used by qmk scripts.
 | |
|     """
 | |
|     if not cli.args.configs:
 | |
|         # Walk the config tree
 | |
|         for section in cli.config:
 | |
|             for key in cli.config[section]:
 | |
|                 print_config(section, key)
 | |
| 
 | |
|         return True
 | |
| 
 | |
|     # Process config_tokens
 | |
|     save_config = False
 | |
| 
 | |
|     for argument in cli.args.configs:
 | |
|         # Split on space in case they quoted multiple config tokens
 | |
|         for config_token in argument.split(' '):
 | |
|             # Extract the section, config_key, and value to write from the supplied config_token.
 | |
|             if '=' in config_token:
 | |
|                 key, value = config_token.split('=')
 | |
|             else:
 | |
|                 key = config_token
 | |
|                 value = None
 | |
| 
 | |
|             if '.' in key:
 | |
|                 section, config_key = key.split('.', 1)
 | |
|             else:
 | |
|                 section = key
 | |
|                 config_key = None
 | |
| 
 | |
|             # Validation
 | |
|             if config_key and '.' in config_key:
 | |
|                 cli.log.error('Config keys may not have more than one period! "%s" is not valid.', key)
 | |
|                 return False
 | |
| 
 | |
|             # Do what the user wants
 | |
|             if section and config_key and value:
 | |
|                 # Write a config key
 | |
|                 log_string = '%s.%s{fg_cyan}:{fg_reset} %s {fg_cyan}->{fg_reset} %s'
 | |
|                 if cli.args.read_only:
 | |
|                     log_string += ' {fg_red}(change not written)'
 | |
| 
 | |
|                 cli.echo(log_string, section, config_key, cli.config[section][config_key], value)
 | |
| 
 | |
|                 if not cli.args.read_only:
 | |
|                     if value == 'None':
 | |
|                         del cli.config[section][config_key]
 | |
|                     else:
 | |
|                         cli.config[section][config_key] = value
 | |
|                     save_config = True
 | |
| 
 | |
|             elif section and config_key:
 | |
|                 # Display a single key
 | |
|                 print_config(section, config_key)
 | |
| 
 | |
|             elif section:
 | |
|                 # Display an entire section
 | |
|                 for key in cli.config[section]:
 | |
|                     print_config(section, key)
 | |
| 
 | |
|     # Ending actions
 | |
|     if save_config:
 | |
|         cli.save_config()
 | |
| 
 | |
|     return True
 |