| #!/usr/bin/env vpython3 | |
| # Copyright 2021 The ChromiumOS Authors | |
| # Use of this source code is governed by a BSD-style license that can be | |
| # found in the LICENSE file. | |
| # [VPYTHON:BEGIN] | |
| # python_version: "3.11" | |
| # | |
| # wheel: < | |
| # name: "infra/python/wheels/vulture-py3" | |
| # version: "version:2.3" | |
| # > | |
| # wheel: < | |
| # name: "infra/python/wheels/toml-py3" | |
| # version: "version:0.10.1" | |
| # > | |
| # [VPYTHON:END] | |
| """Run vulture over the codebase to find dead code. | |
| Note: This needs to be fed all modules to determine whether anything is used. | |
| """ | |
| import os | |
| from pathlib import Path | |
| import subprocess | |
| import sys | |
| import vulture.core # pylint: disable=import-error | |
| TOPDIR = Path(__file__).resolve().parent.parent | |
| def main(argv): | |
| """Main function.""" | |
| if not argv: | |
| os.chdir(TOPDIR) | |
| # Scan all python modules (except generated bindings) that we authored. | |
| result = subprocess.run( | |
| ["git", "ls-tree", "-r", "-z", "HEAD"], | |
| check=True, | |
| encoding="utf-8", | |
| stdout=subprocess.PIPE, | |
| ) | |
| for entry in result.stdout.split("\0"): | |
| if not entry: | |
| continue | |
| fields, path = entry.split("\t", 1) | |
| mode, _ = fields.split(" ", 1) | |
| if ( | |
| mode != "120000" | |
| and not path.startswith("third_party/") | |
| and path.endswith(".py") | |
| and not path.endswith("_pb2.py") | |
| ): | |
| argv.append(path) | |
| argv = [ | |
| "--ignore-names", | |
| "test*,setUp,setUpClass,tearDown,tearDownClass", | |
| ] + argv | |
| # The vulture API doesn't accept explicit args. | |
| sys.argv = [sys.argv[0]] + argv | |
| vulture.core.main() | |
| if __name__ == "__main__": | |
| sys.exit(main(sys.argv[1:])) |