OLD | NEW |
1 #!/usr/bin/env python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. |
3 # Use of this source code is governed by a BSD-style license that can be | 3 # Use of this source code is governed by a BSD-style license that can be |
4 # found in the LICENSE file. | 4 # found in the LICENSE file. |
5 | 5 |
6 """Enables directory-specific presubmit checks to run at upload and/or commit. | 6 """Enables directory-specific presubmit checks to run at upload and/or commit. |
7 """ | 7 """ |
8 | 8 |
9 __version__ = '1.8.0' | 9 __version__ = '1.8.0' |
10 | 10 |
(...skipping 21 matching lines...) Expand all Loading... |
32 import sys # Parts exposed through API. | 32 import sys # Parts exposed through API. |
33 import tempfile # Exposed through the API. | 33 import tempfile # Exposed through the API. |
34 import time | 34 import time |
35 import traceback # Exposed through the API. | 35 import traceback # Exposed through the API. |
36 import types | 36 import types |
37 import unittest # Exposed through the API. | 37 import unittest # Exposed through the API. |
38 import urllib2 # Exposed through the API. | 38 import urllib2 # Exposed through the API. |
39 from warnings import warn | 39 from warnings import warn |
40 | 40 |
41 # Local imports. | 41 # Local imports. |
| 42 import auth |
42 import fix_encoding | 43 import fix_encoding |
43 import gclient_utils | 44 import gclient_utils |
44 import owners | 45 import owners |
45 import presubmit_canned_checks | 46 import presubmit_canned_checks |
46 import rietveld | 47 import rietveld |
47 import scm | 48 import scm |
48 import subprocess2 as subprocess # Exposed through the API. | 49 import subprocess2 as subprocess # Exposed through the API. |
49 | 50 |
50 | 51 |
51 # Ask for feedback only once in program lifetime. | 52 # Ask for feedback only once in program lifetime. |
(...skipping 1578 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1630 help="Git only: the base ref or upstream branch against " | 1631 help="Git only: the base ref or upstream branch against " |
1631 "which the diff should be computed.") | 1632 "which the diff should be computed.") |
1632 parser.add_option("--default_presubmit") | 1633 parser.add_option("--default_presubmit") |
1633 parser.add_option("--may_prompt", action='store_true', default=False) | 1634 parser.add_option("--may_prompt", action='store_true', default=False) |
1634 parser.add_option("--skip_canned", action='append', default=[], | 1635 parser.add_option("--skip_canned", action='append', default=[], |
1635 help="A list of checks to skip which appear in " | 1636 help="A list of checks to skip which appear in " |
1636 "presubmit_canned_checks. Can be provided multiple times " | 1637 "presubmit_canned_checks. Can be provided multiple times " |
1637 "to skip multiple canned checks.") | 1638 "to skip multiple canned checks.") |
1638 parser.add_option("--rietveld_url", help=optparse.SUPPRESS_HELP) | 1639 parser.add_option("--rietveld_url", help=optparse.SUPPRESS_HELP) |
1639 parser.add_option("--rietveld_email", help=optparse.SUPPRESS_HELP) | 1640 parser.add_option("--rietveld_email", help=optparse.SUPPRESS_HELP) |
1640 parser.add_option("--rietveld_password", help=optparse.SUPPRESS_HELP) | |
1641 parser.add_option("--rietveld_fetch", action='store_true', default=False, | 1641 parser.add_option("--rietveld_fetch", action='store_true', default=False, |
1642 help=optparse.SUPPRESS_HELP) | 1642 help=optparse.SUPPRESS_HELP) |
1643 # These are for OAuth2 authentication for bots. See also apply_issue.py | 1643 # These are for OAuth2 authentication for bots. See also apply_issue.py |
1644 parser.add_option("--rietveld_email_file", help=optparse.SUPPRESS_HELP) | 1644 parser.add_option("--rietveld_email_file", help=optparse.SUPPRESS_HELP) |
1645 parser.add_option("--rietveld_private_key_file", help=optparse.SUPPRESS_HELP) | 1645 parser.add_option("--rietveld_private_key_file", help=optparse.SUPPRESS_HELP) |
1646 | 1646 |
1647 parser.add_option("--trybot-json", | 1647 parser.add_option("--trybot-json", |
1648 help="Output trybot information to the file specified.") | 1648 help="Output trybot information to the file specified.") |
| 1649 auth.add_auth_options(parser) |
1649 options, args = parser.parse_args(argv) | 1650 options, args = parser.parse_args(argv) |
| 1651 auth_config = auth.extract_auth_config_from_options(options) |
1650 | 1652 |
1651 if options.verbose >= 2: | 1653 if options.verbose >= 2: |
1652 logging.basicConfig(level=logging.DEBUG) | 1654 logging.basicConfig(level=logging.DEBUG) |
1653 elif options.verbose: | 1655 elif options.verbose: |
1654 logging.basicConfig(level=logging.INFO) | 1656 logging.basicConfig(level=logging.INFO) |
1655 else: | 1657 else: |
1656 logging.basicConfig(level=logging.ERROR) | 1658 logging.basicConfig(level=logging.ERROR) |
1657 | 1659 |
1658 if options.rietveld_email and options.rietveld_email_file: | 1660 if options.rietveld_email and options.rietveld_email_file: |
1659 parser.error("Only one of --rietveld_email or --rietveld_email_file " | 1661 parser.error("Only one of --rietveld_email or --rietveld_email_file " |
1660 "can be passed to this program.") | 1662 "can be passed to this program.") |
1661 if options.rietveld_private_key_file and options.rietveld_password: | |
1662 parser.error("Only one of --rietveld_private_key_file or " | |
1663 "--rietveld_password can be passed to this program.") | |
1664 | 1663 |
1665 if options.rietveld_email_file: | 1664 if options.rietveld_email_file: |
1666 with open(options.rietveld_email_file, "rb") as f: | 1665 with open(options.rietveld_email_file, "rb") as f: |
1667 options.rietveld_email = f.read().strip() | 1666 options.rietveld_email = f.read().strip() |
1668 | 1667 |
1669 change_class, files = load_files(options, args) | 1668 change_class, files = load_files(options, args) |
1670 if not change_class: | 1669 if not change_class: |
1671 parser.error('For unversioned directory, <files> is not optional.') | 1670 parser.error('For unversioned directory, <files> is not optional.') |
1672 logging.info('Found %d file(s).' % len(files)) | 1671 logging.info('Found %d file(s).' % len(files)) |
1673 | 1672 |
1674 rietveld_obj = None | 1673 rietveld_obj = None |
1675 if options.rietveld_url: | 1674 if options.rietveld_url: |
1676 # The empty password is permitted: '' is not None. | 1675 # The empty password is permitted: '' is not None. |
1677 if options.rietveld_private_key_file: | 1676 if options.rietveld_private_key_file: |
1678 rietveld_obj = rietveld.JwtOAuth2Rietveld( | 1677 rietveld_obj = rietveld.JwtOAuth2Rietveld( |
1679 options.rietveld_url, | 1678 options.rietveld_url, |
1680 options.rietveld_email, | 1679 options.rietveld_email, |
1681 options.rietveld_private_key_file) | 1680 options.rietveld_private_key_file) |
1682 else: | 1681 else: |
1683 rietveld_obj = rietveld.CachingRietveld( | 1682 rietveld_obj = rietveld.CachingRietveld( |
1684 options.rietveld_url, | 1683 options.rietveld_url, |
1685 options.rietveld_email, | 1684 auth_config, |
1686 options.rietveld_password) | 1685 options.rietveld_email) |
1687 if options.rietveld_fetch: | 1686 if options.rietveld_fetch: |
1688 assert options.issue | 1687 assert options.issue |
1689 props = rietveld_obj.get_issue_properties(options.issue, False) | 1688 props = rietveld_obj.get_issue_properties(options.issue, False) |
1690 options.author = props['owner_email'] | 1689 options.author = props['owner_email'] |
1691 options.description = props['description'] | 1690 options.description = props['description'] |
1692 logging.info('Got author: "%s"', options.author) | 1691 logging.info('Got author: "%s"', options.author) |
1693 logging.info('Got description: """\n%s\n"""', options.description) | 1692 logging.info('Got description: """\n%s\n"""', options.description) |
1694 if options.trybot_json: | 1693 if options.trybot_json: |
1695 with open(options.trybot_json, 'w') as f: | 1694 with open(options.trybot_json, 'w') as f: |
1696 # Python's sets aren't JSON-encodable, so we convert them to lists here. | 1695 # Python's sets aren't JSON-encodable, so we convert them to lists here. |
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1747 return 2 | 1746 return 2 |
1748 | 1747 |
1749 | 1748 |
1750 if __name__ == '__main__': | 1749 if __name__ == '__main__': |
1751 fix_encoding.fix_encoding() | 1750 fix_encoding.fix_encoding() |
1752 try: | 1751 try: |
1753 sys.exit(main()) | 1752 sys.exit(main()) |
1754 except KeyboardInterrupt: | 1753 except KeyboardInterrupt: |
1755 sys.stderr.write('interrupted\n') | 1754 sys.stderr.write('interrupted\n') |
1756 sys.exit(1) | 1755 sys.exit(1) |
OLD | NEW |