| 1 | """Discard local package artifacts before building against a shared Cargo cache.""" |
| 2 | import json |
| 3 | from pathlib import Path |
| 4 | import subprocess |
| 5 | import sys |
| 6 | |
| 7 | |
| 8 | def local_packages(root, environment=None): |
| 9 | metadata = json.loads(subprocess.check_output( |
| 10 | ['cargo', 'metadata', '--locked', '--all-features', '--format-version=1', |
| 11 | '--manifest-path', str(root / 'Cargo.toml')], cwd=root, env=environment)) |
| 12 | packages = sorted({package['name'] for package in metadata['packages'] if package['source'] is None}) |
| 13 | if not packages: |
| 14 | raise ValueError('Cargo metadata contains no local packages') |
| 15 | return packages |
| 16 | |
| 17 | |
| 18 | def clean_local(root, *args, environment=None, command=('cargo',)): |
| 19 | packages = local_packages(root, environment) |
| 20 | subprocess.run([*command, 'clean', '--locked', '--manifest-path', str(root / 'Cargo.toml'), |
| 21 | *map(str, args), *(arg for package in packages for arg in ('-p', package))], |
| 22 | cwd=root, env=environment, check=True) |
| 23 | |
| 24 | |
| 25 | if __name__ == '__main__': |
| 26 | clean_local(Path(__file__).resolve().parents[1], *sys.argv[1:]) |