blob: 3b28cb5b627481d4e7b82bc1d242bacd875dc6ea [file] [log] [blame]
Mike Frysingere58c0e22017-10-04 15:43:30 -04001# -*- coding: utf-8 -*-
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
Mike Frysinger383367e2014-09-16 15:06:17 -040018from __future__ import print_function
19
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070020import base64
21import distutils.version
Chris Sosa8be39132011-04-14 12:09:24 -070022import filecmp
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
Aviv Keshetb7519e12016-10-04 00:50:00 -070027from chromite.lib import constants
Mike Frysingera13c04f2016-09-01 00:35:17 -040028from chromite.lib import commandline
David James1b363582012-12-17 11:53:11 -080029from chromite.lib import cros_build_lib
Ralph Nathan03047282015-03-23 11:09:32 -070030from chromite.lib import cros_logging as logging
David James97d95872012-11-16 15:09:56 -080031from chromite.lib import git
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070032from chromite.lib import gob_util
Alex Deymo075c2292014-09-04 18:31:50 -070033from chromite.lib import portage_util
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070034from chromite.lib import timeout_util
Mike Frysinger6cb624a2012-05-24 18:17:38 -040035from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080036
Mike Frysinger750c5f52014-09-16 16:16:57 -040037
Chris Sosadad0d322011-01-31 16:37:33 -080038# Helper regex's for finding ebuilds.
David James7c352bc2013-03-15 14:19:57 -070039_CHROME_VERSION_REGEX = r'\d+\.\d+\.\d+\.\d+'
40_NON_STICKY_REGEX = r'%s[(_rc.*)|(_alpha.*)]+' % _CHROME_VERSION_REGEX
Chris Sosadad0d322011-01-31 16:37:33 -080041
42# Dir where all the action happens.
David Zeuthen665d3132014-08-25 15:27:02 -040043_OVERLAY_DIR = '%(srcroot)s/third_party/chromiumos-overlay/'
Chris Sosadad0d322011-01-31 16:37:33 -080044
David Zeuthen665d3132014-08-25 15:27:02 -040045_GIT_COMMIT_MESSAGE = ('Marking %(chrome_rev)s for %(chrome_pn)s ebuild '
46 'with version %(chrome_version)s as stable.')
Chris Sosadad0d322011-01-31 16:37:33 -080047
Chris Masone592cab52011-08-02 14:05:48 -070048# URLs that print lists of chrome revisions between two versions of the browser.
49_CHROME_VERSION_URL = ('http://omahaproxy.appspot.com/changelog?'
50 'old_version=%(old)s&new_version=%(new)s')
Chris Sosadd611df2012-02-03 15:26:23 -080051
52# Only print links when we rev these types.
53_REV_TYPES_FOR_LINKS = [constants.CHROME_REV_LATEST,
54 constants.CHROME_REV_STICKY]
Chris Masone592cab52011-08-02 14:05:48 -070055
ChromeOS Developer03118eb2013-02-12 14:27:09 -080056
petermayo@chromium.org163b3372011-09-12 02:06:05 -040057def _GetVersionContents(chrome_version_info):
Peter Mayo177500f2011-09-09 17:25:23 -040058 """Returns the current Chromium version, from the contents of a VERSION file.
Chris Sosadad0d322011-01-31 16:37:33 -080059
Peter Mayo177500f2011-09-09 17:25:23 -040060 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -040061 chrome_version_info: The contents of a chromium VERSION file.
Peter Mayo177500f2011-09-09 17:25:23 -040062 """
Chris Sosadad0d322011-01-31 16:37:33 -080063 chrome_version_array = []
Chris Sosadad0d322011-01-31 16:37:33 -080064 for line in chrome_version_info.splitlines():
65 chrome_version_array.append(line.rpartition('=')[2])
66
67 return '.'.join(chrome_version_array)
68
Mike Frysingercc838832014-05-24 13:10:30 -040069
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070070def _GetSpecificVersionUrl(git_url, revision, time_to_wait=600):
petermayo@chromium.org163b3372011-09-12 02:06:05 -040071 """Returns the Chromium version, from a repository URL and version.
Peter Mayo177500f2011-09-09 17:25:23 -040072
73 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -040074 git_url: Repository URL for chromium.
75 revision: the git revision we want to use.
76 time_to_wait: the minimum period before abandoning our wait for the
77 desired revision to be present.
Peter Mayo177500f2011-09-09 17:25:23 -040078 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070079 parsed_url = urlparse.urlparse(git_url)
80 host = parsed_url[1]
81 path = parsed_url[2].rstrip('/') + (
82 '/+/%s/chrome/VERSION?format=text' % revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040083
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070084 # Allow for git repository replication lag with sleep/retry loop.
85 def _fetch():
86 fh = gob_util.FetchUrl(host, path, ignore_404=True)
87 return fh.read() if fh else None
petermayo@chromium.org163b3372011-09-12 02:06:05 -040088
Mike Frysingercc55c782014-12-03 22:32:08 -050089 def _wait_msg(_remaining):
Ralph Nathan03047282015-03-23 11:09:32 -070090 logging.info('Repository does not yet have revision %s. Sleeping...',
91 revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040092
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070093 content = timeout_util.WaitForSuccess(
94 retry_check=lambda x: not bool(x),
95 func=_fetch,
96 timeout=time_to_wait,
97 period=30,
98 side_effect_func=_wait_msg)
99 return _GetVersionContents(base64.b64decode(content))
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400100
Peter Mayo177500f2011-09-09 17:25:23 -0400101
102def _GetTipOfTrunkVersionFile(root):
103 """Returns the current Chromium version, from a file in a checkout.
104
105 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -0400106 root: path to the root of the chromium checkout.
Peter Mayo177500f2011-09-09 17:25:23 -0400107 """
108 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800109 chrome_version_info = cros_build_lib.RunCommand(
Peter Mayo177500f2011-09-09 17:25:23 -0400110 ['cat', version_file],
111 redirect_stdout=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800112 error_message='Could not read version file at %s.' % version_file).output
Peter Mayo177500f2011-09-09 17:25:23 -0400113
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400114 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400115
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800116
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700117def CheckIfChromeRightForOS(deps_content):
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700118 """Checks if DEPS is right for Chrome OS.
119
120 This function checks for a variable called 'buildspec_platforms' to
121 find out if its 'chromeos' or 'all'. If any of those values,
122 then it chooses that DEPS.
123
124 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700125 deps_content: Content of release buildspec DEPS file.
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700126
127 Returns:
128 True if DEPS is the right Chrome for Chrome OS.
129 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700130 platforms_search = re.search(r'buildspec_platforms.*\s.*\s', deps_content)
Dharani Govindancbbf69c2014-07-29 15:37:39 -0700131
132 if platforms_search:
133 platforms = platforms_search.group()
134 if 'chromeos' in platforms or 'all' in platforms:
135 return True
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700136
137 return False
138
139
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700140def GetLatestRelease(git_url, branch=None):
141 """Gets the latest release version from the release tags in the repository.
Chris Sosadad0d322011-01-31 16:37:33 -0800142
143 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700144 git_url: URL of git repository.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500145 branch: If set, gets the latest release for branch, otherwise latest
Chris Sosadad0d322011-01-31 16:37:33 -0800146 release.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500147
Chris Sosadad0d322011-01-31 16:37:33 -0800148 Returns:
149 Latest version string.
150 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700151 # TODO(szager): This only works for public release buildspecs in the chromium
152 # src repository. Internal buildspecs are tracked differently. At the time
153 # of writing, I can't find any callers that use this method to scan for
154 # internal buildspecs. But there may be something lurking...
155
156 parsed_url = urlparse.urlparse(git_url)
157 path = parsed_url[2].rstrip('/') + '/+refs/tags?format=JSON'
158 j = gob_util.FetchUrlJson(parsed_url[1], path, ignore_404=False)
Chris Sosadad0d322011-01-31 16:37:33 -0800159 if branch:
David James7c352bc2013-03-15 14:19:57 -0700160 chrome_version_re = re.compile(r'^%s\.\d+.*' % branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800161 else:
David James7c352bc2013-03-15 14:19:57 -0700162 chrome_version_re = re.compile(r'^[0-9]+\..*')
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700163 matching_versions = [key for key in j.keys() if chrome_version_re.match(key)]
164 matching_versions.sort(key=distutils.version.LooseVersion)
165 for chrome_version in reversed(matching_versions):
166 path = parsed_url[2].rstrip() + (
167 '/+/refs/tags/%s/DEPS?format=text' % chrome_version)
168 fh = gob_util.FetchUrl(parsed_url[1], path, ignore_404=False)
169 content = fh.read() if fh else None
170 if content:
171 deps_content = base64.b64decode(content)
172 if CheckIfChromeRightForOS(deps_content):
173 return chrome_version
Peter Mayoad8173d2011-11-08 16:18:23 -0500174
175 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800176
177
178def _GetStickyEBuild(stable_ebuilds):
179 """Returns the sticky ebuild."""
180 sticky_ebuilds = []
181 non_sticky_re = re.compile(_NON_STICKY_REGEX)
182 for ebuild in stable_ebuilds:
183 if not non_sticky_re.match(ebuild.version):
184 sticky_ebuilds.append(ebuild)
185
186 if not sticky_ebuilds:
187 raise Exception('No sticky ebuilds found')
188 elif len(sticky_ebuilds) > 1:
Ralph Nathan446aee92015-03-23 14:44:56 -0700189 logging.warning('More than one sticky ebuild found')
Chris Sosadad0d322011-01-31 16:37:33 -0800190
Alex Deymo075c2292014-09-04 18:31:50 -0700191 return portage_util.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800192
193
Alex Deymo075c2292014-09-04 18:31:50 -0700194class ChromeEBuild(portage_util.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800195 """Thin sub-class of EBuild that adds a chrome_version field."""
David Zeuthen665d3132014-08-25 15:27:02 -0400196 chrome_version_re = re.compile(r'.*-(%s|9999).*' % (
197 _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800198 chrome_version = ''
199
200 def __init__(self, path):
Alex Deymo075c2292014-09-04 18:31:50 -0700201 portage_util.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800202 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
203 if re_match:
204 self.chrome_version = re_match.group(1)
205
Chris Sosadad0d322011-01-31 16:37:33 -0800206 def __str__(self):
207 return self.ebuild_path
208
209
David Zeuthen665d3132014-08-25 15:27:02 -0400210def FindChromeCandidates(package_dir):
Chris Sosadad0d322011-01-31 16:37:33 -0800211 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
212
213 Args:
David Zeuthen665d3132014-08-25 15:27:02 -0400214 package_dir: The path to where the package ebuild is stored.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500215
Chris Sosadad0d322011-01-31 16:37:33 -0800216 Returns:
217 Tuple [unstable_ebuild, stable_ebuilds].
Mike Frysinger1a736a82013-12-12 01:50:59 -0500218
Chris Sosadad0d322011-01-31 16:37:33 -0800219 Raises:
220 Exception: if no unstable ebuild exists for Chrome.
221 """
222 stable_ebuilds = []
223 unstable_ebuilds = []
224 for path in [
David Zeuthen665d3132014-08-25 15:27:02 -0400225 os.path.join(package_dir, entry) for entry in os.listdir(package_dir)]:
Chris Sosadad0d322011-01-31 16:37:33 -0800226 if path.endswith('.ebuild'):
227 ebuild = ChromeEBuild(path)
228 if not ebuild.chrome_version:
Lann Martinffb95162018-08-28 12:02:54 -0600229 logging.warning('Poorly formatted ebuild found at %s', path)
Chris Sosadad0d322011-01-31 16:37:33 -0800230 else:
231 if '9999' in ebuild.version:
232 unstable_ebuilds.append(ebuild)
233 else:
234 stable_ebuilds.append(ebuild)
235
236 # Apply some sanity checks.
237 if not unstable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400238 raise Exception('Missing 9999 ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800239 if not stable_ebuilds:
Lann Martinffb95162018-08-28 12:02:54 -0600240 logging.warning('Missing stable ebuild for %s', package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800241
Alex Deymo075c2292014-09-04 18:31:50 -0700242 return portage_util.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800243
244
245def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
246 """Finds the Chrome uprev candidate for the given chrome_rev.
247
248 Using the pre-flight logic, this means the stable ebuild you are uprevving
249 from. The difference here is that the version could be different and in
250 that case we want to find it to delete it.
251
252 Args:
253 stable_ebuilds: A list of stable ebuilds.
254 chrome_rev: The chrome_rev designating which candidate to find.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500255 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800256 components. For example: 9.0.553. Can be None but not if chrome_rev
257 is CHROME_REV_STICKY.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500258
Chris Sosadad0d322011-01-31 16:37:33 -0800259 Returns:
Mike Frysinger1a736a82013-12-12 01:50:59 -0500260 The EBuild, otherwise None if none found.
Chris Sosadad0d322011-01-31 16:37:33 -0800261 """
262 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400263 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
264 constants.CHROME_REV_SPEC]:
265 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400266 # not just for the fun of confusion.
David James7c352bc2013-03-15 14:19:57 -0700267 chrome_branch_re = re.compile(r'%s.*_alpha.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800268 for ebuild in stable_ebuilds:
269 if chrome_branch_re.search(ebuild.version):
270 candidates.append(ebuild)
271
Ryan Cuic6e097d2011-06-16 12:23:14 -0700272 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800273 assert sticky_branch is not None
David James7c352bc2013-03-15 14:19:57 -0700274 chrome_branch_re = re.compile(r'%s\..*' % sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800275 for ebuild in stable_ebuilds:
276 if chrome_branch_re.search(ebuild.version):
277 candidates.append(ebuild)
278
279 else:
David James7c352bc2013-03-15 14:19:57 -0700280 chrome_branch_re = re.compile(r'%s.*_rc.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800281 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800282 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800283 candidates.append(ebuild)
284
285 if candidates:
Alex Deymo075c2292014-09-04 18:31:50 -0700286 return portage_util.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800287 else:
288 return None
289
Mike Frysingercc838832014-05-24 13:10:30 -0400290
Chris Masone592cab52011-08-02 14:05:48 -0700291def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
292 """Return appropriately formatted link to revision info, given versions
293
294 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
295 page that prints the Chromium revisions between those two versions.
296
297 Args:
298 old_chrome_version: version to diff from
299 chrome_version: version to which to diff
Mike Frysinger1a736a82013-12-12 01:50:59 -0500300
Chris Masone592cab52011-08-02 14:05:48 -0700301 Returns:
302 The desired URL.
303 """
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500304 return _CHROME_VERSION_URL % {'old': old_chrome_version,
305 'new': chrome_version}
Chris Masone592cab52011-08-02 14:05:48 -0700306
Mike Frysinger750c5f52014-09-16 16:16:57 -0400307
Chris Masone592cab52011-08-02 14:05:48 -0700308def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
309 """Returns a link to the list of revisions between two Chromium versions
310
311 Given two ChromeEBuilds and the kind of rev we're doing, generate a
312 link to a page that prints the Chromium changes between those two
313 revisions, inclusive.
314
315 Args:
316 old_chrome: ebuild for the version to diff from
317 new_chrome: ebuild for the version to which to diff
318 chrome_rev: one of constants.VALID_CHROME_REVISIONS
Mike Frysinger1a736a82013-12-12 01:50:59 -0500319
Chris Masone592cab52011-08-02 14:05:48 -0700320 Returns:
321 The desired URL.
322 """
Chris Sosadd611df2012-02-03 15:26:23 -0800323 assert chrome_rev in _REV_TYPES_FOR_LINKS
324 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
325 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800326
Mike Frysingercc838832014-05-24 13:10:30 -0400327
David Zeuthen665d3132014-08-25 15:27:02 -0400328def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_pn,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400329 chrome_rev, chrome_version, package_dir):
David James7c352bc2013-03-15 14:19:57 -0700330 r"""Uprevs the chrome ebuild specified by chrome_rev.
Chris Sosadad0d322011-01-31 16:37:33 -0800331
332 This is the main function that uprevs the chrome_rev from a stable candidate
333 to its new version.
334
335 Args:
336 stable_candidate: ebuild that corresponds to the stable ebuild we are
337 revving from. If None, builds the a new ebuild given the version
338 and logic for chrome_rev type with revision set to 1.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500339 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400340 chrome_pn: package name.
Peter Mayo177500f2011-09-09 17:25:23 -0400341 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400342 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
343 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700344 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
345 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400346 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
347 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700348 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
349 are release candidates for the next sticky version.
350 constants.CHROME_REV_STICKY - Revs the sticky version.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500351 chrome_version: The \d.\d.\d.\d version of Chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400352 package_dir: Path to the chromeos-chrome package dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500353
Chris Sosadad0d322011-01-31 16:37:33 -0800354 Returns:
355 Full portage version atom (including rc's, etc) that was revved.
356 """
Chris Sosa8be39132011-04-14 12:09:24 -0700357 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
358 """Returns True if the new ebuild is redundant.
359
360 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700361 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700362 """
363 if not stable_ebuild:
364 return False
365
366 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700367 return filecmp.cmp(
368 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700369
David James629febb2012-11-25 13:07:34 -0800370 # Mark latest release and sticky branches as stable.
371 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
372 constants.CHROME_REV_SPEC,
373 constants.CHROME_REV_LOCAL]
374
Chris Sosadad0d322011-01-31 16:37:33 -0800375 # Case where we have the last stable candidate with same version just rev.
376 if stable_candidate and stable_candidate.chrome_version == chrome_version:
377 new_ebuild_path = '%s-r%d.ebuild' % (
378 stable_candidate.ebuild_path_no_revision,
379 stable_candidate.current_revision + 1)
380 else:
David James629febb2012-11-25 13:07:34 -0800381 suffix = 'rc' if mark_stable else 'alpha'
David Zeuthen665d3132014-08-25 15:27:02 -0400382 pf = '%s-%s_%s-r1' % (chrome_pn, chrome_version, suffix)
383 new_ebuild_path = os.path.join(package_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800384
Alex Deymo075c2292014-09-04 18:31:50 -0700385 portage_util.EBuild.MarkAsStable(
David James065b2012012-04-01 14:51:11 -0700386 unstable_ebuild.ebuild_path, new_ebuild_path,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400387 {}, make_stable=mark_stable)
Chris Sosadad0d322011-01-31 16:37:33 -0800388 new_ebuild = ChromeEBuild(new_ebuild_path)
Chris Sosa8be39132011-04-14 12:09:24 -0700389
390 # Determine whether this is ebuild is redundant.
391 if IsTheNewEBuildRedundant(new_ebuild, stable_candidate):
David James1b363582012-12-17 11:53:11 -0800392 msg = 'Previous ebuild with same version found and ebuild is redundant.'
Ralph Nathan03047282015-03-23 11:09:32 -0700393 logging.info(msg)
Chris Sosa8be39132011-04-14 12:09:24 -0700394 os.unlink(new_ebuild_path)
395 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800396
Chris Sosadd611df2012-02-03 15:26:23 -0800397 if stable_candidate and chrome_rev in _REV_TYPES_FOR_LINKS:
David Riley3e3f64e2016-02-03 08:17:55 -0800398 logging.PrintBuildbotLink('Chromium revisions',
399 GetChromeRevisionListLink(stable_candidate,
400 new_ebuild, chrome_rev))
Chris Masone592cab52011-08-02 14:05:48 -0700401
David Zeuthen665d3132014-08-25 15:27:02 -0400402 git.RunGit(package_dir, ['add', new_ebuild_path])
Chris Sosa9ba47752012-02-27 15:27:37 -0800403 if stable_candidate and not stable_candidate.IsSticky():
David Zeuthen665d3132014-08-25 15:27:02 -0400404 git.RunGit(package_dir, ['rm', stable_candidate.ebuild_path])
Chris Sosadad0d322011-01-31 16:37:33 -0800405
Alex Deymo075c2292014-09-04 18:31:50 -0700406 portage_util.EBuild.CommitChange(
David Zeuthen665d3132014-08-25 15:27:02 -0400407 _GIT_COMMIT_MESSAGE % {'chrome_pn': chrome_pn,
408 'chrome_rev': chrome_rev,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400409 'chrome_version': chrome_version},
David Zeuthen665d3132014-08-25 15:27:02 -0400410 package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800411
Chris Sosadad0d322011-01-31 16:37:33 -0800412 return '%s-%s' % (new_ebuild.package, new_ebuild.version)
413
414
Mike Frysingera13c04f2016-09-01 00:35:17 -0400415def GetParser():
416 """Return a command line parser."""
417 parser = commandline.ArgumentParser(description=__doc__)
418 parser.add_argument('-b', '--boards')
419 parser.add_argument('-c', '--chrome_url',
420 default=constants.CHROMIUM_GOB_URL)
421 parser.add_argument('-f', '--force_version',
422 help='Chrome version or git revision hash to use')
423 parser.add_argument('-s', '--srcroot',
424 default=os.path.join(os.environ['HOME'], 'trunk', 'src'),
425 help='Path to the src directory')
426 parser.add_argument('-t', '--tracking_branch', default='cros/master',
427 help='Branch we are tracking changes against')
428 parser.add_argument('revision', choices=constants.VALID_CHROME_REVISIONS)
429 return parser
Chris Sosadad0d322011-01-31 16:37:33 -0800430
Chris Sosadad0d322011-01-31 16:37:33 -0800431
Mike Frysingera13c04f2016-09-01 00:35:17 -0400432def main(argv):
433 parser = GetParser()
434 options = parser.parse_args(argv)
435 options.Freeze()
436 chrome_rev = options.revision
437
438 if options.force_version and chrome_rev not in (constants.CHROME_REV_SPEC,
439 constants.CHROME_REV_LATEST):
David Jamesfb160012014-07-01 10:00:57 -0700440 parser.error('--force_version is not compatible with the %r '
Mike Frysingera13c04f2016-09-01 00:35:17 -0400441 'option.' % (chrome_rev,))
David Jamesfb160012014-07-01 10:00:57 -0700442
David Zeuthen665d3132014-08-25 15:27:02 -0400443 overlay_dir = os.path.abspath(_OVERLAY_DIR % {'srcroot': options.srcroot})
444 chrome_package_dir = os.path.join(overlay_dir, constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -0800445 version_to_uprev = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800446 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800447
David Zeuthen665d3132014-08-25 15:27:02 -0400448 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800449
Peter Mayo177500f2011-09-09 17:25:23 -0400450 if chrome_rev == constants.CHROME_REV_LOCAL:
451 if 'CHROME_ROOT' in os.environ:
452 chrome_root = os.environ['CHROME_ROOT']
453 else:
454 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
455
456 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
Ralph Nathan03047282015-03-23 11:09:32 -0700457 logging.info('Using local source, versioning is untrustworthy.')
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400458 elif chrome_rev == constants.CHROME_REV_SPEC:
David Jamesfb160012014-07-01 10:00:57 -0700459 if '.' in options.force_version:
460 version_to_uprev = options.force_version
461 else:
462 commit_to_use = options.force_version
463 if '@' in commit_to_use:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700464 commit_to_use = commit_to_use.rpartition('@')[2]
David Jamesfb160012014-07-01 10:00:57 -0700465 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
466 commit_to_use)
Peter Mayo177500f2011-09-09 17:25:23 -0400467 elif chrome_rev == constants.CHROME_REV_TOT:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700468 commit_to_use = gob_util.GetTipOfTrunkRevision(options.chrome_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400469 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
470 commit_to_use)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700471 elif chrome_rev == constants.CHROME_REV_LATEST:
David James9a5980e2014-07-16 09:37:00 -0700472 if options.force_version:
473 if '.' not in options.force_version:
474 parser.error('%s only accepts released Chrome versions, not SVN or '
475 'Git revisions.' % (chrome_rev,))
476 version_to_uprev = options.force_version
477 else:
478 version_to_uprev = GetLatestRelease(options.chrome_url)
Chris Sosadad0d322011-01-31 16:37:33 -0800479 else:
Chris Sosa9ba47752012-02-27 15:27:37 -0800480 sticky_ebuild = _GetStickyEBuild(stable_ebuilds)
481 sticky_version = sticky_ebuild.chrome_version
482 sticky_branch = sticky_version.rpartition('.')[0]
Yu-Ju Hong39806322014-06-24 16:46:32 -0700483 version_to_uprev = GetLatestRelease(options.chrome_url, sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800484
485 stable_candidate = FindChromeUprevCandidate(stable_ebuilds, chrome_rev,
486 sticky_branch)
487
488 if stable_candidate:
Lann Martinffb95162018-08-28 12:02:54 -0600489 logging.info('Stable candidate found %s', stable_candidate)
Chris Sosadad0d322011-01-31 16:37:33 -0800490 else:
Ralph Nathan03047282015-03-23 11:09:32 -0700491 logging.info('No stable candidate found.')
Chris Sosadad0d322011-01-31 16:37:33 -0800492
Chris Sosa8049f3b2011-05-02 20:09:28 -0700493 tracking_branch = 'remotes/m/%s' % os.path.basename(options.tracking_branch)
David Zeuthen665d3132014-08-25 15:27:02 -0400494 existing_branch = git.GetCurrentBranch(chrome_package_dir)
Ryan Cui05a31ba2011-05-31 17:47:37 -0700495 work_branch = cros_mark_as_stable.GitBranch(constants.STABLE_EBUILD_BRANCH,
David Zeuthen665d3132014-08-25 15:27:02 -0400496 tracking_branch,
497 chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800498 work_branch.CreateBranch()
David Jamesd6708c02012-03-22 10:49:15 -0700499
500 # In the case of uprevving overlays that have patches applied to them,
501 # include the patched changes in the stabilizing branch.
502 if existing_branch:
David Zeuthen665d3132014-08-25 15:27:02 -0400503 git.RunGit(chrome_package_dir, ['rebase', existing_branch])
David Jamesd6708c02012-03-22 10:49:15 -0700504
Chris Sosadad0d322011-01-31 16:37:33 -0800505 chrome_version_atom = MarkChromeEBuildAsStable(
David Zeuthen665d3132014-08-25 15:27:02 -0400506 stable_candidate, unstable_ebuild, 'chromeos-chrome', chrome_rev,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400507 version_to_uprev, chrome_package_dir)
Yu-Ju Hong078c9ec2014-08-06 18:25:16 -0700508 if chrome_version_atom:
509 if options.boards:
David James96c2c992015-07-14 10:21:50 -0700510 cros_mark_as_stable.CleanStalePackages(options.srcroot,
511 options.boards.split(':'),
Yu-Ju Hong078c9ec2014-08-06 18:25:16 -0700512 [chrome_version_atom])
David Zeuthen665d3132014-08-25 15:27:02 -0400513
514 # If we did rev Chrome, now is a good time to uprev other packages.
515 for other_ebuild in constants.OTHER_CHROME_PACKAGES:
516 other_ebuild_name = os.path.basename(other_ebuild)
517 other_package_dir = os.path.join(overlay_dir, other_ebuild)
518 (other_unstable_ebuild, other_stable_ebuilds) = FindChromeCandidates(
519 other_package_dir)
520 other_stable_candidate = FindChromeUprevCandidate(other_stable_ebuilds,
521 chrome_rev,
522 sticky_branch)
523 revved_atom = MarkChromeEBuildAsStable(other_stable_candidate,
524 other_unstable_ebuild,
525 other_ebuild_name,
526 chrome_rev, version_to_uprev,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400527 other_package_dir)
David Zeuthen665d3132014-08-25 15:27:02 -0400528 if revved_atom and options.boards:
David James96c2c992015-07-14 10:21:50 -0700529 cros_mark_as_stable.CleanStalePackages(options.srcroot,
530 options.boards.split(':'),
David Zeuthen665d3132014-08-25 15:27:02 -0400531 [revved_atom])
532
533 # Explicit print to communicate to caller.
534 if chrome_version_atom:
Mike Frysinger383367e2014-09-16 15:06:17 -0400535 print('CHROME_VERSION_ATOM=%s' % chrome_version_atom)