From f21fb241d66d477fa0d8eda48b1d73562a1722cf Mon Sep 17 00:00:00 2001 From: Chris Date: Wed, 9 Mar 2022 17:13:25 +0100 Subject: [PATCH] feat: add file to assist in formatting application --- scripts/format_app.py | 76 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100755 scripts/format_app.py diff --git a/scripts/format_app.py b/scripts/format_app.py new file mode 100755 index 000000000..15bdefe3b --- /dev/null +++ b/scripts/format_app.py @@ -0,0 +1,76 @@ +#!/usr/bin/env python3 + +# format_app.py + +import argparse +import os +import re +import subprocess +import sys + + +def handle_cli_args(): + parser = argparse.ArgumentParser(description='A script for formatting a given app within emqx') + parser.add_argument("-a", "--application", required=True, help="The application which is to be formatted.") + parser.add_argument('-b', "--branch", help="The git branch to be switched to before formatting the code. Required unless the -f option is passed in which case the value will be ignored even if provided.") + parser.add_argument('-f', "--format_in_place", default=False, action="store_true", help="Pass the -f option to format on the current git branch, otherwise a branch name must be provided by passing the -b option.") + args = parser.parse_args() + + if not args.format_in_place and not args.branch: + sys.exit("A new git branch name must be provided with the -b option unless the -f option is given to format the code in place.") + + return args + + +def get_app_path(application): + root_path = os.path.dirname(os.path.realpath(__file__)) + full_path = f"{root_path}/../apps/{application}" + isdir = os.path.isdir(full_path) + + if isdir: + return full_path + + sys.exit(f"The application provided ({application}) does not appear at the expected location: {full_path}") + + +def maybe_switch_git_branch(format_in_place, branch): + if not format_in_place: + PIPE = subprocess.PIPE + process = subprocess.Popen(["git", "status"], stdout=PIPE, text=True) + stdoutput, stderroutput = process.communicate() + + if f"On branch {branch}" in stdoutput: + return + elif "working tree clean" in stdoutput: + subprocess.call(["git", "checkout", "-b", branch]) + else: + sys.exit("Cannot switch git branches while there are changes waiting to be committed.") + + +def maybe_add_rebar_plugin(): + with open("rebar.config", "r+") as f: + text = f.read() + erlfmt_pattern = "\{project_plugins.+?erlfmt.+\}" + plugin_pattern = "\{project_plugins.+?\}" + + if not re.search(erlfmt_pattern, text) and not re.search(plugin_pattern, text): + f.write("\n{project_plugins, [erlfmt]}.\n") + elif not re.search(erlfmt_pattern, text) and re.search(plugin_pattern, text): + sys.exit("Could not find the erlfmt plugin but the 'project_plugins' declaration already exists. Please add 'erlfmt' to the plugins list manually and rerun the script.") + + +def execute_formatting(): + subprocess.call(["rebar3", "fmt", "-w"]) + + +def main(): + args = handle_cli_args() + app_path = get_app_path(args.application) + os.chdir(app_path) + maybe_switch_git_branch(args.format_in_place, args.branch) + maybe_add_rebar_plugin() + execute_formatting() + + +if __name__ == "__main__": + main()