blob: c2a77d20cf38223c97422fd33af4132b8c3a05f3 [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 Frysinger1d4752b2014-11-08 04:00:18 -050017# pylint: disable=bad-whitespace
18
Mike Frysinger383367e2014-09-16 15:06:17 -040019from __future__ import print_function
20
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070021import base64
22import distutils.version
Chris Sosa8be39132011-04-14 12:09:24 -070023import filecmp
Chris Sosadad0d322011-01-31 16:37:33 -080024import optparse
25import os
26import re
Chris Masone592cab52011-08-02 14:05:48 -070027import sys
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070028import urlparse
Chris Sosadad0d322011-01-31 16:37:33 -080029
Don Garrett88b8d782014-05-13 17:30:55 -070030from chromite.cbuildbot import constants
David James1b363582012-12-17 11:53:11 -080031from chromite.lib import cros_build_lib
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
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070057# TODO(szager): This is inaccurate, but is it safe to change? I have no idea.
Chris Masone592cab52011-08-02 14:05:48 -070058_CHROME_SVN_TAG = 'CROS_SVN_COMMIT'
Chris Sosadad0d322011-01-31 16:37:33 -080059
ChromeOS Developer03118eb2013-02-12 14:27:09 -080060
petermayo@chromium.org163b3372011-09-12 02:06:05 -040061def _GetVersionContents(chrome_version_info):
Peter Mayo177500f2011-09-09 17:25:23 -040062 """Returns the current Chromium version, from the contents of a VERSION file.
Chris Sosadad0d322011-01-31 16:37:33 -080063
Peter Mayo177500f2011-09-09 17:25:23 -040064 Args:
65 chrome_version_info: The contents of a chromium VERSION file.
66 """
Chris Sosadad0d322011-01-31 16:37:33 -080067 chrome_version_array = []
Chris Sosadad0d322011-01-31 16:37:33 -080068 for line in chrome_version_info.splitlines():
69 chrome_version_array.append(line.rpartition('=')[2])
70
71 return '.'.join(chrome_version_array)
72
Mike Frysingercc838832014-05-24 13:10:30 -040073
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070074def _GetSpecificVersionUrl(git_url, revision, time_to_wait=600):
petermayo@chromium.org163b3372011-09-12 02:06:05 -040075 """Returns the Chromium version, from a repository URL and version.
Peter Mayo177500f2011-09-09 17:25:23 -040076
77 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070078 git_url: Repository URL for chromium.
79 revision: the git revision we want to use.
petermayo@chromium.org163b3372011-09-12 02:06:05 -040080 time_to_wait: the minimum period before abandoning our wait for the
81 desired revision to be present.
Peter Mayo177500f2011-09-09 17:25:23 -040082 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070083 parsed_url = urlparse.urlparse(git_url)
84 host = parsed_url[1]
85 path = parsed_url[2].rstrip('/') + (
86 '/+/%s/chrome/VERSION?format=text' % revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040087
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070088 # Allow for git repository replication lag with sleep/retry loop.
89 def _fetch():
90 fh = gob_util.FetchUrl(host, path, ignore_404=True)
91 return fh.read() if fh else None
petermayo@chromium.org163b3372011-09-12 02:06:05 -040092
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070093 def _wait_msg(_remaining_minutes):
94 cros_build_lib.Info(
95 'Repository does not yet have revision %s. Sleeping...',
96 revision)
petermayo@chromium.org163b3372011-09-12 02:06:05 -040097
Stefan Zagerd49d9ff2014-08-15 21:33:37 -070098 content = timeout_util.WaitForSuccess(
99 retry_check=lambda x: not bool(x),
100 func=_fetch,
101 timeout=time_to_wait,
102 period=30,
103 side_effect_func=_wait_msg)
104 return _GetVersionContents(base64.b64decode(content))
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400105
Peter Mayo177500f2011-09-09 17:25:23 -0400106
107def _GetTipOfTrunkVersionFile(root):
108 """Returns the current Chromium version, from a file in a checkout.
109
110 Args:
111 root: path to the root of the chromium checkout.
112 """
113 version_file = os.path.join(root, 'src', 'chrome', 'VERSION')
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800114 chrome_version_info = cros_build_lib.RunCommand(
Peter Mayo177500f2011-09-09 17:25:23 -0400115 ['cat', version_file],
116 redirect_stdout=True,
J. Richard Barnetted422f622011-11-17 09:39:46 -0800117 error_message='Could not read version file at %s.' % version_file).output
Peter Mayo177500f2011-09-09 17:25:23 -0400118
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400119 return _GetVersionContents(chrome_version_info)
Peter Mayo177500f2011-09-09 17:25:23 -0400120
ChromeOS Developer03118eb2013-02-12 14:27:09 -0800121
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700122def CheckIfChromeRightForOS(deps_content):
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700123 """Checks if DEPS is right for Chrome OS.
124
125 This function checks for a variable called 'buildspec_platforms' to
126 find out if its 'chromeos' or 'all'. If any of those values,
127 then it chooses that DEPS.
128
129 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700130 deps_content: Content of release buildspec DEPS file.
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700131
132 Returns:
133 True if DEPS is the right Chrome for Chrome OS.
134 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700135 platforms_search = re.search(r'buildspec_platforms.*\s.*\s', deps_content)
Dharani Govindancbbf69c2014-07-29 15:37:39 -0700136
137 if platforms_search:
138 platforms = platforms_search.group()
139 if 'chromeos' in platforms or 'all' in platforms:
140 return True
Dharani Govindan4beb94c2014-07-18 13:31:47 -0700141
142 return False
143
144
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700145def GetLatestRelease(git_url, branch=None):
146 """Gets the latest release version from the release tags in the repository.
Chris Sosadad0d322011-01-31 16:37:33 -0800147
148 Args:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700149 git_url: URL of git repository.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500150 branch: If set, gets the latest release for branch, otherwise latest
Chris Sosadad0d322011-01-31 16:37:33 -0800151 release.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500152
Chris Sosadad0d322011-01-31 16:37:33 -0800153 Returns:
154 Latest version string.
155 """
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700156 # TODO(szager): This only works for public release buildspecs in the chromium
157 # src repository. Internal buildspecs are tracked differently. At the time
158 # of writing, I can't find any callers that use this method to scan for
159 # internal buildspecs. But there may be something lurking...
160
161 parsed_url = urlparse.urlparse(git_url)
162 path = parsed_url[2].rstrip('/') + '/+refs/tags?format=JSON'
163 j = gob_util.FetchUrlJson(parsed_url[1], path, ignore_404=False)
Chris Sosadad0d322011-01-31 16:37:33 -0800164 if branch:
David James7c352bc2013-03-15 14:19:57 -0700165 chrome_version_re = re.compile(r'^%s\.\d+.*' % branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800166 else:
David James7c352bc2013-03-15 14:19:57 -0700167 chrome_version_re = re.compile(r'^[0-9]+\..*')
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700168 matching_versions = [key for key in j.keys() if chrome_version_re.match(key)]
169 matching_versions.sort(key=distutils.version.LooseVersion)
170 for chrome_version in reversed(matching_versions):
171 path = parsed_url[2].rstrip() + (
172 '/+/refs/tags/%s/DEPS?format=text' % chrome_version)
173 fh = gob_util.FetchUrl(parsed_url[1], path, ignore_404=False)
174 content = fh.read() if fh else None
175 if content:
176 deps_content = base64.b64decode(content)
177 if CheckIfChromeRightForOS(deps_content):
178 return chrome_version
Peter Mayoad8173d2011-11-08 16:18:23 -0500179
180 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800181
182
183def _GetStickyEBuild(stable_ebuilds):
184 """Returns the sticky ebuild."""
185 sticky_ebuilds = []
186 non_sticky_re = re.compile(_NON_STICKY_REGEX)
187 for ebuild in stable_ebuilds:
188 if not non_sticky_re.match(ebuild.version):
189 sticky_ebuilds.append(ebuild)
190
191 if not sticky_ebuilds:
192 raise Exception('No sticky ebuilds found')
193 elif len(sticky_ebuilds) > 1:
David James1b363582012-12-17 11:53:11 -0800194 cros_build_lib.Warning('More than one sticky ebuild found')
Chris Sosadad0d322011-01-31 16:37:33 -0800195
Alex Deymo075c2292014-09-04 18:31:50 -0700196 return portage_util.BestEBuild(sticky_ebuilds)
Chris Sosadad0d322011-01-31 16:37:33 -0800197
198
Alex Deymo075c2292014-09-04 18:31:50 -0700199class ChromeEBuild(portage_util.EBuild):
Chris Sosadad0d322011-01-31 16:37:33 -0800200 """Thin sub-class of EBuild that adds a chrome_version field."""
David Zeuthen665d3132014-08-25 15:27:02 -0400201 chrome_version_re = re.compile(r'.*-(%s|9999).*' % (
202 _CHROME_VERSION_REGEX))
Chris Sosadad0d322011-01-31 16:37:33 -0800203 chrome_version = ''
204
205 def __init__(self, path):
Alex Deymo075c2292014-09-04 18:31:50 -0700206 portage_util.EBuild.__init__(self, path)
Chris Sosadad0d322011-01-31 16:37:33 -0800207 re_match = self.chrome_version_re.match(self.ebuild_path_no_revision)
208 if re_match:
209 self.chrome_version = re_match.group(1)
210
Chris Sosadad0d322011-01-31 16:37:33 -0800211 def __str__(self):
212 return self.ebuild_path
213
214
David Zeuthen665d3132014-08-25 15:27:02 -0400215def FindChromeCandidates(package_dir):
Chris Sosadad0d322011-01-31 16:37:33 -0800216 """Return a tuple of chrome's unstable ebuild and stable ebuilds.
217
218 Args:
David Zeuthen665d3132014-08-25 15:27:02 -0400219 package_dir: The path to where the package ebuild is stored.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500220
Chris Sosadad0d322011-01-31 16:37:33 -0800221 Returns:
222 Tuple [unstable_ebuild, stable_ebuilds].
Mike Frysinger1a736a82013-12-12 01:50:59 -0500223
Chris Sosadad0d322011-01-31 16:37:33 -0800224 Raises:
225 Exception: if no unstable ebuild exists for Chrome.
226 """
227 stable_ebuilds = []
228 unstable_ebuilds = []
229 for path in [
David Zeuthen665d3132014-08-25 15:27:02 -0400230 os.path.join(package_dir, entry) for entry in os.listdir(package_dir)]:
Chris Sosadad0d322011-01-31 16:37:33 -0800231 if path.endswith('.ebuild'):
232 ebuild = ChromeEBuild(path)
233 if not ebuild.chrome_version:
David James1b363582012-12-17 11:53:11 -0800234 cros_build_lib.Warning('Poorly formatted ebuild found at %s' % path)
Chris Sosadad0d322011-01-31 16:37:33 -0800235 else:
236 if '9999' in ebuild.version:
237 unstable_ebuilds.append(ebuild)
238 else:
239 stable_ebuilds.append(ebuild)
240
241 # Apply some sanity checks.
242 if not unstable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400243 raise Exception('Missing 9999 ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800244 if not stable_ebuilds:
David Zeuthen665d3132014-08-25 15:27:02 -0400245 cros_build_lib.Warning('Missing stable ebuild for %s' % package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800246
Alex Deymo075c2292014-09-04 18:31:50 -0700247 return portage_util.BestEBuild(unstable_ebuilds), stable_ebuilds
Chris Sosadad0d322011-01-31 16:37:33 -0800248
249
250def FindChromeUprevCandidate(stable_ebuilds, chrome_rev, sticky_branch):
251 """Finds the Chrome uprev candidate for the given chrome_rev.
252
253 Using the pre-flight logic, this means the stable ebuild you are uprevving
254 from. The difference here is that the version could be different and in
255 that case we want to find it to delete it.
256
257 Args:
258 stable_ebuilds: A list of stable ebuilds.
259 chrome_rev: The chrome_rev designating which candidate to find.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500260 sticky_branch: The the branch that is currently sticky with Major/Minor
Chris Sosa9ba47752012-02-27 15:27:37 -0800261 components. For example: 9.0.553. Can be None but not if chrome_rev
262 is CHROME_REV_STICKY.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500263
Chris Sosadad0d322011-01-31 16:37:33 -0800264 Returns:
Mike Frysinger1a736a82013-12-12 01:50:59 -0500265 The EBuild, otherwise None if none found.
Chris Sosadad0d322011-01-31 16:37:33 -0800266 """
267 candidates = []
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400268 if chrome_rev in [constants.CHROME_REV_LOCAL, constants.CHROME_REV_TOT,
269 constants.CHROME_REV_SPEC]:
270 # These are labelled alpha, for historic reasons,
Peter Mayo177500f2011-09-09 17:25:23 -0400271 # not just for the fun of confusion.
David James7c352bc2013-03-15 14:19:57 -0700272 chrome_branch_re = re.compile(r'%s.*_alpha.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800273 for ebuild in stable_ebuilds:
274 if chrome_branch_re.search(ebuild.version):
275 candidates.append(ebuild)
276
Ryan Cuic6e097d2011-06-16 12:23:14 -0700277 elif chrome_rev == constants.CHROME_REV_STICKY:
Chris Sosa9ba47752012-02-27 15:27:37 -0800278 assert sticky_branch is not None
David James7c352bc2013-03-15 14:19:57 -0700279 chrome_branch_re = re.compile(r'%s\..*' % sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800280 for ebuild in stable_ebuilds:
281 if chrome_branch_re.search(ebuild.version):
282 candidates.append(ebuild)
283
284 else:
David James7c352bc2013-03-15 14:19:57 -0700285 chrome_branch_re = re.compile(r'%s.*_rc.*' % _CHROME_VERSION_REGEX)
Chris Sosadad0d322011-01-31 16:37:33 -0800286 for ebuild in stable_ebuilds:
Chris Sosa9ba47752012-02-27 15:27:37 -0800287 if chrome_branch_re.search(ebuild.version):
Chris Sosadad0d322011-01-31 16:37:33 -0800288 candidates.append(ebuild)
289
290 if candidates:
Alex Deymo075c2292014-09-04 18:31:50 -0700291 return portage_util.BestEBuild(candidates)
Chris Sosadad0d322011-01-31 16:37:33 -0800292 else:
293 return None
294
Mike Frysingercc838832014-05-24 13:10:30 -0400295
Chris Masone592cab52011-08-02 14:05:48 -0700296def _AnnotateAndPrint(text, url):
297 """Add buildbot trappings to print <a href='url'>text</a> in the waterfall.
298
299 Args:
300 text: Anchor text for the link
301 url: the URL to which to link
302 """
Mike Frysinger383367e2014-09-16 15:06:17 -0400303 print('\n@@@STEP_LINK@%(text)s@%(url)s@@@' % {'text': text, 'url': url},
304 file=sys.stderr)
Chris Masone592cab52011-08-02 14:05:48 -0700305
Mike Frysinger750c5f52014-09-16 16:16:57 -0400306
Chris Masone592cab52011-08-02 14:05:48 -0700307def GetChromeRevisionLinkFromVersions(old_chrome_version, chrome_version):
308 """Return appropriately formatted link to revision info, given versions
309
310 Given two chrome version strings (e.g. 9.0.533.0), generate a link to a
311 page that prints the Chromium revisions between those two versions.
312
313 Args:
314 old_chrome_version: version to diff from
315 chrome_version: version to which to diff
Mike Frysinger1a736a82013-12-12 01:50:59 -0500316
Chris Masone592cab52011-08-02 14:05:48 -0700317 Returns:
318 The desired URL.
319 """
320 return _CHROME_VERSION_URL % { 'old': old_chrome_version,
321 'new': chrome_version }
322
Mike Frysinger750c5f52014-09-16 16:16:57 -0400323
Chris Masone592cab52011-08-02 14:05:48 -0700324def GetChromeRevisionListLink(old_chrome, new_chrome, chrome_rev):
325 """Returns a link to the list of revisions between two Chromium versions
326
327 Given two ChromeEBuilds and the kind of rev we're doing, generate a
328 link to a page that prints the Chromium changes between those two
329 revisions, inclusive.
330
331 Args:
332 old_chrome: ebuild for the version to diff from
333 new_chrome: ebuild for the version to which to diff
334 chrome_rev: one of constants.VALID_CHROME_REVISIONS
Mike Frysinger1a736a82013-12-12 01:50:59 -0500335
Chris Masone592cab52011-08-02 14:05:48 -0700336 Returns:
337 The desired URL.
338 """
Chris Sosadd611df2012-02-03 15:26:23 -0800339 assert chrome_rev in _REV_TYPES_FOR_LINKS
340 return GetChromeRevisionLinkFromVersions(old_chrome.chrome_version,
341 new_chrome.chrome_version)
Chris Sosadad0d322011-01-31 16:37:33 -0800342
Mike Frysingercc838832014-05-24 13:10:30 -0400343
David Zeuthen665d3132014-08-25 15:27:02 -0400344def MarkChromeEBuildAsStable(stable_candidate, unstable_ebuild, chrome_pn,
345 chrome_rev, chrome_version, commit, package_dir):
David James7c352bc2013-03-15 14:19:57 -0700346 r"""Uprevs the chrome ebuild specified by chrome_rev.
Chris Sosadad0d322011-01-31 16:37:33 -0800347
348 This is the main function that uprevs the chrome_rev from a stable candidate
349 to its new version.
350
351 Args:
352 stable_candidate: ebuild that corresponds to the stable ebuild we are
353 revving from. If None, builds the a new ebuild given the version
354 and logic for chrome_rev type with revision set to 1.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500355 unstable_ebuild: ebuild corresponding to the unstable ebuild for chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400356 chrome_pn: package name.
Peter Mayo177500f2011-09-09 17:25:23 -0400357 chrome_rev: one of constants.VALID_CHROME_REVISIONS or LOCAL
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400358 constants.CHROME_REV_SPEC - Requires commit value. Revs the ebuild for
359 the specified version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700360 constants.CHROME_REV_TOT - Requires commit value. Revs the ebuild for
361 the TOT version and uses the portage suffix of _alpha.
Peter Mayo177500f2011-09-09 17:25:23 -0400362 constants.CHROME_REV_LOCAL - Requires a chrome_root. Revs the ebuild for
363 the local version and uses the portage suffix of _alpha.
Ryan Cuic6e097d2011-06-16 12:23:14 -0700364 constants.CHROME_REV_LATEST - This uses the portage suffix of _rc as they
365 are release candidates for the next sticky version.
366 constants.CHROME_REV_STICKY - Revs the sticky version.
Mike Frysingerad8c6ca2014-02-03 11:28:45 -0500367 chrome_version: The \d.\d.\d.\d version of Chrome.
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700368 commit: Used with constants.CHROME_REV_TOT. The git revision of chrome.
David Zeuthen665d3132014-08-25 15:27:02 -0400369 package_dir: Path to the chromeos-chrome package dir.
Mike Frysinger1a736a82013-12-12 01:50:59 -0500370
Chris Sosadad0d322011-01-31 16:37:33 -0800371 Returns:
372 Full portage version atom (including rc's, etc) that was revved.
373 """
Chris Sosa8be39132011-04-14 12:09:24 -0700374 def IsTheNewEBuildRedundant(new_ebuild, stable_ebuild):
375 """Returns True if the new ebuild is redundant.
376
377 This is True if there if the current stable ebuild is the exact same copy
David James89608f92012-11-03 14:14:12 -0700378 of the new one.
Chris Sosa8be39132011-04-14 12:09:24 -0700379 """
380 if not stable_ebuild:
381 return False
382
383 if stable_candidate.chrome_version == new_ebuild.chrome_version:
David James89608f92012-11-03 14:14:12 -0700384 return filecmp.cmp(
385 new_ebuild.ebuild_path, stable_ebuild.ebuild_path, shallow=False)
Chris Sosa8be39132011-04-14 12:09:24 -0700386
David James629febb2012-11-25 13:07:34 -0800387 # Mark latest release and sticky branches as stable.
388 mark_stable = chrome_rev not in [constants.CHROME_REV_TOT,
389 constants.CHROME_REV_SPEC,
390 constants.CHROME_REV_LOCAL]
391
Chris Sosadad0d322011-01-31 16:37:33 -0800392 # Case where we have the last stable candidate with same version just rev.
393 if stable_candidate and stable_candidate.chrome_version == chrome_version:
394 new_ebuild_path = '%s-r%d.ebuild' % (
395 stable_candidate.ebuild_path_no_revision,
396 stable_candidate.current_revision + 1)
397 else:
David James629febb2012-11-25 13:07:34 -0800398 suffix = 'rc' if mark_stable else 'alpha'
David Zeuthen665d3132014-08-25 15:27:02 -0400399 pf = '%s-%s_%s-r1' % (chrome_pn, chrome_version, suffix)
400 new_ebuild_path = os.path.join(package_dir, '%s.ebuild' % pf)
Chris Sosadad0d322011-01-31 16:37:33 -0800401
David Jamesa6792552012-04-03 10:05:35 -0700402 chrome_variables = dict()
403 if commit:
404 chrome_variables[_CHROME_SVN_TAG] = commit
405
Alex Deymo075c2292014-09-04 18:31:50 -0700406 portage_util.EBuild.MarkAsStable(
David James065b2012012-04-01 14:51:11 -0700407 unstable_ebuild.ebuild_path, new_ebuild_path,
David Jamesa6792552012-04-03 10:05:35 -0700408 chrome_variables, make_stable=mark_stable)
Chris Sosadad0d322011-01-31 16:37:33 -0800409 new_ebuild = ChromeEBuild(new_ebuild_path)
Chris Sosa8be39132011-04-14 12:09:24 -0700410
411 # Determine whether this is ebuild is redundant.
412 if IsTheNewEBuildRedundant(new_ebuild, stable_candidate):
David James1b363582012-12-17 11:53:11 -0800413 msg = 'Previous ebuild with same version found and ebuild is redundant.'
414 cros_build_lib.Info(msg)
Chris Sosa8be39132011-04-14 12:09:24 -0700415 os.unlink(new_ebuild_path)
416 return None
Chris Sosadad0d322011-01-31 16:37:33 -0800417
Chris Sosadd611df2012-02-03 15:26:23 -0800418 if stable_candidate and chrome_rev in _REV_TYPES_FOR_LINKS:
Chris Masone592cab52011-08-02 14:05:48 -0700419 _AnnotateAndPrint('Chromium revisions',
420 GetChromeRevisionListLink(stable_candidate,
421 new_ebuild,
422 chrome_rev))
423
David Zeuthen665d3132014-08-25 15:27:02 -0400424 git.RunGit(package_dir, ['add', new_ebuild_path])
Chris Sosa9ba47752012-02-27 15:27:37 -0800425 if stable_candidate and not stable_candidate.IsSticky():
David Zeuthen665d3132014-08-25 15:27:02 -0400426 git.RunGit(package_dir, ['rm', stable_candidate.ebuild_path])
Chris Sosadad0d322011-01-31 16:37:33 -0800427
Alex Deymo075c2292014-09-04 18:31:50 -0700428 portage_util.EBuild.CommitChange(
David Zeuthen665d3132014-08-25 15:27:02 -0400429 _GIT_COMMIT_MESSAGE % {'chrome_pn': chrome_pn,
430 'chrome_rev': chrome_rev,
Mike Frysinger2ebe3732012-05-08 17:04:12 -0400431 'chrome_version': chrome_version},
David Zeuthen665d3132014-08-25 15:27:02 -0400432 package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800433
Chris Sosadad0d322011-01-31 16:37:33 -0800434 return '%s-%s' % (new_ebuild.package, new_ebuild.version)
435
436
David James1b363582012-12-17 11:53:11 -0800437def main(_argv):
Chris Sosa0f295aa2011-10-21 14:10:28 -0700438 usage_options = '|'.join(constants.VALID_CHROME_REVISIONS)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700439 usage = '%s OPTIONS [%s]' % (__file__, usage_options)
Chris Sosadad0d322011-01-31 16:37:33 -0800440 parser = optparse.OptionParser(usage)
Yu-Ju Hong575b3662014-08-05 13:33:41 -0700441 parser.add_option('-b', '--boards', default=None)
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700442 parser.add_option('-c', '--chrome_url',
443 default=constants.CHROMIUM_GOB_URL)
David Jamesfb160012014-07-01 10:00:57 -0700444 parser.add_option('-f', '--force_version', default=None,
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700445 help='Chrome version or git revision hash to use')
Chris Sosadad0d322011-01-31 16:37:33 -0800446 parser.add_option('-s', '--srcroot', default=os.path.join(os.environ['HOME'],
447 'trunk', 'src'),
448 help='Path to the src directory')
449 parser.add_option('-t', '--tracking_branch', default='cros/master',
450 help='Branch we are tracking changes against')
451 (options, args) = parser.parse_args()
452
Ryan Cuic6e097d2011-06-16 12:23:14 -0700453 if len(args) != 1 or args[0] not in constants.VALID_CHROME_REVISIONS:
454 parser.error('Commit requires arg set to one of %s.'
455 % constants.VALID_CHROME_REVISIONS)
Chris Sosadad0d322011-01-31 16:37:33 -0800456
David James9a5980e2014-07-16 09:37:00 -0700457 if options.force_version and args[0] not in (constants.CHROME_REV_SPEC,
458 constants.CHROME_REV_LATEST):
David Jamesfb160012014-07-01 10:00:57 -0700459 parser.error('--force_version is not compatible with the %r '
460 'option.' % (args[0],))
461
David Zeuthen665d3132014-08-25 15:27:02 -0400462 overlay_dir = os.path.abspath(_OVERLAY_DIR % {'srcroot': options.srcroot})
463 chrome_package_dir = os.path.join(overlay_dir, constants.CHROME_CP)
Chris Sosadad0d322011-01-31 16:37:33 -0800464 chrome_rev = args[0]
465 version_to_uprev = None
466 commit_to_use = None
Chris Sosa9ba47752012-02-27 15:27:37 -0800467 sticky_branch = None
Chris Sosadad0d322011-01-31 16:37:33 -0800468
David Zeuthen665d3132014-08-25 15:27:02 -0400469 (unstable_ebuild, stable_ebuilds) = FindChromeCandidates(chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800470
Peter Mayo177500f2011-09-09 17:25:23 -0400471 if chrome_rev == constants.CHROME_REV_LOCAL:
472 if 'CHROME_ROOT' in os.environ:
473 chrome_root = os.environ['CHROME_ROOT']
474 else:
475 chrome_root = os.path.join(os.environ['HOME'], 'chrome_root')
476
477 version_to_uprev = _GetTipOfTrunkVersionFile(chrome_root)
478 commit_to_use = 'Unknown'
David James1b363582012-12-17 11:53:11 -0800479 cros_build_lib.Info('Using local source, versioning is untrustworthy.')
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400480 elif chrome_rev == constants.CHROME_REV_SPEC:
David Jamesfb160012014-07-01 10:00:57 -0700481 if '.' in options.force_version:
482 version_to_uprev = options.force_version
483 else:
484 commit_to_use = options.force_version
485 if '@' in commit_to_use:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700486 commit_to_use = commit_to_use.rpartition('@')[2]
David Jamesfb160012014-07-01 10:00:57 -0700487 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
488 commit_to_use)
Peter Mayo177500f2011-09-09 17:25:23 -0400489 elif chrome_rev == constants.CHROME_REV_TOT:
Stefan Zagerd49d9ff2014-08-15 21:33:37 -0700490 commit_to_use = gob_util.GetTipOfTrunkRevision(options.chrome_url)
petermayo@chromium.org163b3372011-09-12 02:06:05 -0400491 version_to_uprev = _GetSpecificVersionUrl(options.chrome_url,
492 commit_to_use)
Ryan Cuic6e097d2011-06-16 12:23:14 -0700493 elif chrome_rev == constants.CHROME_REV_LATEST:
David James9a5980e2014-07-16 09:37:00 -0700494 if options.force_version:
495 if '.' not in options.force_version:
496 parser.error('%s only accepts released Chrome versions, not SVN or '
497 'Git revisions.' % (chrome_rev,))
498 version_to_uprev = options.force_version
499 else:
500 version_to_uprev = GetLatestRelease(options.chrome_url)
Chris Sosadad0d322011-01-31 16:37:33 -0800501 else:
Chris Sosa9ba47752012-02-27 15:27:37 -0800502 sticky_ebuild = _GetStickyEBuild(stable_ebuilds)
503 sticky_version = sticky_ebuild.chrome_version
504 sticky_branch = sticky_version.rpartition('.')[0]
Yu-Ju Hong39806322014-06-24 16:46:32 -0700505 version_to_uprev = GetLatestRelease(options.chrome_url, sticky_branch)
Chris Sosadad0d322011-01-31 16:37:33 -0800506
507 stable_candidate = FindChromeUprevCandidate(stable_ebuilds, chrome_rev,
508 sticky_branch)
509
510 if stable_candidate:
David James1b363582012-12-17 11:53:11 -0800511 cros_build_lib.Info('Stable candidate found %s' % stable_candidate)
Chris Sosadad0d322011-01-31 16:37:33 -0800512 else:
David James1b363582012-12-17 11:53:11 -0800513 cros_build_lib.Info('No stable candidate found.')
Chris Sosadad0d322011-01-31 16:37:33 -0800514
Chris Sosa8049f3b2011-05-02 20:09:28 -0700515 tracking_branch = 'remotes/m/%s' % os.path.basename(options.tracking_branch)
David Zeuthen665d3132014-08-25 15:27:02 -0400516 existing_branch = git.GetCurrentBranch(chrome_package_dir)
Ryan Cui05a31ba2011-05-31 17:47:37 -0700517 work_branch = cros_mark_as_stable.GitBranch(constants.STABLE_EBUILD_BRANCH,
David Zeuthen665d3132014-08-25 15:27:02 -0400518 tracking_branch,
519 chrome_package_dir)
Chris Sosadad0d322011-01-31 16:37:33 -0800520 work_branch.CreateBranch()
David Jamesd6708c02012-03-22 10:49:15 -0700521
522 # In the case of uprevving overlays that have patches applied to them,
523 # include the patched changes in the stabilizing branch.
524 if existing_branch:
David Zeuthen665d3132014-08-25 15:27:02 -0400525 git.RunGit(chrome_package_dir, ['rebase', existing_branch])
David Jamesd6708c02012-03-22 10:49:15 -0700526
Chris Sosadad0d322011-01-31 16:37:33 -0800527 chrome_version_atom = MarkChromeEBuildAsStable(
David Zeuthen665d3132014-08-25 15:27:02 -0400528 stable_candidate, unstable_ebuild, 'chromeos-chrome', chrome_rev,
529 version_to_uprev, commit_to_use, chrome_package_dir)
Yu-Ju Hong078c9ec2014-08-06 18:25:16 -0700530 if chrome_version_atom:
531 if options.boards:
532 cros_mark_as_stable.CleanStalePackages(options.boards.split(':'),
533 [chrome_version_atom])
David Zeuthen665d3132014-08-25 15:27:02 -0400534
535 # If we did rev Chrome, now is a good time to uprev other packages.
536 for other_ebuild in constants.OTHER_CHROME_PACKAGES:
537 other_ebuild_name = os.path.basename(other_ebuild)
538 other_package_dir = os.path.join(overlay_dir, other_ebuild)
539 (other_unstable_ebuild, other_stable_ebuilds) = FindChromeCandidates(
540 other_package_dir)
541 other_stable_candidate = FindChromeUprevCandidate(other_stable_ebuilds,
542 chrome_rev,
543 sticky_branch)
544 revved_atom = MarkChromeEBuildAsStable(other_stable_candidate,
545 other_unstable_ebuild,
546 other_ebuild_name,
547 chrome_rev, version_to_uprev,
548 commit_to_use, other_package_dir)
549 if revved_atom and options.boards:
550 cros_mark_as_stable.CleanStalePackages(options.boards.split(':'),
551 [revved_atom])
552
553 # Explicit print to communicate to caller.
554 if chrome_version_atom:
Mike Frysinger383367e2014-09-16 15:06:17 -0400555 print('CHROME_VERSION_ATOM=%s' % chrome_version_atom)