buildman: Extract helper functions from output_is_new()
Move the srcdir walk and output file scanning into module-level functions _check_srcdir_is_current() and _check_output_is_current() to reduce complexity. Co-developed-by: Claude Opus 4.5 <noreply@anthropic.com> Signed-off-by: Simon Glass <simon.glass@canonical.com>
This commit is contained in:
@@ -56,6 +56,50 @@ def try_remove(fname):
|
||||
raise
|
||||
|
||||
|
||||
def _check_srcdir_is_current(ctime, srcdir):
|
||||
"""Check if any Kconfig or MAINTAINERS files are newer than ctime
|
||||
|
||||
Args:
|
||||
ctime (float): Reference time to compare against
|
||||
srcdir (str): Directory containing Kconfig and MAINTAINERS files
|
||||
|
||||
Returns:
|
||||
bool: True if all files are older than ctime
|
||||
"""
|
||||
for (dirpath, _, filenames) in os.walk(srcdir):
|
||||
for filename in filenames:
|
||||
if (fnmatch.fnmatch(filename, '*~') or
|
||||
not fnmatch.fnmatch(filename, 'Kconfig*') and
|
||||
not filename == 'MAINTAINERS'):
|
||||
continue
|
||||
filepath = os.path.join(dirpath, filename)
|
||||
if ctime < os.path.getctime(filepath):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def _check_output_is_current(output, config_dir):
|
||||
"""Check if output references any removed boards
|
||||
|
||||
Args:
|
||||
output (str): Path to the output file
|
||||
config_dir (str): Directory containing defconfig files
|
||||
|
||||
Returns:
|
||||
bool: True if all referenced boards still exist
|
||||
"""
|
||||
with open(output, encoding="utf-8") as inf:
|
||||
for line in inf:
|
||||
if 'Options,' in line:
|
||||
return False
|
||||
if line[0] == '#' or line == '\n':
|
||||
continue
|
||||
defconfig = line.split()[6] + '_defconfig'
|
||||
if not os.path.exists(os.path.join(config_dir, defconfig)):
|
||||
return False
|
||||
return True
|
||||
|
||||
|
||||
def output_is_new(output, config_dir, srcdir):
|
||||
"""Check if the output file is up to date.
|
||||
|
||||
@@ -75,7 +119,6 @@ def output_is_new(output, config_dir, srcdir):
|
||||
Raises:
|
||||
OSError: output file exists but could not be opened
|
||||
"""
|
||||
# pylint: disable=too-many-branches
|
||||
try:
|
||||
ctime = os.path.getctime(output)
|
||||
except OSError as exception:
|
||||
@@ -92,27 +135,11 @@ def output_is_new(output, config_dir, srcdir):
|
||||
if ctime < os.path.getctime(filepath):
|
||||
return False
|
||||
|
||||
for (dirpath, _, filenames) in os.walk(srcdir):
|
||||
for filename in filenames:
|
||||
if (fnmatch.fnmatch(filename, '*~') or
|
||||
not fnmatch.fnmatch(filename, 'Kconfig*') and
|
||||
not filename == 'MAINTAINERS'):
|
||||
continue
|
||||
filepath = os.path.join(dirpath, filename)
|
||||
if ctime < os.path.getctime(filepath):
|
||||
return False
|
||||
if not _check_srcdir_is_current(ctime, srcdir):
|
||||
return False
|
||||
|
||||
# Detect a board that has been removed since the current board database
|
||||
# was generated
|
||||
with open(output, encoding="utf-8") as inf:
|
||||
for line in inf:
|
||||
if 'Options,' in line:
|
||||
return False
|
||||
if line[0] == '#' or line == '\n':
|
||||
continue
|
||||
defconfig = line.split()[6] + '_defconfig'
|
||||
if not os.path.exists(os.path.join(config_dir, defconfig)):
|
||||
return False
|
||||
if not _check_output_is_current(output, config_dir):
|
||||
return False
|
||||
|
||||
return True
|
||||
|
||||
|
||||
Reference in New Issue
Block a user