1*4882a593Smuzhiyun#!/usr/bin/env python3 2*4882a593Smuzhiyun# 3*4882a593Smuzhiyun# Conversion script to rename variables to versions with improved terminology. 4*4882a593Smuzhiyun# Also highlights potentially problematic language and removed variables. 5*4882a593Smuzhiyun# 6*4882a593Smuzhiyun# Copyright (C) 2021 Richard Purdie 7*4882a593Smuzhiyun# Copyright (C) 2022 Wind River Systems, Inc. 8*4882a593Smuzhiyun# 9*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0-only 10*4882a593Smuzhiyun# 11*4882a593Smuzhiyun 12*4882a593Smuzhiyunimport re 13*4882a593Smuzhiyunimport os 14*4882a593Smuzhiyunimport sys 15*4882a593Smuzhiyunimport tempfile 16*4882a593Smuzhiyunimport shutil 17*4882a593Smuzhiyunimport mimetypes 18*4882a593Smuzhiyun 19*4882a593Smuzhiyunif len(sys.argv) < 2: 20*4882a593Smuzhiyun print("Please specify a directory to run the conversion script against.") 21*4882a593Smuzhiyun sys.exit(1) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunrenames = { 24*4882a593Smuzhiyun"BB_ENV_WHITELIST" : "BB_ENV_PASSTHROUGH", 25*4882a593Smuzhiyun"BB_ENV_EXTRAWHITE" : "BB_ENV_PASSTHROUGH_ADDITIONS", 26*4882a593Smuzhiyun"BB_HASHCONFIG_WHITELIST" : "BB_HASHCONFIG_IGNORE_VARS", 27*4882a593Smuzhiyun"BB_SETSCENE_ENFORCE_WHITELIST" : "BB_SETSCENE_ENFORCE_IGNORE_TASKS", 28*4882a593Smuzhiyun"BB_HASHBASE_WHITELIST" : "BB_BASEHASH_IGNORE_VARS", 29*4882a593Smuzhiyun"BB_HASHTASK_WHITELIST" : "BB_TASKHASH_IGNORE_TASKS", 30*4882a593Smuzhiyun"CVE_CHECK_PN_WHITELIST" : "CVE_CHECK_SKIP_RECIPE", 31*4882a593Smuzhiyun"CVE_CHECK_WHITELIST" : "CVE_CHECK_IGNORE", 32*4882a593Smuzhiyun"MULTI_PROVIDER_WHITELIST" : "BB_MULTI_PROVIDER_ALLOWED", 33*4882a593Smuzhiyun"PNBLACKLIST" : "SKIP_RECIPE", 34*4882a593Smuzhiyun"SDK_LOCAL_CONF_BLACKLIST" : "ESDK_LOCALCONF_REMOVE", 35*4882a593Smuzhiyun"SDK_LOCAL_CONF_WHITELIST" : "ESDK_LOCALCONF_ALLOW", 36*4882a593Smuzhiyun"SDK_INHERIT_BLACKLIST" : "ESDK_CLASS_INHERIT_DISABLE", 37*4882a593Smuzhiyun"SSTATE_DUPWHITELIST" : "SSTATE_ALLOW_OVERLAP_FILES", 38*4882a593Smuzhiyun"SYSROOT_DIRS_BLACKLIST" : "SYSROOT_DIRS_IGNORE", 39*4882a593Smuzhiyun"UNKNOWN_CONFIGURE_WHITELIST" : "UNKNOWN_CONFIGURE_OPT_IGNORE", 40*4882a593Smuzhiyun"ICECC_USER_CLASS_BL" : "ICECC_CLASS_DISABLE", 41*4882a593Smuzhiyun"ICECC_SYSTEM_CLASS_BL" : "ICECC_CLASS_DISABLE", 42*4882a593Smuzhiyun"ICECC_USER_PACKAGE_WL" : "ICECC_RECIPE_ENABLE", 43*4882a593Smuzhiyun"ICECC_USER_PACKAGE_BL" : "ICECC_RECIPE_DISABLE", 44*4882a593Smuzhiyun"ICECC_SYSTEM_PACKAGE_BL" : "ICECC_RECIPE_DISABLE", 45*4882a593Smuzhiyun"LICENSE_FLAGS_WHITELIST" : "LICENSE_FLAGS_ACCEPTED", 46*4882a593Smuzhiyun} 47*4882a593Smuzhiyun 48*4882a593Smuzhiyunremoved_list = [ 49*4882a593Smuzhiyun"BB_STAMP_WHITELIST", 50*4882a593Smuzhiyun"BB_STAMP_POLICY", 51*4882a593Smuzhiyun"INHERIT_BLACKLIST", 52*4882a593Smuzhiyun"TUNEABI_WHITELIST", 53*4882a593Smuzhiyun] 54*4882a593Smuzhiyun 55*4882a593Smuzhiyuncontext_check_list = [ 56*4882a593Smuzhiyun"blacklist", 57*4882a593Smuzhiyun"whitelist", 58*4882a593Smuzhiyun"abort", 59*4882a593Smuzhiyun] 60*4882a593Smuzhiyun 61*4882a593Smuzhiyundef processfile(fn): 62*4882a593Smuzhiyun 63*4882a593Smuzhiyun print("processing file '%s'" % fn) 64*4882a593Smuzhiyun try: 65*4882a593Smuzhiyun fh, abs_path = tempfile.mkstemp() 66*4882a593Smuzhiyun modified = False 67*4882a593Smuzhiyun with os.fdopen(fh, 'w') as new_file: 68*4882a593Smuzhiyun with open(fn, "r") as old_file: 69*4882a593Smuzhiyun lineno = 0 70*4882a593Smuzhiyun for line in old_file: 71*4882a593Smuzhiyun lineno += 1 72*4882a593Smuzhiyun if not line or "BB_RENAMED_VARIABLE" in line: 73*4882a593Smuzhiyun continue 74*4882a593Smuzhiyun # Do the renames 75*4882a593Smuzhiyun for old_name, new_name in renames.items(): 76*4882a593Smuzhiyun if old_name in line: 77*4882a593Smuzhiyun line = line.replace(old_name, new_name) 78*4882a593Smuzhiyun modified = True 79*4882a593Smuzhiyun # Find removed names 80*4882a593Smuzhiyun for removed_name in removed_list: 81*4882a593Smuzhiyun if removed_name in line: 82*4882a593Smuzhiyun print("%s needs further work at line %s because %s has been deprecated" % (fn, lineno, removed_name)) 83*4882a593Smuzhiyun for check_word in context_check_list: 84*4882a593Smuzhiyun if re.search(check_word, line, re.IGNORECASE): 85*4882a593Smuzhiyun print("%s needs further work at line %s since it contains %s"% (fn, lineno, check_word)) 86*4882a593Smuzhiyun new_file.write(line) 87*4882a593Smuzhiyun new_file.close() 88*4882a593Smuzhiyun if modified: 89*4882a593Smuzhiyun print("*** Modified file '%s'" % (fn)) 90*4882a593Smuzhiyun shutil.copymode(fn, abs_path) 91*4882a593Smuzhiyun os.remove(fn) 92*4882a593Smuzhiyun shutil.move(abs_path, fn) 93*4882a593Smuzhiyun except UnicodeDecodeError: 94*4882a593Smuzhiyun pass 95*4882a593Smuzhiyun 96*4882a593Smuzhiyunourname = os.path.basename(sys.argv[0]) 97*4882a593Smuzhiyunourversion = "0.1" 98*4882a593Smuzhiyun 99*4882a593Smuzhiyunif os.path.isfile(sys.argv[1]): 100*4882a593Smuzhiyun processfile(sys.argv[1]) 101*4882a593Smuzhiyun sys.exit(0) 102*4882a593Smuzhiyun 103*4882a593Smuzhiyunfor targetdir in sys.argv[1:]: 104*4882a593Smuzhiyun print("processing directory '%s'" % targetdir) 105*4882a593Smuzhiyun for root, dirs, files in os.walk(targetdir): 106*4882a593Smuzhiyun for name in files: 107*4882a593Smuzhiyun if name == ourname: 108*4882a593Smuzhiyun continue 109*4882a593Smuzhiyun fn = os.path.join(root, name) 110*4882a593Smuzhiyun if os.path.islink(fn): 111*4882a593Smuzhiyun continue 112*4882a593Smuzhiyun if "ChangeLog" in fn or "/.git/" in fn or fn.endswith(".html") or fn.endswith(".patch") or fn.endswith(".m4") or fn.endswith(".diff") or fn.endswith(".orig"): 113*4882a593Smuzhiyun continue 114*4882a593Smuzhiyun processfile(fn) 115*4882a593Smuzhiyun 116*4882a593Smuzhiyunprint("All files processed with version %s" % ourversion) 117