blob: 2c911db0f1850c3e6eac87d9615de23e5bd79232 [file] [log] [blame]
[email protected]ca8d1982009-02-19 16:33:121#!/usr/bin/python
2# Copyright (c) 2009 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
6"""Top-level presubmit script for Chromium.
7
[email protected]f1293792009-07-31 18:09:568See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts
[email protected]37cc1a12009-09-24 01:01:339for more details on the presubmit API built into gcl.
[email protected]ca8d1982009-02-19 16:33:1210"""
11
[email protected]4306417642009-06-11 00:33:4012EXCLUDED_PATHS = (
[email protected]33478702009-03-05 14:03:1413 r"breakpad[\\\/].*",
[email protected]33478702009-03-05 14:03:1414 r"skia[\\\/].*",
[email protected]33478702009-03-05 14:03:1415 r"v8[\\\/].*",
[email protected]4306417642009-06-11 00:33:4016)
[email protected]ca8d1982009-02-19 16:33:1217
[email protected]ca8d1982009-02-19 16:33:1218
[email protected]ca8d1982009-02-19 16:33:1219def CheckChangeOnUpload(input_api, output_api):
[email protected]fe5f57c52009-06-05 14:25:5420 results = []
[email protected]4306417642009-06-11 00:33:4021 # What does this code do?
22 # It loads the default black list (e.g. third_party, experimental, etc) and
23 # add our black list (breakpad, skia and v8 are still not following
24 # google style and are not really living this repository).
25 # See presubmit_support.py InputApi.FilterSourceFile for the (simple) usage.
26 black_list = input_api.DEFAULT_BLACK_LIST + EXCLUDED_PATHS
27 sources = lambda x: input_api.FilterSourceFile(x, black_list=black_list)
28 results.extend(input_api.canned_checks.CheckLongLines(
29 input_api, output_api, sources))
30 results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
31 input_api, output_api, sources))
32 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
33 input_api, output_api, sources))
34 results.extend(input_api.canned_checks.CheckChangeHasBugField(
35 input_api, output_api))
36 results.extend(input_api.canned_checks.CheckChangeHasTestField(
37 input_api, output_api))
38 results.extend(input_api.canned_checks.CheckChangeSvnEolStyle(
39 input_api, output_api, sources))
[email protected]40cdf8b32009-06-26 23:00:3740 results.extend(input_api.canned_checks.CheckSvnForCommonMimeTypes(
41 input_api, output_api))
[email protected]fe5f57c52009-06-05 14:25:5442 return results
[email protected]ca8d1982009-02-19 16:33:1243
44
45def CheckChangeOnCommit(input_api, output_api):
[email protected]fe5f57c52009-06-05 14:25:5446 results = []
[email protected]4306417642009-06-11 00:33:4047 black_list = input_api.DEFAULT_BLACK_LIST + EXCLUDED_PATHS
48 sources = lambda x: input_api.FilterSourceFile(x, black_list=black_list)
49 results.extend(input_api.canned_checks.CheckLongLines(
50 input_api, output_api, sources))
51 results.extend(input_api.canned_checks.CheckChangeHasNoTabs(
52 input_api, output_api, sources))
53 results.extend(input_api.canned_checks.CheckChangeHasNoStrayWhitespace(
54 input_api, output_api, sources))
55 results.extend(input_api.canned_checks.CheckChangeHasBugField(
56 input_api, output_api))
57 results.extend(input_api.canned_checks.CheckChangeHasTestField(
58 input_api, output_api))
59 results.extend(input_api.canned_checks.CheckChangeSvnEolStyle(
60 input_api, output_api, sources))
[email protected]40cdf8b32009-06-26 23:00:3761 results.extend(input_api.canned_checks.CheckSvnForCommonMimeTypes(
62 input_api, output_api))
[email protected]dd805fe2009-10-01 08:11:5163 # TODO(thestig) temporarily disabled, doesn't work in third_party/
64 #results.extend(input_api.canned_checks.CheckSvnModifiedDirectories(
65 # input_api, output_api, sources))
[email protected]fe5f57c52009-06-05 14:25:5466 # Make sure the tree is 'open'.
[email protected]4306417642009-06-11 00:33:4067 # TODO(maruel): Run it in a separate thread to parallelize checks?
[email protected]7f238152009-08-12 19:00:3468 results.extend(CheckTreeIsOpen(
69 input_api,
70 output_api,
71 'http://chromium-status.appspot.com/status',
72 '0',
73 'http://chromium-status.appspot.com/current?format=raw'))
[email protected]70ac4982009-06-08 17:31:5174 results.extend(CheckTryJobExecution(input_api, output_api))
[email protected]fe5f57c52009-06-05 14:25:5475 return results
[email protected]ca8d1982009-02-19 16:33:1276
77
[email protected]70ac4982009-06-08 17:31:5178def CheckTryJobExecution(input_api, output_api):
[email protected]4306417642009-06-11 00:33:4079 outputs = []
80 if not input_api.change.issue or not input_api.change.patchset:
81 return outputs
[email protected]70ac4982009-06-08 17:31:5182 url = "http://codereview.chromium.org/%d/get_build_results/%d" % (
83 input_api.change.issue, input_api.change.patchset)
[email protected]7f238152009-08-12 19:00:3484 PLATFORMS = ('win', 'linux', 'mac')
[email protected]70ac4982009-06-08 17:31:5185 try:
86 connection = input_api.urllib2.urlopen(url)
87 # platform|status|url
88 values = [item.split('|', 2) for item in connection.read().splitlines()]
89 connection.close()
[email protected]71cdeb482009-09-18 18:55:0390 if not values:
91 # It returned an empty list. Probably a private review.
92 return outputs
[email protected]7f238152009-08-12 19:00:3493 # Reformat as an dict of platform: [status, url]
94 values = dict([[v[0], [v[1], v[2]]] for v in values])
95 for platform in PLATFORMS:
96 values.setdefault(platform, ['not started', ''])
[email protected]72303832009-07-10 19:09:0897 message = None
[email protected]7f238152009-08-12 19:00:3498 non_success = [k.upper() for k,v in values.iteritems() if v[0] != 'success']
99 if 'failure' in [v[0] for v in values.itervalues()]:
100 message = 'Try job failures on %s!\n' % ', '.join(non_success)
101 elif non_success:
102 message = ('Unfinished (or not even started) try jobs on '
103 '%s.\n') % ', '.join(non_success)
[email protected]72303832009-07-10 19:09:08104 if message:
105 message += (
106 'Is try server wrong or broken? Please notify [email protected]. '
107 'Thanks.\n')
[email protected]7f238152009-08-12 19:00:34108 outputs.append(output_api.PresubmitPromptWarning(message=message))
[email protected]70ac4982009-06-08 17:31:51109 except input_api.urllib2.HTTPError, e:
110 if e.code == 404:
111 # Fallback to no try job.
112 # TODO(maruel): Change to a PresubmitPromptWarning once the try server is
113 # stable enough and it seems to work fine.
114 outputs.append(output_api.PresubmitNotifyResult(
115 'You should try the patch first.'))
116 else:
117 # Another HTTP error happened, warn the user.
118 # TODO(maruel): Change to a PresubmitPromptWarning once it deemed to work
119 # fine.
120 outputs.append(output_api.PresubmitNotifyResult(
121 'Got %s while looking for try job status.' % str(e)))
122 return outputs
[email protected]04a39f7c2009-06-11 00:41:32123
124
125def CheckTreeIsOpen(input_api, output_api, url, closed, url_text):
126 """Similar to the one in presubmit_canned_checks except it shows an helpful
127 status text instead.
128 """
129 assert(input_api.is_committing)
130 try:
131 connection = input_api.urllib2.urlopen(url)
132 status = connection.read()
133 connection.close()
134 if input_api.re.match(closed, status):
135 long_text = status + '\n' + url
136 try:
137 connection = input_api.urllib2.urlopen(url_text)
[email protected]7f238152009-08-12 19:00:34138 long_text = connection.read().strip()
[email protected]04a39f7c2009-06-11 00:41:32139 connection.close()
[email protected]04a39f7c2009-06-11 00:41:32140 except IOError:
141 pass
[email protected]b3fbe1c2009-07-29 18:44:39142 return [output_api.PresubmitError("The tree is closed.",
143 long_text=long_text)]
[email protected]04a39f7c2009-06-11 00:41:32144 except IOError:
145 pass
146 return []
[email protected]5fa06292009-09-29 01:55:00147
148
149def GetPreferredTrySlaves():
150 return ['win', 'linux', 'mac']