Spaces:
Sleeping
Sleeping
#!/usr/bin/env python3 | |
# Copied from https://github.com/rerun-io/rerun_template | |
""" | |
The script has two purposes. | |
After using `rerun_template` as a template, run this to clean out things you don't need. | |
Use `scripts/template_update.py init --languages cpp,rust,python` for this. | |
Update an existing repository with the latest changes from the template. | |
Use `scripts/template_update.py update --languages cpp,rust,python` for this. | |
In either case, make sure the list of languages matches the languages you want to support. | |
You can also use `--dry-run` to see what would happen without actually changing anything. | |
""" | |
from __future__ import annotations | |
import argparse | |
import os | |
import shutil | |
import tempfile | |
from git import Repo | |
OWNER = "rerun-io" | |
# Files requires by C++, but not by both Python or Rust. | |
CPP_FILES = { | |
".clang-format", | |
".github/workflows/cpp.yml", | |
"CMakeLists.txt", | |
"pixi.lock", # Not needed by Rust | |
"pixi.toml", # Not needed by Rust | |
"src/main.cpp", | |
"src/", | |
} | |
# Files requires by Python, but not by both C++ or Rust | |
PYTHON_FILES = { | |
".github/workflows/python.yml", | |
".mypy.ini", | |
"pixi.lock", # Not needed by Rust | |
"pixi.toml", # Not needed by Rust | |
"pyproject.toml", | |
} | |
# Files requires by Rust, but not by both C++ or Python | |
RUST_FILES = { | |
".github/workflows/rust.yml", | |
"bacon.toml", | |
"Cargo.lock", | |
"Cargo.toml", | |
"clippy.toml", | |
"Cranky.toml", | |
"deny.toml", | |
"rust-toolchain", | |
"scripts/clippy_wasm/", | |
"scripts/clippy_wasm/clippy.toml", | |
"src/lib.rs", | |
"src/main.rs", | |
"src/", | |
} | |
def parse_languages(lang_str: str) -> set[str]: | |
languages = lang_str.split(",") if lang_str else [] | |
for lang in languages: | |
assert lang in ["cpp", "python", "rust"], f"Unsupported language: {lang}" | |
return set(languages) | |
def calc_deny_set(languages: set[str]) -> set[str]: | |
"""The set of files to delete/ignore.""" | |
files_to_delete = CPP_FILES | PYTHON_FILES | RUST_FILES | |
if "cpp" in languages: | |
files_to_delete -= CPP_FILES | |
if "python" in languages: | |
files_to_delete -= PYTHON_FILES | |
if "rust" in languages: | |
files_to_delete -= RUST_FILES | |
return files_to_delete | |
def init(languages: set[str], dry_run: bool) -> None: | |
print("Removing all language-specific files not needed for languages {languages}.") | |
files_to_delete = calc_deny_set(languages) | |
delete_files_and_folder(files_to_delete, dry_run) | |
def delete_files_and_folder(paths: set[str], dry_run: bool) -> None: | |
repo_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | |
for path in paths: | |
full_path = os.path.join(repo_path, path) | |
if os.path.exists(full_path): | |
if os.path.isfile(full_path): | |
print(f"Removing file {full_path}…") | |
if not dry_run: | |
os.remove(full_path) | |
elif os.path.isdir(full_path): | |
print(f"Removing folder {full_path}…") | |
if not dry_run: | |
shutil.rmtree(full_path) | |
def update(languages: set[str], dry_run: bool) -> None: | |
files_to_ignore = calc_deny_set(languages) | |
repo_path = os.path.dirname(os.path.dirname(os.path.realpath(__file__))) | |
with tempfile.TemporaryDirectory() as temp_dir: | |
Repo.clone_from("https://github.com/rerun-io/rerun_template.git", temp_dir) | |
for root, dirs, files in os.walk(temp_dir): | |
for file in files: | |
src_path = os.path.join(root, file) | |
rel_path = os.path.relpath(src_path, temp_dir) | |
if rel_path.startswith(".git/"): | |
continue | |
if rel_path.startswith("src/"): | |
continue | |
if rel_path in {"README.md", "pixi.lock", "Cargo.lock"}: | |
continue | |
if rel_path not in files_to_ignore: | |
dest_path = os.path.join(repo_path, rel_path) | |
print(f"Updating {rel_path}…") | |
if not dry_run: | |
os.makedirs(os.path.dirname(dest_path), exist_ok=True) | |
shutil.copy2(src_path, dest_path) | |
def main() -> None: | |
parser = argparse.ArgumentParser(description="Handle the Rerun template.") | |
subparsers = parser.add_subparsers(dest="command") | |
init_parser = subparsers.add_parser("init", help="Initialize a new checkout of the template.") | |
init_parser.add_argument( | |
"--languages", default="", nargs="?", const="", help="The languages to support (e.g. `cpp,python,rust`)." | |
) | |
init_parser.add_argument("--dry-run", action="store_true", help="Don't actually delete any files.") | |
update_parser = subparsers.add_parser( | |
"update", help="Update all existing Rerun repositories with the latest changes from the template" | |
) | |
update_parser.add_argument( | |
"--languages", default="", nargs="?", const="", help="The languages to support (e.g. `cpp,python,rust`)." | |
) | |
update_parser.add_argument("--dry-run", action="store_true", help="Don't actually delete any files.") | |
args = parser.parse_args() | |
if args.command == "init": | |
init(parse_languages(args.languages), args.dry_run) | |
elif args.command == "update": | |
update(parse_languages(args.languages), args.dry_run) | |
else: | |
parser.print_help() | |
exit(1) | |
if __name__ == "__main__": | |
main() | |