OLD | NEW |
1 #!/usr/bin/python | 1 #!/usr/bin/env python |
2 # Copyright (c) 2011 The Chromium Authors. All rights reserved. | 2 # Copyright (c) 2011 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 """ | 6 """ |
7 Runs Coverity Prevent on a build of Chromium. | 7 Runs Coverity Prevent on a build of Chromium. |
8 | 8 |
9 This script should be run in a Visual Studio Command Prompt, so that the | 9 This script should be run in a Visual Studio Command Prompt, so that the |
10 INCLUDE, LIB, and PATH environment variables are set properly for Visual | 10 INCLUDE, LIB, and PATH environment variables are set properly for Visual |
11 Studio. | 11 Studio. |
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
70 COVERITY_PRODUCT = 'Chromium' | 70 COVERITY_PRODUCT = 'Chromium' |
71 | 71 |
72 COVERITY_TARGET = 'Windows' | 72 COVERITY_TARGET = 'Windows' |
73 | 73 |
74 COVERITY_USER = 'admin' | 74 COVERITY_USER = 'admin' |
75 # looking for a PASSWORD constant? Look at --coverity-password-file instead. | 75 # looking for a PASSWORD constant? Look at --coverity-password-file instead. |
76 | 76 |
77 # Relative to CHROMIUM_SOURCE_DIR. Contains the pid of this script. | 77 # Relative to CHROMIUM_SOURCE_DIR. Contains the pid of this script. |
78 LOCK_FILE = 'coverity.lock' | 78 LOCK_FILE = 'coverity.lock' |
79 | 79 |
| 80 |
80 def _ReadPassword(pwfilename): | 81 def _ReadPassword(pwfilename): |
81 """Reads the coverity password in from a file where it was stashed""" | 82 """Reads the coverity password in from a file where it was stashed""" |
82 pwfile = open(pwfilename, 'r') | 83 pwfile = open(pwfilename, 'r') |
83 password = pwfile.readline() | 84 password = pwfile.readline() |
84 pwfile.close() | 85 pwfile.close() |
85 return password.rstrip() | 86 return password.rstrip() |
86 | 87 |
| 88 |
87 def _RunCommand(cmd, dry_run, shell=False, echo_cmd=True): | 89 def _RunCommand(cmd, dry_run, shell=False, echo_cmd=True): |
88 """Runs the command if dry_run is false, otherwise just prints the command.""" | 90 """Runs the command if dry_run is false, otherwise just prints the command.""" |
89 if echo_cmd: | 91 if echo_cmd: |
90 print cmd | 92 print cmd |
91 if not dry_run: | 93 if not dry_run: |
92 return subprocess.call(cmd, shell=shell) | 94 return subprocess.call(cmd, shell=shell) |
93 else: | 95 else: |
94 return 0 | 96 return 0 |
95 | 97 |
| 98 |
96 def _ReleaseLock(lock_file, lock_filename): | 99 def _ReleaseLock(lock_file, lock_filename): |
97 """Removes the lockfile. Function-ized so we can bail from anywhere""" | 100 """Removes the lockfile. Function-ized so we can bail from anywhere""" |
98 os.close(lock_file) | 101 os.close(lock_file) |
99 os.remove(lock_filename) | 102 os.remove(lock_filename) |
100 | 103 |
101 def main(options, args): | 104 |
| 105 def run_coverity(options, args): |
102 """Runs all the selected tests for the given build type and target.""" | 106 """Runs all the selected tests for the given build type and target.""" |
103 # Create the lock file to prevent another instance of this script from | 107 # Create the lock file to prevent another instance of this script from |
104 # running. | 108 # running. |
105 lock_filename = os.path.join(options.source_dir, LOCK_FILE) | 109 lock_filename = os.path.join(options.source_dir, LOCK_FILE) |
106 try: | 110 try: |
107 lock_file = os.open(lock_filename, | 111 lock_file = os.open(lock_filename, |
108 os.O_CREAT | os.O_EXCL | os.O_TRUNC | os.O_RDWR) | 112 os.O_CREAT | os.O_EXCL | os.O_TRUNC | os.O_RDWR) |
109 except OSError, err: | 113 except OSError, err: |
110 print 'Failed to open lock file:\n ' + str(err) | 114 print 'Failed to open lock file:\n ' + str(err) |
111 return 1 | 115 return 1 |
(...skipping 11 matching lines...) Expand all Loading... |
123 # The coverity-password filename may have been a relative path. | 127 # The coverity-password filename may have been a relative path. |
124 # If so, assume it's relative to the source directory, which means | 128 # If so, assume it's relative to the source directory, which means |
125 # the time to read the password is after we do the chdir(). | 129 # the time to read the password is after we do the chdir(). |
126 coverity_password = _ReadPassword(options.coverity_password_file) | 130 coverity_password = _ReadPassword(options.coverity_password_file) |
127 | 131 |
128 cmd = 'gclient sync' | 132 cmd = 'gclient sync' |
129 gclient_exit = _RunCommand(cmd, options.dry_run, shell=True) | 133 gclient_exit = _RunCommand(cmd, options.dry_run, shell=True) |
130 if gclient_exit != 0: | 134 if gclient_exit != 0: |
131 print 'gclient aborted with status %s' % gclient_exit | 135 print 'gclient aborted with status %s' % gclient_exit |
132 _ReleaseLock(lock_file, lock_filename) | 136 _ReleaseLock(lock_file, lock_filename) |
133 sys.exit(1) | 137 return 1 |
134 | 138 |
135 print 'Elapsed time: %ds' % (time.time() - start_time) | 139 print 'Elapsed time: %ds' % (time.time() - start_time) |
136 | 140 |
137 # Do a clean build. Remove the build output directory first. | 141 # Do a clean build. Remove the build output directory first. |
138 if sys.platform.startswith('linux'): | 142 if sys.platform.startswith('linux'): |
139 rm_path = os.path.join(options.source_dir,'src','out',options.target) | 143 rm_path = os.path.join(options.source_dir,'src','out',options.target) |
140 elif sys.platform == 'win32': | 144 elif sys.platform == 'win32': |
141 rm_path = os.path.join(options.source_dir,options.solution_dir, | 145 rm_path = os.path.join(options.source_dir,options.solution_dir, |
142 options.target) | 146 options.target) |
143 elif sys.platform == 'darwin': | 147 elif sys.platform == 'darwin': |
144 rm_path = os.path.join(options.source_dir,'src','xcodebuild') | 148 rm_path = os.path.join(options.source_dir,'src','xcodebuild') |
145 else: | 149 else: |
146 print 'Platform "%s" unrecognized, aborting' % sys.platform | 150 print 'Platform "%s" unrecognized, aborting' % sys.platform |
147 _ReleaseLock(lock_file, lock_filename) | 151 _ReleaseLock(lock_file, lock_filename) |
148 sys.exit(1) | 152 return 1 |
149 | 153 |
150 if options.dry_run: | 154 if options.dry_run: |
151 print 'shutil.rmtree(%s)' % repr(rm_path) | 155 print 'shutil.rmtree(%s)' % repr(rm_path) |
152 else: | 156 else: |
153 shutil.rmtree(rm_path,True) | 157 shutil.rmtree(rm_path,True) |
154 | 158 |
155 if options.preserve_intermediate_dir: | 159 if options.preserve_intermediate_dir: |
156 print 'Preserving intermediate directory.' | 160 print 'Preserving intermediate directory.' |
157 else: | 161 else: |
158 if options.dry_run: | 162 if options.dry_run: |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
222 coverity_password) | 226 coverity_password) |
223 # Avoid echoing the Commit command because it has a password in it | 227 # Avoid echoing the Commit command because it has a password in it |
224 _RunCommand(cmd, options.dry_run, shell=use_shell_during_make, echo_cmd=False) | 228 _RunCommand(cmd, options.dry_run, shell=use_shell_during_make, echo_cmd=False) |
225 | 229 |
226 print 'Total time: %ds' % (time.time() - start_time) | 230 print 'Total time: %ds' % (time.time() - start_time) |
227 | 231 |
228 _ReleaseLock(lock_file, lock_filename) | 232 _ReleaseLock(lock_file, lock_filename) |
229 | 233 |
230 return 0 | 234 return 0 |
231 | 235 |
232 if '__main__' == __name__: | 236 |
| 237 def main(): |
233 option_parser = optparse.OptionParser() | 238 option_parser = optparse.OptionParser() |
234 option_parser.add_option('', '--dry-run', action='store_true', default=False, | 239 option_parser.add_option('', '--dry-run', action='store_true', default=False, |
235 help='print but don\'t run the commands') | 240 help='print but don\'t run the commands') |
236 | 241 |
237 option_parser.add_option('', '--target', default='Release', | 242 option_parser.add_option('', '--target', default='Release', |
238 help='build target (Debug or Release)') | 243 help='build target (Debug or Release)') |
239 | 244 |
240 option_parser.add_option('', '--source-dir', dest='source_dir', | 245 option_parser.add_option('', '--source-dir', dest='source_dir', |
241 help='full path to directory ABOVE "src"', | 246 help='full path to directory ABOVE "src"', |
242 default=CHROMIUM_SOURCE_DIR) | 247 default=CHROMIUM_SOURCE_DIR) |
(...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
289 help='file containing the coverity password', | 294 help='file containing the coverity password', |
290 default='coverity-password') | 295 default='coverity-password') |
291 | 296 |
292 helpmsg = ('By default, the intermediate dir is emptied before analysis. ' | 297 helpmsg = ('By default, the intermediate dir is emptied before analysis. ' |
293 'This switch disables that behavior.') | 298 'This switch disables that behavior.') |
294 option_parser.add_option('', '--preserve-intermediate-dir', | 299 option_parser.add_option('', '--preserve-intermediate-dir', |
295 action='store_true', help=helpmsg, | 300 action='store_true', help=helpmsg, |
296 default=False) | 301 default=False) |
297 | 302 |
298 options, args = option_parser.parse_args() | 303 options, args = option_parser.parse_args() |
| 304 return run_coverity(options, args) |
299 | 305 |
300 result = main(options, args) | 306 |
301 sys.exit(result) | 307 if '__main__' == __name__: |
| 308 sys.exit(main()) |
OLD | NEW |