blob: b90e2ae4f6e57e6ca45a8120898b68008d09db65 [file] [log] [blame]
shenhanb7ff88b2013-02-19 20:42:48 +00001#!/usr/bin/python
bjanakiraman7f4a4852013-02-15 04:35:28 +00002#
Rahul Chaudhryc1635a82014-10-31 14:59:39 -07003# Copyright 2010 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
bjanakiraman7f4a4852013-02-15 04:35:28 +00006"""Script to checkout the ChromeOS source.
7
8This script sets up the ChromeOS source in the given directory, matching a
9particular release of ChromeOS.
10"""
11
Luis Lozanof2a3ef42015-12-15 13:49:30 -080012__author__ = 'raymes@google.com (Raymes Khoury)'
bjanakiraman7f4a4852013-02-15 04:35:28 +000013
llozano9efafde2013-02-23 01:37:04 +000014from datetime import datetime
asharifca35b772013-02-15 04:56:41 +000015import getpass
Luis Lozano8cf53082013-08-01 12:35:11 -070016
bjanakiraman7f4a4852013-02-15 04:35:28 +000017import optparse
yunlian3802fbf2013-02-19 19:58:44 +000018import os
llozano9efafde2013-02-23 01:37:04 +000019import pickle
bjanakiraman7f4a4852013-02-15 04:35:28 +000020import sys
yunlian3802fbf2013-02-19 19:58:44 +000021import tempfile
22import time
raymes01959ae2013-02-15 04:50:07 +000023from utils import command_executer
raymes69c8d722013-02-15 17:55:36 +000024from utils import logger
Luis Lozano8cf53082013-08-01 12:35:11 -070025from utils import manifest_versions
bjanakiraman7f4a4852013-02-15 04:35:28 +000026
raymesbfb57992013-02-15 04:35:45 +000027GCLIENT_FILE = """solutions = [
28 { "name" : "CHROME_DEPS",
29 "url" :
30 "svn://svn.chromium.org/chrome-internal/trunk/tools/buildspec/releases/%s",
31 "custom_deps" : {
32 "src/third_party/WebKit/LayoutTests": None,
33 "src-pdf": None,
34 "src/pdf": None,
35 },
36 "safesync_url": "",
37 },
38]
39"""
40
llozano9efafde2013-02-23 01:37:04 +000041# List of stable versions used for common team image
42# Sheriff must update this list when a new common version becomes available
Luis Lozanof2a3ef42015-12-15 13:49:30 -080043COMMON_VERSIONS = '/home/mobiletc-prebuild/common_images/common_list.txt'
44
llozano9efafde2013-02-23 01:37:04 +000045
bjanakiraman7f4a4852013-02-15 04:35:28 +000046def Usage(parser):
47 parser.print_help()
48 sys.exit(0)
49
Luis Lozanof2a3ef42015-12-15 13:49:30 -080050
shenhanf6617ae2013-03-01 17:17:01 +000051# Get version spec file, either from "paladin" or "buildspec" directory.
52def GetVersionSpecFile(version, versions_git):
53 temp = tempfile.mkdtemp()
Luis Lozanof2a3ef42015-12-15 13:49:30 -080054 commands = ['cd {0}'.format(temp), \
55 'git clone {0} versions'.format(versions_git)]
shenhanf6617ae2013-03-01 17:17:01 +000056 cmd_executer = command_executer.GetCommandExecuter()
57 ret = cmd_executer.RunCommands(commands)
58 err_msg = None
59 if ret:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080060 err_msg = 'Failed to checkout versions_git - {0}'.format(versions_git)
shenhanf6617ae2013-03-01 17:17:01 +000061 ret = None
62 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080063 v, m = version.split('.', 1)
64 paladin_spec = 'paladin/buildspecs/{0}/{1}.xml'.format(v, m)
65 generic_spec = 'buildspecs/{0}/{1}.xml'.format(v, m)
66 paladin_path = '{0}/versions/{1}'.format(temp, paladin_spec)
67 generic_path = '{0}/versions/{1}'.format(temp, generic_spec)
shenhanf6617ae2013-03-01 17:17:01 +000068 if os.path.exists(paladin_path):
69 ret = paladin_spec
70 elif os.path.exists(generic_path):
71 ret = generic_spec
72 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080073 err_msg = 'No spec found for version {0}'.format(version)
shenhanf6617ae2013-03-01 17:17:01 +000074 ret = None
75 # Fall through to clean up.
76
Luis Lozanof2a3ef42015-12-15 13:49:30 -080077 commands = ['rm -rf {0}'.format(temp)]
shenhanf6617ae2013-03-01 17:17:01 +000078 cmd_executer.RunCommands(commands)
79 if err_msg:
80 logger.GetLogger().LogFatal(err_msg)
81 return ret
yunlian3802fbf2013-02-19 19:58:44 +000082
Luis Lozanof2a3ef42015-12-15 13:49:30 -080083
llozano9efafde2013-02-23 01:37:04 +000084def TimeToCommonVersion(timestamp):
85 """Convert timestamp to common image version."""
86 tdt = datetime.fromtimestamp(float(timestamp))
Luis Lozanof2a3ef42015-12-15 13:49:30 -080087 with open(COMMON_VERSIONS, 'r') as f:
llozano9efafde2013-02-23 01:37:04 +000088 common_list = pickle.load(f)
89 for sv in common_list:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080090 sdt = datetime.strptime(sv['date'], '%Y-%m-%d %H:%M:%S.%f')
llozano9efafde2013-02-23 01:37:04 +000091 if tdt >= sdt:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080092 return '%s.%s' % (sv['chrome_major_version'], sv['chromeos_version'])
llozano9efafde2013-02-23 01:37:04 +000093 # should never reach here
Luis Lozanof2a3ef42015-12-15 13:49:30 -080094 logger.GetLogger().LogFatal('No common version for timestamp')
llozano9efafde2013-02-23 01:37:04 +000095 return None
96
97
asharif0d3535a2013-02-15 04:50:33 +000098def Main(argv):
bjanakiraman7f4a4852013-02-15 04:35:28 +000099 """Checkout the ChromeOS source."""
100 parser = optparse.OptionParser()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800101 parser.add_option('--dir',
102 dest='directory',
103 help='Target directory for ChromeOS installation.')
104 parser.add_option('--version',
105 dest='version',
106 default='latest_lkgm',
llozano9efafde2013-02-23 01:37:04 +0000107 help="""ChromeOS version. Can be:
108(1) A release version in the format: 'X.X.X.X'
109(2) 'top' for top of trunk
110(3) 'latest_lkgm' for the latest lkgm version
111(4) 'lkgm' for the lkgm release before timestamp
112(5) 'latest_common' for the latest team common stable version
113(6) 'common' for the team common stable version before timestamp
114Default is 'latest_lkgm'.""")
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800115 parser.add_option('--timestamp',
116 dest='timestamp',
117 default=None,
yunlian3802fbf2013-02-19 19:58:44 +0000118 help="""Timestamps in epoch format. It will check out the
llozano9efafde2013-02-23 01:37:04 +0000119latest LKGM or the latest COMMON version of ChromeOS before the timestamp.
120Use in combination with --version=latest or --version=common. Use
121'date -d <date string> +%s' to find epoch time""")
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800122 parser.add_option('--minilayout',
123 dest='minilayout',
124 default=False,
125 action='store_true',
llozano9efafde2013-02-23 01:37:04 +0000126 help="""Whether to checkout the minilayout
raymes01959ae2013-02-15 04:50:07 +0000127(smaller checkout).'""")
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800128 parser.add_option('--jobs',
129 '-j',
130 dest='jobs',
131 help='Number of repo sync threads to use.')
132 parser.add_option('--public',
133 '-p',
134 dest='public',
135 default=False,
136 action='store_true',
137 help='Use the public checkout instead of the private one.')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000138
asharif0d3535a2013-02-15 04:50:33 +0000139 options = parser.parse_args(argv)[0]
bjanakiraman7f4a4852013-02-15 04:35:28 +0000140
asharifbf6899d2013-02-15 21:42:35 +0000141 if not options.version:
142 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800143 logger.GetLogger().LogFatal('No version specified.')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000144 else:
145 version = options.version.strip()
146
yunlian3802fbf2013-02-19 19:58:44 +0000147 if not options.timestamp:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800148 timestamp = ''
yunlian3802fbf2013-02-19 19:58:44 +0000149 else:
150 timestamp = options.timestamp.strip()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800151 if version not in ('lkgm', 'common'):
llozano9efafde2013-02-23 01:37:04 +0000152 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800153 logger.GetLogger().LogFatal('timestamp option only applies for '
llozano9efafde2013-02-23 01:37:04 +0000154 "versions \"lkgm\" or \"common\"")
yunlian3802fbf2013-02-19 19:58:44 +0000155
asharifbf6899d2013-02-15 21:42:35 +0000156 if not options.directory:
157 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800158 logger.GetLogger().LogFatal('No directory specified.')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000159
160 directory = options.directory.strip()
161
asharifbf6899d2013-02-15 21:42:35 +0000162 if options.public:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800163 manifest_repo = 'https://chromium.googlesource.com/chromiumos/manifest.git'
164 versions_repo = ('https://chromium.googlesource.com/'
165 'chromiumos/manifest-versions.git')
asharifbf6899d2013-02-15 21:42:35 +0000166 else:
167 manifest_repo = (
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800168 'https://chrome-internal.googlesource.com/chromeos/manifest-internal.git'
169 )
asharifbf6899d2013-02-15 21:42:35 +0000170 versions_repo = (
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800171 'https://chrome-internal.googlesource.com/chromeos/manifest-versions.git'
172 )
asharifbf6899d2013-02-15 21:42:35 +0000173
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800174 if version == 'top':
175 init = 'repo init -u %s' % manifest_repo
176 elif version == 'latest_lkgm':
Luis Lozano8cf53082013-08-01 12:35:11 -0700177 manifests = manifest_versions.ManifestVersions()
178 version = manifests.TimeToVersion(time.mktime(time.gmtime()))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800179 version, manifest = version.split('.', 1)
180 logger.GetLogger().LogOutput('found version %s.%s for latest LKGM' %
181 (version, manifest))
182 init = ('repo init -u %s -m paladin/buildspecs/%s/%s.xml' %
183 (versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700184 del manifests
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800185 elif version == 'lkgm':
llozano9efafde2013-02-23 01:37:04 +0000186 if not timestamp:
187 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800188 logger.GetLogger().LogFatal('No timestamp specified for version=lkgm')
Luis Lozano8cf53082013-08-01 12:35:11 -0700189 manifests = manifest_versions.ManifestVersions()
190 version = manifests.TimeToVersion(timestamp)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800191 version, manifest = version.split('.', 1)
192 logger.GetLogger().LogOutput('found version %s.%s for LKGM at timestamp %s'
llozano9efafde2013-02-23 01:37:04 +0000193 % (version, manifest, timestamp))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800194 init = ('repo init -u %s -m paladin/buildspecs/%s/%s.xml' %
195 (versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700196 del manifests
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800197 elif version == 'latest_common':
llozano9efafde2013-02-23 01:37:04 +0000198 version = TimeToCommonVersion(time.mktime(time.gmtime()))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800199 version, manifest = version.split('.', 1)
200 logger.GetLogger().LogOutput('found version %s.%s for latest Common image' %
llozano9efafde2013-02-23 01:37:04 +0000201 (version, manifest))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800202 init = ('repo init -u %s -m buildspecs/%s/%s.xml' % (versions_repo, version,
203 manifest))
204 elif version == 'common':
llozano9efafde2013-02-23 01:37:04 +0000205 if not timestamp:
206 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800207 logger.GetLogger().LogFatal('No timestamp specified for version=lkgm')
llozano9efafde2013-02-23 01:37:04 +0000208 version = TimeToCommonVersion(timestamp)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800209 version, manifest = version.split('.', 1)
210 logger.GetLogger().LogOutput('found version %s.%s for latest common image '
211 'at timestamp %s' % (version, manifest,
212 timestamp))
213 init = ('repo init -u %s -m buildspecs/%s/%s.xml' % (versions_repo, version,
214 manifest))
raymes69c8d722013-02-15 17:55:36 +0000215 else:
llozano9efafde2013-02-23 01:37:04 +0000216 # user specified a specific version number
shenhanf6617ae2013-03-01 17:17:01 +0000217 version_spec_file = GetVersionSpecFile(version, versions_repo)
218 if not version_spec_file:
219 return 1
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800220 init = 'repo init -u %s -m %s' % (versions_repo, version_spec_file)
llozano9efafde2013-02-23 01:37:04 +0000221
yunlian3802fbf2013-02-19 19:58:44 +0000222 if options.minilayout:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800223 init += ' -g minilayout'
yunlian3802fbf2013-02-19 19:58:44 +0000224
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800225 init += ' --repo-url=https://chromium.googlesource.com/external/repo.git'
bjanakiraman7f4a4852013-02-15 04:35:28 +0000226
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700227 # crosbug#31837 - "Sources need to be world-readable to properly
228 # function inside the chroot"
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800229 sync = 'umask 022 && repo sync'
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700230 if options.jobs:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800231 sync += ' -j %s' % options.jobs
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700232
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800233 commands = ['mkdir -p %s' % directory, 'cd %s' % directory, init, sync]
asharifbf6899d2013-02-15 21:42:35 +0000234 cmd_executer = command_executer.GetCommandExecuter()
235 ret = cmd_executer.RunCommands(commands)
236 if ret:
237 return ret
bjanakiraman7f4a4852013-02-15 04:35:28 +0000238
asharifbf6899d2013-02-15 21:42:35 +0000239 return cmd_executer.RunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800240 'git ls-remote '
241 'https://chrome-internal.googlesource.com/chrome/src-internal.git '
242 '> /dev/null')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000243
244
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800245if __name__ == '__main__':
asharif2198c512013-02-15 09:21:35 +0000246 retval = Main(sys.argv)
247 sys.exit(retval)