Shift migrate script to a workflow class, and file renames to .carbon (#535)

This might need some customization, e.g. `woff2_decompress.impl.carbon` (as a file with a `main`) might be better as `woff2_decompress.carbon`, but I thought at least putting on `.carbon` extensions would help perspectives on files.

This restructures the script to make it easier to access standard info (e.g. cpp_files) without passing everywhere.
This commit is contained in:
Jon Meow
2021-06-01 10:15:03 -07:00
committed by GitHub
parent 93e7a37493
commit e619d3d632
32 changed files with 79 additions and 52 deletions
+78 -51
View File
@@ -14,68 +14,95 @@ import sys
_CLANG_TIDY = "../external/bootstrap_clang_toolchain/bin/clang-tidy"
_CPP_REFACTORING = "./cpp_refactoring/cpp_refactoring"
_CPP_EXTS = {".h", ".c", ".cc", ".cpp", ".cxx"}
_H_EXTS = {".h", ".hpp"}
_CPP_EXTS = {".c", ".cc", ".cpp", ".cxx"}
def _data_file(relative_path):
"""Returns the path to a data file."""
return os.path.join(os.path.dirname(sys.argv[0]), relative_path)
def _parse_args(args=None):
"""Parses command-line arguments and flags."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"dir",
type=str,
help="A directory containing C++ files to migrate to Carbon.",
)
parsed_args = parser.parse_args(args=args)
return parsed_args
def _gather_files(parsed_args):
"""Returns the list of C++ files to convert."""
all_files = glob.glob(
os.path.join(parsed_args.dir, "**/*.*"), recursive=True
)
cpp_files = [f for f in all_files if os.path.splitext(f)[1] in _CPP_EXTS]
if not cpp_files:
sys.exit(
"%r doesn't contain any C++ files to convert." % parsed_args.dir
class _Workflow(object):
def __init__(self):
"""Parses command-line arguments and flags."""
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument(
"dir",
type=str,
help="A directory containing C++ files to migrate to Carbon.",
)
return sorted(cpp_files)
parsed_args = parser.parse_args()
self._parsed_args = parsed_args
self._data_dir = os.path.dirname(sys.argv[0])
def _clang_tidy(parsed_args, cpp_files):
"""Runs clang-tidy to fix C++ files in a directory."""
print("Running clang-tidy...")
clang_tidy = _data_file(_CLANG_TIDY)
with open(_data_file("clang_tidy.yaml")) as f:
config = f.read()
subprocess.run([clang_tidy, "--fix", "--config", config] + cpp_files)
# Validate arguments.
if not os.path.isdir(parsed_args.dir):
sys.exit("%r must point to a directory." % parsed_args.dir)
def run(self):
"""Runs the migration workflow."""
self._gather_files()
self._clang_tidy()
self._cpp_refactoring()
self._rename_files()
self._print_header("Done!")
def _cpp_refactoring(parsed_args, cpp_files):
"""Runs cpp_refactoring to migrate C++ files towards Carbon syntax."""
print("Running cpp_refactoring...")
cpp_refactoring = _data_file(_CPP_REFACTORING)
subprocess.run([cpp_refactoring] + cpp_files)
def _data_file(self, relative_path):
"""Returns the path to a data file."""
return os.path.join(self._data_dir, relative_path)
@staticmethod
def _print_header(header):
print("*" * 79)
print("* %-75s *" % header)
print("*" * 79)
def _main():
"""Main program execution."""
parsed_args = _parse_args()
def _gather_files(self):
"""Returns the list of C++ files to convert."""
self._print_header("Gathering C++ files...")
all_files = glob.glob(
os.path.join(self._parsed_args.dir, "**/*.*"), recursive=True
)
exts = _CPP_EXTS.union(_H_EXTS)
cpp_files = [f for f in all_files if os.path.splitext(f)[1] in exts]
if not cpp_files:
sys.exit(
"%r doesn't contain any C++ files to convert."
% self._parsed_args.dir
)
self._cpp_files = sorted(cpp_files)
print("%d files found." % len(self._cpp_files))
# Validate arguments.
if not os.path.isdir(parsed_args.dir):
sys.exit("%r must point to a directory." % parsed_args.dir)
def _clang_tidy(self):
"""Runs clang-tidy to fix C++ files in a directory."""
self._print_header("Running clang-tidy...")
clang_tidy = self._data_file(_CLANG_TIDY)
with open(self._data_file("clang_tidy.yaml")) as f:
config = f.read()
subprocess.run(
[clang_tidy, "--fix", "--config", config] + self._cpp_files
)
cpp_files = _gather_files(parsed_args)
_clang_tidy(parsed_args, cpp_files)
_cpp_refactoring(parsed_args, cpp_files)
print("Done!")
def _cpp_refactoring(self):
"""Runs cpp_refactoring to migrate C++ files towards Carbon syntax."""
self._print_header("Running cpp_refactoring...")
cpp_refactoring = self._data_file(_CPP_REFACTORING)
subprocess.run([cpp_refactoring] + self._cpp_files)
def _rename_files(self):
"""Renames C++ files to the destination Carbon filenames."""
api_renames = 0
impl_renames = 0
for f in self._cpp_files:
parts = os.path.splitext(f)
if parts[1] in _H_EXTS:
os.rename(f, parts[0] + ".carbon")
api_renames += 1
else:
os.rename(f, parts[0] + ".impl.carbon")
impl_renames += 1
print(
"Renaming resulted in %d API files and %d impl files."
% (api_renames, impl_renames)
)
if __name__ == "__main__":
_main()
_Workflow().run()