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