Split _abi_compliance_command into smaller functions

This makes the code easier to read and pacifies pylint.
This commit is contained in:
Gilles Peskine 2019-07-04 19:17:40 +02:00
parent 2b3f1346ef
commit b14b7305c6

View File

@ -233,24 +233,9 @@ class AbiChecker(object):
if not problems.getchildren(): if not problems.getchildren():
report.remove(problems) report.remove(problems)
def get_abi_compatibility_report(self): def _abi_compliance_command(self, mbed_module, output_path):
"""Generate a report of the differences between the reference ABI """Build the command to run to analyze the library mbed_module.
and the new ABI. ABI dumps from self.old_version and self.new_version The report will be placed in output_path."""
must be available."""
compatibility_report = ("Checking evolution from {} to {}\n".format(
self._pretty_revision(self.old_version),
self._pretty_revision(self.new_version)
))
compliance_return_code = 0
shared_modules = list(set(self.old_version.modules.keys()) &
set(self.new_version.modules.keys()))
for mbed_module in shared_modules:
output_path = os.path.join(
self.report_dir, "{}-{}-{}.html".format(
mbed_module, self.old_version.revision,
self.new_version.revision
)
)
abi_compliance_command = [ abi_compliance_command = [
"abi-compliance-checker", "abi-compliance-checker",
"-l", mbed_module, "-l", mbed_module,
@ -265,14 +250,25 @@ class AbiChecker(object):
if self.brief: if self.brief:
abi_compliance_command += ["-report-format", "xml", abi_compliance_command += ["-report-format", "xml",
"-stdout"] "-stdout"]
return abi_compliance_command
def _is_library_compatible(self, mbed_module, compatibility_report):
"""Test if the library mbed_module has remained compatible.
Append a message regarding compatibility to compatibility_report."""
output_path = os.path.join(
self.report_dir, "{}-{}-{}.html".format(
mbed_module, self.old_version.revision,
self.new_version.revision
)
)
try: try:
subprocess.check_output( subprocess.check_output(
abi_compliance_command, self._abi_compliance_command(mbed_module, output_path),
stderr=subprocess.STDOUT stderr=subprocess.STDOUT
) )
except subprocess.CalledProcessError as err: except subprocess.CalledProcessError as err:
if err.returncode == 1: if err.returncode != 1:
compliance_return_code = 1 raise err
if self.brief: if self.brief:
self.log.info( self.log.info(
"Compatibility issues found for {}".format(mbed_module) "Compatibility issues found for {}".format(mbed_module)
@ -282,24 +278,39 @@ class AbiChecker(object):
self.log.info(ET.tostring(report_root).decode("utf-8")) self.log.info(ET.tostring(report_root).decode("utf-8"))
else: else:
self.can_remove_report_dir = False self.can_remove_report_dir = False
compatibility_report += ( compatibility_report.append(
"Compatibility issues found for {}, " "Compatibility issues found for {}, "
"for details see {}\n".format(mbed_module, output_path) "for details see {}".format(mbed_module, output_path)
) )
else: return False
raise err compatibility_report.append(
else: "No compatibility issues for {}".format(mbed_module)
compatibility_report += (
"No compatibility issues for {}\n".format(mbed_module)
) )
if not (self.keep_all_reports or self.brief): if not (self.keep_all_reports or self.brief):
os.remove(output_path) os.remove(output_path)
return True
def get_abi_compatibility_report(self):
"""Generate a report of the differences between the reference ABI
and the new ABI. ABI dumps from self.old_version and self.new_version
must be available."""
compatibility_report = ["Checking evolution from {} to {}".format(
self._pretty_revision(self.old_version),
self._pretty_revision(self.new_version)
)]
compliance_return_code = 0
shared_modules = list(set(self.old_version.modules.keys()) &
set(self.new_version.modules.keys()))
for mbed_module in shared_modules:
if not self._is_library_compatible(mbed_module,
compatibility_report):
compliance_return_code = 1
for version in [self.old_version, self.new_version]: for version in [self.old_version, self.new_version]:
for mbed_module, mbed_module_dump in version.abi_dumps.items(): for mbed_module, mbed_module_dump in version.abi_dumps.items():
os.remove(mbed_module_dump) os.remove(mbed_module_dump)
if self.can_remove_report_dir: if self.can_remove_report_dir:
os.rmdir(self.report_dir) os.rmdir(self.report_dir)
self.log.info(compatibility_report) self.log.info("\n".join(compatibility_report))
return compliance_return_code return compliance_return_code
def check_for_abi_changes(self): def check_for_abi_changes(self):