blob: bda688b4101e889709f1544ed368e8b0767f221c [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
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070017import base64
18import distutils.version
Chris Sosa8be39132011-04-14 12:09:24 -070019import filecmp
Chris Sosadad0d322011-01-31 16:37:33 -080020import optparse
21import os
22import re
Chris Masone592cab52011-08-02 14:05:48 -070023import sys
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070024import urlparse
Chris Sosadad0d322011-01-31 16:37:33 -080025
Don Garrett88b8d782014-05-13 17:30:55 -070026from chromite.cbuildbot import constants
David James1b363582012-12-17 11:53:11 -080027from chromite.lib import cros_build_lib
David James97d95872012-11-16 15:09:56 -080028from chromite.lib import git
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070029from chromite.lib import gob_util
Alex Deymo075c2292014-09-04 18:31:50 -070030from chromite.lib import portage_util
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070031from chromite.lib import timeout_util
Mike Frysinger6cb624a2012-05-24 18:17:38 -040032from chromite.scripts import cros_mark_as_stable
Chris Sosadad0d322011-01-31 16:37:33 -080033
Mike Frysinger750c5f52014-09-16 16:16:57 -040034
Chris Sosadad0d322011-01-31 16:37:33 -080035# Helper regex's for finding ebuilds.
David James7c352bc2013-03-15 14:19:57 -070036_CHROME_VERSION_REGEX = r'\d+\.\d+\.\d+\.\d+'
37_NON_STICKY_REGEX = r'%s[(_rc.*)|(_alpha.*)]+' % _CHROME_VERSION_REGEX
Chris Sosadad0d322011-01-31 16:37:33 -080038
39# Dir where all the action happens.
David Zeuthen665d3132014-08-25 15:27:02 -040040_OVERLAY_DIR = '%(srcroot)s/third_party/chromiumos-overlay/'
Chris Sosadad0d322011-01-31 16:37:33 -080041
David Zeuthen665d3132014-08-25 15:27:02 -040042_GIT_COMMIT_MESSAGE = ('Marking %(chrome_rev)s for %(chrome_pn)s ebuild '
43 'with version %(chrome_version)s as stable.')
Chris Sosadad0d322011-01-31 16:37:33 -080044
Chris Masone592cab52011-08-02 14:05:48 -070045# URLs that print lists of chrome revisions between two versions of the browser.
46_CHROME_VERSION_URL = ('http://omahaproxy.appspot.com/changelog?'
47 'old_version=%(old)s&new_version=%(new)s')
Chris Sosadd611df2012-02-03 15:26:23 -080048
49# Only print links when we rev these types.
50_REV_TYPES_FOR_LINKS = [constants.CHROME_REV_LATEST,
51 constants.CHROME_REV_STICKY]
Chris Masone592cab52011-08-02 14:05:48 -070052
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070053# TODO(szager): This is inaccurate, but is it safe to change? I have no idea.
Chris Masone592cab52011-08-02 14:05:48 -070054_CHROME_SVN_TAG = 'CROS_SVN_COMMIT'
Chris Sosadad0d322011-01-31 16:37:33 -080055
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:
61 chrome_version_info: The contents of a chromium VERSION file.
62 """
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:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070074 git_url: Repository URL for chromium.
75 revision: the git revision we want to use.
petermayo@chromium.org163b3372011-09-12 02:06:05 -040076 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
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070089 def _wait_msg(_remaining_minutes):
90 cros_build_lib.Info(
91 '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:
107 root: path to the root of the chromium checkout.
108 """
109 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800110 chrome_version_info = cros_build_lib.RunCommand(
Peter Mayo177500f2011-09-09 17:25:23 -0400111 ['cat', version_file],
112 redirect_stdout=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800113 error_message='Could not read version file at %s.' % version_file).output
Peter Mayo177500f2011-09-09 17:25:23 -0400114
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400115 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400116
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800117
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700118def CheckIfChromeRightForOS(deps_content):
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700119 """Checks if DEPS is right for Chrome OS.
120
121 This function checks for a variable called 'buildspec_platforms' to
122 find out if its 'chromeos' or 'all'. If any of those values,
123 then it chooses that DEPS.
124
125 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700126 deps_content: Content of release buildspec DEPS file.
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700127
128 Returns:
129 True if DEPS is the right Chrome for Chrome OS.
130 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700131 platforms_search = re.search(r'buildspec_platforms.*\s.*\s', deps_content)
Dharani Govindancbbf69c2014-07-29 15:37:39 -0700132
133 if platforms_search:
134 platforms = platforms_search.group()
135 if 'chromeos' in platforms or 'all' in platforms:
136 return True
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700137
138 return False
139
140
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700141def GetLatestRelease(git_url, branch=None):
142 """Gets the latest release version from the release tags in the repository.
Chris Sosadad0d322011-01-31 16:37:33 -0800143
144 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700145 git_url: URL of git repository.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500146 branch: If set, gets the latest release for branch, otherwise latest
Chris Sosadad0d322011-01-31 16:37:33 -0800147 release.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500148
Chris Sosadad0d322011-01-31 16:37:33 -0800149 Returns:
150 Latest version string.
151 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700152 # TODO(szager): This only works for public release buildspecs in the chromium
153 # src repository. Internal buildspecs are tracked differently. At the time
154 # of writing, I can't find any callers that use this method to scan for
155 # internal buildspecs. But there may be something lurking...
156
157 parsed_url = urlparse.urlparse(git_url)
158 path = parsed_url[2].rstrip('/') + '/+refs/tags?format=JSON'
159 j = gob_util.FetchUrlJson(parsed_url[1], path, ignore_404=False)
Chris Sosadad0d322011-01-31 16:37:33 -0800160 if branch:
David James7c352bc2013-03-15 14:19:57 -0700161 chrome_version_re = re.compile(r'^%s\.\d+.*' % branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800162 else:
David James7c352bc2013-03-15 14:19:57 -0700163 chrome_version_re = re.compile(r'^[0-9]+\..*')
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700164 matching_versions = [key for key in j.keys() if chrome_version_re.match(key)]
165 matching_versions.sort(key=distutils.version.LooseVersion)
166 for chrome_version in reversed(matching_versions):
167 path = parsed_url[2].rstrip() + (
168 '/+/refs/tags/%s/DEPS?format=text' % chrome_version)
169 fh = gob_util.FetchUrl(parsed_url[1], path, ignore_404=False)
170 content = fh.read() if fh else None
171 if content:
172 deps_content = base64.b64decode(content)
173 if CheckIfChromeRightForOS(deps_content):
174 return chrome_version
Peter Mayoad8173d2011-11-08 16:18:23 -0500175
176 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800177
178
179def _GetStickyEBuild(stable_ebuilds):
180 """Returns the sticky ebuild."""
181 sticky_ebuilds = []
182 non_sticky_re = re.compile(_NON_STICKY_REGEX)
183 for ebuild in stable_ebuilds:
184 if not non_sticky_re.match(ebuild.version):
185 sticky_ebuilds.append(ebuild)
186
187 if not sticky_ebuilds:
188 raise Exception('No sticky ebuilds found')
189 elif len(sticky_ebuilds) > 1:
David James1b363582012-12-17 11:53:11 -0800190 cros_build_lib.Warning('More than one sticky ebuild found')
Chris Sosadad0d322011-01-31 16:37:33 -0800191
Alex Deymo075c2292014-09-04 18:31:50 -0700192 return portage_util.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800193
194
Alex Deymo075c2292014-09-04 18:31:50 -0700195class ChromeEBuild(portage_util.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800196 """Thin sub-class of EBuild that adds a chrome_version field."""
David Zeuthen665d3132014-08-25 15:27:02 -0400197 chrome_version_re = re.compile(r'.*-(%s|9999).*' % (
198 _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800199 chrome_version = ''
200
201 def __init__(self, path):
Alex Deymo075c2292014-09-04 18:31:50 -0700202 portage_util.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800203 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
204 if re_match:
205 self.chrome_version = re_match.group(1)
206
Chris Sosadad0d322011-01-31 16:37:33 -0800207 def __str__(self):
208 return self.ebuild_path
209
210
David Zeuthen665d3132014-08-25 15:27:02 -0400211def FindChromeCandidates(package_dir):
Chris Sosadad0d322011-01-31 16:37:33 -0800212 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
213
214 Args:
David Zeuthen665d3132014-08-25 15:27:02 -0400215 package_dir: The path to where the package ebuild is stored.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500216
Chris Sosadad0d322011-01-31 16:37:33 -0800217 Returns:
218 Tuple [unstable_ebuild, stable_ebuilds].
Mike Frysinger1a736a82013-12-12 01:50:59 -0500219
Chris Sosadad0d322011-01-31 16:37:33 -0800220 Raises:
221 Exception: if no unstable ebuild exists for Chrome.
222 """
223 stable_ebuilds = []
224 unstable_ebuilds = []
225 for path in [
David Zeuthen665d3132014-08-25 15:27:02 -0400226 os.path.join(package_dir, entry) for entry in os.listdir(package_dir)]:
Chris Sosadad0d322011-01-31 16:37:33 -0800227 if path.endswith('.ebuild'):
228 ebuild = ChromeEBuild(path)
229 if not ebuild.chrome_version:
David James1b363582012-12-17 11:53:11 -0800230 cros_build_lib.Warning('Poorly formatted ebuild found at %s' % path)
Chris Sosadad0d322011-01-31 16:37:33 -0800231 else:
232 if '9999' in ebuild.version:
233 unstable_ebuilds.append(ebuild)
234 else:
235 stable_ebuilds.append(ebuild)
236
237 # Apply some sanity checks.
238 if not unstable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400239 raise Exception('Missing 9999 ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800240 if not stable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400241 cros_build_lib.Warning('Missing stable ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800242
Alex Deymo075c2292014-09-04 18:31:50 -0700243 return portage_util.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800244
245
246def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
247 """Finds the Chrome uprev candidate for the given chrome_rev.
248
249 Using the pre-flight logic, this means the stable ebuild you are uprevving
250 from. The difference here is that the version could be different and in
251 that case we want to find it to delete it.
252
253 Args:
254 stable_ebuilds: A list of stable ebuilds.
255 chrome_rev: The chrome_rev designating which candidate to find.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500256 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800257 components. For example: 9.0.553. Can be None but not if chrome_rev
258 is CHROME_REV_STICKY.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500259
Chris Sosadad0d322011-01-31 16:37:33 -0800260 Returns:
Mike Frysinger1a736a82013-12-12 01:50:59 -0500261 The EBuild, otherwise None if none found.
Chris Sosadad0d322011-01-31 16:37:33 -0800262 """
263 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400264 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
265 constants.CHROME_REV_SPEC]:
266 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400267 # not just for the fun of confusion.
David James7c352bc2013-03-15 14:19:57 -0700268 chrome_branch_re = re.compile(r'%s.*_alpha.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800269 for ebuild in stable_ebuilds:
270 if chrome_branch_re.search(ebuild.version):
271 candidates.append(ebuild)
272
Ryan Cuic6e097d2011-06-16 12:23:14 -0700273 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800274 assert sticky_branch is not None
David James7c352bc2013-03-15 14:19:57 -0700275 chrome_branch_re = re.compile(r'%s\..*' % sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800276 for ebuild in stable_ebuilds:
277 if chrome_branch_re.search(ebuild.version):
278 candidates.append(ebuild)
279
280 else:
David James7c352bc2013-03-15 14:19:57 -0700281 chrome_branch_re = re.compile(r'%s.*_rc.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800282 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800283 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800284 candidates.append(ebuild)
285
286 if candidates:
Alex Deymo075c2292014-09-04 18:31:50 -0700287 return portage_util.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800288 else:
289 return None
290
Mike Frysingercc838832014-05-24 13:10:30 -0400291
Chris Masone592cab52011-08-02 14:05:48 -0700292def _AnnotateAndPrint(text, url):
293 """Add buildbot trappings to print <a href='url'>text</a> in the waterfall.
294
295 Args:
296 text: Anchor text for the link
297 url: the URL to which to link
298 """
Don Garrette60de902011-10-17 18:52:05 -0700299 print >> sys.stderr, '\n@@@STEP_LINK@%(text)s@%(url)s@@@' % { 'text': text,
Chris Masone592cab52011-08-02 14:05:48 -0700300 'url': url }
301
Mike Frysinger750c5f52014-09-16 16:16:57 -0400302
Chris Masone592cab52011-08-02 14:05:48 -0700303def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
304 """Return appropriately formatted link to revision info, given versions
305
306 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
307 page that prints the Chromium revisions between those two versions.
308
309 Args:
310 old_chrome_version: version to diff from
311 chrome_version: version to which to diff
Mike Frysinger1a736a82013-12-12 01:50:59 -0500312
Chris Masone592cab52011-08-02 14:05:48 -0700313 Returns:
314 The desired URL.
315 """
316 return _CHROME_VERSION_URL % { 'old': old_chrome_version,
317 'new': chrome_version }
318
Mike Frysinger750c5f52014-09-16 16:16:57 -0400319
Chris Masone592cab52011-08-02 14:05:48 -0700320def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
321 """Returns a link to the list of revisions between two Chromium versions
322
323 Given two ChromeEBuilds and the kind of rev we're doing, generate a
324 link to a page that prints the Chromium changes between those two
325 revisions, inclusive.
326
327 Args:
328 old_chrome: ebuild for the version to diff from
329 new_chrome: ebuild for the version to which to diff
330 chrome_rev: one of constants.VALID_CHROME_REVISIONS
Mike Frysinger1a736a82013-12-12 01:50:59 -0500331
Chris Masone592cab52011-08-02 14:05:48 -0700332 Returns:
333 The desired URL.
334 """
Chris Sosadd611df2012-02-03 15:26:23 -0800335 assert chrome_rev in _REV_TYPES_FOR_LINKS
336 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
337 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800338
Mike Frysingercc838832014-05-24 13:10:30 -0400339
David Zeuthen665d3132014-08-25 15:27:02 -0400340def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_pn,
341 chrome_rev, chrome_version, commit, package_dir):
David James7c352bc2013-03-15 14:19:57 -0700342 r"""Uprevs the chrome ebuild specified by chrome_rev.
Chris Sosadad0d322011-01-31 16:37:33 -0800343
344 This is the main function that uprevs the chrome_rev from a stable candidate
345 to its new version.
346
347 Args:
348 stable_candidate: ebuild that corresponds to the stable ebuild we are
349 revving from. If None, builds the a new ebuild given the version
350 and logic for chrome_rev type with revision set to 1.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500351 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400352 chrome_pn: package name.
Peter Mayo177500f2011-09-09 17:25:23 -0400353 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400354 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
355 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700356 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
357 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400358 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
359 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700360 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
361 are release candidates for the next sticky version.
362 constants.CHROME_REV_STICKY - Revs the sticky version.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500363 chrome_version: The \d.\d.\d.\d version of Chrome.
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700364 commit: Used with constants.CHROME_REV_TOT. The git revision of chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400365 package_dir: Path to the chromeos-chrome package dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500366
Chris Sosadad0d322011-01-31 16:37:33 -0800367 Returns:
368 Full portage version atom (including rc's, etc) that was revved.
369 """
Chris Sosa8be39132011-04-14 12:09:24 -0700370 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
371 """Returns True if the new ebuild is redundant.
372
373 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700374 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700375 """
376 if not stable_ebuild:
377 return False
378
379 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700380 return filecmp.cmp(
381 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700382
David James629febb2012-11-25 13:07:34 -0800383 # Mark latest release and sticky branches as stable.
384 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
385 constants.CHROME_REV_SPEC,
386 constants.CHROME_REV_LOCAL]
387
Chris Sosadad0d322011-01-31 16:37:33 -0800388 # Case where we have the last stable candidate with same version just rev.
389 if stable_candidate and stable_candidate.chrome_version == chrome_version:
390 new_ebuild_path = '%s-r%d.ebuild' % (
391 stable_candidate.ebuild_path_no_revision,
392 stable_candidate.current_revision + 1)
393 else:
David James629febb2012-11-25 13:07:34 -0800394 suffix = 'rc' if mark_stable else 'alpha'
David Zeuthen665d3132014-08-25 15:27:02 -0400395 pf = '%s-%s_%s-r1' % (chrome_pn, chrome_version, suffix)
396 new_ebuild_path = os.path.join(package_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800397
David Jamesa6792552012-04-03 10:05:35 -0700398 chrome_variables = dict()
399 if commit:
400 chrome_variables[_CHROME_SVN_TAG] = commit
401
Alex Deymo075c2292014-09-04 18:31:50 -0700402 portage_util.EBuild.MarkAsStable(
David James065b2012012-04-01 14:51:11 -0700403 unstable_ebuild.ebuild_path, new_ebuild_path,
David Jamesa6792552012-04-03 10:05:35 -0700404 chrome_variables, make_stable=mark_stable)
Chris Sosadad0d322011-01-31 16:37:33 -0800405 new_ebuild = ChromeEBuild(new_ebuild_path)
Chris Sosa8be39132011-04-14 12:09:24 -0700406
407 # Determine whether this is ebuild is redundant.
408 if IsTheNewEBuildRedundant(new_ebuild, stable_candidate):
David James1b363582012-12-17 11:53:11 -0800409 msg = 'Previous ebuild with same version found and ebuild is redundant.'
410 cros_build_lib.Info(msg)
Chris Sosa8be39132011-04-14 12:09:24 -0700411 os.unlink(new_ebuild_path)
412 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800413
Chris Sosadd611df2012-02-03 15:26:23 -0800414 if stable_candidate and chrome_rev in _REV_TYPES_FOR_LINKS:
Chris Masone592cab52011-08-02 14:05:48 -0700415 _AnnotateAndPrint('Chromium revisions',
416 GetChromeRevisionListLink(stable_candidate,
417 new_ebuild,
418 chrome_rev))
419
David Zeuthen665d3132014-08-25 15:27:02 -0400420 git.RunGit(package_dir, ['add', new_ebuild_path])
Chris Sosa9ba47752012-02-27 15:27:37 -0800421 if stable_candidate and not stable_candidate.IsSticky():
David Zeuthen665d3132014-08-25 15:27:02 -0400422 git.RunGit(package_dir, ['rm', stable_candidate.ebuild_path])
Chris Sosadad0d322011-01-31 16:37:33 -0800423
Alex Deymo075c2292014-09-04 18:31:50 -0700424 portage_util.EBuild.CommitChange(
David Zeuthen665d3132014-08-25 15:27:02 -0400425 _GIT_COMMIT_MESSAGE % {'chrome_pn': chrome_pn,
426 'chrome_rev': chrome_rev,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400427 'chrome_version': chrome_version},
David Zeuthen665d3132014-08-25 15:27:02 -0400428 package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800429
Chris Sosadad0d322011-01-31 16:37:33 -0800430 return '%s-%s' % (new_ebuild.package, new_ebuild.version)
431
432
David James1b363582012-12-17 11:53:11 -0800433def main(_argv):
Chris Sosa0f295aa2011-10-21 14:10:28 -0700434 usage_options = '|'.join(constants.VALID_CHROME_REVISIONS)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700435 usage = '%s OPTIONS [%s]' % (__file__, usage_options)
Chris Sosadad0d322011-01-31 16:37:33 -0800436 parser = optparse.OptionParser(usage)
Yu-Ju Hong575b3662014-08-05 13:33:41 -0700437 parser.add_option('-b', '--boards', default=None)
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700438 parser.add_option('-c', '--chrome_url',
439 default=constants.CHROMIUM_GOB_URL)
David Jamesfb160012014-07-01 10:00:57 -0700440 parser.add_option('-f', '--force_version', default=None,
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700441 help='Chrome version or git revision hash to use')
Chris Sosadad0d322011-01-31 16:37:33 -0800442 parser.add_option('-s', '--srcroot', default=os.path.join(os.environ['HOME'],
443 'trunk', 'src'),
444 help='Path to the src directory')
445 parser.add_option('-t', '--tracking_branch', default='cros/master',
446 help='Branch we are tracking changes against')
447 (options, args) = parser.parse_args()
448
Ryan Cuic6e097d2011-06-16 12:23:14 -0700449 if len(args) != 1 or args[0] not in constants.VALID_CHROME_REVISIONS:
450 parser.error('Commit requires arg set to one of %s.'
451 % constants.VALID_CHROME_REVISIONS)
Chris Sosadad0d322011-01-31 16:37:33 -0800452
David James9a5980e2014-07-16 09:37:00 -0700453 if options.force_version and args[0] not in (constants.CHROME_REV_SPEC,
454 constants.CHROME_REV_LATEST):
David Jamesfb160012014-07-01 10:00:57 -0700455 parser.error('--force_version is not compatible with the %r '
456 'option.' % (args[0],))
457
David Zeuthen665d3132014-08-25 15:27:02 -0400458 overlay_dir = os.path.abspath(_OVERLAY_DIR % {'srcroot': options.srcroot})
459 chrome_package_dir = os.path.join(overlay_dir, constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -0800460 chrome_rev = args[0]
461 version_to_uprev = None
462 commit_to_use = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800463 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800464
David Zeuthen665d3132014-08-25 15:27:02 -0400465 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800466
Peter Mayo177500f2011-09-09 17:25:23 -0400467 if chrome_rev == constants.CHROME_REV_LOCAL:
468 if 'CHROME_ROOT' in os.environ:
469 chrome_root = os.environ['CHROME_ROOT']
470 else:
471 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
472
473 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
474 commit_to_use = 'Unknown'
David James1b363582012-12-17 11:53:11 -0800475 cros_build_lib.Info('Using local source, versioning is untrustworthy.')
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400476 elif chrome_rev == constants.CHROME_REV_SPEC:
David Jamesfb160012014-07-01 10:00:57 -0700477 if '.' in options.force_version:
478 version_to_uprev = options.force_version
479 else:
480 commit_to_use = options.force_version
481 if '@' in commit_to_use:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700482 commit_to_use = commit_to_use.rpartition('@')[2]
David Jamesfb160012014-07-01 10:00:57 -0700483 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
484 commit_to_use)
Peter Mayo177500f2011-09-09 17:25:23 -0400485 elif chrome_rev == constants.CHROME_REV_TOT:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700486 commit_to_use = gob_util.GetTipOfTrunkRevision(options.chrome_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400487 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
488 commit_to_use)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700489 elif chrome_rev == constants.CHROME_REV_LATEST:
David James9a5980e2014-07-16 09:37:00 -0700490 if options.force_version:
491 if '.' not in options.force_version:
492 parser.error('%s only accepts released Chrome versions, not SVN or '
493 'Git revisions.' % (chrome_rev,))
494 version_to_uprev = options.force_version
495 else:
496 version_to_uprev = GetLatestRelease(options.chrome_url)
Chris Sosadad0d322011-01-31 16:37:33 -0800497 else:
Chris Sosa9ba47752012-02-27 15:27:37 -0800498 sticky_ebuild = _GetStickyEBuild(stable_ebuilds)
499 sticky_version = sticky_ebuild.chrome_version
500 sticky_branch = sticky_version.rpartition('.')[0]
Yu-Ju Hong39806322014-06-24 16:46:32 -0700501 version_to_uprev = GetLatestRelease(options.chrome_url, sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800502
503 stable_candidate = FindChromeUprevCandidate(stable_ebuilds, chrome_rev,
504 sticky_branch)
505
506 if stable_candidate:
David James1b363582012-12-17 11:53:11 -0800507 cros_build_lib.Info('Stable candidate found %s' % stable_candidate)
Chris Sosadad0d322011-01-31 16:37:33 -0800508 else:
David James1b363582012-12-17 11:53:11 -0800509 cros_build_lib.Info('No stable candidate found.')
Chris Sosadad0d322011-01-31 16:37:33 -0800510
Chris Sosa8049f3b2011-05-02 20:09:28 -0700511 tracking_branch = 'remotes/m/%s' % os.path.basename(options.tracking_branch)
David Zeuthen665d3132014-08-25 15:27:02 -0400512 existing_branch = git.GetCurrentBranch(chrome_package_dir)
Ryan Cui05a31ba2011-05-31 17:47:37 -0700513 work_branch = cros_mark_as_stable.GitBranch(constants.STABLE_EBUILD_BRANCH,
David Zeuthen665d3132014-08-25 15:27:02 -0400514 tracking_branch,
515 chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800516 work_branch.CreateBranch()
David Jamesd6708c02012-03-22 10:49:15 -0700517
518 # In the case of uprevving overlays that have patches applied to them,
519 # include the patched changes in the stabilizing branch.
520 if existing_branch:
David Zeuthen665d3132014-08-25 15:27:02 -0400521 git.RunGit(chrome_package_dir, ['rebase', existing_branch])
David Jamesd6708c02012-03-22 10:49:15 -0700522
Chris Sosadad0d322011-01-31 16:37:33 -0800523 chrome_version_atom = MarkChromeEBuildAsStable(
David Zeuthen665d3132014-08-25 15:27:02 -0400524 stable_candidate, unstable_ebuild, 'chromeos-chrome', chrome_rev,
525 version_to_uprev, commit_to_use, chrome_package_dir)
Yu-Ju Hong078c9ec2014-08-06 18:25:16 -0700526 if chrome_version_atom:
527 if options.boards:
528 cros_mark_as_stable.CleanStalePackages(options.boards.split(':'),
529 [chrome_version_atom])
David Zeuthen665d3132014-08-25 15:27:02 -0400530
531 # If we did rev Chrome, now is a good time to uprev other packages.
532 for other_ebuild in constants.OTHER_CHROME_PACKAGES:
533 other_ebuild_name = os.path.basename(other_ebuild)
534 other_package_dir = os.path.join(overlay_dir, other_ebuild)
535 (other_unstable_ebuild, other_stable_ebuilds) = FindChromeCandidates(
536 other_package_dir)
537 other_stable_candidate = FindChromeUprevCandidate(other_stable_ebuilds,
538 chrome_rev,
539 sticky_branch)
540 revved_atom = MarkChromeEBuildAsStable(other_stable_candidate,
541 other_unstable_ebuild,
542 other_ebuild_name,
543 chrome_rev, version_to_uprev,
544 commit_to_use, other_package_dir)
545 if revved_atom and options.boards:
546 cros_mark_as_stable.CleanStalePackages(options.boards.split(':'),
547 [revved_atom])
548
549 # Explicit print to communicate to caller.
550 if chrome_version_atom:
Chris Sosadad0d322011-01-31 16:37:33 -0800551 print 'CHROME_VERSION_ATOM=%s' % chrome_version_atom