mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-09-06 02:50:43 +00:00
![David Gow](/assets/img/avatar_default.png)
[ Upstream commit7421b1a4d1
] The first argument to namedtuple() should match the name of the type, which wasn't the case for KconfigEntryBase. Fixing this is enough to make mypy show no python typing errors again. Fixes97752c39bd
("kunit: kunit_tool: Allow .kunitconfig to disable config items") Signed-off-by: David Gow <davidgow@google.com> Reviewed-by: Daniel Latypov <dlatypov@google.com> Acked-by: Brendan Higgins <brendanhiggins@google.com> Signed-off-by: Shuah Khan <skhan@linuxfoundation.org> Signed-off-by: Sasha Levin <sashal@kernel.org>
89 lines
2.2 KiB
Python
89 lines
2.2 KiB
Python
# SPDX-License-Identifier: GPL-2.0
|
|
#
|
|
# Builds a .config from a kunitconfig.
|
|
#
|
|
# Copyright (C) 2019, Google LLC.
|
|
# Author: Felix Guo <felixguoxiuping@gmail.com>
|
|
# Author: Brendan Higgins <brendanhiggins@google.com>
|
|
|
|
import collections
|
|
import re
|
|
|
|
CONFIG_IS_NOT_SET_PATTERN = r'^# CONFIG_(\w+) is not set$'
|
|
CONFIG_PATTERN = r'^CONFIG_(\w+)=(\S+|".*")$'
|
|
|
|
KconfigEntryBase = collections.namedtuple('KconfigEntryBase', ['name', 'value'])
|
|
|
|
class KconfigEntry(KconfigEntryBase):
|
|
|
|
def __str__(self) -> str:
|
|
if self.value == 'n':
|
|
return r'# CONFIG_%s is not set' % (self.name)
|
|
else:
|
|
return r'CONFIG_%s=%s' % (self.name, self.value)
|
|
|
|
|
|
class KconfigParseError(Exception):
|
|
"""Error parsing Kconfig defconfig or .config."""
|
|
|
|
|
|
class Kconfig(object):
|
|
"""Represents defconfig or .config specified using the Kconfig language."""
|
|
|
|
def __init__(self):
|
|
self._entries = []
|
|
|
|
def entries(self):
|
|
return set(self._entries)
|
|
|
|
def add_entry(self, entry: KconfigEntry) -> None:
|
|
self._entries.append(entry)
|
|
|
|
def is_subset_of(self, other: 'Kconfig') -> bool:
|
|
for a in self.entries():
|
|
found = False
|
|
for b in other.entries():
|
|
if a.name != b.name:
|
|
continue
|
|
if a.value != b.value:
|
|
return False
|
|
found = True
|
|
if a.value != 'n' and found == False:
|
|
return False
|
|
return True
|
|
|
|
def write_to_file(self, path: str) -> None:
|
|
with open(path, 'w') as f:
|
|
for entry in self.entries():
|
|
f.write(str(entry) + '\n')
|
|
|
|
def parse_from_string(self, blob: str) -> None:
|
|
"""Parses a string containing KconfigEntrys and populates this Kconfig."""
|
|
self._entries = []
|
|
is_not_set_matcher = re.compile(CONFIG_IS_NOT_SET_PATTERN)
|
|
config_matcher = re.compile(CONFIG_PATTERN)
|
|
for line in blob.split('\n'):
|
|
line = line.strip()
|
|
if not line:
|
|
continue
|
|
|
|
match = config_matcher.match(line)
|
|
if match:
|
|
entry = KconfigEntry(match.group(1), match.group(2))
|
|
self.add_entry(entry)
|
|
continue
|
|
|
|
empty_match = is_not_set_matcher.match(line)
|
|
if empty_match:
|
|
entry = KconfigEntry(empty_match.group(1), 'n')
|
|
self.add_entry(entry)
|
|
continue
|
|
|
|
if line[0] == '#':
|
|
continue
|
|
else:
|
|
raise KconfigParseError('Failed to parse: ' + line)
|
|
|
|
def read_from_file(self, path: str) -> None:
|
|
with open(path, 'r') as f:
|
|
self.parse_from_string(f.read())
|