20 Check that no light-release-breaking dependencies have been added.
22 If you are failing this test you have managed to break light builds, please
23 check with the light release manager for more information.
27 def get_sconscripts(package):
28 """glob to get the path to all sconscript files
31 package (str): the name of the package directory
34 list(str): a list of all SConscript files
36 path_to_package = basf2.find_file(package)
37 return glob.glob(f
"{path_to_package}/**/SConscript", recursive=
True)
40 def get_dependencies(sconscript_filename):
41 """grab all of the LIBS in the sconscript file
44 sconscript_filename (str): the path to the sconscript file
47 set(str): a set of packages in the env['LIBS'] in this file
51 with open(sconscript_filename)
as fi:
53 dependencies = re.search(
54 r"env\['LIBS'\] *= *\[\n*((?:.*?|\n)*?)\n*\]", file_data
57 dependencies = dependencies.group(1)
64 lb.replace(
"'",
"").replace(
'"',
"").strip()
65 for lb
in re.split(
",|\n", dependencies)
66 if not lb.count(
"#")
and not lb ==
''
70 package_dependencies = {lb.split(
"_")[0]
for lb
in dependencies}
72 return package_dependencies
75 def check_dependencies(forbidden, sconscript_files, error=""):
76 """Check that there are no dependencies that are forbidden.
79 forbidden set(str): a set of packages we don't want to depend on
80 sconscript_files list(str): a list of paths to sconscript files
81 error str: optionally specify the error message
84 int: count of the number of forbidden dependencies found
87 for sconscript_filename
in sconscript_files:
90 this_dependencies = get_dependencies(sconscript_filename)
94 forbidden_packages_dependencies = forbidden.intersection(this_dependencies)
97 if len(forbidden_packages_dependencies) != 0:
99 f
"The sconscript file {sconscript_filename} depends on",
100 forbidden_packages_dependencies,
107 if __name__ ==
"__main__":
111 light_file = basf2.find_file(
".light")
112 with open(light_file)
as fi:
113 light_packages = [li.strip().replace(
"/",
"")
for li
in fi
if li.strip().endswith(
"/")]
118 all_packages = subprocess.check_output(
119 [
"b2code-package-list"], cwd=os.path.dirname(light_file),
121 all_packages = all_packages.decode(
"utf-8").strip().split(
" ")
124 non_light_packages = set(all_packages).difference(set(light_packages))
131 for package
in light_packages:
132 sconscript_files = get_sconscripts(package)
133 return_code_sum += check_dependencies(
134 non_light_packages, sconscript_files,
"This breaks light releases! Sorry."
138 print(
"Test of light dependencies, the loop took:", time() - start,
"seconds to run")
139 print(
"There were", return_code_sum,
"forbidden dependencies")
141 sys.exit(return_code_sum)