| OLD | NEW |
| (Empty) | |
| 1 # Copyright (c) 2014 The Chromium Authors. All rights reserved. |
| 2 # Use of this source code is governed by a BSD-style license that can be |
| 3 # found in the LICENSE file. |
| 4 |
| 5 """Top-level presubmit script for chromium-build-stats (or go appengine app). |
| 6 |
| 7 See http://dev.chromium.org/developers/how-tos/depottools/presubmit-scripts for |
| 8 details on the presubmit API built into gcl. |
| 9 """ |
| 10 |
| 11 def reporoot(input_api): |
| 12 return input_api.os_path.join(input_api.PresubmitLocalPath(), '..', '..') |
| 13 |
| 14 def _go_files(input_api, source_file_filter=None): |
| 15 """Collects affected go source files, but ignores ones generated by protoc.""" |
| 16 files = [] |
| 17 for f in input_api.AffectedTextFiles(source_file_filter): |
| 18 if not f.LocalPath().endswith('.go'): |
| 19 continue |
| 20 if f.LocalPath().endswith('.pb.go'): |
| 21 continue |
| 22 files.append(f) |
| 23 return files |
| 24 |
| 25 def _run_go_tool(input_api, args): |
| 26 cmdline = [input_api.os_path.join(reporoot(input_api), '..', |
| 27 'go_appengine', args[0])] |
| 28 cmdline.extend(args[1:]) |
| 29 cwd = reporoot(input_api) |
| 30 p = input_api.subprocess.Popen(cmdline, |
| 31 cwd=cwd, |
| 32 stdout=input_api.subprocess.PIPE, |
| 33 stderr=input_api.subprocess.STDOUT) |
| 34 (out, _) = p.communicate() |
| 35 return (out, p.returncode) |
| 36 |
| 37 def _CheckChangeByGoTool(input_api, output_api, source_file_filter=None, |
| 38 go_tool=None): |
| 39 """Checks that all '.go' files pass by go_tool.""" |
| 40 tool = ' '.join(go_tool) |
| 41 cmdline = [] |
| 42 cmdline.extend(go_tool) |
| 43 items = _go_files(input_api, source_file_filter) |
| 44 files = [f.LocalPath() for f in items] |
| 45 if not len(files): |
| 46 return [] |
| 47 cmdline.extend(files) |
| 48 out, ret = _run_go_tool(input_api, cmdline) |
| 49 msg = "" |
| 50 if ret: |
| 51 msg = "Failed to run %s" % tool |
| 52 if out: |
| 53 msg = "\n".join([msg, out]) |
| 54 if msg: |
| 55 return [output_api.PresubmitError(msg, items=items)] |
| 56 return [] |
| 57 |
| 58 def CheckGoTest(input_api, output_api, source_file_filter=None): |
| 59 """Checks that all directories test pass by goapp test.""" |
| 60 items = _go_files(input_api, source_file_filter) |
| 61 dirs = set() |
| 62 for f in items: |
| 63 dirs.add(input_api.os_path.join(reporoot(input_api), |
| 64 input_api.os_path.dirname(f.LocalPath()))) |
| 65 if not len(dirs): |
| 66 return [] |
| 67 result=[] |
| 68 for d in dirs: |
| 69 cmdline = [input_api.os_path.join(reporoot(input_api), '..', |
| 70 'go_appengine', 'goapp')] |
| 71 cmdline.extend(['test']) |
| 72 p = input_api.subprocess.Popen(cmdline, |
| 73 cwd=d, |
| 74 stdout=input_api.subprocess.PIPE, |
| 75 stderr=input_api.subprocess.STDOUT) |
| 76 (out, _) = p.communicate() |
| 77 msg = "" |
| 78 if p.returncode: |
| 79 msg = "Failed to run goapp test in %s" % d |
| 80 if out: |
| 81 msg = "\n".join([msg, out]) |
| 82 if msg: |
| 83 result.append(output_api.PresubmitError(msg, items=items)) |
| 84 return result |
| 85 |
| 86 |
| 87 def CheckChangeGoFmtClean(input_api, output_api, source_file_filter=None): |
| 88 return _CheckChangeByGoTool(input_api, output_api, |
| 89 source_file_filter=source_file_filter, |
| 90 go_tool=['gofmt', '-l']) |
| 91 |
| 92 def CheckChangeGoVetClean(input_api, output_api, source_file_filter=None): |
| 93 return _CheckChangeByGoTool(input_api, output_api, |
| 94 source_file_filter=source_file_filter, |
| 95 go_tool=['goapp', 'vet']) |
| 96 |
| 97 |
| 98 def CommonChecks(input_api, output_api): |
| 99 results = [] |
| 100 results += input_api.canned_checks.CheckChangeHasDescription( |
| 101 input_api, output_api) |
| 102 results += CheckChangeGoFmtClean(input_api, output_api) |
| 103 results += CheckChangeGoVetClean(input_api, output_api) |
| 104 results += CheckGoTest(input_api, output_api) |
| 105 results += input_api.canned_checks.CheckChangeHasNoCrAndHasOnlyOneEol( |
| 106 input_api, output_api) |
| 107 # go uses TAB. |
| 108 #results += input_api.canned_checks.CheckChangeHasNoTabs( |
| 109 # input_api, output_api) |
| 110 results += input_api.canned_checks.CheckChangeTodoHasOwner( |
| 111 input_api, output_api) |
| 112 results += input_api.canned_checks.CheckChangeHasNoStrayWhitespace( |
| 113 input_api, output_api) |
| 114 # go accepts long lines. |
| 115 #results += input_api.canned_checks.CheckLongLines(input_api, output_api, 80) |
| 116 results += input_api.canned_checks.CheckLicense( |
| 117 input_api, output_api, |
| 118 r'(Copyright 201\d Google Inc. All Rights Reserved.|' + |
| 119 'Copyright.*The Chromium Authors. All rights reserved.)') |
| 120 results += input_api.canned_checks.CheckDoNotSubmit( |
| 121 input_api, output_api) |
| 122 return results |
| 123 |
| 124 |
| 125 def CheckChangeOnUpload(input_api, output_api): |
| 126 return CommonChecks(input_api, output_api) |
| 127 |
| 128 |
| 129 def CheckChangeOnCommit(input_api, output_api): |
| 130 output = CommonChecks(input_api, output_api) |
| 131 output.extend(input_api.canned_checks.CheckOwners(input_api, output_api)) |
| 132 return output |
| OLD | NEW |