pylint_main.py 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #!/usr/bin/env python3
  2. # Copyright 2019 The Chromium Authors. All rights reserved.
  3. # Use of this source code is governed by a BSD-style license that can be
  4. # found in the LICENSE file.
  5. """Chromium wrapper for pylint for passing args via stdin.
  6. This will be executed by vpython with the right pylint versions.
  7. """
  8. import os
  9. import sys
  10. HERE = os.path.dirname(os.path.abspath(__file__))
  11. PYLINT = os.path.join(HERE, 'pylint_main.py')
  12. RC_FILE = os.path.join(HERE, 'pylintrc')
  13. ARGS_ON_STDIN = '--args-on-stdin'
  14. def find_rcfile() -> str:
  15. """Locate the config file for this wrapper."""
  16. arg0 = os.path.basename(sys.argv[0])
  17. if arg0.startswith('pylint-'):
  18. rc_file = RC_FILE + '-' + arg0.split('-', 1)[1]
  19. if os.path.exists(rc_file):
  20. return rc_file
  21. return RC_FILE
  22. def main(argv):
  23. """Our main wrapper."""
  24. # Add support for a custom mode where arguments are fed line by line on
  25. # stdin. This allows us to get around command line length limitations.
  26. if ARGS_ON_STDIN in argv:
  27. argv = [x for x in argv if x != ARGS_ON_STDIN]
  28. argv.extend(x.strip() for x in sys.stdin)
  29. rc_file = find_rcfile()
  30. # Set default config options with the PYLINTRC environment variable. This
  31. # will allow overriding with "more local" config file options, such as a
  32. # local "pylintrc" file, the "--rcfile" command-line flag, or an existing
  33. # PYLINTRC.
  34. #
  35. # Note that this is not quite the same thing as replacing pylint's built-in
  36. # defaults, since, based on config file precedence, it will not be
  37. # overridden by "more global" config file options, such as ~/.pylintrc,
  38. # ~/.config/pylintrc, or /etc/pylintrc. This is generally the desired
  39. # behavior, since we want to enforce these defaults in most cases, but allow
  40. # them to be overridden for specific code or repos.
  41. #
  42. # If someone really doesn't ever want the depot_tools pylintrc, they can set
  43. # their own PYLINTRC, or set an empty PYLINTRC to use pylint's normal config
  44. # file resolution, which would include the "more global" options that are
  45. # normally overridden by the depot_tools config.
  46. os.environ.setdefault('PYLINTRC', rc_file)
  47. # This import has to happen after PYLINTRC is set because the module tries
  48. # to resolve the config file location on load.
  49. from pylint import lint # pylint: disable=bad-option-value,import-outside-toplevel
  50. lint.Run(argv)
  51. if __name__ == '__main__':
  52. sys.exit(main(sys.argv[1:]))