blob: 8a66c800810dfc1805c61792f2f0865af95436e0 [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
7"""Script to checkout the ChromeOS source.
8
9This script sets up the ChromeOS source in the given directory, matching a
10particular release of ChromeOS.
11"""
12
13__author__ = "raymes@google.com (Raymes Khoury)"
14
llozano9efafde2013-02-23 01:37:04 +000015from datetime import datetime
asharifca35b772013-02-15 04:56:41 +000016import getpass
Luis Lozano8cf53082013-08-01 12:35:11 -070017
bjanakiraman7f4a4852013-02-15 04:35:28 +000018import optparse
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
raymes01959ae2013-02-15 04:50:07 +000024from utils import command_executer
raymes69c8d722013-02-15 17:55:36 +000025from utils import logger
Luis Lozano8cf53082013-08-01 12:35:11 -070026from 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
44COMMON_VERSIONS = "/home/mobiletc-prebuild/common_images/common_list.txt"
45
bjanakiraman7f4a4852013-02-15 04:35:28 +000046def Usage(parser):
47 parser.print_help()
48 sys.exit(0)
49
shenhanf6617ae2013-03-01 17:17:01 +000050# Get version spec file, either from "paladin" or "buildspec" directory.
51def GetVersionSpecFile(version, versions_git):
52 temp = tempfile.mkdtemp()
53 commands = ["cd {0}".format(temp), \
54 "git clone {0} versions".format(versions_git)]
55 cmd_executer = command_executer.GetCommandExecuter()
56 ret = cmd_executer.RunCommands(commands)
57 err_msg = None
58 if ret:
59 err_msg = "Failed to checkout versions_git - {0}".format(versions_git)
60 ret = None
61 else:
62 v, m = version.split(".", 1)
63 paladin_spec = "paladin/buildspecs/{0}/{1}.xml".format(v, m)
64 generic_spec = "buildspecs/{0}/{1}.xml".format(v, m)
65 paladin_path = "{0}/versions/{1}".format(temp, paladin_spec)
66 generic_path = "{0}/versions/{1}".format(temp, generic_spec)
67 if os.path.exists(paladin_path):
68 ret = paladin_spec
69 elif os.path.exists(generic_path):
70 ret = generic_spec
71 else:
72 err_msg = "No spec found for version {0}".format(version)
73 ret = None
74 # Fall through to clean up.
75
76 commands = ["rm -rf {0}".format(temp)]
77 cmd_executer.RunCommands(commands)
78 if err_msg:
79 logger.GetLogger().LogFatal(err_msg)
80 return ret
yunlian3802fbf2013-02-19 19:58:44 +000081
llozano9efafde2013-02-23 01:37:04 +000082def TimeToCommonVersion(timestamp):
83 """Convert timestamp to common image version."""
84 tdt = datetime.fromtimestamp(float(timestamp))
85 with open(COMMON_VERSIONS, "r") as f:
86 common_list = pickle.load(f)
87 for sv in common_list:
88 sdt = datetime.strptime(sv["date"], "%Y-%m-%d %H:%M:%S.%f")
89 if tdt >= sdt:
90 return "%s.%s" % (sv["chrome_major_version"], sv["chromeos_version"])
91 # should never reach here
92 logger.GetLogger().LogFatal("No common version for timestamp")
93 return None
94
95
asharif0d3535a2013-02-15 04:50:33 +000096def Main(argv):
bjanakiraman7f4a4852013-02-15 04:35:28 +000097 """Checkout the ChromeOS source."""
98 parser = optparse.OptionParser()
99 parser.add_option("--dir", dest="directory",
100 help="Target directory for ChromeOS installation.")
llozano75d42eb2013-02-27 00:30:33 +0000101 parser.add_option("--version", dest="version", default="latest_lkgm",
llozano9efafde2013-02-23 01:37:04 +0000102 help="""ChromeOS version. Can be:
103(1) A release version in the format: 'X.X.X.X'
104(2) 'top' for top of trunk
105(3) 'latest_lkgm' for the latest lkgm version
106(4) 'lkgm' for the lkgm release before timestamp
107(5) 'latest_common' for the latest team common stable version
108(6) 'common' for the team common stable version before timestamp
109Default is 'latest_lkgm'.""")
yunlian3802fbf2013-02-19 19:58:44 +0000110 parser.add_option("--timestamp", dest="timestamp", default=None,
111 help="""Timestamps in epoch format. It will check out the
llozano9efafde2013-02-23 01:37:04 +0000112latest LKGM or the latest COMMON version of ChromeOS before the timestamp.
113Use in combination with --version=latest or --version=common. Use
114'date -d <date string> +%s' to find epoch time""")
raymes01959ae2013-02-15 04:50:07 +0000115 parser.add_option("--minilayout", dest="minilayout", default=False,
asharifdff61342013-02-15 04:50:46 +0000116 action="store_true",
llozano9efafde2013-02-23 01:37:04 +0000117 help="""Whether to checkout the minilayout
raymes01959ae2013-02-15 04:50:07 +0000118(smaller checkout).'""")
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700119 parser.add_option("--jobs", "-j", dest="jobs",
raymes69c8d722013-02-15 17:55:36 +0000120 help="Number of repo sync threads to use.")
asharifbf6899d2013-02-15 21:42:35 +0000121 parser.add_option("--public", "-p", dest="public", default=False,
122 action="store_true",
123 help="Use the public checkout instead of the private one.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000124
asharif0d3535a2013-02-15 04:50:33 +0000125 options = parser.parse_args(argv)[0]
bjanakiraman7f4a4852013-02-15 04:35:28 +0000126
asharifbf6899d2013-02-15 21:42:35 +0000127 if not options.version:
128 parser.print_help()
129 logger.GetLogger().LogFatal("No version specified.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000130 else:
131 version = options.version.strip()
132
yunlian3802fbf2013-02-19 19:58:44 +0000133 if not options.timestamp:
134 timestamp = ""
135 else:
136 timestamp = options.timestamp.strip()
llozano9efafde2013-02-23 01:37:04 +0000137 if version not in ("lkgm", "common"):
138 parser.print_help()
139 logger.GetLogger().LogFatal("timestamp option only applies for "
140 "versions \"lkgm\" or \"common\"")
yunlian3802fbf2013-02-19 19:58:44 +0000141
asharifbf6899d2013-02-15 21:42:35 +0000142 if not options.directory:
143 parser.print_help()
144 logger.GetLogger().LogFatal("No directory specified.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000145
146 directory = options.directory.strip()
147
asharifbf6899d2013-02-15 21:42:35 +0000148 if options.public:
Luis Lozano6aae4c92013-09-10 00:00:27 -0700149 manifest_repo = "https://chromium.googlesource.com/chromiumos/manifest.git"
150 versions_repo = ("https://chromium.googlesource.com/"
Luis Lozano6aebeb12013-09-03 01:55:02 -0700151 "chromiumos/manifest-versions.git")
asharifbf6899d2013-02-15 21:42:35 +0000152 else:
153 manifest_repo = (
Luis Lozano6aae4c92013-09-10 00:00:27 -0700154 "https://chrome-internal.googlesource.com/chromeos/manifest-internal.git")
asharifbf6899d2013-02-15 21:42:35 +0000155 versions_repo = (
Luis Lozano6aae4c92013-09-10 00:00:27 -0700156 "https://chrome-internal.googlesource.com/chromeos/manifest-versions.git")
asharifbf6899d2013-02-15 21:42:35 +0000157
yunlian3802fbf2013-02-19 19:58:44 +0000158 if version == "top":
asharifbf6899d2013-02-15 21:42:35 +0000159 init = "repo init -u %s" % manifest_repo
llozano9efafde2013-02-23 01:37:04 +0000160 elif version == "latest_lkgm":
Luis Lozano8cf53082013-08-01 12:35:11 -0700161 manifests = manifest_versions.ManifestVersions()
162 version = manifests.TimeToVersion(time.mktime(time.gmtime()))
llozano9efafde2013-02-23 01:37:04 +0000163 version, manifest = version.split(".", 1)
164 logger.GetLogger().LogOutput("found version %s.%s for latest LKGM" % (
165 version, manifest))
166 init = ("repo init -u %s -m paladin/buildspecs/%s/%s.xml" % (
167 versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700168 del manifests
llozano9efafde2013-02-23 01:37:04 +0000169 elif version == "lkgm":
170 if not timestamp:
171 parser.print_help()
172 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm")
Luis Lozano8cf53082013-08-01 12:35:11 -0700173 manifests = manifest_versions.ManifestVersions()
174 version = manifests.TimeToVersion(timestamp)
llozano9efafde2013-02-23 01:37:04 +0000175 version, manifest = version.split(".", 1)
176 logger.GetLogger().LogOutput("found version %s.%s for LKGM at timestamp %s"
177 % (version, manifest, timestamp))
178 init = ("repo init -u %s -m paladin/buildspecs/%s/%s.xml" % (
179 versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700180 del manifests
llozano9efafde2013-02-23 01:37:04 +0000181 elif version == "latest_common":
182 version = TimeToCommonVersion(time.mktime(time.gmtime()))
183 version, manifest = version.split(".", 1)
184 logger.GetLogger().LogOutput("found version %s.%s for latest Common image" %
185 (version, manifest))
186 init = ("repo init -u %s -m buildspecs/%s/%s.xml" % (
187 versions_repo, version, manifest))
188 elif version == "common":
189 if not timestamp:
190 parser.print_help()
191 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm")
192 version = TimeToCommonVersion(timestamp)
193 version, manifest = version.split(".", 1)
194 logger.GetLogger().LogOutput("found version %s.%s for latest common image "
195 "at timestamp %s" % (
196 version, manifest, timestamp))
197 init = ("repo init -u %s -m buildspecs/%s/%s.xml" % (
198 versions_repo, version, manifest))
raymes69c8d722013-02-15 17:55:36 +0000199 else:
llozano9efafde2013-02-23 01:37:04 +0000200 # user specified a specific version number
shenhanf6617ae2013-03-01 17:17:01 +0000201 version_spec_file = GetVersionSpecFile(version, versions_repo)
202 if not version_spec_file:
203 return 1
204 init = "repo init -u %s -m %s" % (versions_repo, version_spec_file)
llozano9efafde2013-02-23 01:37:04 +0000205
yunlian3802fbf2013-02-19 19:58:44 +0000206 if options.minilayout:
yunlian992a4902013-02-19 20:19:25 +0000207 init += " -g minilayout"
yunlian3802fbf2013-02-19 19:58:44 +0000208
Luis Lozano6aae4c92013-09-10 00:00:27 -0700209 init += " --repo-url=https://chromium.googlesource.com/external/repo.git"
bjanakiraman7f4a4852013-02-15 04:35:28 +0000210
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700211 # crosbug#31837 - "Sources need to be world-readable to properly
212 # function inside the chroot"
213 sync = "umask 022 && repo sync"
214 if options.jobs:
215 sync += " -j %s" % options.jobs
216
asharifbf6899d2013-02-15 21:42:35 +0000217 commands = ["mkdir -p %s" % directory,
218 "cd %s" % directory,
219 init,
Rahul Chaudhryc1635a82014-10-31 14:59:39 -0700220 sync]
asharifbf6899d2013-02-15 21:42:35 +0000221 cmd_executer = command_executer.GetCommandExecuter()
222 ret = cmd_executer.RunCommands(commands)
223 if ret:
224 return ret
bjanakiraman7f4a4852013-02-15 04:35:28 +0000225
asharifbf6899d2013-02-15 21:42:35 +0000226 return cmd_executer.RunCommand(
Rahul Chaudhrycec0bd82014-10-22 18:23:54 -0700227 "git ls-remote "
228 "https://chrome-internal.googlesource.com/chrome/src-internal.git "
229 "> /dev/null")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000230
231
232if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000233 retval = Main(sys.argv)
234 sys.exit(retval)