blob: 0a453438144e84bc1faba1524a2a179a04f26807 [file] [log] [blame]
Chris Sosa9ba47752012-02-27 15:27:37 -08001# Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Chris Sosadad0d322011-01-31 16:37:33 -08002# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
4
5"""This module uprevs Chrome for cbuildbot.
6
7After calling, it prints outs CHROME_VERSION_ATOM=(version atom string). A
8caller could then use this atom with emerge to build the newly uprevved version
9of Chrome e.g.
10
11./cros_mark_chrome_as_stable tot
12Returns chrome-base/chromeos-chrome-8.0.552.0_alpha_r1
13
14emerge-x86-generic =chrome-base/chromeos-chrome-8.0.552.0_alpha_r1
15"""
16
Mike Frysinger383367e2014-09-16 15:06:17 -040017from __future__ import print_function
18
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070019import base64
20import distutils.version
Chris Sosa8be39132011-04-14 12:09:24 -070021import filecmp
Mike Frysingerb0b0caa2015-11-07 01:05:18 -050022import optparse # pylint: disable=deprecated-module
Chris Sosadad0d322011-01-31 16:37:33 -080023import os
24import re
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070025import urlparse
Chris Sosadad0d322011-01-31 16:37:33 -080026
Don Garrett88b8d782014-05-13 17:30:55 -070027from chromite.cbuildbot import constants
David James1b363582012-12-17 11:53:11 -080028from chromite.lib import cros_build_lib
Ralph Nathan03047282015-03-23 11:09:32 -070029from chromite.lib import cros_logging as logging
David James97d95872012-11-16 15:09:56 -080030from chromite.lib import git
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070031from chromite.lib import gob_util
Alex Deymo075c2292014-09-04 18:31:50 -070032from chromite.lib import portage_util
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070033from chromite.lib import timeout_util
Mike Frysinger6cb624a2012-05-24 18:17:38 -040034from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080035
Mike Frysinger750c5f52014-09-16 16:16:57 -040036
Chris Sosadad0d322011-01-31 16:37:33 -080037# Helper regex's for finding ebuilds.
David James7c352bc2013-03-15 14:19:57 -070038_CHROME_VERSION_REGEX = r'\d+\.\d+\.\d+\.\d+'
39_NON_STICKY_REGEX = r'%s[(_rc.*)|(_alpha.*)]+' % _CHROME_VERSION_REGEX
Chris Sosadad0d322011-01-31 16:37:33 -080040
41# Dir where all the action happens.
David Zeuthen665d3132014-08-25 15:27:02 -040042_OVERLAY_DIR = '%(srcroot)s/third_party/chromiumos-overlay/'
Chris Sosadad0d322011-01-31 16:37:33 -080043
David Zeuthen665d3132014-08-25 15:27:02 -040044_GIT_COMMIT_MESSAGE = ('Marking %(chrome_rev)s for %(chrome_pn)s ebuild '
45 'with version %(chrome_version)s as stable.')
Chris Sosadad0d322011-01-31 16:37:33 -080046
Chris Masone592cab52011-08-02 14:05:48 -070047# URLs that print lists of chrome revisions between two versions of the browser.
48_CHROME_VERSION_URL = ('http://omahaproxy.appspot.com/changelog?'
49 'old_version=%(old)s&new_version=%(new)s')
Chris Sosadd611df2012-02-03 15:26:23 -080050
51# Only print links when we rev these types.
52_REV_TYPES_FOR_LINKS = [constants.CHROME_REV_LATEST,
53 constants.CHROME_REV_STICKY]
Chris Masone592cab52011-08-02 14:05:48 -070054
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070055# TODO(szager): This is inaccurate, but is it safe to change? I have no idea.
Chris Masone592cab52011-08-02 14:05:48 -070056_CHROME_SVN_TAG = 'CROS_SVN_COMMIT'
Chris Sosadad0d322011-01-31 16:37:33 -080057
ChromeOS Developer03118eb2013-02-12 14:27:09 -080058
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:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -040063 chrome_version_info: The contents of a chromium VERSION file.
Peter Mayo177500f2011-09-09 17:25:23 -040064 """
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
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070072def _GetSpecificVersionUrl(git_url, revision, time_to_wait=600):
petermayo@chromium.org163b3372011-09-12 02:06:05 -040073 """Returns the Chromium version, from a repository URL and version.
Peter Mayo177500f2011-09-09 17:25:23 -040074
75 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -040076 git_url: Repository URL for chromium.
77 revision: the git 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 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070081 parsed_url = urlparse.urlparse(git_url)
82 host = parsed_url[1]
83 path = parsed_url[2].rstrip('/') + (
84 '/+/%s/chrome/VERSION?format=text' % revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040085
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070086 # Allow for git repository replication lag with sleep/retry loop.
87 def _fetch():
88 fh = gob_util.FetchUrl(host, path, ignore_404=True)
89 return fh.read() if fh else None
petermayo@chromium.org163b3372011-09-12 02:06:05 -040090
Mike Frysingercc55c782014-12-03 22:32:08 -050091 def _wait_msg(_remaining):
Ralph Nathan03047282015-03-23 11:09:32 -070092 logging.info('Repository does not yet have revision %s. Sleeping...',
93 revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040094
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070095 content = timeout_util.WaitForSuccess(
96 retry_check=lambda x: not bool(x),
97 func=_fetch,
98 timeout=time_to_wait,
99 period=30,
100 side_effect_func=_wait_msg)
101 return _GetVersionContents(base64.b64decode(content))
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400102
Peter Mayo177500f2011-09-09 17:25:23 -0400103
104def _GetTipOfTrunkVersionFile(root):
105 """Returns the current Chromium version, from a file in a checkout.
106
107 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -0400108 root: path to the root of the chromium checkout.
Peter Mayo177500f2011-09-09 17:25:23 -0400109 """
110 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800111 chrome_version_info = cros_build_lib.RunCommand(
Peter Mayo177500f2011-09-09 17:25:23 -0400112 ['cat', version_file],
113 redirect_stdout=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800114 error_message='Could not read version file at %s.' % version_file).output
Peter Mayo177500f2011-09-09 17:25:23 -0400115
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400116 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400117
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800118
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700119def CheckIfChromeRightForOS(deps_content):
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700120 """Checks if DEPS is right for Chrome OS.
121
122 This function checks for a variable called 'buildspec_platforms' to
123 find out if its 'chromeos' or 'all'. If any of those values,
124 then it chooses that DEPS.
125
126 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700127 deps_content: Content of release buildspec DEPS file.
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700128
129 Returns:
130 True if DEPS is the right Chrome for Chrome OS.
131 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700132 platforms_search = re.search(r'buildspec_platforms.*\s.*\s', deps_content)
Dharani Govindancbbf69c2014-07-29 15:37:39 -0700133
134 if platforms_search:
135 platforms = platforms_search.group()
136 if 'chromeos' in platforms or 'all' in platforms:
137 return True
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700138
139 return False
140
141
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700142def GetLatestRelease(git_url, branch=None):
143 """Gets the latest release version from the release tags in the repository.
Chris Sosadad0d322011-01-31 16:37:33 -0800144
145 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700146 git_url: URL of git repository.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500147 branch: If set, gets the latest release for branch, otherwise latest
Chris Sosadad0d322011-01-31 16:37:33 -0800148 release.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500149
Chris Sosadad0d322011-01-31 16:37:33 -0800150 Returns:
151 Latest version string.
152 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700153 # TODO(szager): This only works for public release buildspecs in the chromium
154 # src repository. Internal buildspecs are tracked differently. At the time
155 # of writing, I can't find any callers that use this method to scan for
156 # internal buildspecs. But there may be something lurking...
157
158 parsed_url = urlparse.urlparse(git_url)
159 path = parsed_url[2].rstrip('/') + '/+refs/tags?format=JSON'
160 j = gob_util.FetchUrlJson(parsed_url[1], path, ignore_404=False)
Chris Sosadad0d322011-01-31 16:37:33 -0800161 if branch:
David James7c352bc2013-03-15 14:19:57 -0700162 chrome_version_re = re.compile(r'^%s\.\d+.*' % branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800163 else:
David James7c352bc2013-03-15 14:19:57 -0700164 chrome_version_re = re.compile(r'^[0-9]+\..*')
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700165 matching_versions = [key for key in j.keys() if chrome_version_re.match(key)]
166 matching_versions.sort(key=distutils.version.LooseVersion)
167 for chrome_version in reversed(matching_versions):
168 path = parsed_url[2].rstrip() + (
169 '/+/refs/tags/%s/DEPS?format=text' % chrome_version)
170 fh = gob_util.FetchUrl(parsed_url[1], path, ignore_404=False)
171 content = fh.read() if fh else None
172 if content:
173 deps_content = base64.b64decode(content)
174 if CheckIfChromeRightForOS(deps_content):
175 return chrome_version
Peter Mayoad8173d2011-11-08 16:18:23 -0500176
177 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800178
179
180def _GetStickyEBuild(stable_ebuilds):
181 """Returns the sticky ebuild."""
182 sticky_ebuilds = []
183 non_sticky_re = re.compile(_NON_STICKY_REGEX)
184 for ebuild in stable_ebuilds:
185 if not non_sticky_re.match(ebuild.version):
186 sticky_ebuilds.append(ebuild)
187
188 if not sticky_ebuilds:
189 raise Exception('No sticky ebuilds found')
190 elif len(sticky_ebuilds) > 1:
Ralph Nathan446aee92015-03-23 14:44:56 -0700191 logging.warning('More than one sticky ebuild found')
Chris Sosadad0d322011-01-31 16:37:33 -0800192
Alex Deymo075c2292014-09-04 18:31:50 -0700193 return portage_util.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800194
195
Alex Deymo075c2292014-09-04 18:31:50 -0700196class ChromeEBuild(portage_util.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800197 """Thin sub-class of EBuild that adds a chrome_version field."""
David Zeuthen665d3132014-08-25 15:27:02 -0400198 chrome_version_re = re.compile(r'.*-(%s|9999).*' % (
199 _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800200 chrome_version = ''
201
202 def __init__(self, path):
Alex Deymo075c2292014-09-04 18:31:50 -0700203 portage_util.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800204 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
205 if re_match:
206 self.chrome_version = re_match.group(1)
207
Chris Sosadad0d322011-01-31 16:37:33 -0800208 def __str__(self):
209 return self.ebuild_path
210
211
David Zeuthen665d3132014-08-25 15:27:02 -0400212def FindChromeCandidates(package_dir):
Chris Sosadad0d322011-01-31 16:37:33 -0800213 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
214
215 Args:
David Zeuthen665d3132014-08-25 15:27:02 -0400216 package_dir: The path to where the package ebuild is stored.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500217
Chris Sosadad0d322011-01-31 16:37:33 -0800218 Returns:
219 Tuple [unstable_ebuild, stable_ebuilds].
Mike Frysinger1a736a82013-12-12 01:50:59 -0500220
Chris Sosadad0d322011-01-31 16:37:33 -0800221 Raises:
222 Exception: if no unstable ebuild exists for Chrome.
223 """
224 stable_ebuilds = []
225 unstable_ebuilds = []
226 for path in [
David Zeuthen665d3132014-08-25 15:27:02 -0400227 os.path.join(package_dir, entry) for entry in os.listdir(package_dir)]:
Chris Sosadad0d322011-01-31 16:37:33 -0800228 if path.endswith('.ebuild'):
229 ebuild = ChromeEBuild(path)
230 if not ebuild.chrome_version:
Ralph Nathan446aee92015-03-23 14:44:56 -0700231 logging.warning('Poorly formatted ebuild found at %s' % path)
Chris Sosadad0d322011-01-31 16:37:33 -0800232 else:
233 if '9999' in ebuild.version:
234 unstable_ebuilds.append(ebuild)
235 else:
236 stable_ebuilds.append(ebuild)
237
238 # Apply some sanity checks.
239 if not unstable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400240 raise Exception('Missing 9999 ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800241 if not stable_ebuilds:
Ralph Nathan446aee92015-03-23 14:44:56 -0700242 logging.warning('Missing stable ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800243
Alex Deymo075c2292014-09-04 18:31:50 -0700244 return portage_util.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800245
246
247def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
248 """Finds the Chrome uprev candidate for the given chrome_rev.
249
250 Using the pre-flight logic, this means the stable ebuild you are uprevving
251 from. The difference here is that the version could be different and in
252 that case we want to find it to delete it.
253
254 Args:
255 stable_ebuilds: A list of stable ebuilds.
256 chrome_rev: The chrome_rev designating which candidate to find.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500257 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800258 components. For example: 9.0.553. Can be None but not if chrome_rev
259 is CHROME_REV_STICKY.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500260
Chris Sosadad0d322011-01-31 16:37:33 -0800261 Returns:
Mike Frysinger1a736a82013-12-12 01:50:59 -0500262 The EBuild, otherwise None if none found.
Chris Sosadad0d322011-01-31 16:37:33 -0800263 """
264 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400265 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
266 constants.CHROME_REV_SPEC]:
267 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400268 # not just for the fun of confusion.
David James7c352bc2013-03-15 14:19:57 -0700269 chrome_branch_re = re.compile(r'%s.*_alpha.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800270 for ebuild in stable_ebuilds:
271 if chrome_branch_re.search(ebuild.version):
272 candidates.append(ebuild)
273
Ryan Cuic6e097d2011-06-16 12:23:14 -0700274 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800275 assert sticky_branch is not None
David James7c352bc2013-03-15 14:19:57 -0700276 chrome_branch_re = re.compile(r'%s\..*' % sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800277 for ebuild in stable_ebuilds:
278 if chrome_branch_re.search(ebuild.version):
279 candidates.append(ebuild)
280
281 else:
David James7c352bc2013-03-15 14:19:57 -0700282 chrome_branch_re = re.compile(r'%s.*_rc.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800283 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800284 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800285 candidates.append(ebuild)
286
287 if candidates:
Alex Deymo075c2292014-09-04 18:31:50 -0700288 return portage_util.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800289 else:
290 return None
291
Mike Frysingercc838832014-05-24 13:10:30 -0400292
Chris Masone592cab52011-08-02 14:05:48 -0700293def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
294 """Return appropriately formatted link to revision info, given versions
295
296 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
297 page that prints the Chromium revisions between those two versions.
298
299 Args:
300 old_chrome_version: version to diff from
301 chrome_version: version to which to diff
Mike Frysinger1a736a82013-12-12 01:50:59 -0500302
Chris Masone592cab52011-08-02 14:05:48 -0700303 Returns:
304 The desired URL.
305 """
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500306 return _CHROME_VERSION_URL % {'old': old_chrome_version,
307 'new': chrome_version}
Chris Masone592cab52011-08-02 14:05:48 -0700308
Mike Frysinger750c5f52014-09-16 16:16:57 -0400309
Chris Masone592cab52011-08-02 14:05:48 -0700310def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
311 """Returns a link to the list of revisions between two Chromium versions
312
313 Given two ChromeEBuilds and the kind of rev we're doing, generate a
314 link to a page that prints the Chromium changes between those two
315 revisions, inclusive.
316
317 Args:
318 old_chrome: ebuild for the version to diff from
319 new_chrome: ebuild for the version to which to diff
320 chrome_rev: one of constants.VALID_CHROME_REVISIONS
Mike Frysinger1a736a82013-12-12 01:50:59 -0500321
Chris Masone592cab52011-08-02 14:05:48 -0700322 Returns:
323 The desired URL.
324 """
Chris Sosadd611df2012-02-03 15:26:23 -0800325 assert chrome_rev in _REV_TYPES_FOR_LINKS
326 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
327 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800328
Mike Frysingercc838832014-05-24 13:10:30 -0400329
David Zeuthen665d3132014-08-25 15:27:02 -0400330def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_pn,
331 chrome_rev, chrome_version, commit, package_dir):
David James7c352bc2013-03-15 14:19:57 -0700332 r"""Uprevs the chrome ebuild specified by chrome_rev.
Chris Sosadad0d322011-01-31 16:37:33 -0800333
334 This is the main function that uprevs the chrome_rev from a stable candidate
335 to its new version.
336
337 Args:
338 stable_candidate: ebuild that corresponds to the stable ebuild we are
339 revving from. If None, builds the a new ebuild given the version
340 and logic for chrome_rev type with revision set to 1.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500341 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400342 chrome_pn: package name.
Peter Mayo177500f2011-09-09 17:25:23 -0400343 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400344 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
345 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700346 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
347 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400348 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
349 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700350 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
351 are release candidates for the next sticky version.
352 constants.CHROME_REV_STICKY - Revs the sticky version.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500353 chrome_version: The \d.\d.\d.\d version of Chrome.
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700354 commit: Used with constants.CHROME_REV_TOT. The git revision of chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400355 package_dir: Path to the chromeos-chrome package dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500356
Chris Sosadad0d322011-01-31 16:37:33 -0800357 Returns:
358 Full portage version atom (including rc's, etc) that was revved.
359 """
Chris Sosa8be39132011-04-14 12:09:24 -0700360 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
361 """Returns True if the new ebuild is redundant.
362
363 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700364 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700365 """
366 if not stable_ebuild:
367 return False
368
369 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700370 return filecmp.cmp(
371 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700372
David James629febb2012-11-25 13:07:34 -0800373 # Mark latest release and sticky branches as stable.
374 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
375 constants.CHROME_REV_SPEC,
376 constants.CHROME_REV_LOCAL]
377
Chris Sosadad0d322011-01-31 16:37:33 -0800378 # Case where we have the last stable candidate with same version just rev.
379 if stable_candidate and stable_candidate.chrome_version == chrome_version:
380 new_ebuild_path = '%s-r%d.ebuild' % (
381 stable_candidate.ebuild_path_no_revision,
382 stable_candidate.current_revision + 1)
383 else:
David James629febb2012-11-25 13:07:34 -0800384 suffix = 'rc' if mark_stable else 'alpha'
David Zeuthen665d3132014-08-25 15:27:02 -0400385 pf = '%s-%s_%s-r1' % (chrome_pn, chrome_version, suffix)
386 new_ebuild_path = os.path.join(package_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800387
David Jamesa6792552012-04-03 10:05:35 -0700388 chrome_variables = dict()
389 if commit:
390 chrome_variables[_CHROME_SVN_TAG] = commit
391
Alex Deymo075c2292014-09-04 18:31:50 -0700392 portage_util.EBuild.MarkAsStable(
David James065b2012012-04-01 14:51:11 -0700393 unstable_ebuild.ebuild_path, new_ebuild_path,
David Jamesa6792552012-04-03 10:05:35 -0700394 chrome_variables, make_stable=mark_stable)
Chris Sosadad0d322011-01-31 16:37:33 -0800395 new_ebuild = ChromeEBuild(new_ebuild_path)
Chris Sosa8be39132011-04-14 12:09:24 -0700396
397 # Determine whether this is ebuild is redundant.
398 if IsTheNewEBuildRedundant(new_ebuild, stable_candidate):
David James1b363582012-12-17 11:53:11 -0800399 msg = 'Previous ebuild with same version found and ebuild is redundant.'
Ralph Nathan03047282015-03-23 11:09:32 -0700400 logging.info(msg)
Chris Sosa8be39132011-04-14 12:09:24 -0700401 os.unlink(new_ebuild_path)
402 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800403
Chris Sosadd611df2012-02-03 15:26:23 -0800404 if stable_candidate and chrome_rev in _REV_TYPES_FOR_LINKS:
David Riley3e3f64e2016-02-03 08:17:55 -0800405 logging.PrintBuildbotLink('Chromium revisions',
406 GetChromeRevisionListLink(stable_candidate,
407 new_ebuild, chrome_rev))
Chris Masone592cab52011-08-02 14:05:48 -0700408
David Zeuthen665d3132014-08-25 15:27:02 -0400409 git.RunGit(package_dir, ['add', new_ebuild_path])
Chris Sosa9ba47752012-02-27 15:27:37 -0800410 if stable_candidate and not stable_candidate.IsSticky():
David Zeuthen665d3132014-08-25 15:27:02 -0400411 git.RunGit(package_dir, ['rm', stable_candidate.ebuild_path])
Chris Sosadad0d322011-01-31 16:37:33 -0800412
Alex Deymo075c2292014-09-04 18:31:50 -0700413 portage_util.EBuild.CommitChange(
David Zeuthen665d3132014-08-25 15:27:02 -0400414 _GIT_COMMIT_MESSAGE % {'chrome_pn': chrome_pn,
415 'chrome_rev': chrome_rev,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400416 'chrome_version': chrome_version},
David Zeuthen665d3132014-08-25 15:27:02 -0400417 package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800418
Chris Sosadad0d322011-01-31 16:37:33 -0800419 return '%s-%s' % (new_ebuild.package, new_ebuild.version)
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)
Yu-Ju Hong575b3662014-08-05 13:33:41 -0700426 parser.add_option('-b', '--boards', default=None)
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700427 parser.add_option('-c', '--chrome_url',
428 default=constants.CHROMIUM_GOB_URL)
David Jamesfb160012014-07-01 10:00:57 -0700429 parser.add_option('-f', '--force_version', default=None,
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700430 help='Chrome version or git revision hash to use')
Chris Sosadad0d322011-01-31 16:37:33 -0800431 parser.add_option('-s', '--srcroot', default=os.path.join(os.environ['HOME'],
432 'trunk', 'src'),
433 help='Path to the src directory')
434 parser.add_option('-t', '--tracking_branch', default='cros/master',
435 help='Branch we are tracking changes against')
436 (options, args) = parser.parse_args()
437
Ryan Cuic6e097d2011-06-16 12:23:14 -0700438 if len(args) != 1 or args[0] not in constants.VALID_CHROME_REVISIONS:
439 parser.error('Commit requires arg set to one of %s.'
440 % constants.VALID_CHROME_REVISIONS)
Chris Sosadad0d322011-01-31 16:37:33 -0800441
David James9a5980e2014-07-16 09:37:00 -0700442 if options.force_version and args[0] not in (constants.CHROME_REV_SPEC,
443 constants.CHROME_REV_LATEST):
David Jamesfb160012014-07-01 10:00:57 -0700444 parser.error('--force_version is not compatible with the %r '
445 'option.' % (args[0],))
446
David Zeuthen665d3132014-08-25 15:27:02 -0400447 overlay_dir = os.path.abspath(_OVERLAY_DIR % {'srcroot': options.srcroot})
448 chrome_package_dir = os.path.join(overlay_dir, constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -0800449 chrome_rev = args[0]
450 version_to_uprev = None
451 commit_to_use = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800452 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800453
David Zeuthen665d3132014-08-25 15:27:02 -0400454 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800455
Peter Mayo177500f2011-09-09 17:25:23 -0400456 if chrome_rev == constants.CHROME_REV_LOCAL:
457 if 'CHROME_ROOT' in os.environ:
458 chrome_root = os.environ['CHROME_ROOT']
459 else:
460 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
461
462 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
463 commit_to_use = 'Unknown'
Ralph Nathan03047282015-03-23 11:09:32 -0700464 logging.info('Using local source, versioning is untrustworthy.')
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400465 elif chrome_rev == constants.CHROME_REV_SPEC:
David Jamesfb160012014-07-01 10:00:57 -0700466 if '.' in options.force_version:
467 version_to_uprev = options.force_version
468 else:
469 commit_to_use = options.force_version
470 if '@' in commit_to_use:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700471 commit_to_use = commit_to_use.rpartition('@')[2]
David Jamesfb160012014-07-01 10:00:57 -0700472 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
473 commit_to_use)
Peter Mayo177500f2011-09-09 17:25:23 -0400474 elif chrome_rev == constants.CHROME_REV_TOT:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700475 commit_to_use = gob_util.GetTipOfTrunkRevision(options.chrome_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400476 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
477 commit_to_use)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700478 elif chrome_rev == constants.CHROME_REV_LATEST:
David James9a5980e2014-07-16 09:37:00 -0700479 if options.force_version:
480 if '.' not in options.force_version:
481 parser.error('%s only accepts released Chrome versions, not SVN or '
482 'Git revisions.' % (chrome_rev,))
483 version_to_uprev = options.force_version
484 else:
485 version_to_uprev = GetLatestRelease(options.chrome_url)
Chris Sosadad0d322011-01-31 16:37:33 -0800486 else:
Chris Sosa9ba47752012-02-27 15:27:37 -0800487 sticky_ebuild = _GetStickyEBuild(stable_ebuilds)
488 sticky_version = sticky_ebuild.chrome_version
489 sticky_branch = sticky_version.rpartition('.')[0]
Yu-Ju Hong39806322014-06-24 16:46:32 -0700490 version_to_uprev = GetLatestRelease(options.chrome_url, sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800491
492 stable_candidate = FindChromeUprevCandidate(stable_ebuilds, chrome_rev,
493 sticky_branch)
494
495 if stable_candidate:
Ralph Nathan03047282015-03-23 11:09:32 -0700496 logging.info('Stable candidate found %s' % stable_candidate)
Chris Sosadad0d322011-01-31 16:37:33 -0800497 else:
Ralph Nathan03047282015-03-23 11:09:32 -0700498 logging.info('No stable candidate found.')
Chris Sosadad0d322011-01-31 16:37:33 -0800499
Chris Sosa8049f3b2011-05-02 20:09:28 -0700500 tracking_branch = 'remotes/m/%s' % os.path.basename(options.tracking_branch)
David Zeuthen665d3132014-08-25 15:27:02 -0400501 existing_branch = git.GetCurrentBranch(chrome_package_dir)
Ryan Cui05a31ba2011-05-31 17:47:37 -0700502 work_branch = cros_mark_as_stable.GitBranch(constants.STABLE_EBUILD_BRANCH,
David Zeuthen665d3132014-08-25 15:27:02 -0400503 tracking_branch,
504 chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800505 work_branch.CreateBranch()
David Jamesd6708c02012-03-22 10:49:15 -0700506
507 # In the case of uprevving overlays that have patches applied to them,
508 # include the patched changes in the stabilizing branch.
509 if existing_branch:
David Zeuthen665d3132014-08-25 15:27:02 -0400510 git.RunGit(chrome_package_dir, ['rebase', existing_branch])
David Jamesd6708c02012-03-22 10:49:15 -0700511
Chris Sosadad0d322011-01-31 16:37:33 -0800512 chrome_version_atom = MarkChromeEBuildAsStable(
David Zeuthen665d3132014-08-25 15:27:02 -0400513 stable_candidate, unstable_ebuild, 'chromeos-chrome', chrome_rev,
514 version_to_uprev, commit_to_use, chrome_package_dir)
Yu-Ju Hong078c9ec2014-08-06 18:25:16 -0700515 if chrome_version_atom:
516 if options.boards:
David James96c2c992015-07-14 10:21:50 -0700517 cros_mark_as_stable.CleanStalePackages(options.srcroot,
518 options.boards.split(':'),
Yu-Ju Hong078c9ec2014-08-06 18:25:16 -0700519 [chrome_version_atom])
David Zeuthen665d3132014-08-25 15:27:02 -0400520
521 # If we did rev Chrome, now is a good time to uprev other packages.
522 for other_ebuild in constants.OTHER_CHROME_PACKAGES:
523 other_ebuild_name = os.path.basename(other_ebuild)
524 other_package_dir = os.path.join(overlay_dir, other_ebuild)
525 (other_unstable_ebuild, other_stable_ebuilds) = FindChromeCandidates(
526 other_package_dir)
527 other_stable_candidate = FindChromeUprevCandidate(other_stable_ebuilds,
528 chrome_rev,
529 sticky_branch)
530 revved_atom = MarkChromeEBuildAsStable(other_stable_candidate,
531 other_unstable_ebuild,
532 other_ebuild_name,
533 chrome_rev, version_to_uprev,
534 commit_to_use, other_package_dir)
535 if revved_atom and options.boards:
David James96c2c992015-07-14 10:21:50 -0700536 cros_mark_as_stable.CleanStalePackages(options.srcroot,
537 options.boards.split(':'),
David Zeuthen665d3132014-08-25 15:27:02 -0400538 [revved_atom])
539
540 # Explicit print to communicate to caller.
541 if chrome_version_atom:
Mike Frysinger383367e2014-09-16 15:06:17 -0400542 print('CHROME_VERSION_ATOM=%s' % chrome_version_atom)