blob: 98c260482380324f7bc69be3523c5fcbc01c870e [file] [log] [blame]
#!/usr/bin/env vpython3
# Copyright 2021 The Chromium OS Authors. All rights reserved.
# 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.8"
#
# 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
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:]))