diff --git a/scripts/cleanup b/scripts/cleanup new file mode 100755 index 0000000..6238031 --- /dev/null +++ b/scripts/cleanup @@ -0,0 +1,90 @@ +#!/usr/bin/env python + +""" +Remove cache and other automatically created stuff that is always safe to remove when we need some more space in a pinch +""" + +import argparse +from pathlib import Path +import subprocess +import shutil + +from rich.progress import ( + Progress, + SpinnerColumn, + FileSizeColumn, + TimeElapsedColumn, + TextColumn, +) +from rich import filesize + +jetbrains_dir = Path().home() / "Library/Caches/JetBrains" +rubymine = [] +for mine in jetbrains_dir.glob('RubyMine*'): + rubymine.append(mine / 'index') + rubymine.append(mine / 'cache') + +pycharm = [] +for charm in jetbrains_dir.glob('PyCharm*'): + pycharm.append(charm / 'index') + pycharm.append(charm / 'vcs-log') + pycharm.append(charm / 'caches') + +paths = [ + *rubymine, + *pycharm, + Path().home() / "Library/Caches/JetBrains/RubyMine*/caches", + Path().home() / "Library/Caches/JetBrains/PyCharm*/index", + Path().home() / "Library/Caches/JetBrains/PyCharm*/vcs-log", + Path().home() / "Library/Caches/JetBrains/PyCharm*/caches", + Path().home() / "Library/Caches/Yarn", + Path().home() / "Library/Caches/node-gyp", + Path().home() / "Library/Caches/pdm/http", + Path().home() / "Library/Caches/com.spotify.client/Default/Cache", + Path().home() / "Library/Caches/kdenlive", + Path().home() / "Library/Caches/pip/http-v2", + Path().home() / "Library/Caches/go-build", +] +paths = [Path(p) for p in paths] + +def dir_size(path: Path) -> int: + return sum(file.stat().st_size for file in path.rglob('*')) + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument('--check', action="store_true", help="just show sizes, no delete") + parser.add_argument('--keep-pycharm', action="store_true") + args = parser.parse_args() + if args.keep_pycharm: + paths = [p for p in paths if 'pycharm' not in str(p).lower()] + if args.check: + msg = "Checking clearable space" + else: + msg = "Clearing space" + + + total_size = 0 + with Progress( + SpinnerColumn(), + *Progress.get_default_columns(), + TextColumn("{task.fields[size]}"), + transient=False + ) as progress: + task = progress.add_task(f"[green] {msg}", total=len(paths), size="0") + for path in paths: + size = dir_size(path) + total_size += size + total_size_str = filesize.decimal(int(total_size)) + file_msg = filesize.decimal(int(size)) + + if not args.check and path.exists() and size > 0: + try: + shutil.rmtree(path) + except Exception as e: + file_msg = f"Error removing: {e}" + + + progress.update(task, advance=1, size=total_size_str) + progress.log(file_msg, path) + +