blob: b6f9f4df4f7d26770b5b6e152a89a703e6e511aa [file] [log] [blame]
Caroline Tice88272d42016-01-13 09:48:29 -08001#!/usr/bin/python2
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
Caroline Tice88272d42016-01-13 09:48:29 -080012from __future__ import print_function
13
Luis Lozanof2a3ef42015-12-15 13:49:30 -080014__author__ = 'raymes@google.com (Raymes Khoury)'
bjanakiraman7f4a4852013-02-15 04:35:28 +000015
llozano9efafde2013-02-23 01:37:04 +000016from datetime import datetime
Luis Lozano8cf53082013-08-01 12:35:11 -070017
Caroline Tice88272d42016-01-13 09:48:29 -080018import argparse
yunlian3802fbf2013-02-19 19:58:44 +000019import os
llozano9efafde2013-02-23 01:37:04 +000020import pickle
bjanakiraman7f4a4852013-02-15 04:35:28 +000021import sys
yunlian3802fbf2013-02-19 19:58:44 +000022import tempfile
23import time
Caroline Tice88272d42016-01-13 09:48:29 -080024from cros_utils import command_executer
25from cros_utils import logger
26from cros_utils import manifest_versions
bjanakiraman7f4a4852013-02-15 04:35:28 +000027
raymesbfb57992013-02-15 04:35:45 +000028GCLIENT_FILE = """solutions = [
29 { "name" : "CHROME_DEPS",
30 "url" :
31 "svn://svn.chromium.org/chrome-internal/trunk/tools/buildspec/releases/%s",
32 "custom_deps" : {
33 "src/third_party/WebKit/LayoutTests": None,
34 "src-pdf": None,
35 "src/pdf": None,
36 },
37 "safesync_url": "",
38 },
39]
40"""
41
llozano9efafde2013-02-23 01:37:04 +000042# List of stable versions used for common team image
43# Sheriff must update this list when a new common version becomes available
Luis Lozanof2a3ef42015-12-15 13:49:30 -080044COMMON_VERSIONS = '/home/mobiletc-prebuild/common_images/common_list.txt'
45
llozano9efafde2013-02-23 01:37:04 +000046
bjanakiraman7f4a4852013-02-15 04:35:28 +000047def Usage(parser):
48 parser.print_help()
49 sys.exit(0)
50
Luis Lozanof2a3ef42015-12-15 13:49:30 -080051
shenhanf6617ae2013-03-01 17:17:01 +000052# Get version spec file, either from "paladin" or "buildspec" directory.
53def GetVersionSpecFile(version, versions_git):
54 temp = tempfile.mkdtemp()
Luis Lozanof2a3ef42015-12-15 13:49:30 -080055 commands = ['cd {0}'.format(temp), \
56 'git clone {0} versions'.format(versions_git)]
shenhanf6617ae2013-03-01 17:17:01 +000057 cmd_executer = command_executer.GetCommandExecuter()
58 ret = cmd_executer.RunCommands(commands)
59 err_msg = None
60 if ret:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080061 err_msg = 'Failed to checkout versions_git - {0}'.format(versions_git)
shenhanf6617ae2013-03-01 17:17:01 +000062 ret = None
63 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080064 v, m = version.split('.', 1)
65 paladin_spec = 'paladin/buildspecs/{0}/{1}.xml'.format(v, m)
66 generic_spec = 'buildspecs/{0}/{1}.xml'.format(v, m)
67 paladin_path = '{0}/versions/{1}'.format(temp, paladin_spec)
68 generic_path = '{0}/versions/{1}'.format(temp, generic_spec)
shenhanf6617ae2013-03-01 17:17:01 +000069 if os.path.exists(paladin_path):
70 ret = paladin_spec
71 elif os.path.exists(generic_path):
72 ret = generic_spec
73 else:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080074 err_msg = 'No spec found for version {0}'.format(version)
shenhanf6617ae2013-03-01 17:17:01 +000075 ret = None
76 # Fall through to clean up.
77
Luis Lozanof2a3ef42015-12-15 13:49:30 -080078 commands = ['rm -rf {0}'.format(temp)]
shenhanf6617ae2013-03-01 17:17:01 +000079 cmd_executer.RunCommands(commands)
80 if err_msg:
81 logger.GetLogger().LogFatal(err_msg)
82 return ret
yunlian3802fbf2013-02-19 19:58:44 +000083
Luis Lozanof2a3ef42015-12-15 13:49:30 -080084
llozano9efafde2013-02-23 01:37:04 +000085def TimeToCommonVersion(timestamp):
86 """Convert timestamp to common image version."""
87 tdt = datetime.fromtimestamp(float(timestamp))
Luis Lozanof2a3ef42015-12-15 13:49:30 -080088 with open(COMMON_VERSIONS, 'r') as f:
llozano9efafde2013-02-23 01:37:04 +000089 common_list = pickle.load(f)
90 for sv in common_list:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080091 sdt = datetime.strptime(sv['date'], '%Y-%m-%d %H:%M:%S.%f')
llozano9efafde2013-02-23 01:37:04 +000092 if tdt >= sdt:
Luis Lozanof2a3ef42015-12-15 13:49:30 -080093 return '%s.%s' % (sv['chrome_major_version'], sv['chromeos_version'])
llozano9efafde2013-02-23 01:37:04 +000094 # should never reach here
Luis Lozanof2a3ef42015-12-15 13:49:30 -080095 logger.GetLogger().LogFatal('No common version for timestamp')
llozano9efafde2013-02-23 01:37:04 +000096 return None
97
98
asharif0d3535a2013-02-15 04:50:33 +000099def Main(argv):
bjanakiraman7f4a4852013-02-15 04:35:28 +0000100 """Checkout the ChromeOS source."""
Caroline Tice88272d42016-01-13 09:48:29 -0800101 parser = argparse.ArgumentParser()
102 parser.add_argument('--dir',
103 dest='directory',
104 help='Target directory for ChromeOS installation.')
105 parser.add_argument('--version',
106 dest='version',
107 default='latest_lkgm',
108 help="""ChromeOS version. Can be:
llozano9efafde2013-02-23 01:37:04 +0000109(1) A release version in the format: 'X.X.X.X'
110(2) 'top' for top of trunk
111(3) 'latest_lkgm' for the latest lkgm version
112(4) 'lkgm' for the lkgm release before timestamp
113(5) 'latest_common' for the latest team common stable version
114(6) 'common' for the team common stable version before timestamp
115Default is 'latest_lkgm'.""")
Caroline Tice88272d42016-01-13 09:48:29 -0800116 parser.add_argument('--timestamp',
117 dest='timestamp',
118 default=None,
119 help='Timestamps in epoch format. It will check out the'
120 'latest LKGM or the latest COMMON version of ChromeOS'
121 ' before the timestamp. Use in combination with'
122 ' --version=latest or --version=common. Use '
123 '"date -d <date string> +%s" to find epoch time')
124 parser.add_argument('--minilayout',
125 dest='minilayout',
126 default=False,
127 action='store_true',
128 help='Whether to checkout the minilayout (smaller '
129 'checkout).')
130 parser.add_argument('--jobs',
131 '-j',
132 dest='jobs',
133 help='Number of repo sync threads to use.')
134 parser.add_argument('--public',
135 '-p',
136 dest='public',
137 default=False,
138 action='store_true',
139 help='Use the public checkout instead of the private '
140 'one.')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000141
Caroline Tice88272d42016-01-13 09:48:29 -0800142 options = parser.parse_args(argv)
bjanakiraman7f4a4852013-02-15 04:35:28 +0000143
asharifbf6899d2013-02-15 21:42:35 +0000144 if not options.version:
145 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800146 logger.GetLogger().LogFatal('No version specified.')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000147 else:
148 version = options.version.strip()
149
yunlian3802fbf2013-02-19 19:58:44 +0000150 if not options.timestamp:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800151 timestamp = ''
yunlian3802fbf2013-02-19 19:58:44 +0000152 else:
153 timestamp = options.timestamp.strip()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800154 if version not in ('lkgm', 'common'):
llozano9efafde2013-02-23 01:37:04 +0000155 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800156 logger.GetLogger().LogFatal('timestamp option only applies for '
llozano9efafde2013-02-23 01:37:04 +0000157 "versions \"lkgm\" or \"common\"")
yunlian3802fbf2013-02-19 19:58:44 +0000158
asharifbf6899d2013-02-15 21:42:35 +0000159 if not options.directory:
160 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800161 logger.GetLogger().LogFatal('No directory specified.')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000162
163 directory = options.directory.strip()
164
asharifbf6899d2013-02-15 21:42:35 +0000165 if options.public:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800166 manifest_repo = 'https://chromium.googlesource.com/chromiumos/manifest.git'
167 versions_repo = ('https://chromium.googlesource.com/'
168 'chromiumos/manifest-versions.git')
asharifbf6899d2013-02-15 21:42:35 +0000169 else:
170 manifest_repo = (
Caroline Tice88272d42016-01-13 09:48:29 -0800171 'https://chrome-internal.googlesource.com/chromeos/'
172 'manifest-internal.git'
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800173 )
asharifbf6899d2013-02-15 21:42:35 +0000174 versions_repo = (
Caroline Tice88272d42016-01-13 09:48:29 -0800175 'https://chrome-internal.googlesource.com/chromeos/'
176 'manifest-versions.git'
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800177 )
asharifbf6899d2013-02-15 21:42:35 +0000178
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800179 if version == 'top':
180 init = 'repo init -u %s' % manifest_repo
181 elif version == 'latest_lkgm':
Luis Lozano8cf53082013-08-01 12:35:11 -0700182 manifests = manifest_versions.ManifestVersions()
183 version = manifests.TimeToVersion(time.mktime(time.gmtime()))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800184 version, manifest = version.split('.', 1)
185 logger.GetLogger().LogOutput('found version %s.%s for latest LKGM' %
186 (version, manifest))
187 init = ('repo init -u %s -m paladin/buildspecs/%s/%s.xml' %
188 (versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700189 del manifests
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800190 elif version == 'lkgm':
llozano9efafde2013-02-23 01:37:04 +0000191 if not timestamp:
192 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800193 logger.GetLogger().LogFatal('No timestamp specified for version=lkgm')
Luis Lozano8cf53082013-08-01 12:35:11 -0700194 manifests = manifest_versions.ManifestVersions()
195 version = manifests.TimeToVersion(timestamp)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800196 version, manifest = version.split('.', 1)
197 logger.GetLogger().LogOutput('found version %s.%s for LKGM at timestamp %s'
llozano9efafde2013-02-23 01:37:04 +0000198 % (version, manifest, timestamp))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800199 init = ('repo init -u %s -m paladin/buildspecs/%s/%s.xml' %
200 (versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700201 del manifests
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800202 elif version == 'latest_common':
llozano9efafde2013-02-23 01:37:04 +0000203 version = TimeToCommonVersion(time.mktime(time.gmtime()))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800204 version, manifest = version.split('.', 1)
205 logger.GetLogger().LogOutput('found version %s.%s for latest Common image' %
llozano9efafde2013-02-23 01:37:04 +0000206 (version, manifest))
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800207 init = ('repo init -u %s -m buildspecs/%s/%s.xml' % (versions_repo, version,
208 manifest))
209 elif version == 'common':
llozano9efafde2013-02-23 01:37:04 +0000210 if not timestamp:
211 parser.print_help()
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800212 logger.GetLogger().LogFatal('No timestamp specified for version=lkgm')
llozano9efafde2013-02-23 01:37:04 +0000213 version = TimeToCommonVersion(timestamp)
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800214 version, manifest = version.split('.', 1)
215 logger.GetLogger().LogOutput('found version %s.%s for latest common image '
216 'at timestamp %s' % (version, manifest,
217 timestamp))
218 init = ('repo init -u %s -m buildspecs/%s/%s.xml' % (versions_repo, version,
219 manifest))
raymes69c8d722013-02-15 17:55:36 +0000220 else:
llozano9efafde2013-02-23 01:37:04 +0000221 # user specified a specific version number
shenhanf6617ae2013-03-01 17:17:01 +0000222 version_spec_file = GetVersionSpecFile(version, versions_repo)
223 if not version_spec_file:
224 return 1
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800225 init = 'repo init -u %s -m %s' % (versions_repo, version_spec_file)
llozano9efafde2013-02-23 01:37:04 +0000226
yunlian3802fbf2013-02-19 19:58:44 +0000227 if options.minilayout:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800228 init += ' -g minilayout'
yunlian3802fbf2013-02-19 19:58:44 +0000229
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800230 init += ' --repo-url=https://chromium.googlesource.com/external/repo.git'
bjanakiraman7f4a4852013-02-15 04:35:28 +0000231
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700232 # crosbug#31837 - "Sources need to be world-readable to properly
233 # function inside the chroot"
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800234 sync = 'umask 022 && repo sync'
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700235 if options.jobs:
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800236 sync += ' -j %s' % options.jobs
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700237
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800238 commands = ['mkdir -p %s' % directory, 'cd %s' % directory, init, sync]
asharifbf6899d2013-02-15 21:42:35 +0000239 cmd_executer = command_executer.GetCommandExecuter()
240 ret = cmd_executer.RunCommands(commands)
241 if ret:
242 return ret
bjanakiraman7f4a4852013-02-15 04:35:28 +0000243
asharifbf6899d2013-02-15 21:42:35 +0000244 return cmd_executer.RunCommand(
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800245 'git ls-remote '
246 'https://chrome-internal.googlesource.com/chrome/src-internal.git '
247 '> /dev/null')
bjanakiraman7f4a4852013-02-15 04:35:28 +0000248
249
Luis Lozanof2a3ef42015-12-15 13:49:30 -0800250if __name__ == '__main__':
Caroline Tice88272d42016-01-13 09:48:29 -0800251 retval = Main(sys.argv[1:])
asharif2198c512013-02-15 09:21:35 +0000252 sys.exit(retval)