blob: 689b1ec99bedb903f056f3c0ad10beb2206d27f7 [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
Luis Lozano8cf53082013-08-01 12:35:11 -070015
bjanakiraman7f4a4852013-02-15 04:35:28 +000016import optparse
yunlian3802fbf2013-02-19 19:58:44 +000017import os
llozano9efafde2013-02-23 01:37:04 +000018import pickle
bjanakiraman7f4a4852013-02-15 04:35:28 +000019import sys
yunlian3802fbf2013-02-19 19:58:44 +000020import tempfile
21import time
raymes01959ae2013-02-15 04:50:07 +000022from utils import command_executer
raymes69c8d722013-02-15 17:55:36 +000023from utils import logger
Luis Lozano8cf53082013-08-01 12:35:11 -070024from utils import manifest_versions
bjanakiraman7f4a4852013-02-15 04:35:28 +000025
raymesbfb57992013-02-15 04:35:45 +000026GCLIENT_FILE = """solutions = [
27 { "name" : "CHROME_DEPS",
28 "url" :
29 "svn://svn.chromium.org/chrome-internal/trunk/tools/buildspec/releases/%s",
30 "custom_deps" : {
31 "src/third_party/WebKit/LayoutTests": None,
32 "src-pdf": None,
33 "src/pdf": None,
34 },
35 "safesync_url": "",
36 },
37]
38"""
39
llozano9efafde2013-02-23 01:37:04 +000040# List of stable versions used for common team image
41# Sheriff must update this list when a new common version becomes available
42COMMON_VERSIONS = "/home/mobiletc-prebuild/common_images/common_list.txt"
43
bjanakiraman7f4a4852013-02-15 04:35:28 +000044def Usage(parser):
45 parser.print_help()
46 sys.exit(0)
47
shenhanf6617ae2013-03-01 17:17:01 +000048# Get version spec file, either from "paladin" or "buildspec" directory.
49def GetVersionSpecFile(version, versions_git):
50 temp = tempfile.mkdtemp()
51 commands = ["cd {0}".format(temp), \
52 "git clone {0} versions".format(versions_git)]
53 cmd_executer = command_executer.GetCommandExecuter()
54 ret = cmd_executer.RunCommands(commands)
55 err_msg = None
56 if ret:
57 err_msg = "Failed to checkout versions_git - {0}".format(versions_git)
58 ret = None
59 else:
60 v, m = version.split(".", 1)
61 paladin_spec = "paladin/buildspecs/{0}/{1}.xml".format(v, m)
62 generic_spec = "buildspecs/{0}/{1}.xml".format(v, m)
63 paladin_path = "{0}/versions/{1}".format(temp, paladin_spec)
64 generic_path = "{0}/versions/{1}".format(temp, generic_spec)
65 if os.path.exists(paladin_path):
66 ret = paladin_spec
67 elif os.path.exists(generic_path):
68 ret = generic_spec
69 else:
70 err_msg = "No spec found for version {0}".format(version)
71 ret = None
72 # Fall through to clean up.
73
74 commands = ["rm -rf {0}".format(temp)]
75 cmd_executer.RunCommands(commands)
76 if err_msg:
77 logger.GetLogger().LogFatal(err_msg)
78 return ret
yunlian3802fbf2013-02-19 19:58:44 +000079
llozano9efafde2013-02-23 01:37:04 +000080def TimeToCommonVersion(timestamp):
81 """Convert timestamp to common image version."""
82 tdt = datetime.fromtimestamp(float(timestamp))
83 with open(COMMON_VERSIONS, "r") as f:
84 common_list = pickle.load(f)
85 for sv in common_list:
86 sdt = datetime.strptime(sv["date"], "%Y-%m-%d %H:%M:%S.%f")
87 if tdt >= sdt:
88 return "%s.%s" % (sv["chrome_major_version"], sv["chromeos_version"])
89 # should never reach here
90 logger.GetLogger().LogFatal("No common version for timestamp")
91 return None
92
93
asharif0d3535a2013-02-15 04:50:33 +000094def Main(argv):
bjanakiraman7f4a4852013-02-15 04:35:28 +000095 """Checkout the ChromeOS source."""
96 parser = optparse.OptionParser()
97 parser.add_option("--dir", dest="directory",
98 help="Target directory for ChromeOS installation.")
llozano75d42eb2013-02-27 00:30:33 +000099 parser.add_option("--version", dest="version", default="latest_lkgm",
llozano9efafde2013-02-23 01:37:04 +0000100 help="""ChromeOS version. Can be:
101(1) A release version in the format: 'X.X.X.X'
102(2) 'top' for top of trunk
103(3) 'latest_lkgm' for the latest lkgm version
104(4) 'lkgm' for the lkgm release before timestamp
105(5) 'latest_common' for the latest team common stable version
106(6) 'common' for the team common stable version before timestamp
107Default is 'latest_lkgm'.""")
yunlian3802fbf2013-02-19 19:58:44 +0000108 parser.add_option("--timestamp", dest="timestamp", default=None,
109 help="""Timestamps in epoch format. It will check out the
llozano9efafde2013-02-23 01:37:04 +0000110latest LKGM or the latest COMMON version of ChromeOS before the timestamp.
111Use in combination with --version=latest or --version=common. Use
112'date -d <date string> +%s' to find epoch time""")
raymes01959ae2013-02-15 04:50:07 +0000113 parser.add_option("--minilayout", dest="minilayout", default=False,
asharifdff61342013-02-15 04:50:46 +0000114 action="store_true",
llozano9efafde2013-02-23 01:37:04 +0000115 help="""Whether to checkout the minilayout
raymes01959ae2013-02-15 04:50:07 +0000116(smaller checkout).'""")
raymes69c8d722013-02-15 17:55:36 +0000117 parser.add_option("--jobs", "-j", dest="jobs", default="1",
118 help="Number of repo sync threads to use.")
asharifbf6899d2013-02-15 21:42:35 +0000119 parser.add_option("--public", "-p", dest="public", default=False,
120 action="store_true",
121 help="Use the public checkout instead of the private one.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000122
asharif0d3535a2013-02-15 04:50:33 +0000123 options = parser.parse_args(argv)[0]
bjanakiraman7f4a4852013-02-15 04:35:28 +0000124
asharifbf6899d2013-02-15 21:42:35 +0000125 if not options.version:
126 parser.print_help()
127 logger.GetLogger().LogFatal("No version specified.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000128 else:
129 version = options.version.strip()
130
yunlian3802fbf2013-02-19 19:58:44 +0000131 if not options.timestamp:
132 timestamp = ""
133 else:
134 timestamp = options.timestamp.strip()
llozano9efafde2013-02-23 01:37:04 +0000135 if version not in ("lkgm", "common"):
136 parser.print_help()
137 logger.GetLogger().LogFatal("timestamp option only applies for "
138 "versions \"lkgm\" or \"common\"")
yunlian3802fbf2013-02-19 19:58:44 +0000139
asharifbf6899d2013-02-15 21:42:35 +0000140 if not options.directory:
141 parser.print_help()
142 logger.GetLogger().LogFatal("No directory specified.")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000143
144 directory = options.directory.strip()
145
asharifbf6899d2013-02-15 21:42:35 +0000146 if options.public:
Luis Lozano6aae4c92013-09-10 00:00:27 -0700147 manifest_repo = "https://chromium.googlesource.com/chromiumos/manifest.git"
148 versions_repo = ("https://chromium.googlesource.com/"
Luis Lozano6aebeb12013-09-03 01:55:02 -0700149 "chromiumos/manifest-versions.git")
asharifbf6899d2013-02-15 21:42:35 +0000150 else:
151 manifest_repo = (
Luis Lozano6aae4c92013-09-10 00:00:27 -0700152 "https://chrome-internal.googlesource.com/chromeos/manifest-internal.git")
asharifbf6899d2013-02-15 21:42:35 +0000153 versions_repo = (
Luis Lozano6aae4c92013-09-10 00:00:27 -0700154 "https://chrome-internal.googlesource.com/chromeos/manifest-versions.git")
asharifbf6899d2013-02-15 21:42:35 +0000155
yunlian3802fbf2013-02-19 19:58:44 +0000156 if version == "top":
asharifbf6899d2013-02-15 21:42:35 +0000157 init = "repo init -u %s" % manifest_repo
llozano9efafde2013-02-23 01:37:04 +0000158 elif version == "latest_lkgm":
Luis Lozano8cf53082013-08-01 12:35:11 -0700159 manifests = manifest_versions.ManifestVersions()
160 version = manifests.TimeToVersion(time.mktime(time.gmtime()))
llozano9efafde2013-02-23 01:37:04 +0000161 version, manifest = version.split(".", 1)
162 logger.GetLogger().LogOutput("found version %s.%s for latest LKGM" % (
163 version, manifest))
164 init = ("repo init -u %s -m paladin/buildspecs/%s/%s.xml" % (
165 versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700166 del manifests
llozano9efafde2013-02-23 01:37:04 +0000167 elif version == "lkgm":
168 if not timestamp:
169 parser.print_help()
170 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm")
Luis Lozano8cf53082013-08-01 12:35:11 -0700171 manifests = manifest_versions.ManifestVersions()
172 version = manifests.TimeToVersion(timestamp)
llozano9efafde2013-02-23 01:37:04 +0000173 version, manifest = version.split(".", 1)
174 logger.GetLogger().LogOutput("found version %s.%s for LKGM at timestamp %s"
175 % (version, manifest, timestamp))
176 init = ("repo init -u %s -m paladin/buildspecs/%s/%s.xml" % (
177 versions_repo, version, manifest))
Luis Lozano8cf53082013-08-01 12:35:11 -0700178 del manifests
llozano9efafde2013-02-23 01:37:04 +0000179 elif version == "latest_common":
180 version = TimeToCommonVersion(time.mktime(time.gmtime()))
181 version, manifest = version.split(".", 1)
182 logger.GetLogger().LogOutput("found version %s.%s for latest Common image" %
183 (version, manifest))
184 init = ("repo init -u %s -m buildspecs/%s/%s.xml" % (
185 versions_repo, version, manifest))
186 elif version == "common":
187 if not timestamp:
188 parser.print_help()
189 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm")
190 version = TimeToCommonVersion(timestamp)
191 version, manifest = version.split(".", 1)
192 logger.GetLogger().LogOutput("found version %s.%s for latest common image "
193 "at timestamp %s" % (
194 version, manifest, timestamp))
195 init = ("repo init -u %s -m buildspecs/%s/%s.xml" % (
196 versions_repo, version, manifest))
raymes69c8d722013-02-15 17:55:36 +0000197 else:
llozano9efafde2013-02-23 01:37:04 +0000198 # user specified a specific version number
shenhanf6617ae2013-03-01 17:17:01 +0000199 version_spec_file = GetVersionSpecFile(version, versions_repo)
200 if not version_spec_file:
201 return 1
202 init = "repo init -u %s -m %s" % (versions_repo, version_spec_file)
llozano9efafde2013-02-23 01:37:04 +0000203
yunlian3802fbf2013-02-19 19:58:44 +0000204 if options.minilayout:
yunlian992a4902013-02-19 20:19:25 +0000205 init += " -g minilayout"
yunlian3802fbf2013-02-19 19:58:44 +0000206
Luis Lozano6aae4c92013-09-10 00:00:27 -0700207 init += " --repo-url=https://chromium.googlesource.com/external/repo.git"
bjanakiraman7f4a4852013-02-15 04:35:28 +0000208
asharifbf6899d2013-02-15 21:42:35 +0000209 commands = ["mkdir -p %s" % directory,
210 "cd %s" % directory,
211 init,
shenhanb7ff88b2013-02-19 20:42:48 +0000212 # crosbug#31837 - "Sources need to be world-readable to properly
213 # function inside the chroot"
214 "umask 022 && repo sync -j %s" % options.jobs]
asharifbf6899d2013-02-15 21:42:35 +0000215 cmd_executer = command_executer.GetCommandExecuter()
216 ret = cmd_executer.RunCommands(commands)
217 if ret:
218 return ret
bjanakiraman7f4a4852013-02-15 04:35:28 +0000219
raymese91a6e62013-02-15 04:35:51 +0000220 # Setup svn credentials for use inside the chroot
asharifca35b772013-02-15 04:56:41 +0000221 if getpass.getuser() == "mobiletc-prebuild":
222 chromium_username = "raymes"
223 else:
224 chromium_username = "$USER"
raymesbfb57992013-02-15 04:35:45 +0000225
asharifbf6899d2013-02-15 21:42:35 +0000226 return cmd_executer.RunCommand(
227 "svn ls --config-option config:auth:password-stores= "
228 "--config-option "
229 "servers:global:store-plaintext-passwords=yes "
230 "--username " + chromium_username + "@google.com "
231 "svn://svn.chromium.org/leapfrog-internal "
232 "svn://svn.chromium.org/chrome "
233 "svn://svn.chromium.org/chrome-internal > /dev/null")
bjanakiraman7f4a4852013-02-15 04:35:28 +0000234
235
236if __name__ == "__main__":
asharif2198c512013-02-15 09:21:35 +0000237 retval = Main(sys.argv)
238 sys.exit(retval)