import os
import pathlib
import sys
def help():
print('Usage:')
print('python source-code-check.py
')
def check(directory, bytes_to_check, exclude_dirs, exclude_extensions, exclude_files):
if not os.path.isdir(directory):
return None
files_with_errors = []
for root, dirs, files in os.walk(directory, topdown=True):
dirs[:] = [d for d in dirs if os.path.join(root, d) not in exclude_dirs]
for filename in files:
if (pathlib.Path(filename).suffix in exclude_extensions):
continue
file = os.path.join(root, filename)
if (os.path.islink(file) or file in exclude_files):
continue
with open(file, "rb") as f:
print('Checking file: ' + file)
byte = f.read(1)
while byte:
if byte in bytes_to_check:
files_with_errors.append(file)
break
byte = f.read(1)
return files_with_errors
if (len(sys.argv) != 2):
help()
sys.exit(1)
directory = sys.argv[1]
exclude_dirs = [
os.path.join(directory, ".git"),
os.path.join(directory, "3rdParty", "android"),
os.path.join(directory, "3rdParty", "buildCache"),
os.path.join(directory, "3rdParty", "linux"),
os.path.join(directory, "3rdParty", "Windows"),
os.path.join(directory, "3rdParty", "vcpkg_ports", "ports"),
os.path.join(directory, "android", "BOINC", ".gradle"),
os.path.join(directory, "android", "BOINC", "app", "build"),
os.path.join(directory, "android", "BOINC", "app", "src", "main", "assets"),
os.path.join(directory, "android", "BOINC", "app", "src", "main", "res"),
os.path.join(directory, "doc", "manpages"),
os.path.join(directory, "drupal", "sites", "all", "libraries"),
os.path.join(directory, "drupal", "sites", "all", "themes"),
os.path.join(directory, "drupal", "sites", "default", "boinc", "modules", "contrib"),
os.path.join(directory, "drupal", "sites", "default", "boinc", "themes"),
os.path.join(directory, "fastlane"),
os.path.join(directory, "samples", "example_app", "bin"),
]
exclude_files = [
os.path.join(directory, "aclocal.m4"),
os.path.join(directory, "android", "BOINC", "gradlew"),
os.path.join(directory, "client", "boinc_client"),
os.path.join(directory, "client", "boinccmd"),
os.path.join(directory, "client", "boinc"),
os.path.join(directory, "client", "switcher"),
os.path.join(directory, "clientgui", "BOINCBaseView.cpp"),
os.path.join(directory, "clientscr", "progress", "simt"),
os.path.join(directory, "drupal", "sites", "default", "boinc", "modules", "boinc_solr_search", "boinc_solr_comments", "README.txt"),
os.path.join(directory, "drupal", "sites", "default", "boinc", "modules", "boinc_solr_search", "boinc_solr_comments", "INSTALL.txt"),
os.path.join(directory, "html", "inc", "GeoIP.dat"),
os.path.join(directory, "mac_installer", "BOINC.pmproj"),
os.path.join(directory, "mac_build", "boinc.xcodeproj", "project.pbxproj"),
os.path.join(directory, "stage", "usr", "local", "bin", "boinc_client"),
os.path.join(directory, "stage", "usr", "local", "bin", "boinccmd"),
os.path.join(directory, "stage", "usr", "local", "bin", "boinc"),
os.path.join(directory, "stage", "usr", "local", "bin", "switcher"),
]
exclude_extensions = [
".a",
".bmp",
".dll",
".exe",
".gif",
".icns",
".ico",
".jar",
".jpg",
".lib",
".mo",
".nib",
".o",
".odp",
".pdf",
".pdn",
".png",
".po",
".psd",
".rgb",
".so",
".tif",
".tiff",
".tlb",
".ttf",
".zip",
]
files_with_errors = check(directory, [b"\xC2"], exclude_dirs, exclude_extensions, exclude_files)
if files_with_errors:
print("Found files with errors:")
for file in files_with_errors:
print(file)
sys.exit(1)
sys.exit(0)