blob: 5698462ea6bdc95978c8b67927fbdca05f762996 [file] [log] [blame]
Chris Sosadad0d322011-01-31 16:37:33 -08001#!/usr/bin/python
2
Chris Sosa9ba47752012-02-27 15:27:37 -08003# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Sosadad0d322011-01-31 16:37:33 -08004# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6
7"""This module uprevs Chrome for cbuildbot.
8
9After calling, it prints outs CHROME_VERSION_ATOM=(version atom string). A
10caller could then use this atom with emerge to build the newly uprevved version
11of Chrome e.g.
12
13./cros_mark_chrome_as_stable tot
14Returns chrome-base/chromeos-chrome-8.0.552.0_alpha_r1
15
16emerge-x86-generic =chrome-base/chromeos-chrome-8.0.552.0_alpha_r1
17"""
18
Chris Sosa8be39132011-04-14 12:09:24 -070019import filecmp
Chris Sosadad0d322011-01-31 16:37:33 -080020import optparse
21import os
22import re
Chris Masone592cab52011-08-02 14:05:48 -070023import sys
petermayo@chromium.org163b3372011-09-12 02:06:05 -040024import time
Chris Sosadad0d322011-01-31 16:37:33 -080025
Mike Frysinger6cb624a2012-05-24 18:17:38 -040026from chromite.buildbot import constants
J. Richard Barnettef6697cf2011-11-18 12:42:08 -080027from chromite.buildbot import portage_utilities
David James1b363582012-12-17 11:53:11 -080028from chromite.lib import cros_build_lib
David Jamesef74b1c2012-11-12 07:47:47 -080029from chromite.lib import gclient
David James97d95872012-11-16 15:09:56 -080030from chromite.lib import git
David James1b363582012-12-17 11:53:11 -080031from chromite.lib.cros_build_lib import RunCommand
Mike Frysinger6cb624a2012-05-24 18:17:38 -040032from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080033
Chris Sosadad0d322011-01-31 16:37:33 -080034# Helper regex's for finding ebuilds.
35_CHROME_VERSION_REGEX = '\d+\.\d+\.\d+\.\d+'
36_NON_STICKY_REGEX = '%s[(_rc.*)|(_alpha.*)]+' % _CHROME_VERSION_REGEX
37
38# Dir where all the action happens.
David James629febb2012-11-25 13:07:34 -080039_CHROME_OVERLAY_DIR = ('%(srcroot)s/third_party/chromiumos-overlay/' +
40 constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -080041
42_GIT_COMMIT_MESSAGE = ('Marking %(chrome_rev)s for chrome ebuild with version '
43 '%(chrome_version)s as stable.')
44
Chris Masone592cab52011-08-02 14:05:48 -070045# URLs that print lists of chrome revisions between two versions of the browser.
46_CHROME_VERSION_URL = ('http://omahaproxy.appspot.com/changelog?'
47 'old_version=%(old)s&new_version=%(new)s')
Chris Sosadd611df2012-02-03 15:26:23 -080048
49# Only print links when we rev these types.
50_REV_TYPES_FOR_LINKS = [constants.CHROME_REV_LATEST,
51 constants.CHROME_REV_STICKY]
Chris Masone592cab52011-08-02 14:05:48 -070052
53_CHROME_SVN_TAG = 'CROS_SVN_COMMIT'
Chris Sosadad0d322011-01-31 16:37:33 -080054
Peter Mayof65b8412011-08-26 01:22:21 -040055def _GetSvnUrl(base_url):
Chris Sosadad0d322011-01-31 16:37:33 -080056 """Returns the path to the svn url for the given chrome branch."""
Peter Mayof65b8412011-08-26 01:22:21 -040057 return os.path.join(base_url, 'trunk')
Chris Sosadad0d322011-01-31 16:37:33 -080058
59
Peter Mayof65b8412011-08-26 01:22:21 -040060def _GetTipOfTrunkSvnRevision(base_url):
Chris Sosadad0d322011-01-31 16:37:33 -080061 """Returns the current svn revision for the chrome tree."""
Peter Mayof65b8412011-08-26 01:22:21 -040062 svn_url = _GetSvnUrl(base_url)
J. Richard Barnetted422f622011-11-17 09:39:46 -080063 svn_info = RunCommand(['svn', 'info', svn_url], redirect_stdout=True).output
Chris Sosadad0d322011-01-31 16:37:33 -080064
65 revision_re = re.compile('^Revision:\s+(\d+).*')
66 for line in svn_info.splitlines():
67 match = revision_re.search(line)
68 if match:
69 svn_revision = match.group(1)
David James1b363582012-12-17 11:53:11 -080070 cros_build_lib.Info('Found SVN Revision %s' % svn_revision)
Chris Sosadad0d322011-01-31 16:37:33 -080071 return svn_revision
72
73 raise Exception('Could not find revision information from %s' % svn_url)
74
75
petermayo@chromium.org163b3372011-09-12 02:06:05 -040076def _GetVersionContents(chrome_version_info):
Peter Mayo177500f2011-09-09 17:25:23 -040077 """Returns the current Chromium version, from the contents of a VERSION file.
Chris Sosadad0d322011-01-31 16:37:33 -080078
Peter Mayo177500f2011-09-09 17:25:23 -040079 Args:
80 chrome_version_info: The contents of a chromium VERSION file.
81 """
Chris Sosadad0d322011-01-31 16:37:33 -080082 chrome_version_array = []
Chris Sosadad0d322011-01-31 16:37:33 -080083 for line in chrome_version_info.splitlines():
84 chrome_version_array.append(line.rpartition('=')[2])
85
86 return '.'.join(chrome_version_array)
87
petermayo@chromium.org163b3372011-09-12 02:06:05 -040088def _GetSpecificVersionUrl(base_url, revision, time_to_wait=600):
89 """Returns the Chromium version, from a repository URL and version.
Peter Mayo177500f2011-09-09 17:25:23 -040090
91 Args:
92 base_url: URL for the root of the chromium checkout.
petermayo@chromium.org163b3372011-09-12 02:06:05 -040093 revision: the SVN revision we want to use.
94 time_to_wait: the minimum period before abandoning our wait for the
95 desired revision to be present.
Peter Mayo177500f2011-09-09 17:25:23 -040096 """
petermayo@chromium.org163b3372011-09-12 02:06:05 -040097 svn_url = os.path.join(_GetSvnUrl(base_url), 'src', 'chrome', 'VERSION')
petermayo@chromium.org163b3372011-09-12 02:06:05 -040098 if not revision or not (int(revision) > 0):
99 raise Exception('Revision must be positive, got %s' % revision)
100
101 start = time.time()
102 # Use the fact we are SVN, hence ordered.
103 # Dodge the fact it will silently ignore the revision if it is not
104 # yet known. (i.e. too high)
105 repo_version = _GetTipOfTrunkSvnRevision(base_url)
106 while revision > repo_version:
107 if time.time() - start > time_to_wait:
108 raise Exception('Timeout Exceeeded')
109
David James1b363582012-12-17 11:53:11 -0800110 msg = 'Repository only has version %s, looking for %s. Sleeping...'
111 cros_build_lib.Info(msg, repo_version, revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400112 time.sleep(30)
113 repo_version = _GetTipOfTrunkSvnRevision(base_url)
114
115 chrome_version_info = RunCommand(
116 ['svn', 'cat', '-r', revision, svn_url],
117 redirect_stdout=True,
118 error_message='Could not read version file at %s revision %s.' %
J. Richard Barnetted422f622011-11-17 09:39:46 -0800119 (svn_url, revision)).output
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400120
121 return _GetVersionContents(chrome_version_info)
122
Peter Mayo177500f2011-09-09 17:25:23 -0400123
124def _GetTipOfTrunkVersionFile(root):
125 """Returns the current Chromium version, from a file in a checkout.
126
127 Args:
128 root: path to the root of the chromium checkout.
129 """
130 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
131 chrome_version_info = RunCommand(
132 ['cat', version_file],
133 redirect_stdout=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800134 error_message='Could not read version file at %s.' % version_file).output
Peter Mayo177500f2011-09-09 17:25:23 -0400135
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400136 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400137
Peter Mayof65b8412011-08-26 01:22:21 -0400138def _GetLatestRelease(base_url, branch=None):
Chris Sosadad0d322011-01-31 16:37:33 -0800139 """Gets the latest release version from the buildspec_url for the branch.
140
141 Args:
142 branch: If set, gets the latest release for branch, otherwise latest
143 release.
144 Returns:
145 Latest version string.
146 """
Peter Mayof65b8412011-08-26 01:22:21 -0400147 buildspec_url = os.path.join(base_url, 'releases')
J. Richard Barnetted422f622011-11-17 09:39:46 -0800148 svn_ls = RunCommand(['svn', 'ls', buildspec_url],
149 redirect_stdout=True).output
Peter Mayoad8173d2011-11-08 16:18:23 -0500150 sorted_ls = RunCommand(['sort', '--version-sort', '-r'], input=svn_ls,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800151 redirect_stdout=True).output
Chris Sosadad0d322011-01-31 16:37:33 -0800152 if branch:
153 chrome_version_re = re.compile('^%s\.\d+.*' % branch)
154 else:
155 chrome_version_re = re.compile('^[0-9]+\..*')
Chris Sosadad0d322011-01-31 16:37:33 -0800156
Peter Mayoad8173d2011-11-08 16:18:23 -0500157 for chrome_version in sorted_ls.splitlines():
J. Richard Barnetted422f622011-11-17 09:39:46 -0800158 if chrome_version_re.match(chrome_version):
159 deps_url = os.path.join(buildspec_url, chrome_version, 'DEPS')
160 deps_check = RunCommand(['svn', 'ls', deps_url],
Brian Harringfa310772012-09-22 21:38:39 -0700161 error_code_ok=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800162 redirect_stdout=True).output
163 if deps_check == 'DEPS\n':
164 return chrome_version.rstrip('/')
Peter Mayoad8173d2011-11-08 16:18:23 -0500165
166 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800167
168
169def _GetStickyEBuild(stable_ebuilds):
170 """Returns the sticky ebuild."""
171 sticky_ebuilds = []
172 non_sticky_re = re.compile(_NON_STICKY_REGEX)
173 for ebuild in stable_ebuilds:
174 if not non_sticky_re.match(ebuild.version):
175 sticky_ebuilds.append(ebuild)
176
177 if not sticky_ebuilds:
178 raise Exception('No sticky ebuilds found')
179 elif len(sticky_ebuilds) > 1:
David James1b363582012-12-17 11:53:11 -0800180 cros_build_lib.Warning('More than one sticky ebuild found')
Chris Sosadad0d322011-01-31 16:37:33 -0800181
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800182 return portage_utilities.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800183
184
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800185class ChromeEBuild(portage_utilities.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800186 """Thin sub-class of EBuild that adds a chrome_version field."""
David James629febb2012-11-25 13:07:34 -0800187 chrome_version_re = re.compile('.*%s-(%s|9999).*' % (
188 constants.CHROME_PN, _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800189 chrome_version = ''
190
191 def __init__(self, path):
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800192 portage_utilities.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800193 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
194 if re_match:
195 self.chrome_version = re_match.group(1)
196
Chris Sosadad0d322011-01-31 16:37:33 -0800197 def __str__(self):
198 return self.ebuild_path
199
200
201def FindChromeCandidates(overlay_dir):
202 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
203
204 Args:
205 overlay_dir: The path to chrome's portage overlay dir.
206 Returns:
207 Tuple [unstable_ebuild, stable_ebuilds].
208 Raises:
209 Exception: if no unstable ebuild exists for Chrome.
210 """
211 stable_ebuilds = []
212 unstable_ebuilds = []
213 for path in [
214 os.path.join(overlay_dir, entry) for entry in os.listdir(overlay_dir)]:
215 if path.endswith('.ebuild'):
216 ebuild = ChromeEBuild(path)
217 if not ebuild.chrome_version:
David James1b363582012-12-17 11:53:11 -0800218 cros_build_lib.Warning('Poorly formatted ebuild found at %s' % path)
Chris Sosadad0d322011-01-31 16:37:33 -0800219 else:
220 if '9999' in ebuild.version:
221 unstable_ebuilds.append(ebuild)
222 else:
223 stable_ebuilds.append(ebuild)
224
225 # Apply some sanity checks.
226 if not unstable_ebuilds:
227 raise Exception('Missing 9999 ebuild for %s' % overlay_dir)
228 if not stable_ebuilds:
David James1b363582012-12-17 11:53:11 -0800229 cros_build_lib.Warning('Missing stable ebuild for %s' % overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800230
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800231 return portage_utilities.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800232
233
234def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
235 """Finds the Chrome uprev candidate for the given chrome_rev.
236
237 Using the pre-flight logic, this means the stable ebuild you are uprevving
238 from. The difference here is that the version could be different and in
239 that case we want to find it to delete it.
240
241 Args:
242 stable_ebuilds: A list of stable ebuilds.
243 chrome_rev: The chrome_rev designating which candidate to find.
244 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800245 components. For example: 9.0.553. Can be None but not if chrome_rev
246 is CHROME_REV_STICKY.
Chris Sosadad0d322011-01-31 16:37:33 -0800247 Returns:
248 Returns the EBuild, otherwise None if none found.
249 """
250 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400251 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
252 constants.CHROME_REV_SPEC]:
253 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400254 # not just for the fun of confusion.
Chris Sosadad0d322011-01-31 16:37:33 -0800255 chrome_branch_re = re.compile('%s.*_alpha.*' % _CHROME_VERSION_REGEX)
256 for ebuild in stable_ebuilds:
257 if chrome_branch_re.search(ebuild.version):
258 candidates.append(ebuild)
259
Ryan Cuic6e097d2011-06-16 12:23:14 -0700260 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800261 assert sticky_branch is not None
Chris Sosadad0d322011-01-31 16:37:33 -0800262 chrome_branch_re = re.compile('%s\..*' % sticky_branch)
263 for ebuild in stable_ebuilds:
264 if chrome_branch_re.search(ebuild.version):
265 candidates.append(ebuild)
266
267 else:
268 chrome_branch_re = re.compile('%s.*_rc.*' % _CHROME_VERSION_REGEX)
269 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800270 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800271 candidates.append(ebuild)
272
273 if candidates:
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800274 return portage_utilities.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800275 else:
276 return None
277
Chris Masone592cab52011-08-02 14:05:48 -0700278def _AnnotateAndPrint(text, url):
279 """Add buildbot trappings to print <a href='url'>text</a> in the waterfall.
280
281 Args:
282 text: Anchor text for the link
283 url: the URL to which to link
284 """
Don Garrette60de902011-10-17 18:52:05 -0700285 print >> sys.stderr, '\n@@@STEP_LINK@%(text)s@%(url)s@@@' % { 'text': text,
Chris Masone592cab52011-08-02 14:05:48 -0700286 'url': url }
287
288def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
289 """Return appropriately formatted link to revision info, given versions
290
291 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
292 page that prints the Chromium revisions between those two versions.
293
294 Args:
295 old_chrome_version: version to diff from
296 chrome_version: version to which to diff
297 Returns:
298 The desired URL.
299 """
300 return _CHROME_VERSION_URL % { 'old': old_chrome_version,
301 'new': chrome_version }
302
Chris Masone592cab52011-08-02 14:05:48 -0700303def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
304 """Returns a link to the list of revisions between two Chromium versions
305
306 Given two ChromeEBuilds and the kind of rev we're doing, generate a
307 link to a page that prints the Chromium changes between those two
308 revisions, inclusive.
309
310 Args:
311 old_chrome: ebuild for the version to diff from
312 new_chrome: ebuild for the version to which to diff
313 chrome_rev: one of constants.VALID_CHROME_REVISIONS
314 Returns:
315 The desired URL.
316 """
Chris Sosadd611df2012-02-03 15:26:23 -0800317 assert chrome_rev in _REV_TYPES_FOR_LINKS
318 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
319 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800320
321def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_rev,
Chris Sosa9ba47752012-02-27 15:27:37 -0800322 chrome_version, commit, overlay_dir):
Chris Sosadad0d322011-01-31 16:37:33 -0800323 """Uprevs the chrome ebuild specified by chrome_rev.
324
325 This is the main function that uprevs the chrome_rev from a stable candidate
326 to its new version.
327
328 Args:
329 stable_candidate: ebuild that corresponds to the stable ebuild we are
330 revving from. If None, builds the a new ebuild given the version
331 and logic for chrome_rev type with revision set to 1.
332 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
Peter Mayo177500f2011-09-09 17:25:23 -0400333 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400334 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
335 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700336 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
337 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400338 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
339 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700340 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
341 are release candidates for the next sticky version.
342 constants.CHROME_REV_STICKY - Revs the sticky version.
Chris Sosadad0d322011-01-31 16:37:33 -0800343 chrome_version: The \d.\d.\d.\d version of Chrome.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700344 commit: Used with constants.CHROME_REV_TOT. The svn revision of chrome.
Chris Sosadad0d322011-01-31 16:37:33 -0800345 overlay_dir: Path to the chromeos-chrome package dir.
Chris Sosadad0d322011-01-31 16:37:33 -0800346 Returns:
347 Full portage version atom (including rc's, etc) that was revved.
348 """
Chris Sosa8be39132011-04-14 12:09:24 -0700349 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
350 """Returns True if the new ebuild is redundant.
351
352 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700353 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700354 """
355 if not stable_ebuild:
356 return False
357
358 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700359 return filecmp.cmp(
360 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700361
David James629febb2012-11-25 13:07:34 -0800362 # Mark latest release and sticky branches as stable.
363 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
364 constants.CHROME_REV_SPEC,
365 constants.CHROME_REV_LOCAL]
366
Chris Sosadad0d322011-01-31 16:37:33 -0800367 # Case where we have the last stable candidate with same version just rev.
368 if stable_candidate and stable_candidate.chrome_version == chrome_version:
369 new_ebuild_path = '%s-r%d.ebuild' % (
370 stable_candidate.ebuild_path_no_revision,
371 stable_candidate.current_revision + 1)
372 else:
David James629febb2012-11-25 13:07:34 -0800373 suffix = 'rc' if mark_stable else 'alpha'
374 pf = '%s-%s_%s-r1' % (constants.CHROME_PN, chrome_version, suffix)
375 new_ebuild_path = os.path.join(overlay_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800376
David Jamesa6792552012-04-03 10:05:35 -0700377 chrome_variables = dict()
378 if commit:
379 chrome_variables[_CHROME_SVN_TAG] = commit
380
J. Richard Barnette0cfc5052011-11-28 14:31:39 -0800381 portage_utilities.EBuild.MarkAsStable(
David James065b2012012-04-01 14:51:11 -0700382 unstable_ebuild.ebuild_path, new_ebuild_path,
David Jamesa6792552012-04-03 10:05:35 -0700383 chrome_variables, make_stable=mark_stable)
Chris Sosadad0d322011-01-31 16:37:33 -0800384 new_ebuild = ChromeEBuild(new_ebuild_path)
Chris Sosa8be39132011-04-14 12:09:24 -0700385
386 # Determine whether this is ebuild is redundant.
387 if IsTheNewEBuildRedundant(new_ebuild, stable_candidate):
David James1b363582012-12-17 11:53:11 -0800388 msg = 'Previous ebuild with same version found and ebuild is redundant.'
389 cros_build_lib.Info(msg)
Chris Sosa8be39132011-04-14 12:09:24 -0700390 os.unlink(new_ebuild_path)
391 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800392
Chris Sosadd611df2012-02-03 15:26:23 -0800393 if stable_candidate and chrome_rev in _REV_TYPES_FOR_LINKS:
Chris Masone592cab52011-08-02 14:05:48 -0700394 _AnnotateAndPrint('Chromium revisions',
395 GetChromeRevisionListLink(stable_candidate,
396 new_ebuild,
397 chrome_rev))
398
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400399 RunCommand(['git', 'add', new_ebuild_path], cwd=overlay_dir)
Chris Sosa9ba47752012-02-27 15:27:37 -0800400 if stable_candidate and not stable_candidate.IsSticky():
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400401 RunCommand(['git', 'rm', stable_candidate.ebuild_path], cwd=overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800402
J. Richard Barnette0cfc5052011-11-28 14:31:39 -0800403 portage_utilities.EBuild.CommitChange(
Chris Sosadad0d322011-01-31 16:37:33 -0800404 _GIT_COMMIT_MESSAGE % {'chrome_rev': chrome_rev,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400405 'chrome_version': chrome_version},
406 overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800407
Chris Sosadad0d322011-01-31 16:37:33 -0800408 return '%s-%s' % (new_ebuild.package, new_ebuild.version)
409
410
Chris Sosad53f8fd2011-10-21 15:15:19 -0700411def ParseMaxRevision(revision_list):
412 """Returns the max revision from a list of url@revision string."""
413 revision_re = re.compile('.*@(\d+)')
414
415 def RevisionKey(revision):
416 return revision_re.match(revision).group(1)
417
418 max_revision = max(revision_list.split(), key=RevisionKey)
419 return max_revision.rpartition('@')[2]
420
421
David James1b363582012-12-17 11:53:11 -0800422def main(_argv):
Chris Sosa0f295aa2011-10-21 14:10:28 -0700423 usage_options = '|'.join(constants.VALID_CHROME_REVISIONS)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700424 usage = '%s OPTIONS [%s]' % (__file__, usage_options)
Chris Sosadad0d322011-01-31 16:37:33 -0800425 parser = optparse.OptionParser(usage)
David Jamescc09c9b2012-01-26 22:10:13 -0800426 parser.add_option('-b', '--boards', default='x86-generic')
David Jamesef74b1c2012-11-12 07:47:47 -0800427 parser.add_option('-c', '--chrome_url', default=gclient.GetBaseURLs()[0])
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400428 parser.add_option('-f', '--force_revision', default=None)
Chris Sosadad0d322011-01-31 16:37:33 -0800429 parser.add_option('-s', '--srcroot', default=os.path.join(os.environ['HOME'],
430 'trunk', 'src'),
431 help='Path to the src directory')
432 parser.add_option('-t', '--tracking_branch', default='cros/master',
433 help='Branch we are tracking changes against')
434 (options, args) = parser.parse_args()
435
Ryan Cuic6e097d2011-06-16 12:23:14 -0700436 if len(args) != 1 or args[0] not in constants.VALID_CHROME_REVISIONS:
437 parser.error('Commit requires arg set to one of %s.'
438 % constants.VALID_CHROME_REVISIONS)
Chris Sosadad0d322011-01-31 16:37:33 -0800439
440 overlay_dir = os.path.abspath(_CHROME_OVERLAY_DIR %
441 {'srcroot': options.srcroot})
442 chrome_rev = args[0]
443 version_to_uprev = None
444 commit_to_use = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800445 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800446
447 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800448
Peter Mayo177500f2011-09-09 17:25:23 -0400449 if chrome_rev == constants.CHROME_REV_LOCAL:
450 if 'CHROME_ROOT' in os.environ:
451 chrome_root = os.environ['CHROME_ROOT']
452 else:
453 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
454
455 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
456 commit_to_use = 'Unknown'
David James1b363582012-12-17 11:53:11 -0800457 cros_build_lib.Info('Using local source, versioning is untrustworthy.')
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400458 elif chrome_rev == constants.CHROME_REV_SPEC:
459 commit_to_use = options.force_revision
Chris Sosad53f8fd2011-10-21 15:15:19 -0700460 if '@' in commit_to_use: commit_to_use = ParseMaxRevision(commit_to_use)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400461 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
462 commit_to_use)
Peter Mayo177500f2011-09-09 17:25:23 -0400463 elif chrome_rev == constants.CHROME_REV_TOT:
Peter Mayof65b8412011-08-26 01:22:21 -0400464 commit_to_use = _GetTipOfTrunkSvnRevision(options.chrome_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400465 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
466 commit_to_use)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700467 elif chrome_rev == constants.CHROME_REV_LATEST:
Peter Mayof65b8412011-08-26 01:22:21 -0400468 version_to_uprev = _GetLatestRelease(options.chrome_url)
Chris Sosadad0d322011-01-31 16:37:33 -0800469 else:
Chris Sosa9ba47752012-02-27 15:27:37 -0800470 sticky_ebuild = _GetStickyEBuild(stable_ebuilds)
471 sticky_version = sticky_ebuild.chrome_version
472 sticky_branch = sticky_version.rpartition('.')[0]
Peter Mayof65b8412011-08-26 01:22:21 -0400473 version_to_uprev = _GetLatestRelease(options.chrome_url, sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800474
475 stable_candidate = FindChromeUprevCandidate(stable_ebuilds, chrome_rev,
476 sticky_branch)
477
478 if stable_candidate:
David James1b363582012-12-17 11:53:11 -0800479 cros_build_lib.Info('Stable candidate found %s' % stable_candidate)
Chris Sosadad0d322011-01-31 16:37:33 -0800480 else:
David James1b363582012-12-17 11:53:11 -0800481 cros_build_lib.Info('No stable candidate found.')
Chris Sosadad0d322011-01-31 16:37:33 -0800482
Chris Sosa8049f3b2011-05-02 20:09:28 -0700483 tracking_branch = 'remotes/m/%s' % os.path.basename(options.tracking_branch)
David James97d95872012-11-16 15:09:56 -0800484 existing_branch = git.GetCurrentBranch(overlay_dir)
Ryan Cui05a31ba2011-05-31 17:47:37 -0700485 work_branch = cros_mark_as_stable.GitBranch(constants.STABLE_EBUILD_BRANCH,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400486 tracking_branch, overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800487 work_branch.CreateBranch()
David Jamesd6708c02012-03-22 10:49:15 -0700488
489 # In the case of uprevving overlays that have patches applied to them,
490 # include the patched changes in the stabilizing branch.
491 if existing_branch:
492 RunCommand(['git', 'rebase', existing_branch], cwd=overlay_dir)
493
Chris Sosadad0d322011-01-31 16:37:33 -0800494 chrome_version_atom = MarkChromeEBuildAsStable(
495 stable_candidate, unstable_ebuild, chrome_rev, version_to_uprev,
Chris Sosa9ba47752012-02-27 15:27:37 -0800496 commit_to_use, overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800497 # Explicit print to communicate to caller.
498 if chrome_version_atom:
David Jamescc09c9b2012-01-26 22:10:13 -0800499 cros_mark_as_stable.CleanStalePackages(options.boards.split(':'),
500 [chrome_version_atom])
Chris Sosadad0d322011-01-31 16:37:33 -0800501 print 'CHROME_VERSION_ATOM=%s' % chrome_version_atom