blob: 7d0858cfb4f0f05fd830289faf1e9bfb2ab0434b [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
Mike Frysingera94f1252019-09-12 02:39:28 -040021import distutils.version # pylint: disable=import-error,no-name-in-module
Chris Sosa8be39132011-04-14 12:09:24 -070022import filecmp
Chris Sosadad0d322011-01-31 16:37:33 -080023import os
24import re
Mike Frysinger3dcacee2019-08-23 17:09:11 -040025
26from six.moves import urllib
Chris Sosadad0d322011-01-31 16:37:33 -080027
Aviv Keshetb7519e12016-10-04 00:50:00 -070028from chromite.lib import constants
Mike Frysingera13c04f2016-09-01 00:35:17 -040029from chromite.lib import commandline
David James1b363582012-12-17 11:53:11 -080030from chromite.lib import cros_build_lib
Ralph Nathan03047282015-03-23 11:09:32 -070031from chromite.lib import cros_logging as logging
David James97d95872012-11-16 15:09:56 -080032from chromite.lib import git
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070033from chromite.lib import gob_util
Alex Deymo075c2292014-09-04 18:31:50 -070034from chromite.lib import portage_util
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070035from chromite.lib import timeout_util
Mike Frysinger6cb624a2012-05-24 18:17:38 -040036from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080037
Mike Frysinger750c5f52014-09-16 16:16:57 -040038
Chris Sosadad0d322011-01-31 16:37:33 -080039# Helper regex's for finding ebuilds.
David James7c352bc2013-03-15 14:19:57 -070040_CHROME_VERSION_REGEX = r'\d+\.\d+\.\d+\.\d+'
41_NON_STICKY_REGEX = r'%s[(_rc.*)|(_alpha.*)]+' % _CHROME_VERSION_REGEX
Chris Sosadad0d322011-01-31 16:37:33 -080042
43# Dir where all the action happens.
David Zeuthen665d3132014-08-25 15:27:02 -040044_OVERLAY_DIR = '%(srcroot)s/third_party/chromiumos-overlay/'
Chris Sosadad0d322011-01-31 16:37:33 -080045
David Zeuthen665d3132014-08-25 15:27:02 -040046_GIT_COMMIT_MESSAGE = ('Marking %(chrome_rev)s for %(chrome_pn)s ebuild '
47 'with version %(chrome_version)s as stable.')
Chris Sosadad0d322011-01-31 16:37:33 -080048
Chris Masone592cab52011-08-02 14:05:48 -070049# URLs that print lists of chrome revisions between two versions of the browser.
50_CHROME_VERSION_URL = ('http://omahaproxy.appspot.com/changelog?'
51 'old_version=%(old)s&new_version=%(new)s')
Chris Sosadd611df2012-02-03 15:26:23 -080052
53# Only print links when we rev these types.
54_REV_TYPES_FOR_LINKS = [constants.CHROME_REV_LATEST,
55 constants.CHROME_REV_STICKY]
Chris Masone592cab52011-08-02 14:05:48 -070056
ChromeOS Developer03118eb2013-02-12 14:27:09 -080057
petermayo@chromium.org163b3372011-09-12 02:06:05 -040058def _GetVersionContents(chrome_version_info):
Peter Mayo177500f2011-09-09 17:25:23 -040059 """Returns the current Chromium version, from the contents of a VERSION file.
Chris Sosadad0d322011-01-31 16:37:33 -080060
Peter Mayo177500f2011-09-09 17:25:23 -040061 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -040062 chrome_version_info: The contents of a chromium VERSION file.
Peter Mayo177500f2011-09-09 17:25:23 -040063 """
Chris Sosadad0d322011-01-31 16:37:33 -080064 chrome_version_array = []
Chris Sosadad0d322011-01-31 16:37:33 -080065 for line in chrome_version_info.splitlines():
66 chrome_version_array.append(line.rpartition('=')[2])
67
68 return '.'.join(chrome_version_array)
69
Mike Frysingercc838832014-05-24 13:10:30 -040070
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070071def _GetSpecificVersionUrl(git_url, revision, time_to_wait=600):
petermayo@chromium.org163b3372011-09-12 02:06:05 -040072 """Returns the Chromium version, from a repository URL and version.
Peter Mayo177500f2011-09-09 17:25:23 -040073
74 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -040075 git_url: Repository URL for chromium.
76 revision: the git revision we want to use.
77 time_to_wait: the minimum period before abandoning our wait for the
78 desired revision to be present.
Peter Mayo177500f2011-09-09 17:25:23 -040079 """
Mike Frysinger3dcacee2019-08-23 17:09:11 -040080 parsed_url = urllib.parse.urlparse(git_url)
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070081 host = parsed_url[1]
82 path = parsed_url[2].rstrip('/') + (
83 '/+/%s/chrome/VERSION?format=text' % revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040084
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070085 # Allow for git repository replication lag with sleep/retry loop.
86 def _fetch():
87 fh = gob_util.FetchUrl(host, path, ignore_404=True)
88 return fh.read() if fh else None
petermayo@chromium.org163b3372011-09-12 02:06:05 -040089
Mike Frysingercc55c782014-12-03 22:32:08 -050090 def _wait_msg(_remaining):
Ralph Nathan03047282015-03-23 11:09:32 -070091 logging.info('Repository does not yet have revision %s. Sleeping...',
92 revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040093
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070094 content = timeout_util.WaitForSuccess(
95 retry_check=lambda x: not bool(x),
96 func=_fetch,
97 timeout=time_to_wait,
98 period=30,
99 side_effect_func=_wait_msg)
100 return _GetVersionContents(base64.b64decode(content))
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400101
Peter Mayo177500f2011-09-09 17:25:23 -0400102
103def _GetTipOfTrunkVersionFile(root):
104 """Returns the current Chromium version, from a file in a checkout.
105
106 Args:
Mike Frysinger6f3c48e2015-05-06 02:38:51 -0400107 root: path to the root of the chromium checkout.
Peter Mayo177500f2011-09-09 17:25:23 -0400108 """
109 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
Mike Frysinger94a459c2019-09-29 23:43:05 -0400110 try:
111 chrome_version_info = cros_build_lib.run(
112 ['cat', version_file],
113 redirect_stdout=True).stdout
114 except cros_build_lib.RunCommandError as e:
115 e.msg += '\nCould not read version file at %s.' % version_file
116 raise e
Peter Mayo177500f2011-09-09 17:25:23 -0400117
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400118 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400119
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800120
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700121def CheckIfChromeRightForOS(deps_content):
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700122 """Checks if DEPS is right for Chrome OS.
123
124 This function checks for a variable called 'buildspec_platforms' to
125 find out if its 'chromeos' or 'all'. If any of those values,
126 then it chooses that DEPS.
127
128 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700129 deps_content: Content of release buildspec DEPS file.
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700130
131 Returns:
132 True if DEPS is the right Chrome for Chrome OS.
133 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700134 platforms_search = re.search(r'buildspec_platforms.*\s.*\s', deps_content)
Dharani Govindancbbf69c2014-07-29 15:37:39 -0700135
136 if platforms_search:
137 platforms = platforms_search.group()
138 if 'chromeos' in platforms or 'all' in platforms:
139 return True
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700140
141 return False
142
143
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700144def GetLatestRelease(git_url, branch=None):
145 """Gets the latest release version from the release tags in the repository.
Chris Sosadad0d322011-01-31 16:37:33 -0800146
147 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700148 git_url: URL of git repository.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500149 branch: If set, gets the latest release for branch, otherwise latest
Chris Sosadad0d322011-01-31 16:37:33 -0800150 release.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500151
Chris Sosadad0d322011-01-31 16:37:33 -0800152 Returns:
153 Latest version string.
154 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700155 # TODO(szager): This only works for public release buildspecs in the chromium
156 # src repository. Internal buildspecs are tracked differently. At the time
157 # of writing, I can't find any callers that use this method to scan for
158 # internal buildspecs. But there may be something lurking...
159
Mike Frysinger3dcacee2019-08-23 17:09:11 -0400160 parsed_url = urllib.parse.urlparse(git_url)
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700161 path = parsed_url[2].rstrip('/') + '/+refs/tags?format=JSON'
162 j = gob_util.FetchUrlJson(parsed_url[1], path, ignore_404=False)
Chris Sosadad0d322011-01-31 16:37:33 -0800163 if branch:
David James7c352bc2013-03-15 14:19:57 -0700164 chrome_version_re = re.compile(r'^%s\.\d+.*' % branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800165 else:
David James7c352bc2013-03-15 14:19:57 -0700166 chrome_version_re = re.compile(r'^[0-9]+\..*')
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700167 matching_versions = [key for key in j.keys() if chrome_version_re.match(key)]
168 matching_versions.sort(key=distutils.version.LooseVersion)
169 for chrome_version in reversed(matching_versions):
170 path = parsed_url[2].rstrip() + (
171 '/+/refs/tags/%s/DEPS?format=text' % chrome_version)
172 fh = gob_util.FetchUrl(parsed_url[1], path, ignore_404=False)
173 content = fh.read() if fh else None
174 if content:
175 deps_content = base64.b64decode(content)
176 if CheckIfChromeRightForOS(deps_content):
177 return chrome_version
Peter Mayoad8173d2011-11-08 16:18:23 -0500178
179 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800180
181
182def _GetStickyEBuild(stable_ebuilds):
183 """Returns the sticky ebuild."""
184 sticky_ebuilds = []
185 non_sticky_re = re.compile(_NON_STICKY_REGEX)
186 for ebuild in stable_ebuilds:
187 if not non_sticky_re.match(ebuild.version):
188 sticky_ebuilds.append(ebuild)
189
190 if not sticky_ebuilds:
191 raise Exception('No sticky ebuilds found')
192 elif len(sticky_ebuilds) > 1:
Mike Frysinger6c2a6242019-03-20 20:37:24 -0400193 logging.warning('More than one sticky ebuild found:')
194 for ebuild in sticky_ebuilds:
195 logging.warning(' %s', ebuild.ebuild_path)
196 logging.warning('Make sure to *not* create xxx.0-r1.ebuilds')
Chris Sosadad0d322011-01-31 16:37:33 -0800197
Alex Deymo075c2292014-09-04 18:31:50 -0700198 return portage_util.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800199
200
Alex Deymo075c2292014-09-04 18:31:50 -0700201class ChromeEBuild(portage_util.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800202 """Thin sub-class of EBuild that adds a chrome_version field."""
David Zeuthen665d3132014-08-25 15:27:02 -0400203 chrome_version_re = re.compile(r'.*-(%s|9999).*' % (
204 _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800205 chrome_version = ''
206
207 def __init__(self, path):
Alex Deymo075c2292014-09-04 18:31:50 -0700208 portage_util.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800209 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
210 if re_match:
211 self.chrome_version = re_match.group(1)
212
Chris Sosadad0d322011-01-31 16:37:33 -0800213 def __str__(self):
214 return self.ebuild_path
215
216
David Zeuthen665d3132014-08-25 15:27:02 -0400217def FindChromeCandidates(package_dir):
Chris Sosadad0d322011-01-31 16:37:33 -0800218 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
219
220 Args:
David Zeuthen665d3132014-08-25 15:27:02 -0400221 package_dir: The path to where the package ebuild is stored.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500222
Chris Sosadad0d322011-01-31 16:37:33 -0800223 Returns:
224 Tuple [unstable_ebuild, stable_ebuilds].
Mike Frysinger1a736a82013-12-12 01:50:59 -0500225
Chris Sosadad0d322011-01-31 16:37:33 -0800226 Raises:
227 Exception: if no unstable ebuild exists for Chrome.
228 """
229 stable_ebuilds = []
230 unstable_ebuilds = []
231 for path in [
David Zeuthen665d3132014-08-25 15:27:02 -0400232 os.path.join(package_dir, entry) for entry in os.listdir(package_dir)]:
Chris Sosadad0d322011-01-31 16:37:33 -0800233 if path.endswith('.ebuild'):
234 ebuild = ChromeEBuild(path)
235 if not ebuild.chrome_version:
Lann Martinffb95162018-08-28 12:02:54 -0600236 logging.warning('Poorly formatted ebuild found at %s', path)
Chris Sosadad0d322011-01-31 16:37:33 -0800237 else:
238 if '9999' in ebuild.version:
239 unstable_ebuilds.append(ebuild)
240 else:
241 stable_ebuilds.append(ebuild)
242
243 # Apply some sanity checks.
244 if not unstable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400245 raise Exception('Missing 9999 ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800246 if not stable_ebuilds:
Lann Martinffb95162018-08-28 12:02:54 -0600247 logging.warning('Missing stable ebuild for %s', package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800248
Alex Deymo075c2292014-09-04 18:31:50 -0700249 return portage_util.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800250
251
252def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
253 """Finds the Chrome uprev candidate for the given chrome_rev.
254
255 Using the pre-flight logic, this means the stable ebuild you are uprevving
256 from. The difference here is that the version could be different and in
257 that case we want to find it to delete it.
258
259 Args:
260 stable_ebuilds: A list of stable ebuilds.
261 chrome_rev: The chrome_rev designating which candidate to find.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500262 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800263 components. For example: 9.0.553. Can be None but not if chrome_rev
264 is CHROME_REV_STICKY.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500265
Chris Sosadad0d322011-01-31 16:37:33 -0800266 Returns:
Mike Frysinger1a736a82013-12-12 01:50:59 -0500267 The EBuild, otherwise None if none found.
Chris Sosadad0d322011-01-31 16:37:33 -0800268 """
269 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400270 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
271 constants.CHROME_REV_SPEC]:
272 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400273 # not just for the fun of confusion.
David James7c352bc2013-03-15 14:19:57 -0700274 chrome_branch_re = re.compile(r'%s.*_alpha.*' % _CHROME_VERSION_REGEX)
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
Ryan Cuic6e097d2011-06-16 12:23:14 -0700279 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800280 assert sticky_branch is not None
David James7c352bc2013-03-15 14:19:57 -0700281 chrome_branch_re = re.compile(r'%s\..*' % sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800282 for ebuild in stable_ebuilds:
283 if chrome_branch_re.search(ebuild.version):
284 candidates.append(ebuild)
285
286 else:
David James7c352bc2013-03-15 14:19:57 -0700287 chrome_branch_re = re.compile(r'%s.*_rc.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800288 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800289 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800290 candidates.append(ebuild)
291
292 if candidates:
Alex Deymo075c2292014-09-04 18:31:50 -0700293 return portage_util.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800294 else:
295 return None
296
Mike Frysingercc838832014-05-24 13:10:30 -0400297
Chris Masone592cab52011-08-02 14:05:48 -0700298def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
299 """Return appropriately formatted link to revision info, given versions
300
301 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
302 page that prints the Chromium revisions between those two versions.
303
304 Args:
305 old_chrome_version: version to diff from
306 chrome_version: version to which to diff
Mike Frysinger1a736a82013-12-12 01:50:59 -0500307
Chris Masone592cab52011-08-02 14:05:48 -0700308 Returns:
309 The desired URL.
310 """
Mike Frysingerd6e2df02014-11-26 02:55:04 -0500311 return _CHROME_VERSION_URL % {'old': old_chrome_version,
312 'new': chrome_version}
Chris Masone592cab52011-08-02 14:05:48 -0700313
Mike Frysinger750c5f52014-09-16 16:16:57 -0400314
Chris Masone592cab52011-08-02 14:05:48 -0700315def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
316 """Returns a link to the list of revisions between two Chromium versions
317
318 Given two ChromeEBuilds and the kind of rev we're doing, generate a
319 link to a page that prints the Chromium changes between those two
320 revisions, inclusive.
321
322 Args:
323 old_chrome: ebuild for the version to diff from
324 new_chrome: ebuild for the version to which to diff
325 chrome_rev: one of constants.VALID_CHROME_REVISIONS
Mike Frysinger1a736a82013-12-12 01:50:59 -0500326
Chris Masone592cab52011-08-02 14:05:48 -0700327 Returns:
328 The desired URL.
329 """
Chris Sosadd611df2012-02-03 15:26:23 -0800330 assert chrome_rev in _REV_TYPES_FOR_LINKS
331 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
332 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800333
Mike Frysingercc838832014-05-24 13:10:30 -0400334
David Zeuthen665d3132014-08-25 15:27:02 -0400335def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_pn,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400336 chrome_rev, chrome_version, package_dir):
David James7c352bc2013-03-15 14:19:57 -0700337 r"""Uprevs the chrome ebuild specified by chrome_rev.
Chris Sosadad0d322011-01-31 16:37:33 -0800338
339 This is the main function that uprevs the chrome_rev from a stable candidate
340 to its new version.
341
342 Args:
343 stable_candidate: ebuild that corresponds to the stable ebuild we are
344 revving from. If None, builds the a new ebuild given the version
345 and logic for chrome_rev type with revision set to 1.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500346 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400347 chrome_pn: package name.
Peter Mayo177500f2011-09-09 17:25:23 -0400348 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400349 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
350 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700351 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
352 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400353 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
354 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700355 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
356 are release candidates for the next sticky version.
357 constants.CHROME_REV_STICKY - Revs the sticky version.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500358 chrome_version: The \d.\d.\d.\d version of Chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400359 package_dir: Path to the chromeos-chrome package dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500360
Chris Sosadad0d322011-01-31 16:37:33 -0800361 Returns:
362 Full portage version atom (including rc's, etc) that was revved.
363 """
Chris Sosa8be39132011-04-14 12:09:24 -0700364 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
365 """Returns True if the new ebuild is redundant.
366
367 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700368 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700369 """
370 if not stable_ebuild:
371 return False
372
373 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700374 return filecmp.cmp(
375 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700376
David James629febb2012-11-25 13:07:34 -0800377 # Mark latest release and sticky branches as stable.
378 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
379 constants.CHROME_REV_SPEC,
380 constants.CHROME_REV_LOCAL]
381
Chris Sosadad0d322011-01-31 16:37:33 -0800382 # Case where we have the last stable candidate with same version just rev.
383 if stable_candidate and stable_candidate.chrome_version == chrome_version:
384 new_ebuild_path = '%s-r%d.ebuild' % (
385 stable_candidate.ebuild_path_no_revision,
386 stable_candidate.current_revision + 1)
387 else:
David James629febb2012-11-25 13:07:34 -0800388 suffix = 'rc' if mark_stable else 'alpha'
David Zeuthen665d3132014-08-25 15:27:02 -0400389 pf = '%s-%s_%s-r1' % (chrome_pn, chrome_version, suffix)
390 new_ebuild_path = os.path.join(package_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800391
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,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400394 {}, 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
Mike Frysingera13c04f2016-09-01 00:35:17 -0400422def GetParser():
423 """Return a command line parser."""
424 parser = commandline.ArgumentParser(description=__doc__)
425 parser.add_argument('-b', '--boards')
426 parser.add_argument('-c', '--chrome_url',
427 default=constants.CHROMIUM_GOB_URL)
428 parser.add_argument('-f', '--force_version',
429 help='Chrome version or git revision hash to use')
430 parser.add_argument('-s', '--srcroot',
431 default=os.path.join(os.environ['HOME'], 'trunk', 'src'),
432 help='Path to the src directory')
433 parser.add_argument('-t', '--tracking_branch', default='cros/master',
434 help='Branch we are tracking changes against')
435 parser.add_argument('revision', choices=constants.VALID_CHROME_REVISIONS)
436 return parser
Chris Sosadad0d322011-01-31 16:37:33 -0800437
Chris Sosadad0d322011-01-31 16:37:33 -0800438
Mike Frysingera13c04f2016-09-01 00:35:17 -0400439def main(argv):
440 parser = GetParser()
441 options = parser.parse_args(argv)
442 options.Freeze()
443 chrome_rev = options.revision
444
445 if options.force_version and chrome_rev not in (constants.CHROME_REV_SPEC,
446 constants.CHROME_REV_LATEST):
David Jamesfb160012014-07-01 10:00:57 -0700447 parser.error('--force_version is not compatible with the %r '
Mike Frysingera13c04f2016-09-01 00:35:17 -0400448 'option.' % (chrome_rev,))
David Jamesfb160012014-07-01 10:00:57 -0700449
David Zeuthen665d3132014-08-25 15:27:02 -0400450 overlay_dir = os.path.abspath(_OVERLAY_DIR % {'srcroot': options.srcroot})
451 chrome_package_dir = os.path.join(overlay_dir, constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -0800452 version_to_uprev = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800453 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800454
David Zeuthen665d3132014-08-25 15:27:02 -0400455 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800456
Peter Mayo177500f2011-09-09 17:25:23 -0400457 if chrome_rev == constants.CHROME_REV_LOCAL:
458 if 'CHROME_ROOT' in os.environ:
459 chrome_root = os.environ['CHROME_ROOT']
460 else:
461 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
462
463 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
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:
Lann Martinffb95162018-08-28 12:02:54 -0600496 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,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400514 version_to_uprev, 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,
Mike Frysinger93ad2262018-08-30 18:42:14 -0400534 other_package_dir)
David Zeuthen665d3132014-08-25 15:27:02 -0400535 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)