Revision control
Copy as Markdown
#!/usr/bin/env python3
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
"""
Clean the world.
Note that this is probably only a partial clean - in particular, no attempt
is made to clean the iOS/Swift world, because markh doesn't know what that
involves.
Please make a PR with anything you notice that should be cleaned but isn't!
"""
import argparse
import shlex
import shutil
import subprocess
from pathlib import Path
PROJECT_ROOT = Path(__file__).parent.parent
def run_command(dry_run, cmdline, **kwargs):
print("Executing:", " ".join(shlex.quote(str(part)) for part in cmdline))
if not dry_run:
subprocess.check_call(cmdline, **kwargs)
def find_generated_directories(look_dir):
for child in look_dir.iterdir():
if child.name == "support":
for sub in find_generated_directories(child):
yield sub
else:
# `android/build` directories should be removed.
sub = child / "android" / "build"
if sub.is_dir():
yield sub
# TODO: ios/swift?
def clean_android(dry_run):
# pathlib.Path will join "." and "gradlew" as "gradlew", which doesn't
# work as "." is not on the path!
gradlew = (PROJECT_ROOT / "gradlew").resolve()
# Running gradle is fairly likely to fail if the environment isn't setup,
# so we ignore errors there...
try:
run_command(dry_run, [gradlew, "clean"], shell=True)
except subprocess.CalledProcessError:
print("`./gradle clean` failed, but looking for other Android stuff...")
# ... and still try and find obviously generated directories.
for to_rm in find_generated_directories(PROJECT_ROOT / "components"):
print("Removing:", to_rm)
if not dry_run:
shutil.rmtree(to_rm)
def parse_args():
parser = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter
)
parser.add_argument(
"-n",
"--dry-run",
dest="dry_run",
action="store_true",
help="show what would be executed/removed without actually doing it.",
)
return parser.parse_args()
def main():
args = parse_args()
run_command(args.dry_run, ["cargo", "clean"])
clean_android(args.dry_run)
# TODO: add swift etc.
print("We should be clean! (except for iOS - fix me? :)")
if __name__ == "__main__":
main()