diff options
Diffstat (limited to 'setup_chromeos.py')
-rwxr-xr-x | setup_chromeos.py | 252 |
1 files changed, 252 insertions, 0 deletions
diff --git a/setup_chromeos.py b/setup_chromeos.py new file mode 100755 index 00000000..b6f9f4df --- /dev/null +++ b/setup_chromeos.py @@ -0,0 +1,252 @@ +#!/usr/bin/python2 +# +# Copyright 2010 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""Script to checkout the ChromeOS source. + +This script sets up the ChromeOS source in the given directory, matching a +particular release of ChromeOS. +""" + +from __future__ import print_function + +__author__ = 'raymes@google.com (Raymes Khoury)' + +from datetime import datetime + +import argparse +import os +import pickle +import sys +import tempfile +import time +from cros_utils import command_executer +from cros_utils import logger +from cros_utils import manifest_versions + +GCLIENT_FILE = """solutions = [ + { "name" : "CHROME_DEPS", + "url" : + "svn://svn.chromium.org/chrome-internal/trunk/tools/buildspec/releases/%s", + "custom_deps" : { + "src/third_party/WebKit/LayoutTests": None, + "src-pdf": None, + "src/pdf": None, + }, + "safesync_url": "", + }, +] +""" + +# List of stable versions used for common team image +# Sheriff must update this list when a new common version becomes available +COMMON_VERSIONS = '/home/mobiletc-prebuild/common_images/common_list.txt' + + +def Usage(parser): + parser.print_help() + sys.exit(0) + + +# Get version spec file, either from "paladin" or "buildspec" directory. +def GetVersionSpecFile(version, versions_git): + temp = tempfile.mkdtemp() + commands = ['cd {0}'.format(temp), \ + 'git clone {0} versions'.format(versions_git)] + cmd_executer = command_executer.GetCommandExecuter() + ret = cmd_executer.RunCommands(commands) + err_msg = None + if ret: + err_msg = 'Failed to checkout versions_git - {0}'.format(versions_git) + ret = None + else: + v, m = version.split('.', 1) + paladin_spec = 'paladin/buildspecs/{0}/{1}.xml'.format(v, m) + generic_spec = 'buildspecs/{0}/{1}.xml'.format(v, m) + paladin_path = '{0}/versions/{1}'.format(temp, paladin_spec) + generic_path = '{0}/versions/{1}'.format(temp, generic_spec) + if os.path.exists(paladin_path): + ret = paladin_spec + elif os.path.exists(generic_path): + ret = generic_spec + else: + err_msg = 'No spec found for version {0}'.format(version) + ret = None + # Fall through to clean up. + + commands = ['rm -rf {0}'.format(temp)] + cmd_executer.RunCommands(commands) + if err_msg: + logger.GetLogger().LogFatal(err_msg) + return ret + + +def TimeToCommonVersion(timestamp): + """Convert timestamp to common image version.""" + tdt = datetime.fromtimestamp(float(timestamp)) + with open(COMMON_VERSIONS, 'r') as f: + common_list = pickle.load(f) + for sv in common_list: + sdt = datetime.strptime(sv['date'], '%Y-%m-%d %H:%M:%S.%f') + if tdt >= sdt: + return '%s.%s' % (sv['chrome_major_version'], sv['chromeos_version']) + # should never reach here + logger.GetLogger().LogFatal('No common version for timestamp') + return None + + +def Main(argv): + """Checkout the ChromeOS source.""" + parser = argparse.ArgumentParser() + parser.add_argument('--dir', + dest='directory', + help='Target directory for ChromeOS installation.') + parser.add_argument('--version', + dest='version', + default='latest_lkgm', + help="""ChromeOS version. Can be: +(1) A release version in the format: 'X.X.X.X' +(2) 'top' for top of trunk +(3) 'latest_lkgm' for the latest lkgm version +(4) 'lkgm' for the lkgm release before timestamp +(5) 'latest_common' for the latest team common stable version +(6) 'common' for the team common stable version before timestamp +Default is 'latest_lkgm'.""") + parser.add_argument('--timestamp', + dest='timestamp', + default=None, + help='Timestamps in epoch format. It will check out the' + 'latest LKGM or the latest COMMON version of ChromeOS' + ' before the timestamp. Use in combination with' + ' --version=latest or --version=common. Use ' + '"date -d <date string> +%s" to find epoch time') + parser.add_argument('--minilayout', + dest='minilayout', + default=False, + action='store_true', + help='Whether to checkout the minilayout (smaller ' + 'checkout).') + parser.add_argument('--jobs', + '-j', + dest='jobs', + help='Number of repo sync threads to use.') + parser.add_argument('--public', + '-p', + dest='public', + default=False, + action='store_true', + help='Use the public checkout instead of the private ' + 'one.') + + options = parser.parse_args(argv) + + if not options.version: + parser.print_help() + logger.GetLogger().LogFatal('No version specified.') + else: + version = options.version.strip() + + if not options.timestamp: + timestamp = '' + else: + timestamp = options.timestamp.strip() + if version not in ('lkgm', 'common'): + parser.print_help() + logger.GetLogger().LogFatal('timestamp option only applies for ' + "versions \"lkgm\" or \"common\"") + + if not options.directory: + parser.print_help() + logger.GetLogger().LogFatal('No directory specified.') + + directory = options.directory.strip() + + if options.public: + manifest_repo = 'https://chromium.googlesource.com/chromiumos/manifest.git' + versions_repo = ('https://chromium.googlesource.com/' + 'chromiumos/manifest-versions.git') + else: + manifest_repo = ( + 'https://chrome-internal.googlesource.com/chromeos/' + 'manifest-internal.git' + ) + versions_repo = ( + 'https://chrome-internal.googlesource.com/chromeos/' + 'manifest-versions.git' + ) + + if version == 'top': + init = 'repo init -u %s' % manifest_repo + elif version == 'latest_lkgm': + manifests = manifest_versions.ManifestVersions() + version = manifests.TimeToVersion(time.mktime(time.gmtime())) + version, manifest = version.split('.', 1) + logger.GetLogger().LogOutput('found version %s.%s for latest LKGM' % + (version, manifest)) + init = ('repo init -u %s -m paladin/buildspecs/%s/%s.xml' % + (versions_repo, version, manifest)) + del manifests + elif version == 'lkgm': + if not timestamp: + parser.print_help() + logger.GetLogger().LogFatal('No timestamp specified for version=lkgm') + manifests = manifest_versions.ManifestVersions() + version = manifests.TimeToVersion(timestamp) + version, manifest = version.split('.', 1) + logger.GetLogger().LogOutput('found version %s.%s for LKGM at timestamp %s' + % (version, manifest, timestamp)) + init = ('repo init -u %s -m paladin/buildspecs/%s/%s.xml' % + (versions_repo, version, manifest)) + del manifests + elif version == 'latest_common': + version = TimeToCommonVersion(time.mktime(time.gmtime())) + version, manifest = version.split('.', 1) + logger.GetLogger().LogOutput('found version %s.%s for latest Common image' % + (version, manifest)) + init = ('repo init -u %s -m buildspecs/%s/%s.xml' % (versions_repo, version, + manifest)) + elif version == 'common': + if not timestamp: + parser.print_help() + logger.GetLogger().LogFatal('No timestamp specified for version=lkgm') + version = TimeToCommonVersion(timestamp) + version, manifest = version.split('.', 1) + logger.GetLogger().LogOutput('found version %s.%s for latest common image ' + 'at timestamp %s' % (version, manifest, + timestamp)) + init = ('repo init -u %s -m buildspecs/%s/%s.xml' % (versions_repo, version, + manifest)) + else: + # user specified a specific version number + version_spec_file = GetVersionSpecFile(version, versions_repo) + if not version_spec_file: + return 1 + init = 'repo init -u %s -m %s' % (versions_repo, version_spec_file) + + if options.minilayout: + init += ' -g minilayout' + + init += ' --repo-url=https://chromium.googlesource.com/external/repo.git' + + # crosbug#31837 - "Sources need to be world-readable to properly + # function inside the chroot" + sync = 'umask 022 && repo sync' + if options.jobs: + sync += ' -j %s' % options.jobs + + commands = ['mkdir -p %s' % directory, 'cd %s' % directory, init, sync] + cmd_executer = command_executer.GetCommandExecuter() + ret = cmd_executer.RunCommands(commands) + if ret: + return ret + + return cmd_executer.RunCommand( + 'git ls-remote ' + 'https://chrome-internal.googlesource.com/chrome/src-internal.git ' + '> /dev/null') + + +if __name__ == '__main__': + retval = Main(sys.argv[1:]) + sys.exit(retval) |