blob: f4919dddcef520e6cec529685e76dd857b0e59a4 [file] [log] [blame]
#!/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:]))