Revision control

Copy as Markdown

#!/usr/bin/env python3
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
Please make a PR with anything you notice that should be cleaned but isn't!
import argparse
import subprocess
from pathlib import Path
import shlex
import shutil
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 == 'support':
for sub in find_generated_directories(child):
yield sub
# `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...
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:
def parse_args():
parser = argparse.ArgumentParser(
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"])
# TODO: add swift etc.
print("We should be clean! (except for iOS - fix me? :)")
if __name__ == '__main__':