#!/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 # file, You can obtain one at https://mozilla.org/MPL/2.0/. """ 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()