find_chrome.py revision f2477e01787aa58f445919b809d89e252beef54f
17dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch#!/usr/bin/env python
27dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Copyright 2013 The Chromium Authors. All rights reserved.
37dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# Use of this source code is governed by a BSD-style license that can be
47dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch# found in the LICENSE file.
57dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
67dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch"""A script to find a recently-built Chrome, in the likely places.
77dbb3d5cf0c15f500944d211057644d6a2f37371Ben MurdochThis script is used for automated testing, don't trust it for anything more
87dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochthan that!"""
97dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
107dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
117dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport optparse
127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport os
137dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochimport sys
147dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
157dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
167dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef FindChrome(src_dir, configs, verbose=False):
177dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # List of places that chrome could live.
187dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # In theory we should be more careful about what platform we're actually
197dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # building for.
207dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # As currently constructed, this will also hork people who have debug and
217dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # release builds sitting side by side who build locally.
227dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chrome_locations = []
237dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
247dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for config in configs:
257dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    chrome_locations.extend([
267dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'build/%s/chrome.exe' % config,
277dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'chrome/%s/chrome.exe' % config,
287dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        # Windows Chromium ninja builder
297dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'out/%s/chrome.exe' % config,
304e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        # Linux
317dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'out/%s/chrome' % config,
324e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)        # Mac Chromium ninja builder
337dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'out/%s/Chromium.app/Contents/MacOS/Chromium' % config,
34f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)        # Mac release ninja builder
357dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'out/%s/Google Chrome.app/Contents/MacOS/Google Chrome' % config,
367dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        # Mac Chromium xcode builder
377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'xcodebuild/%s/Chromium.app/Contents/MacOS/Chromium' % config,
387dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        # Mac release xcode builder
397dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        'xcodebuild/%s/Google Chrome.app/Contents/MacOS/Google Chrome' % config,
407dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    ])
417dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
427dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  # Pick the one with the newest timestamp.
437dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  latest_mtime = 0
447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  latest_path = None
457dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  for chrome in chrome_locations:
467dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    chrome_filename = os.path.join(src_dir, chrome)
477dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if verbose:
487dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      print 'Looking for %r...' % chrome_filename,
497dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if os.path.exists(chrome_filename):
507dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if verbose:
517dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        print 'YES.'
527dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      mtime = os.path.getmtime(chrome_filename)
537dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if mtime > latest_mtime:
547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        latest_mtime = mtime
557dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        latest_path = chrome_filename
567dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    else:
577dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      if verbose:
587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch        print 'NO.'
597dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if latest_path is not None:
607dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    if verbose:
617dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch      print 'Most recent is %r.' % latest_path
627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return latest_path
637dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return None
647dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
657dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochdef main(args):
677dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  usage = 'Usage: %prog [options] <src dir>'
687dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  description = __doc__
697dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  parser = optparse.OptionParser(usage, description=description)
707dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  parser.add_option('-c', '--config',
717dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    action='append',
727dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    help='Which configuration of Chrome to look for. '
737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         'One of [Debug, Release]. The default is to try both. '
747dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                         'You can specify this multiple times.')
757dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  parser.add_option('-v', '--verbose', action='store_true',
767dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                    help='Verbose output')
777dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
787dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  options, args = parser.parse_args(args[1:])
797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
807dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if not len(args):
817dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parser.error('Expected source directory as first argument.')
827dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
837dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if not options.config:
847dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    options.config = ['Debug', 'Release']
857dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
867dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  invalid_configs = set(options.config) - set(['Debug', 'Release'])
877dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if invalid_configs:
887dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    parser.error('Expected config to be one of [Debug, Release]. '
897dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 'Got the following invalid configs: %s. ' %
907dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                 ', '.invalid_configs)
917dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  src_dir = args[0]
937dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  chrome_path = FindChrome(src_dir, options.config, options.verbose)
947dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  if not chrome_path:
957dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    sys.stderr.write('Error: Cannot find Chrome. '
967dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch                     'Run again with -v to see where was searched.\n')
977dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    return 1
987dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
997dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  print chrome_path
1007dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  return 0
1017dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1027dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch
1037dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochif __name__ == '__main__':
1047dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch  sys.exit(main(sys.argv))
105