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 15, 2024
1 parent 97f98c1 commit 4260ed1
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 5 deletions.
34 changes: 29 additions & 5 deletions src/west/app/config.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,15 @@
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. The existing value can be empty.
Examples:
west config -a build.cmake-args -- "-DCMAKE_EXPORT_COMPILE_COMMANDS=ON \
-DCMAKE_VERBOSE_MAKEFILE=ON"
west config -a manifest.group-filter ,+optional
To list all options and their values:
west config -l
Expand All @@ -64,7 +73,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 Down Expand Up @@ -92,13 +101,14 @@ def do_add_parser(self, parser_adder):
"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')
help='list all options and their values')
group.add_argument('-d', '--delete', action='store_true',
help='delete an option in one config file')
help='delete an option in one config file')
group.add_argument('-D', '--delete-all', action='store_true',
help="delete an option everywhere it's set")
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 @@ -129,13 +139,17 @@ def do_run(self, args, user_args):
elif not args.name:
self.parser.error('missing argument name '
'(to list all options and values, use -l)')
elif args.value is None and args.append:
self.parser.error('-a requires both name and 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 @@ -180,6 +194,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)
where = args.configfile or LOCAL
value = self.config.get(args.name, configfile=where)
if value is None:
self.die(f'option {args.name} not found in the {where.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
3 changes: 3 additions & 0 deletions tests/test_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -229,6 +229,9 @@ def test_local_creation_with_topdir():
assert 'pytest' not in cfg(f=GLOBAL)
assert cfg(f=LOCAL, topdir=str(topdir))['pytest']['key'] == 'val'

def test_append_basic():


def test_delete_basic():
# Basic deletion test: write local, verify global and system deletions
# don't work, then delete local does work.
Expand Down

0 comments on commit 4260ed1

Please sign in to comment.