blob: 963ac6b8deb311476e47894c32f59356b2a86255 [file] [log] [blame]
Chris Sosadad0d322011-01-31 16:37:33 -08001#!/usr/bin/python
Chris Sosa9ba47752012-02-27 15:27:37 -08002# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Sosadad0d322011-01-31 16:37:33 -08003# Use of this source code is governed by a BSD-style license that can be
4# found in the LICENSE file.
5
6"""This module uprevs Chrome for cbuildbot.
7
8After calling, it prints outs CHROME_VERSION_ATOM=(version atom string). A
9caller could then use this atom with emerge to build the newly uprevved version
10of Chrome e.g.
11
12./cros_mark_chrome_as_stable tot
13Returns chrome-base/chromeos-chrome-8.0.552.0_alpha_r1
14
15emerge-x86-generic =chrome-base/chromeos-chrome-8.0.552.0_alpha_r1
16"""
17
Chris Sosa8be39132011-04-14 12:09:24 -070018import filecmp
Chris Sosadad0d322011-01-31 16:37:33 -080019import optparse
20import os
21import re
Chris Masone592cab52011-08-02 14:05:48 -070022import sys
petermayo@chromium.org163b3372011-09-12 02:06:05 -040023import time
Chris Sosadad0d322011-01-31 16:37:33 -080024
Don Garrett88b8d782014-05-13 17:30:55 -070025from chromite.cbuildbot import constants
26from chromite.cbuildbot import portage_utilities
David James1b363582012-12-17 11:53:11 -080027from chromite.lib import cros_build_lib
David Jamesef74b1c2012-11-12 07:47:47 -080028from chromite.lib import gclient
David James97d95872012-11-16 15:09:56 -080029from chromite.lib import git
Mike Frysinger6cb624a2012-05-24 18:17:38 -040030from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080031
Chris Sosadad0d322011-01-31 16:37:33 -080032# Helper regex's for finding ebuilds.
David James7c352bc2013-03-15 14:19:57 -070033_CHROME_VERSION_REGEX = r'\d+\.\d+\.\d+\.\d+'
34_NON_STICKY_REGEX = r'%s[(_rc.*)|(_alpha.*)]+' % _CHROME_VERSION_REGEX
Chris Sosadad0d322011-01-31 16:37:33 -080035
36# Dir where all the action happens.
David James629febb2012-11-25 13:07:34 -080037_CHROME_OVERLAY_DIR = ('%(srcroot)s/third_party/chromiumos-overlay/' +
38 constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -080039
40_GIT_COMMIT_MESSAGE = ('Marking %(chrome_rev)s for chrome ebuild with version '
41 '%(chrome_version)s as stable.')
42
Chris Masone592cab52011-08-02 14:05:48 -070043# URLs that print lists of chrome revisions between two versions of the browser.
44_CHROME_VERSION_URL = ('http://omahaproxy.appspot.com/changelog?'
45 'old_version=%(old)s&new_version=%(new)s')
Chris Sosadd611df2012-02-03 15:26:23 -080046
47# Only print links when we rev these types.
48_REV_TYPES_FOR_LINKS = [constants.CHROME_REV_LATEST,
49 constants.CHROME_REV_STICKY]
Chris Masone592cab52011-08-02 14:05:48 -070050
51_CHROME_SVN_TAG = 'CROS_SVN_COMMIT'
Chris Sosadad0d322011-01-31 16:37:33 -080052
ChromeOS Developer03118eb2013-02-12 14:27:09 -080053
Peter Mayof65b8412011-08-26 01:22:21 -040054def _GetSvnUrl(base_url):
Chris Sosadad0d322011-01-31 16:37:33 -080055 """Returns the path to the svn url for the given chrome branch."""
Peter Mayof65b8412011-08-26 01:22:21 -040056 return os.path.join(base_url, 'trunk')
Chris Sosadad0d322011-01-31 16:37:33 -080057
58
petermayo@chromium.org163b3372011-09-12 02:06:05 -040059def _GetVersionContents(chrome_version_info):
Peter Mayo177500f2011-09-09 17:25:23 -040060 """Returns the current Chromium version, from the contents of a VERSION file.
Chris Sosadad0d322011-01-31 16:37:33 -080061
Peter Mayo177500f2011-09-09 17:25:23 -040062 Args:
63 chrome_version_info: The contents of a chromium VERSION file.
64 """
Chris Sosadad0d322011-01-31 16:37:33 -080065 chrome_version_array = []
Chris Sosadad0d322011-01-31 16:37:33 -080066 for line in chrome_version_info.splitlines():
67 chrome_version_array.append(line.rpartition('=')[2])
68
69 return '.'.join(chrome_version_array)
70
Mike Frysingercc838832014-05-24 13:10:30 -040071
petermayo@chromium.org163b3372011-09-12 02:06:05 -040072def _GetSpecificVersionUrl(base_url, revision, time_to_wait=600):
73 """Returns the Chromium version, from a repository URL and version.
Peter Mayo177500f2011-09-09 17:25:23 -040074
75 Args:
76 base_url: URL for the root of the chromium checkout.
petermayo@chromium.org163b3372011-09-12 02:06:05 -040077 revision: the SVN revision we want to use.
78 time_to_wait: the minimum period before abandoning our wait for the
79 desired revision to be present.
Peter Mayo177500f2011-09-09 17:25:23 -040080 """
petermayo@chromium.org163b3372011-09-12 02:06:05 -040081 svn_url = os.path.join(_GetSvnUrl(base_url), 'src', 'chrome', 'VERSION')
petermayo@chromium.org163b3372011-09-12 02:06:05 -040082 if not revision or not (int(revision) > 0):
83 raise Exception('Revision must be positive, got %s' % revision)
84
85 start = time.time()
86 # Use the fact we are SVN, hence ordered.
87 # Dodge the fact it will silently ignore the revision if it is not
88 # yet known. (i.e. too high)
ChromeOS Developer03118eb2013-02-12 14:27:09 -080089 repo_version = gclient.GetTipOfTrunkSvnRevision(base_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040090 while revision > repo_version:
91 if time.time() - start > time_to_wait:
92 raise Exception('Timeout Exceeeded')
93
David James1b363582012-12-17 11:53:11 -080094 msg = 'Repository only has version %s, looking for %s. Sleeping...'
95 cros_build_lib.Info(msg, repo_version, revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040096 time.sleep(30)
ChromeOS Developer03118eb2013-02-12 14:27:09 -080097 repo_version = gclient.GetTipOfTrunkSvnRevision(base_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040098
ChromeOS Developer03118eb2013-02-12 14:27:09 -080099 chrome_version_info = cros_build_lib.RunCommand(
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400100 ['svn', 'cat', '-r', revision, svn_url],
101 redirect_stdout=True,
102 error_message='Could not read version file at %s revision %s.' %
J. Richard Barnetted422f622011-11-17 09:39:46 -0800103 (svn_url, revision)).output
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400104
105 return _GetVersionContents(chrome_version_info)
106
Peter Mayo177500f2011-09-09 17:25:23 -0400107
108def _GetTipOfTrunkVersionFile(root):
109 """Returns the current Chromium version, from a file in a checkout.
110
111 Args:
112 root: path to the root of the chromium checkout.
113 """
114 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800115 chrome_version_info = cros_build_lib.RunCommand(
Peter Mayo177500f2011-09-09 17:25:23 -0400116 ['cat', version_file],
117 redirect_stdout=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800118 error_message='Could not read version file at %s.' % version_file).output
Peter Mayo177500f2011-09-09 17:25:23 -0400119
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400120 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400121
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800122
Yu-Ju Hong39806322014-06-24 16:46:32 -0700123def GetLatestRelease(base_url, branch=None):
Chris Sosadad0d322011-01-31 16:37:33 -0800124 """Gets the latest release version from the buildspec_url for the branch.
125
126 Args:
Don Garrett25f309a2014-03-19 14:02:12 -0700127 base_url: Base URL for the SVN repository.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500128 branch: If set, gets the latest release for branch, otherwise latest
Chris Sosadad0d322011-01-31 16:37:33 -0800129 release.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500130
Chris Sosadad0d322011-01-31 16:37:33 -0800131 Returns:
132 Latest version string.
133 """
Peter Mayof65b8412011-08-26 01:22:21 -0400134 buildspec_url = os.path.join(base_url, 'releases')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800135 svn_ls = cros_build_lib.RunCommand(['svn', 'ls', buildspec_url],
136 redirect_stdout=True).output
137 sorted_ls = cros_build_lib.RunCommand(['sort', '--version-sort', '-r'],
138 input=svn_ls,
139 redirect_stdout=True).output
Chris Sosadad0d322011-01-31 16:37:33 -0800140 if branch:
David James7c352bc2013-03-15 14:19:57 -0700141 chrome_version_re = re.compile(r'^%s\.\d+.*' % branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800142 else:
David James7c352bc2013-03-15 14:19:57 -0700143 chrome_version_re = re.compile(r'^[0-9]+\..*')
Chris Sosadad0d322011-01-31 16:37:33 -0800144
Peter Mayoad8173d2011-11-08 16:18:23 -0500145 for chrome_version in sorted_ls.splitlines():
J. Richard Barnetted422f622011-11-17 09:39:46 -0800146 if chrome_version_re.match(chrome_version):
147 deps_url = os.path.join(buildspec_url, chrome_version, 'DEPS')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800148 deps_check = cros_build_lib.RunCommand(['svn', 'ls', deps_url],
149 error_code_ok=True,
150 redirect_stdout=True).output
J. Richard Barnetted422f622011-11-17 09:39:46 -0800151 if deps_check == 'DEPS\n':
152 return chrome_version.rstrip('/')
Peter Mayoad8173d2011-11-08 16:18:23 -0500153
154 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800155
156
157def _GetStickyEBuild(stable_ebuilds):
158 """Returns the sticky ebuild."""
159 sticky_ebuilds = []
160 non_sticky_re = re.compile(_NON_STICKY_REGEX)
161 for ebuild in stable_ebuilds:
162 if not non_sticky_re.match(ebuild.version):
163 sticky_ebuilds.append(ebuild)
164
165 if not sticky_ebuilds:
166 raise Exception('No sticky ebuilds found')
167 elif len(sticky_ebuilds) > 1:
David James1b363582012-12-17 11:53:11 -0800168 cros_build_lib.Warning('More than one sticky ebuild found')
Chris Sosadad0d322011-01-31 16:37:33 -0800169
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800170 return portage_utilities.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800171
172
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800173class ChromeEBuild(portage_utilities.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800174 """Thin sub-class of EBuild that adds a chrome_version field."""
David James7c352bc2013-03-15 14:19:57 -0700175 chrome_version_re = re.compile(r'.*%s-(%s|9999).*' % (
David James629febb2012-11-25 13:07:34 -0800176 constants.CHROME_PN, _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800177 chrome_version = ''
178
179 def __init__(self, path):
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800180 portage_utilities.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800181 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
182 if re_match:
183 self.chrome_version = re_match.group(1)
184
Chris Sosadad0d322011-01-31 16:37:33 -0800185 def __str__(self):
186 return self.ebuild_path
187
188
189def FindChromeCandidates(overlay_dir):
190 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
191
192 Args:
193 overlay_dir: The path to chrome's portage overlay dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500194
Chris Sosadad0d322011-01-31 16:37:33 -0800195 Returns:
196 Tuple [unstable_ebuild, stable_ebuilds].
Mike Frysinger1a736a82013-12-12 01:50:59 -0500197
Chris Sosadad0d322011-01-31 16:37:33 -0800198 Raises:
199 Exception: if no unstable ebuild exists for Chrome.
200 """
201 stable_ebuilds = []
202 unstable_ebuilds = []
203 for path in [
204 os.path.join(overlay_dir, entry) for entry in os.listdir(overlay_dir)]:
205 if path.endswith('.ebuild'):
206 ebuild = ChromeEBuild(path)
207 if not ebuild.chrome_version:
David James1b363582012-12-17 11:53:11 -0800208 cros_build_lib.Warning('Poorly formatted ebuild found at %s' % path)
Chris Sosadad0d322011-01-31 16:37:33 -0800209 else:
210 if '9999' in ebuild.version:
211 unstable_ebuilds.append(ebuild)
212 else:
213 stable_ebuilds.append(ebuild)
214
215 # Apply some sanity checks.
216 if not unstable_ebuilds:
217 raise Exception('Missing 9999 ebuild for %s' % overlay_dir)
218 if not stable_ebuilds:
David James1b363582012-12-17 11:53:11 -0800219 cros_build_lib.Warning('Missing stable ebuild for %s' % overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800220
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800221 return portage_utilities.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800222
223
224def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
225 """Finds the Chrome uprev candidate for the given chrome_rev.
226
227 Using the pre-flight logic, this means the stable ebuild you are uprevving
228 from. The difference here is that the version could be different and in
229 that case we want to find it to delete it.
230
231 Args:
232 stable_ebuilds: A list of stable ebuilds.
233 chrome_rev: The chrome_rev designating which candidate to find.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500234 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800235 components. For example: 9.0.553. Can be None but not if chrome_rev
236 is CHROME_REV_STICKY.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500237
Chris Sosadad0d322011-01-31 16:37:33 -0800238 Returns:
Mike Frysinger1a736a82013-12-12 01:50:59 -0500239 The EBuild, otherwise None if none found.
Chris Sosadad0d322011-01-31 16:37:33 -0800240 """
241 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400242 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
243 constants.CHROME_REV_SPEC]:
244 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400245 # not just for the fun of confusion.
David James7c352bc2013-03-15 14:19:57 -0700246 chrome_branch_re = re.compile(r'%s.*_alpha.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800247 for ebuild in stable_ebuilds:
248 if chrome_branch_re.search(ebuild.version):
249 candidates.append(ebuild)
250
Ryan Cuic6e097d2011-06-16 12:23:14 -0700251 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800252 assert sticky_branch is not None
David James7c352bc2013-03-15 14:19:57 -0700253 chrome_branch_re = re.compile(r'%s\..*' % sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800254 for ebuild in stable_ebuilds:
255 if chrome_branch_re.search(ebuild.version):
256 candidates.append(ebuild)
257
258 else:
David James7c352bc2013-03-15 14:19:57 -0700259 chrome_branch_re = re.compile(r'%s.*_rc.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800260 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800261 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800262 candidates.append(ebuild)
263
264 if candidates:
J. Richard Barnettef6697cf2011-11-18 12:42:08 -0800265 return portage_utilities.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800266 else:
267 return None
268
Mike Frysingercc838832014-05-24 13:10:30 -0400269
Chris Masone592cab52011-08-02 14:05:48 -0700270def _AnnotateAndPrint(text, url):
271 """Add buildbot trappings to print <a href='url'>text</a> in the waterfall.
272
273 Args:
274 text: Anchor text for the link
275 url: the URL to which to link
276 """
Don Garrette60de902011-10-17 18:52:05 -0700277 print >> sys.stderr, '\n@@@STEP_LINK@%(text)s@%(url)s@@@' % { 'text': text,
Chris Masone592cab52011-08-02 14:05:48 -0700278 'url': url }
279
280def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
281 """Return appropriately formatted link to revision info, given versions
282
283 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
284 page that prints the Chromium revisions between those two versions.
285
286 Args:
287 old_chrome_version: version to diff from
288 chrome_version: version to which to diff
Mike Frysinger1a736a82013-12-12 01:50:59 -0500289
Chris Masone592cab52011-08-02 14:05:48 -0700290 Returns:
291 The desired URL.
292 """
293 return _CHROME_VERSION_URL % { 'old': old_chrome_version,
294 'new': chrome_version }
295
Chris Masone592cab52011-08-02 14:05:48 -0700296def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
297 """Returns a link to the list of revisions between two Chromium versions
298
299 Given two ChromeEBuilds and the kind of rev we're doing, generate a
300 link to a page that prints the Chromium changes between those two
301 revisions, inclusive.
302
303 Args:
304 old_chrome: ebuild for the version to diff from
305 new_chrome: ebuild for the version to which to diff
306 chrome_rev: one of constants.VALID_CHROME_REVISIONS
Mike Frysinger1a736a82013-12-12 01:50:59 -0500307
Chris Masone592cab52011-08-02 14:05:48 -0700308 Returns:
309 The desired URL.
310 """
Chris Sosadd611df2012-02-03 15:26:23 -0800311 assert chrome_rev in _REV_TYPES_FOR_LINKS
312 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
313 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800314
Mike Frysingercc838832014-05-24 13:10:30 -0400315
Chris Sosadad0d322011-01-31 16:37:33 -0800316def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_rev,
Chris Sosa9ba47752012-02-27 15:27:37 -0800317 chrome_version, commit, overlay_dir):
David James7c352bc2013-03-15 14:19:57 -0700318 r"""Uprevs the chrome ebuild specified by chrome_rev.
Chris Sosadad0d322011-01-31 16:37:33 -0800319
320 This is the main function that uprevs the chrome_rev from a stable candidate
321 to its new version.
322
323 Args:
324 stable_candidate: ebuild that corresponds to the stable ebuild we are
325 revving from. If None, builds the a new ebuild given the version
326 and logic for chrome_rev type with revision set to 1.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500327 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
Peter Mayo177500f2011-09-09 17:25:23 -0400328 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400329 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
330 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700331 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
332 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400333 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
334 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700335 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
336 are release candidates for the next sticky version.
337 constants.CHROME_REV_STICKY - Revs the sticky version.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500338 chrome_version: The \d.\d.\d.\d version of Chrome.
339 commit: Used with constants.CHROME_REV_TOT. The svn revision of chrome.
340 overlay_dir: Path to the chromeos-chrome package dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500341
Chris Sosadad0d322011-01-31 16:37:33 -0800342 Returns:
343 Full portage version atom (including rc's, etc) that was revved.
344 """
Chris Sosa8be39132011-04-14 12:09:24 -0700345 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
346 """Returns True if the new ebuild is redundant.
347
348 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700349 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700350 """
351 if not stable_ebuild:
352 return False
353
354 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700355 return filecmp.cmp(
356 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700357
David James629febb2012-11-25 13:07:34 -0800358 # Mark latest release and sticky branches as stable.
359 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
360 constants.CHROME_REV_SPEC,
361 constants.CHROME_REV_LOCAL]
362
Chris Sosadad0d322011-01-31 16:37:33 -0800363 # Case where we have the last stable candidate with same version just rev.
364 if stable_candidate and stable_candidate.chrome_version == chrome_version:
365 new_ebuild_path = '%s-r%d.ebuild' % (
366 stable_candidate.ebuild_path_no_revision,
367 stable_candidate.current_revision + 1)
368 else:
David James629febb2012-11-25 13:07:34 -0800369 suffix = 'rc' if mark_stable else 'alpha'
370 pf = '%s-%s_%s-r1' % (constants.CHROME_PN, chrome_version, suffix)
371 new_ebuild_path = os.path.join(overlay_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800372
David Jamesa6792552012-04-03 10:05:35 -0700373 chrome_variables = dict()
374 if commit:
375 chrome_variables[_CHROME_SVN_TAG] = commit
376
J. Richard Barnette0cfc5052011-11-28 14:31:39 -0800377 portage_utilities.EBuild.MarkAsStable(
David James065b2012012-04-01 14:51:11 -0700378 unstable_ebuild.ebuild_path, new_ebuild_path,
David Jamesa6792552012-04-03 10:05:35 -0700379 chrome_variables, make_stable=mark_stable)
Chris Sosadad0d322011-01-31 16:37:33 -0800380 new_ebuild = ChromeEBuild(new_ebuild_path)
Chris Sosa8be39132011-04-14 12:09:24 -0700381
382 # Determine whether this is ebuild is redundant.
383 if IsTheNewEBuildRedundant(new_ebuild, stable_candidate):
David James1b363582012-12-17 11:53:11 -0800384 msg = 'Previous ebuild with same version found and ebuild is redundant.'
385 cros_build_lib.Info(msg)
Chris Sosa8be39132011-04-14 12:09:24 -0700386 os.unlink(new_ebuild_path)
387 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800388
Chris Sosadd611df2012-02-03 15:26:23 -0800389 if stable_candidate and chrome_rev in _REV_TYPES_FOR_LINKS:
Chris Masone592cab52011-08-02 14:05:48 -0700390 _AnnotateAndPrint('Chromium revisions',
391 GetChromeRevisionListLink(stable_candidate,
392 new_ebuild,
393 chrome_rev))
394
David James67d73252013-09-19 17:33:12 -0700395 git.RunGit(overlay_dir, ['add', new_ebuild_path])
Chris Sosa9ba47752012-02-27 15:27:37 -0800396 if stable_candidate and not stable_candidate.IsSticky():
David James67d73252013-09-19 17:33:12 -0700397 git.RunGit(overlay_dir, ['rm', stable_candidate.ebuild_path])
Chris Sosadad0d322011-01-31 16:37:33 -0800398
J. Richard Barnette0cfc5052011-11-28 14:31:39 -0800399 portage_utilities.EBuild.CommitChange(
Chris Sosadad0d322011-01-31 16:37:33 -0800400 _GIT_COMMIT_MESSAGE % {'chrome_rev': chrome_rev,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400401 'chrome_version': chrome_version},
402 overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800403
Chris Sosadad0d322011-01-31 16:37:33 -0800404 return '%s-%s' % (new_ebuild.package, new_ebuild.version)
405
406
Chris Sosad53f8fd2011-10-21 15:15:19 -0700407def ParseMaxRevision(revision_list):
408 """Returns the max revision from a list of url@revision string."""
David James7c352bc2013-03-15 14:19:57 -0700409 revision_re = re.compile(r'.*@(\d+)')
Chris Sosad53f8fd2011-10-21 15:15:19 -0700410
411 def RevisionKey(revision):
412 return revision_re.match(revision).group(1)
413
414 max_revision = max(revision_list.split(), key=RevisionKey)
415 return max_revision.rpartition('@')[2]
416
417
David James1b363582012-12-17 11:53:11 -0800418def main(_argv):
Chris Sosa0f295aa2011-10-21 14:10:28 -0700419 usage_options = '|'.join(constants.VALID_CHROME_REVISIONS)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700420 usage = '%s OPTIONS [%s]' % (__file__, usage_options)
Chris Sosadad0d322011-01-31 16:37:33 -0800421 parser = optparse.OptionParser(usage)
David Jamescc09c9b2012-01-26 22:10:13 -0800422 parser.add_option('-b', '--boards', default='x86-generic')
David Jamesef74b1c2012-11-12 07:47:47 -0800423 parser.add_option('-c', '--chrome_url', default=gclient.GetBaseURLs()[0])
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400424 parser.add_option('-f', '--force_revision', default=None)
Chris Sosadad0d322011-01-31 16:37:33 -0800425 parser.add_option('-s', '--srcroot', default=os.path.join(os.environ['HOME'],
426 'trunk', 'src'),
427 help='Path to the src directory')
428 parser.add_option('-t', '--tracking_branch', default='cros/master',
429 help='Branch we are tracking changes against')
430 (options, args) = parser.parse_args()
431
Ryan Cuic6e097d2011-06-16 12:23:14 -0700432 if len(args) != 1 or args[0] not in constants.VALID_CHROME_REVISIONS:
433 parser.error('Commit requires arg set to one of %s.'
434 % constants.VALID_CHROME_REVISIONS)
Chris Sosadad0d322011-01-31 16:37:33 -0800435
436 overlay_dir = os.path.abspath(_CHROME_OVERLAY_DIR %
437 {'srcroot': options.srcroot})
438 chrome_rev = args[0]
439 version_to_uprev = None
440 commit_to_use = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800441 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800442
443 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800444
Peter Mayo177500f2011-09-09 17:25:23 -0400445 if chrome_rev == constants.CHROME_REV_LOCAL:
446 if 'CHROME_ROOT' in os.environ:
447 chrome_root = os.environ['CHROME_ROOT']
448 else:
449 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
450
451 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
452 commit_to_use = 'Unknown'
David James1b363582012-12-17 11:53:11 -0800453 cros_build_lib.Info('Using local source, versioning is untrustworthy.')
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400454 elif chrome_rev == constants.CHROME_REV_SPEC:
455 commit_to_use = options.force_revision
Mike Frysingerf02736e2013-11-08 15:27:00 -0500456 if '@' in commit_to_use:
457 commit_to_use = ParseMaxRevision(commit_to_use)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400458 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
459 commit_to_use)
Peter Mayo177500f2011-09-09 17:25:23 -0400460 elif chrome_rev == constants.CHROME_REV_TOT:
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800461 commit_to_use = gclient.GetTipOfTrunkSvnRevision(options.chrome_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400462 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
463 commit_to_use)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700464 elif chrome_rev == constants.CHROME_REV_LATEST:
Yu-Ju Hong39806322014-06-24 16:46:32 -0700465 version_to_uprev = GetLatestRelease(options.chrome_url)
Chris Sosadad0d322011-01-31 16:37:33 -0800466 else:
Chris Sosa9ba47752012-02-27 15:27:37 -0800467 sticky_ebuild = _GetStickyEBuild(stable_ebuilds)
468 sticky_version = sticky_ebuild.chrome_version
469 sticky_branch = sticky_version.rpartition('.')[0]
Yu-Ju Hong39806322014-06-24 16:46:32 -0700470 version_to_uprev = GetLatestRelease(options.chrome_url, sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800471
472 stable_candidate = FindChromeUprevCandidate(stable_ebuilds, chrome_rev,
473 sticky_branch)
474
475 if stable_candidate:
David James1b363582012-12-17 11:53:11 -0800476 cros_build_lib.Info('Stable candidate found %s' % stable_candidate)
Chris Sosadad0d322011-01-31 16:37:33 -0800477 else:
David James1b363582012-12-17 11:53:11 -0800478 cros_build_lib.Info('No stable candidate found.')
Chris Sosadad0d322011-01-31 16:37:33 -0800479
Chris Sosa8049f3b2011-05-02 20:09:28 -0700480 tracking_branch = 'remotes/m/%s' % os.path.basename(options.tracking_branch)
David James97d95872012-11-16 15:09:56 -0800481 existing_branch = git.GetCurrentBranch(overlay_dir)
Ryan Cui05a31ba2011-05-31 17:47:37 -0700482 work_branch = cros_mark_as_stable.GitBranch(constants.STABLE_EBUILD_BRANCH,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400483 tracking_branch, overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800484 work_branch.CreateBranch()
David Jamesd6708c02012-03-22 10:49:15 -0700485
486 # In the case of uprevving overlays that have patches applied to them,
487 # include the patched changes in the stabilizing branch.
488 if existing_branch:
David James67d73252013-09-19 17:33:12 -0700489 git.RunGit(overlay_dir, ['rebase', existing_branch])
David Jamesd6708c02012-03-22 10:49:15 -0700490
Chris Sosadad0d322011-01-31 16:37:33 -0800491 chrome_version_atom = MarkChromeEBuildAsStable(
492 stable_candidate, unstable_ebuild, chrome_rev, version_to_uprev,
Chris Sosa9ba47752012-02-27 15:27:37 -0800493 commit_to_use, overlay_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800494 # Explicit print to communicate to caller.
495 if chrome_version_atom:
David Jamescc09c9b2012-01-26 22:10:13 -0800496 cros_mark_as_stable.CleanStalePackages(options.boards.split(':'),
497 [chrome_version_atom])
Chris Sosadad0d322011-01-31 16:37:33 -0800498 print 'CHROME_VERSION_ATOM=%s' % chrome_version_atom