Skip to content

Commit

Permalink
app: config: Add support for appending to the config string
Browse files Browse the repository at this point in the history
In some cases, and specifically in the manifest.group-filter and
manifest.project-filter options, it is sometimes useful to be able to
append to a value instead of replacing it completely.

For example, assuming one wants to add to an existing group filter,
without this patch the user needs to do:

(assuming the group filter is currently +unstable,-optional, and the
user wants to add +extras).
> west config manifest.group-filter
> west config manifest.group-filter +unstable,-optional,+extras

With this patch instead:

> west config -a manifest.group-filter ,+extras

Signed-off-by: Carles Cufi <[email protected]>
  • Loading branch information
carlescufi committed Nov 14, 2024
1 parent 0fbb54c commit 3cf5a27
Showing 1 changed file with 30 additions and 8 deletions.
38 changes: 30 additions & 8 deletions src/west/app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,11 @@
To set a value for <name>, type:
west config <name> <value>
To append to a value for <name>, type:
west config -a <name> <value>
A value must exist in the selected configuration file in order to be able
to append to it.
To list all options and their values:
west config -l
Expand All @@ -64,7 +69,7 @@

CONFIG_EPILOG = '''\
If the configuration file to use is not set, reads use all three in
precedence order, and writes use the local file.'''
precedence order, and writes (including appends) use the local file.'''

ALL = ConfigFile.ALL
SYSTEM = ConfigFile.SYSTEM
Expand All @@ -88,12 +93,19 @@ def do_add_parser(self, parser_adder):
description=self.description,
epilog=CONFIG_EPILOG)

parser.add_argument('-l', '--list', action='store_true',
group = parser.add_argument_group(
"action to perform (give at most one)"
).add_mutually_exclusive_group()


group.add_argument('-l', '--list', action='store_true',
help='list all options and their values')
parser.add_argument('-d', '--delete', action='store_true',
group.add_argument('-d', '--delete', action='store_true',
help='delete an option in one config file')
parser.add_argument('-D', '--delete-all', action='store_true',
group.add_argument('-D', '--delete-all', action='store_true',
help="delete an option everywhere it's set")
group.add_argument('-a', '--append', action='store_true',
help='append to an existing value')

group = parser.add_argument_group(
"configuration file to use (give at most one)"
Expand Down Expand Up @@ -121,20 +133,20 @@ def do_run(self, args, user_args):
if args.list:
if args.name:
self.parser.error('-l cannot be combined with name argument')
elif delete:
self.parser.error('-l cannot be combined with -d or -D')
elif not args.name:
self.parser.error('missing argument name '
'(to list all options and values, use -l)')
elif args.delete and args.delete_all:
self.parser.error('-d cannot be combined with -D')
elif args.value is None and args.append:
self.parser.error('-a requires a value')

if args.list:
self.list(args)
elif delete:
self.delete(args)
elif args.value is None:
self.read(args)
elif args.append:
self.append(args)
else:
self.write(args)

Expand Down Expand Up @@ -179,6 +191,16 @@ def read(self, args):
self.dbg(f'{args.name} is unset')
raise CommandError(returncode=1)

def append(self, args):
self.check_config(args.name)
what = args.configfile or LOCAL
value = self.config.get(args.name, configfile=what)
if value is None:
self.die(f'option {args.name} not found in {what.name.lower()} '
'configuration file')
args.value = value + args.value
self.write(args)

def write(self, args):
self.check_config(args.name)
what = args.configfile or LOCAL
Expand Down

0 comments on commit 3cf5a27

Please sign in to comment.