blob: 25887a1b53100f903a51c5154b2c79e918812c94 [file] [log] [blame]
#!/usr/bin/python
#
# Copyright (c) 2014 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.
import argparse
import itertools
import logging
import os
import re
import sys
import factory_common # pylint: disable=W0611
from cros.factory.utils.process_utils import CheckOutput, Spawn
def main():
parser = argparse.ArgumentParser(
description='Lints files that are new, changed, or in a pending CL.')
parser.add_argument('--verbose', '-v', action='count')
args = parser.parse_args()
logging.basicConfig(level=logging.WARNING - 10 * (args.verbose or 0))
# chdir to repo root so paths are all correct
os.chdir(CheckOutput(['git', 'rev-parse', '--show-toplevel']).strip())
output = CheckOutput(
['git', 'status', '--untracked-files=all', '--porcelain'], log=True)
# Remove first three characters, and anything up to the -> for renames.
uncommitted = [re.sub('^...(.+ -> )?', '', x)
for x in output.splitlines()]
uncommitted = [x for x in uncommitted
if x.endswith('.py') and '#' not in x]
logging.info('Uncommitted files: %r', uncommitted)
all_files = set(uncommitted)
for i in itertools.count():
commit = 'HEAD~%d' % i
proc = Spawn(['git', 'log', '-1', commit], read_stdout=True)
if proc.returncode:
# No more log entries
break
if '\n Reviewed-on: ' in proc.stdout_data:
logging.info('%s has Reviewed-on; ending search', commit)
break
files = CheckOutput(['git', 'diff-tree', '--no-commit-id', '--name-only',
'-r', commit], log=True).splitlines()
logging.info('%s contains files %s', commit, files)
for f in files:
if f.endswith('.py') and os.path.exists(f):
all_files.add(f)
if not all_files:
sys.exit('No files to lint.')
all_files_str = ' '.join(sorted(all_files))
proc = Spawn(['make', 'lint', 'LINT_FILES=%s' % all_files_str], call=True,
log=True)
sys.exit(proc.returncode)
if __name__ == '__main__':
main()