| Index: third_party/closure_linter/closure_linter/gjslint.py
|
| diff --git a/third_party/closure_linter/closure_linter/gjslint.py b/third_party/closure_linter/closure_linter/gjslint.py
|
| deleted file mode 100755
|
| index b67c5a98bab2b1c8d34e0681673188b3895a55f7..0000000000000000000000000000000000000000
|
| --- a/third_party/closure_linter/closure_linter/gjslint.py
|
| +++ /dev/null
|
| @@ -1,327 +0,0 @@
|
| -#!/usr/bin/env python
|
| -# Copyright 2007 The Closure Linter Authors. All Rights Reserved.
|
| -#
|
| -# Licensed under the Apache License, Version 2.0 (the "License");
|
| -# you may not use this file except in compliance with the License.
|
| -# You may obtain a copy of the License at
|
| -#
|
| -# http://www.apache.org/licenses/LICENSE-2.0
|
| -#
|
| -# Unless required by applicable law or agreed to in writing, software
|
| -# distributed under the License is distributed on an "AS-IS" BASIS,
|
| -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
| -# See the License for the specific language governing permissions and
|
| -# limitations under the License.
|
| -
|
| -"""Checks JavaScript files for common style guide violations.
|
| -
|
| -gjslint.py is designed to be used as a PRESUBMIT script to check for javascript
|
| -style guide violations. As of now, it checks for the following violations:
|
| -
|
| - * Missing and extra spaces
|
| - * Lines longer than 80 characters
|
| - * Missing newline at end of file
|
| - * Missing semicolon after function declaration
|
| - * Valid JsDoc including parameter matching
|
| -
|
| -Someday it will validate to the best of its ability against the entirety of the
|
| -JavaScript style guide.
|
| -
|
| -This file is a front end that parses arguments and flags. The core of the code
|
| -is in tokenizer.py and checker.py.
|
| -"""
|
| -
|
| -__author__ = ('robbyw@google.com (Robert Walker)',
|
| - 'ajp@google.com (Andy Perelson)',
|
| - 'nnaze@google.com (Nathan Naze)',)
|
| -
|
| -import errno
|
| -import itertools
|
| -import os
|
| -import platform
|
| -import re
|
| -import sys
|
| -import time
|
| -
|
| -import gflags as flags
|
| -
|
| -from closure_linter import errorrecord
|
| -from closure_linter import runner
|
| -from closure_linter.common import erroraccumulator
|
| -from closure_linter.common import simplefileflags as fileflags
|
| -
|
| -# Attempt import of multiprocessing (should be available in Python 2.6 and up).
|
| -try:
|
| - # pylint: disable=g-import-not-at-top
|
| - import multiprocessing
|
| -except ImportError:
|
| - multiprocessing = None
|
| -
|
| -FLAGS = flags.FLAGS
|
| -flags.DEFINE_boolean('unix_mode', False,
|
| - 'Whether to emit warnings in standard unix format.')
|
| -flags.DEFINE_boolean('beep', True, 'Whether to beep when errors are found.')
|
| -flags.DEFINE_boolean('time', False, 'Whether to emit timing statistics.')
|
| -flags.DEFINE_boolean('quiet', False, 'Whether to minimize logged messages. '
|
| - 'Most useful for per-file linting, such as that performed '
|
| - 'by the presubmit linter service.')
|
| -flags.DEFINE_boolean('check_html', False,
|
| - 'Whether to check javascript in html files.')
|
| -flags.DEFINE_boolean('summary', False,
|
| - 'Whether to show an error count summary.')
|
| -flags.DEFINE_list('additional_extensions', None, 'List of additional file '
|
| - 'extensions (not js) that should be treated as '
|
| - 'JavaScript files.')
|
| -flags.DEFINE_boolean('multiprocess',
|
| - platform.system() is 'Linux' and bool(multiprocessing),
|
| - 'Whether to attempt parallelized linting using the '
|
| - 'multiprocessing module. Enabled by default on Linux '
|
| - 'if the multiprocessing module is present (Python 2.6+). '
|
| - 'Otherwise disabled by default. '
|
| - 'Disabling may make debugging easier.')
|
| -flags.ADOPT_module_key_flags(fileflags)
|
| -flags.ADOPT_module_key_flags(runner)
|
| -
|
| -
|
| -GJSLINT_ONLY_FLAGS = ['--unix_mode', '--beep', '--nobeep', '--time',
|
| - '--check_html', '--summary', '--quiet']
|
| -
|
| -
|
| -
|
| -def _MultiprocessCheckPaths(paths):
|
| - """Run _CheckPath over mutltiple processes.
|
| -
|
| - Tokenization, passes, and checks are expensive operations. Running in a
|
| - single process, they can only run on one CPU/core. Instead,
|
| - shard out linting over all CPUs with multiprocessing to parallelize.
|
| -
|
| - Args:
|
| - paths: paths to check.
|
| -
|
| - Yields:
|
| - errorrecord.ErrorRecords for any found errors.
|
| - """
|
| -
|
| - pool = multiprocessing.Pool()
|
| -
|
| - path_results = pool.imap(_CheckPath, paths)
|
| - for results in path_results:
|
| - for result in results:
|
| - yield result
|
| -
|
| - # Force destruct before returning, as this can sometimes raise spurious
|
| - # "interrupted system call" (EINTR), which we can ignore.
|
| - try:
|
| - pool.close()
|
| - pool.join()
|
| - del pool
|
| - except OSError as err:
|
| - if err.errno is not errno.EINTR:
|
| - raise err
|
| -
|
| -
|
| -def _CheckPaths(paths):
|
| - """Run _CheckPath on all paths in one thread.
|
| -
|
| - Args:
|
| - paths: paths to check.
|
| -
|
| - Yields:
|
| - errorrecord.ErrorRecords for any found errors.
|
| - """
|
| -
|
| - for path in paths:
|
| - results = _CheckPath(path)
|
| - for record in results:
|
| - yield record
|
| -
|
| -
|
| -def _CheckPath(path):
|
| - """Check a path and return any errors.
|
| -
|
| - Args:
|
| - path: paths to check.
|
| -
|
| - Returns:
|
| - A list of errorrecord.ErrorRecords for any found errors.
|
| - """
|
| -
|
| - error_handler = erroraccumulator.ErrorAccumulator()
|
| - runner.Run(path, error_handler)
|
| -
|
| - make_error_record = lambda err: errorrecord.MakeErrorRecord(path, err)
|
| - return map(make_error_record, error_handler.GetErrors())
|
| -
|
| -
|
| -def _GetFilePaths(argv):
|
| - suffixes = ['.js']
|
| - if FLAGS.additional_extensions:
|
| - suffixes += ['.%s' % ext for ext in FLAGS.additional_extensions]
|
| - if FLAGS.check_html:
|
| - suffixes += ['.html', '.htm']
|
| - return fileflags.GetFileList(argv, 'JavaScript', suffixes)
|
| -
|
| -
|
| -# Error printing functions
|
| -
|
| -
|
| -def _PrintFileSummary(paths, records):
|
| - """Print a detailed summary of the number of errors in each file."""
|
| -
|
| - paths = list(paths)
|
| - paths.sort()
|
| -
|
| - for path in paths:
|
| - path_errors = [e for e in records if e.path == path]
|
| - print '%s: %d' % (path, len(path_errors))
|
| -
|
| -
|
| -def _PrintFileSeparator(path):
|
| - print '----- FILE : %s -----' % path
|
| -
|
| -
|
| -def _PrintSummary(paths, error_records):
|
| - """Print a summary of the number of errors and files."""
|
| -
|
| - error_count = len(error_records)
|
| - all_paths = set(paths)
|
| - all_paths_count = len(all_paths)
|
| -
|
| - if error_count is 0:
|
| - print '%d files checked, no errors found.' % all_paths_count
|
| -
|
| - new_error_count = len([e for e in error_records if e.new_error])
|
| -
|
| - error_paths = set([e.path for e in error_records])
|
| - error_paths_count = len(error_paths)
|
| - no_error_paths_count = all_paths_count - error_paths_count
|
| -
|
| - if (error_count or new_error_count) and not FLAGS.quiet:
|
| - error_noun = 'error' if error_count == 1 else 'errors'
|
| - new_error_noun = 'error' if new_error_count == 1 else 'errors'
|
| - error_file_noun = 'file' if error_paths_count == 1 else 'files'
|
| - ok_file_noun = 'file' if no_error_paths_count == 1 else 'files'
|
| - print ('Found %d %s, including %d new %s, in %d %s (%d %s OK).' %
|
| - (error_count,
|
| - error_noun,
|
| - new_error_count,
|
| - new_error_noun,
|
| - error_paths_count,
|
| - error_file_noun,
|
| - no_error_paths_count,
|
| - ok_file_noun))
|
| -
|
| -
|
| -def _PrintErrorRecords(error_records):
|
| - """Print error records strings in the expected format."""
|
| -
|
| - current_path = None
|
| - for record in error_records:
|
| -
|
| - if current_path != record.path:
|
| - current_path = record.path
|
| - if not FLAGS.unix_mode:
|
| - _PrintFileSeparator(current_path)
|
| -
|
| - print record.error_string
|
| -
|
| -
|
| -def _FormatTime(t):
|
| - """Formats a duration as a human-readable string.
|
| -
|
| - Args:
|
| - t: A duration in seconds.
|
| -
|
| - Returns:
|
| - A formatted duration string.
|
| - """
|
| - if t < 1:
|
| - return '%dms' % round(t * 1000)
|
| - else:
|
| - return '%.2fs' % t
|
| -
|
| -
|
| -
|
| -
|
| -def main(argv=None):
|
| - """Main function.
|
| -
|
| - Args:
|
| - argv: Sequence of command line arguments.
|
| - """
|
| - if argv is None:
|
| - argv = flags.FLAGS(sys.argv)
|
| -
|
| - if FLAGS.time:
|
| - start_time = time.time()
|
| -
|
| - # Emacs sets the environment variable INSIDE_EMACS in the subshell.
|
| - # Request Unix mode as emacs will expect output to be in Unix format
|
| - # for integration.
|
| - # See https://www.gnu.org/software/emacs/manual/html_node/emacs/
|
| - # Interactive-Shell.html
|
| - if 'INSIDE_EMACS' in os.environ:
|
| - FLAGS.unix_mode = True
|
| -
|
| - suffixes = ['.js']
|
| - if FLAGS.additional_extensions:
|
| - suffixes += ['.%s' % ext for ext in FLAGS.additional_extensions]
|
| - if FLAGS.check_html:
|
| - suffixes += ['.html', '.htm']
|
| - paths = fileflags.GetFileList(argv, 'JavaScript', suffixes)
|
| -
|
| - if FLAGS.multiprocess:
|
| - records_iter = _MultiprocessCheckPaths(paths)
|
| - else:
|
| - records_iter = _CheckPaths(paths)
|
| -
|
| - records_iter, records_iter_copy = itertools.tee(records_iter, 2)
|
| - _PrintErrorRecords(records_iter_copy)
|
| -
|
| - error_records = list(records_iter)
|
| - _PrintSummary(paths, error_records)
|
| -
|
| - exit_code = 0
|
| -
|
| - # If there are any errors
|
| - if error_records:
|
| - exit_code += 1
|
| -
|
| - # If there are any new errors
|
| - if [r for r in error_records if r.new_error]:
|
| - exit_code += 2
|
| -
|
| - if exit_code:
|
| - if FLAGS.summary:
|
| - _PrintFileSummary(paths, error_records)
|
| -
|
| - if FLAGS.beep:
|
| - # Make a beep noise.
|
| - sys.stdout.write(chr(7))
|
| -
|
| - # Write out instructions for using fixjsstyle script to fix some of the
|
| - # reported errors.
|
| - fix_args = []
|
| - for flag in sys.argv[1:]:
|
| - for f in GJSLINT_ONLY_FLAGS:
|
| - if flag.startswith(f):
|
| - break
|
| - else:
|
| - fix_args.append(flag)
|
| -
|
| - if not FLAGS.quiet:
|
| - print """
|
| -Some of the errors reported by GJsLint may be auto-fixable using the script
|
| -fixjsstyle. Please double check any changes it makes and report any bugs. The
|
| -script can be run by executing:
|
| -
|
| -fixjsstyle %s """ % ' '.join(fix_args)
|
| -
|
| - if FLAGS.time:
|
| - print 'Done in %s.' % _FormatTime(time.time() - start_time)
|
| -
|
| - sys.exit(exit_code)
|
| -
|
| -
|
| -if __name__ == '__main__':
|
| - main()
|
|
|