15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#!/usr/bin/env python
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Copyright (c) 2011 The Chromium Authors. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Use of this source code is governed by a BSD-style license that can be
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# found in the LICENSE file.
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Runs Coverity Prevent on a build of Chromium.
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)This script should be run in a Visual Studio Command Prompt, so that the
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)INCLUDE, LIB, and PATH environment variables are set properly for Visual
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Studio.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Usage examples:
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  coverity.py
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  coverity.py --dry-run
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  coverity.py --target=debug
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  %comspec% /c ""C:\Program Files\Microsoft Visual Studio 8\VC\vcvarsall.bat"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      x86 && C:\Python24\python.exe C:\coverity.py"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)For a full list of options, pass the '--help' switch.
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)See http://support.microsoft.com/kb/308569 for running this script as a
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)Scheduled Task on Windows XP.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)"""
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import optparse
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import os.path
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import shutil
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import subprocess
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import sys
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)import time
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# These constants provide default values, but are exposed as command-line
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# flags. See the --help for more info. Note that for historical reasons
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# (the script started out as Windows-only and has legacy usages which pre-date
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# these switches), the constants are all tuned for Windows.
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Usage of this script on Linux pretty much requires explicit
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# --source-dir, --coverity-bin-dir, --coverity-intermediate-dir, and
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# --coverity-target command line flags.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CHROMIUM_SOURCE_DIR = 'C:\\chromium.latest'
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Relative to CHROMIUM_SOURCE_DIR.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CHROMIUM_SOLUTION_FILE = 'src\\chrome\\chrome.sln'
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Relative to CHROMIUM_SOURCE_DIR.
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)CHROMIUM_SOLUTION_DIR = 'src\\chrome'
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_BIN_DIR = 'C:\\coverity\\prevent-win32-4.5.1\\bin'
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_INTERMEDIATE_DIR = 'C:\\coverity\\cvbuild\\cr_int'
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_ANALYZE_OPTIONS = ('--cxx --security --concurrency '
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--enable ATOMICITY '
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--enable MISSING_LOCK '
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--enable DELETE_VOID '
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--checker-option PASS_BY_VALUE:size_threshold:16 '
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--checker-option '
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            'USE_AFTER_FREE:allow_simple_use:false '
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--enable-constraint-fpp '
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            '--enable-callgraph-metrics')
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Might need to be changed to FQDN
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_REMOTE = 'chromecoverity-linux1'
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_PORT = '5467'
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_PRODUCT = 'Chromium'
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_TARGET = 'Windows'
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)COVERITY_USER = 'admin'
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# looking for a PASSWORD constant? Look at --coverity-password-file instead.
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)# Relative to CHROMIUM_SOURCE_DIR.  Contains the pid of this script.
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)LOCK_FILE = 'coverity.lock'
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _ReadPassword(pwfilename):
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Reads the coverity password in from a file where it was stashed"""
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pwfile = open(pwfilename, 'r')
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  password = pwfile.readline()
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  pwfile.close()
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return password.rstrip()
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _RunCommand(cmd, dry_run, shell=False, echo_cmd=True):
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Runs the command if dry_run is false, otherwise just prints the command."""
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if echo_cmd:
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print cmd
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if not dry_run:
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return subprocess.call(cmd, shell=shell)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 0
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def _ReleaseLock(lock_file, lock_filename):
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Removes the lockfile. Function-ized so we can bail from anywhere"""
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  os.close(lock_file)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  os.remove(lock_filename)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def run_coverity(options, args):
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  """Runs all the selected tests for the given build type and target."""
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Create the lock file to prevent another instance of this script from
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # running.
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  lock_filename = os.path.join(options.source_dir, LOCK_FILE)
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  try:
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    lock_file = os.open(lock_filename,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        os.O_CREAT | os.O_EXCL | os.O_TRUNC | os.O_RDWR)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  except OSError, err:
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'Failed to open lock file:\n  ' + str(err)
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Write the pid of this script (the python.exe process) to the lock file.
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  os.write(lock_file, str(os.getpid()))
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options.target = options.target.title()
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  start_time = time.time()
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'Change directory to ' + options.source_dir
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  os.chdir(options.source_dir)
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # The coverity-password filename may have been a relative path.
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # If so, assume it's relative to the source directory, which means
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # the time to read the password is after we do the chdir().
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  coverity_password = _ReadPassword(options.coverity_password_file)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd = 'gclient sync'
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gclient_exit = _RunCommand(cmd, options.dry_run, shell=True)
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if gclient_exit != 0:
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'gclient aborted with status %s' % gclient_exit
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _ReleaseLock(lock_file, lock_filename)
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'Elapsed time: %ds' % (time.time() - start_time)
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Do a clean build.  Remove the build output directory first.
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if sys.platform.startswith('linux'):
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rm_path = os.path.join(options.source_dir,'src','out',options.target)
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif sys.platform == 'win32':
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rm_path = os.path.join(options.source_dir,options.solution_dir,
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           options.target)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif sys.platform == 'darwin':
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    rm_path = os.path.join(options.source_dir,'src','xcodebuild')
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'Platform "%s" unrecognized, aborting' % sys.platform
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _ReleaseLock(lock_file, lock_filename)
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return 1
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if options.dry_run:
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    print 'shutil.rmtree(%s)' % repr(rm_path)
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    shutil.rmtree(rm_path,True)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if options.preserve_intermediate_dir:
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print 'Preserving intermediate directory.'
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  else:
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if options.dry_run:
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print 'shutil.rmtree(%s)' % repr(options.coverity_intermediate_dir)
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      print 'os.mkdir(%s)' % repr(options.coverity_intermediate_dir)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    else:
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      shutil.rmtree(options.coverity_intermediate_dir,True)
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      os.mkdir(options.coverity_intermediate_dir)
1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'Elapsed time: %ds' % (time.time() - start_time)
1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  use_shell_during_make = False
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if sys.platform.startswith('linux'):
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    use_shell_during_make = True
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os.chdir('src')
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _RunCommand('pwd', options.dry_run, shell=True)
1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd = '%s/cov-build --dir %s make BUILDTYPE=%s chrome' % (
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.coverity_bin_dir, options.coverity_intermediate_dir,
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.target)
1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif sys.platform == 'win32':
1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd = ('%s\\cov-build.exe --dir %s devenv.com %s\\%s /build %s '
1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           '/project chrome.vcproj') % (
1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.coverity_bin_dir, options.coverity_intermediate_dir,
1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.source_dir, options.solution_file, options.target)
1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  elif sys.platform == 'darwin':
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    use_shell_during_make = True
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    os.chdir('src/chrome')
1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    _RunCommand('pwd', options.dry_run, shell=True)
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    cmd = ('%s/cov-build --dir %s xcodebuild -project chrome.xcodeproj '
1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)           '-configuration %s -target chrome') % (
1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.coverity_bin_dir, options.coverity_intermediate_dir,
1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      options.target)
1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _RunCommand(cmd, options.dry_run, shell=use_shell_during_make)
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'Elapsed time: %ds' % (time.time() - start_time)
1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cov_analyze_exe = os.path.join(options.coverity_bin_dir,'cov-analyze')
1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd = '%s --dir %s %s' % (cov_analyze_exe,
1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            options.coverity_intermediate_dir,
2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            options.coverity_analyze_options)
2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _RunCommand(cmd, options.dry_run, shell=use_shell_during_make)
2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'Elapsed time: %ds' % (time.time() - start_time)
2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cov_commit_exe = os.path.join(options.coverity_bin_dir,'cov-commit-defects')
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # On Linux we have started using a Target with a space in it, so we want
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # to quote it. On the other hand, Windows quoting doesn't work quite the
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # same way. To be conservative, I'd like to avoid quoting an argument
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # that doesn't need quoting and which we haven't historically been quoting
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # on that platform. So, only quote the target if we have to.
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  coverity_target = options.coverity_target
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if sys.platform != 'win32':
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    coverity_target = '"%s"' % coverity_target
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  cmd = ('%s --dir %s --remote %s --port %s '
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         '--product %s '
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         '--target %s '
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         '--user %s '
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)         '--password %s') % (cov_commit_exe,
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options.coverity_intermediate_dir,
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options.coverity_dbhost,
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options.coverity_port,
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options.coverity_product,
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             coverity_target,
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             options.coverity_user,
2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             coverity_password)
2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  # Avoid echoing the Commit command because it has a password in it
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _RunCommand(cmd, options.dry_run, shell=use_shell_during_make, echo_cmd=False)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  print 'Total time: %ds' % (time.time() - start_time)
2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  _ReleaseLock(lock_file, lock_filename)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return 0
2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)def main():
2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser = optparse.OptionParser()
2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--dry-run', action='store_true', default=False,
2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help='print but don\'t run the commands')
2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--target', default='Release',
2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help='build target (Debug or Release)')
2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--source-dir', dest='source_dir',
2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help='full path to directory ABOVE "src"',
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=CHROMIUM_SOURCE_DIR)
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--solution-file', dest='solution_file',
2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=CHROMIUM_SOLUTION_FILE)
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--solution-dir', dest='solution_dir',
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=CHROMIUM_SOLUTION_DIR)
2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-bin-dir', dest='coverity_bin_dir',
2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_BIN_DIR)
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-intermediate-dir',
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           dest='coverity_intermediate_dir',
2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_INTERMEDIATE_DIR)
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-analyze-options',
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           dest='coverity_analyze_options',
2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help=('all cov-analyze options, e.g. "%s"'
2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 % COVERITY_ANALYZE_OPTIONS),
2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_ANALYZE_OPTIONS)
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-db-host',
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           dest='coverity_dbhost',
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help=('coverity defect db server hostname, e.g. %s'
2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 % COVERITY_REMOTE),
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_REMOTE)
2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-db-port', dest='coverity_port',
2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help=('port # of coverity web/db server, e.g. %s'
2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 % COVERITY_PORT),
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_PORT)
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-product', dest='coverity_product',
2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help=('Product name reported to coverity, e.g. %s'
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 % COVERITY_PRODUCT),
2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_PRODUCT)
2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-target', dest='coverity_target',
2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help='Platform Target reported to coverity',
2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_TARGET)
2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-user', dest='coverity_user',
2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help='Username used to log into coverity',
2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=COVERITY_USER)
2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--coverity-password-file',
2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           dest='coverity_password_file',
2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           help='file containing the coverity password',
2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default='coverity-password')
2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  helpmsg = ('By default, the intermediate dir is emptied before analysis. '
2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)             'This switch disables that behavior.')
2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  option_parser.add_option('', '--preserve-intermediate-dir',
3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           action='store_true', help=helpmsg,
3015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           default=False)
3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  options, args = option_parser.parse_args()
3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return run_coverity(options, args)
3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)if '__main__' == __name__:
3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sys.exit(main())
309