setup_chromeos.py revision 0440388677b2445f4f8273b6c2b4d82601b1aca3
1#!/usr/bin/python 2# 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 13from datetime import datetime 14import getpass 15 16import optparse 17import os 18import pickle 19import sys 20import tempfile 21import time 22from utils import command_executer 23from utils import logger 24from utils import manifest_versions 25 26GCLIENT_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 40# 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 44def Usage(parser): 45 parser.print_help() 46 sys.exit(0) 47 48# 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 79 80def 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 94def Main(argv): 95 """Checkout the ChromeOS source.""" 96 parser = optparse.OptionParser() 97 parser.add_option("--dir", dest="directory", 98 help="Target directory for ChromeOS installation.") 99 parser.add_option("--version", dest="version", default="latest_lkgm", 100 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'.""") 108 parser.add_option("--timestamp", dest="timestamp", default=None, 109 help="""Timestamps in epoch format. It will check out the 110latest 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""") 113 parser.add_option("--minilayout", dest="minilayout", default=False, 114 action="store_true", 115 help="""Whether to checkout the minilayout 116(smaller checkout).'""") 117 parser.add_option("--jobs", "-j", dest="jobs", default="1", 118 help="Number of repo sync threads to use.") 119 parser.add_option("--public", "-p", dest="public", default=False, 120 action="store_true", 121 help="Use the public checkout instead of the private one.") 122 123 options = parser.parse_args(argv)[0] 124 125 if not options.version: 126 parser.print_help() 127 logger.GetLogger().LogFatal("No version specified.") 128 else: 129 version = options.version.strip() 130 131 if not options.timestamp: 132 timestamp = "" 133 else: 134 timestamp = options.timestamp.strip() 135 if version not in ("lkgm", "common"): 136 parser.print_help() 137 logger.GetLogger().LogFatal("timestamp option only applies for " 138 "versions \"lkgm\" or \"common\"") 139 140 if not options.directory: 141 parser.print_help() 142 logger.GetLogger().LogFatal("No directory specified.") 143 144 directory = options.directory.strip() 145 146 if options.public: 147 manifest_repo = "https://chromium.googlesource.com/chromiumos/manifest.git" 148 versions_repo = ("https://chromium.googlesource.com/" 149 "chromiumos/manifest-versions.git") 150 else: 151 manifest_repo = ( 152 "https://chrome-internal.googlesource.com/chromeos/manifest-internal.git") 153 versions_repo = ( 154 "https://chrome-internal.googlesource.com/chromeos/manifest-versions.git") 155 156 if version == "top": 157 init = "repo init -u %s" % manifest_repo 158 elif version == "latest_lkgm": 159 manifests = manifest_versions.ManifestVersions() 160 version = manifests.TimeToVersion(time.mktime(time.gmtime())) 161 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)) 166 del manifests 167 elif version == "lkgm": 168 if not timestamp: 169 parser.print_help() 170 logger.GetLogger().LogFatal("No timestamp specified for version=lkgm") 171 manifests = manifest_versions.ManifestVersions() 172 version = manifests.TimeToVersion(timestamp) 173 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)) 178 del manifests 179 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)) 197 else: 198 # user specified a specific version number 199 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) 203 204 if options.minilayout: 205 init += " -g minilayout" 206 207 init += " --repo-url=https://chromium.googlesource.com/external/repo.git" 208 209 commands = ["mkdir -p %s" % directory, 210 "cd %s" % directory, 211 init, 212 # crosbug#31837 - "Sources need to be world-readable to properly 213 # function inside the chroot" 214 "umask 022 && repo sync -j %s" % options.jobs] 215 cmd_executer = command_executer.GetCommandExecuter() 216 ret = cmd_executer.RunCommands(commands) 217 if ret: 218 return ret 219 220 return cmd_executer.RunCommand( 221 "svn ls " 222 "svn://svn.chromium.org/leapfrog-internal " 223 "svn://svn.chromium.org/chrome " 224 "svn://svn.chromium.org/chrome-internal " 225 "svn://svn.chromium.org/blink > /dev/null") 226 227 228if __name__ == "__main__": 229 retval = Main(sys.argv) 230 sys.exit(retval) 231