blob: 7d3c22da78b94e2291ff972d6e1c0b8214a59896 [file] [log] [blame]
shenhanb7ff88b2013-02-19 20:42:48 +00001#!/usr/bin/python
bjanakiraman7f4a4852013-02-15 04:35:28 +00002#
3# Copyright 2010 Google Inc. All Rights Reserved.
4
5"""Script to checkout the ChromeOS source.
6
7This script sets up the ChromeOS source in the given directory, matching a
8particular release of ChromeOS.
9"""
10
11__author__ = "raymes@google.com (Raymes Khoury)"
12
llozano9efafde2013-02-23 01:37:04 +000013from datetime import datetime
asharifca35b772013-02-15 04:56:41 +000014import getpass
bjanakiraman7f4a4852013-02-15 04:35:28 +000015import optparse
yunlian3802fbf2013-02-19 19:58:44 +000016import os
llozano9efafde2013-02-23 01:37:04 +000017import pickle
bjanakiraman7f4a4852013-02-15 04:35:28 +000018import sys
yunlian3802fbf2013-02-19 19:58:44 +000019import tempfile
20import time
raymes01959ae2013-02-15 04:50:07 +000021from utils import command_executer
raymes69c8d722013-02-15 17:55:36 +000022from utils import logger
bjanakiraman7f4a4852013-02-15 04:35:28 +000023
raymesbfb57992013-02-15 04:35:45 +000024GCLIENT_FILE = """solutions = [
25 { "name" : "CHROME_DEPS",
26 "url" :
27 "svn://svn.chromium.org/chrome-internal/trunk/tools/buildspec/releases/%s",
28 "custom_deps" : {
29 "src/third_party/WebKit/LayoutTests": None,
30 "src-pdf": None,
31 "src/pdf": None,
32 },
33 "safesync_url": "",
34 },
35]
36"""
37
llozano9efafde2013-02-23 01:37:04 +000038# List of stable versions used for common team image
39# Sheriff must update this list when a new common version becomes available
40COMMON_VERSIONS = "/home/mobiletc-prebuild/common_images/common_list.txt"
41
bjanakiraman7f4a4852013-02-15 04:35:28 +000042def Usage(parser):
43 parser.print_help()
44 sys.exit(0)
45
46
yunlian3802fbf2013-02-19 19:58:44 +000047def TimeToVersion(my_time, versions_git):
48 """Convert timestamp to version number."""
49 cur_time = time.mktime(time.gmtime())
50 des_time = float(my_time)
51 if cur_time - des_time > 7000000:
52 logger.GetLogger().LogFatal("The time you specify is too early.")
53 temp = tempfile.mkdtemp()
54 commands = ["cd {0}".format(temp), "git clone {0}".format(versions_git),
55 "cd manifest-versions", "git checkout -f $(git rev-list" +
56 " --max-count=1 --before={0} origin/master)".format(my_time)]
57 cmd_executer = command_executer.GetCommandExecuter()
58 ret = cmd_executer.RunCommands(commands)
59 if ret:
shenhanf6617ae2013-03-01 17:17:01 +000060 logger.GetLogger().LogFatal("Failed to checkout manifest-versions.")
yunlian3802fbf2013-02-19 19:58:44 +000061 path = os.path.realpath("{0}/manifest-versions/LKGM/lkgm.xml".format(temp))
62 pp = path.split("/")
63 small = os.path.basename(path).split(".xml")[0]
64 version = pp[-2] + "." + small
65 commands = ["rm -rf {0}".format(temp)]
66 cmd_executer.RunCommands(commands)
67 return version
68
shenhanf6617ae2013-03-01 17:17:01 +000069# Get version spec file, either from "paladin" or "buildspec" directory.
70def GetVersionSpecFile(version, versions_git):
71 temp = tempfile.mkdtemp()
72 commands = ["cd {0}".format(temp), \
73 "git clone {0} versions".format(versions_git)]
74 cmd_executer = command_executer.GetCommandExecuter()
75 ret = cmd_executer.RunCommands(commands)
76 err_msg = None
77 if ret:
78 err_msg = "Failed to checkout versions_git - {0}".format(versions_git)
79 ret = None
80 else:
81 v, m = version.split(".", 1)
82 paladin_spec = "paladin/buildspecs/{0}/{1}.xml".format(v, m)
83 generic_spec = "buildspecs/{0}/{1}.xml".format(v, m)
84 paladin_path = "{0}/versions/{1}".format(temp, paladin_spec)
85 generic_path = "{0}/versions/{1}".format(temp, generic_spec)
86 if os.path.exists(paladin_path):
87 ret = paladin_spec
88 elif os.path.exists(generic_path):
89 ret = generic_spec
90 else:
91 err_msg = "No spec found for version {0}".format(version)
92 ret = None
93 # Fall through to clean up.
94
95 commands = ["rm -rf {0}".format(temp)]
96 cmd_executer.RunCommands(commands)
97 if err_msg:
98 logger.GetLogger().LogFatal(err_msg)
99 return ret
yunlian3802fbf2013-02-19 19:58:44 +0000100
llozano9efafde2013-02-23 01:37:04 +0000101def TimeToCommonVersion(timestamp):
102 """Convert timestamp to common image version."""
103 tdt = datetime.fromtimestamp(float(timestamp))
104 with open(COMMON_VERSIONS, "r") as f:
105 common_list = pickle.load(f)
106 for sv in common_list:
107 sdt = datetime.strptime(sv["date"], "%Y-%m-%d %H:%M:%S.%f")
108 if tdt >= sdt:
109 return "%s.%s" % (sv["chrome_major_version"], sv["chromeos_version"])
110 # should never reach here
111 logger.GetLogger().LogFatal("No common version for timestamp")
112 return None
113
114
asharif0d3535a2013-02-15 04:50:33 +0000115def Main(argv):
bjanakiraman7f4a4852013-02-15 04:35:28 +0000116 """Checkout the ChromeOS source."""
117 parser = optparse.OptionParser()
118 parser.add_option("--dir", dest="directory",
119 help="Target directory for ChromeOS installation.")
llozano75d42eb2013-02-27 00:30:33 +0000120 parser.add_option("--version", dest="version", default="latest_lkgm",
llozano9efafde2013-02-23 01:37:04 +0000121 help="""ChromeOS version. Can be:
122(1) A release version in the format: 'X.X.X.X'
123(2) 'top' for top of trunk
124(3) 'latest_lkgm' for the latest lkgm version
125(4) 'lkgm' for the lkgm release before timestamp
126(5) 'latest_common' for the latest team common stable version
127(6) 'common' for the team common stable version before timestamp
128Default is 'latest_lkgm'.""")
yunlian3802fbf2013-02-19 19:58:44 +0000129 parser.add_option("--timestamp", dest="timestamp", default=None,
130 help="""Timestamps in epoch format. It will check out the
llozano9efafde2013-02-23 01:37:04 +0000131latest LKGM or the latest COMMON version of ChromeOS before the timestamp.
132Use in combination with --version=latest or --version=common. Use
133'date -d <date string> +%s' to find epoch time""")
raymes01959ae2013-02-15 04:50:07 +0000134 parser.add_option("--minilayout", dest="minilayout", default=False,
asharifdff61342013-02-15 04:50:46 +0000135 action="store_true",
llozano9efafde2013-02-23 01:37:04 +0000136 help="""Whether to checkout the minilayout
raymes01959ae2013-02-15 04:50:07 +0000137(smaller checkout).'""")
raymes69c8d722013-02-15 17:55:36 +0000138 parser.add_option("--jobs", "-j", dest="jobs", default="1",
139 help="Number of repo sync threads to use.")
asharifbf6899d2013-02-15 21:42:35 +0000140 parser.add_option("--public", "-p", dest="public", default=False,
141 action="store_true",
142 help="Use the public checkout instead of the private one.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000143
asharif0d3535a2013-02-15 04:50:33 +0000144 options = parser.parse_args(argv)[0]
bjanakiraman7f4a4852013-02-15 04:35:28 +0000145
asharifbf6899d2013-02-15 21:42:35 +0000146 if not options.version:
147 parser.print_help()
148 logger.GetLogger().LogFatal("No version specified.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000149 else:
150 version = options.version.strip()
151
yunlian3802fbf2013-02-19 19:58:44 +0000152 if not options.timestamp:
153 timestamp = ""
154 else:
155 timestamp = options.timestamp.strip()
llozano9efafde2013-02-23 01:37:04 +0000156 if version not in ("lkgm", "common"):
157 parser.print_help()
158 logger.GetLogger().LogFatal("timestamp option only applies for "
159 "versions \"lkgm\" or \"common\"")
yunlian3802fbf2013-02-19 19:58:44 +0000160
asharifbf6899d2013-02-15 21:42:35 +0000161 if not options.directory:
162 parser.print_help()
163 logger.GetLogger().LogFatal("No directory specified.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000164
165 directory = options.directory.strip()
166
asharifbf6899d2013-02-15 21:42:35 +0000167 if options.public:
168 manifest_repo = "http://git.chromium.org/chromiumos/manifest.git"
169 versions_repo = "http://git.chromium.org/chromiumos/manifest-versions.git"
170 else:
171 manifest_repo = (
172 "ssh://gerrit-int.chromium.org:29419/chromeos/manifest-internal.git")
173 versions_repo = (
174 "ssh://gerrit-int.chromium.org:29419/chromeos/manifest-versions.git")
175
yunlian3802fbf2013-02-19 19:58:44 +0000176 if version == "top":
asharifbf6899d2013-02-15 21:42:35 +0000177 init = "repo init -u %s" % manifest_repo
llozano9efafde2013-02-23 01:37:04 +0000178 elif version == "latest_lkgm":
179 version = TimeToVersion(time.mktime(time.gmtime()), versions_repo)
180 version, manifest = version.split(".", 1)
181 logger.GetLogger().LogOutput("found version %s.%s for latest LKGM" % (
182 version, manifest))
183 init = ("repo init -u %s -m paladin/buildspecs/%s/%s.xml" % (
184 versions_repo, version, manifest))
185 elif version == "lkgm":
186 if not timestamp:
187 parser.print_help()
188 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm")
189 version = TimeToVersion(timestamp, versions_repo)
190 version, manifest = version.split(".", 1)
191 logger.GetLogger().LogOutput("found version %s.%s for LKGM at timestamp %s"
192 % (version, manifest, timestamp))
193 init = ("repo init -u %s -m paladin/buildspecs/%s/%s.xml" % (
194 versions_repo, version, manifest))
195 elif version == "latest_common":
196 version = TimeToCommonVersion(time.mktime(time.gmtime()))
197 version, manifest = version.split(".", 1)
198 logger.GetLogger().LogOutput("found version %s.%s for latest Common image" %
199 (version, manifest))
200 init = ("repo init -u %s -m buildspecs/%s/%s.xml" % (
201 versions_repo, version, manifest))
202 elif version == "common":
203 if not timestamp:
204 parser.print_help()
205 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm")
206 version = TimeToCommonVersion(timestamp)
207 version, manifest = version.split(".", 1)
208 logger.GetLogger().LogOutput("found version %s.%s for latest common image "
209 "at timestamp %s" % (
210 version, manifest, timestamp))
211 init = ("repo init -u %s -m buildspecs/%s/%s.xml" % (
212 versions_repo, version, manifest))
raymes69c8d722013-02-15 17:55:36 +0000213 else:
llozano9efafde2013-02-23 01:37:04 +0000214 # user specified a specific version number
shenhanf6617ae2013-03-01 17:17:01 +0000215 version_spec_file = GetVersionSpecFile(version, versions_repo)
216 if not version_spec_file:
217 return 1
218 init = "repo init -u %s -m %s" % (versions_repo, version_spec_file)
llozano9efafde2013-02-23 01:37:04 +0000219
yunlian3802fbf2013-02-19 19:58:44 +0000220 if options.minilayout:
yunlian992a4902013-02-19 20:19:25 +0000221 init += " -g minilayout"
yunlian3802fbf2013-02-19 19:58:44 +0000222
asharif731e2932013-02-15 21:20:10 +0000223 init += " --repo-url=http://git.chromium.org/external/repo.git"
bjanakiraman7f4a4852013-02-15 04:35:28 +0000224
asharifbf6899d2013-02-15 21:42:35 +0000225 commands = ["mkdir -p %s" % directory,
226 "cd %s" % directory,
227 init,
shenhanb7ff88b2013-02-19 20:42:48 +0000228 # crosbug#31837 - "Sources need to be world-readable to properly
229 # function inside the chroot"
230 "umask 022 && repo sync -j %s" % options.jobs]
asharifbf6899d2013-02-15 21:42:35 +0000231 cmd_executer = command_executer.GetCommandExecuter()
232 ret = cmd_executer.RunCommands(commands)
233 if ret:
234 return ret
bjanakiraman7f4a4852013-02-15 04:35:28 +0000235
raymese91a6e62013-02-15 04:35:51 +0000236 # Setup svn credentials for use inside the chroot
asharifca35b772013-02-15 04:56:41 +0000237 if getpass.getuser() == "mobiletc-prebuild":
238 chromium_username = "raymes"
239 else:
240 chromium_username = "$USER"
raymesbfb57992013-02-15 04:35:45 +0000241
asharifbf6899d2013-02-15 21:42:35 +0000242 return cmd_executer.RunCommand(
243 "svn ls --config-option config:auth:password-stores= "
244 "--config-option "
245 "servers:global:store-plaintext-passwords=yes "
246 "--username " + chromium_username + "@google.com "
247 "svn://svn.chromium.org/leapfrog-internal "
248 "svn://svn.chromium.org/chrome "
249 "svn://svn.chromium.org/chrome-internal > /dev/null")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000250
251
252if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000253 retval = Main(sys.argv)
254 sys.exit(retval)