ppo-SnowballTarget / Tools /ci /onboard.py
ashish2244's picture
Initial commit (part 4)
a4473a4 verified
Raw
History Blame Contribute Delete
6.01 kB
# Description: This script is used to onboard a project onto Wrench
import argparse
import json
import os
import shutil
import subprocess
TEMPLATE_CSPROJ = "TEMPLATE.Cookbook.csproj"
TEMPLATE_SLN = "TEMPLATE-recipes.sln"
def get_args():
parser = argparse.ArgumentParser(description="Onboard a project onto Wrench")
parser.add_argument(
"--settings-name",
required=True,
help="The name of the settings file",
dest="settings_name",
)
return parser.parse_args()
def delete_git_folder():
print("Deleting .git folder")
if os.path.isfile(".gitignore"):
os.remove(".gitignore")
if os.path.exists(".git"):
shutil.rmtree(".git", ignore_errors=True)
def get_git_root_dir():
git_dir = subprocess.run(
["git", "rev-parse", "--show-toplevel"], stdout=subprocess.PIPE
).stdout
return git_dir.decode("utf-8").strip()
def find_package_json_files(root_dir, initial=True):
# walk the directory recursively and find all package.json files
rtn_list = set()
for root, dirs, files in os.walk(root_dir):
for file in files:
if file == "package.json":
if initial:
file_location = file
else:
file_location = os.path.join(root, file)
# validate the package.json file
with open(os.path.join(root, file_location)) as f:
data = json.loads(f.read())
if "unity" in data and "name" in data:
rtn_list.add(data["name"])
for directory in dirs:
rtn_list.update(
find_package_json_files(os.path.join(root, directory), False)
)
return rtn_list
def create_package_option(name, first):
initial_char = ""
initial_tab = ""
if not first:
initial_char = ",\n"
initial_tab = " "
return (
f'{initial_char}{initial_tab}{{\n "{name}",\n'
f" new PackageOptions() {{ ReleaseOptions = "
f"new ReleaseOptions() {{ IsReleasing = true }} }}\n }}"
)
def update_template_variables(packages):
template_var = "TEMPLATESettings"
settings = get_args()
settings_content = open(os.path.join("Settings", template_var + ".cs")).read()
# replace the template settings with the actual settings
settings_content = settings_content.replace(
"TEMPLATESettings", f"{settings.settings_name}Settings"
)
settings_content = settings_content.replace("PACKAGES_ROOTS", ".")
package_replace_string = ""
first = True
for package in packages:
package_replace_string += create_package_option(package, first)
first = False
settings_content = settings_content.replace(
'//"PACKAGES_TO_RELEASE"', package_replace_string
)
settings_content = settings_content.replace(
"TEMPLATE.Cookbook.Settings", settings.settings_name + ".Cookbook.Settings"
)
# Write the updated settings file
with open(
os.path.join("Settings", settings.settings_name + "Settings.cs"), "w"
) as f:
f.write(settings_content)
# Update the Program.cs file
program_content = open("Program.cs").read()
with open("Program.cs", "w") as f:
program_content = program_content.replace(
"using TEMPLATE.Cookbook.Settings;",
f"using {settings.settings_name}.Cookbook.Settings;",
)
program_content = program_content.replace(
"TEMPLATE.Cookbook", settings.settings_name
)
program_content = program_content.replace("PACKAGES_ROOT", ".")
program_content = program_content.replace(
"TEMPLATESettings", settings.settings_name + "Settings"
)
f.write(program_content)
# delete the template file
os.remove(os.path.join("Settings", template_var + ".cs"))
# update csproj file
csproj_content = open(TEMPLATE_CSPROJ).read()
with open(TEMPLATE_CSPROJ.replace("TEMPLATE", settings.settings_name), "w") as f:
f.write(csproj_content)
os.remove(TEMPLATE_CSPROJ)
# update sln file
sln_content = open(TEMPLATE_SLN).read()
with open(TEMPLATE_SLN.replace("TEMPLATE", settings.settings_name), "w") as f:
sln_content = sln_content.replace("TEMPLATE", settings.settings_name)
f.write(sln_content)
os.remove(TEMPLATE_SLN)
def update_shell_scripts(root_dir):
split_root = os.path.normpath(root_dir).split(os.sep)
split_cwd = os.getcwd().split(os.sep)
relative_path = os.path.relpath(os.getcwd(), root_dir)
csproj_path = os.path.join(
relative_path, f"{get_args().settings_name}.Cookbook.csproj"
)
path_diff = len(split_cwd) - len(split_root)
cd_string = ""
for _ in range(path_diff):
cd_string += "../"
bash_content = open("regenerate.bat").read()
bash_content = bash_content.replace("STEPS_TO_ROOT", cd_string)
bash_content = bash_content.replace("PATH_TO_CSPROJ", csproj_path)
with open("regenerate.bat", "w") as f:
f.write(bash_content)
shell_content = open("regenerate.sh").read()
shell_content = shell_content.replace("STEPS_TO_ROOT", cd_string)
shell_content = shell_content.replace("PATH_TO_CSPROJ", csproj_path)
with open("regenerate.sh", "w") as f:
f.write(shell_content)
def main():
print("Starting process of onboarding")
# delete git folder
delete_git_folder()
# get root folder
root_dir = get_git_root_dir()
# find all appropriate package.json files
package_files = find_package_json_files(root_dir)
packages = set()
# process out any testing packages
for package in package_files:
if ".tests" in package:
continue
packages.add(package)
# Replace Template naming with actual naming
update_template_variables(packages)
update_shell_scripts(root_dir)
if "__main__" in __name__:
main()