1"""Discard local package artifacts before building against a shared Cargo cache."""
2import json
3from pathlib import Path
4import subprocess
5import sys
6
7
8def 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
18def 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
25if __name__ == '__main__':
26 clean_local(Path(__file__).resolve().parents[1], *sys.argv[1:])