| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| """Common functions used for syncing Chrome.""" |
| |
| import os |
| import pprint |
| import re |
| |
| from chromite.lib import cros_build_lib |
| from chromite.lib import osutils |
| |
| CHROME_COMMITTER_URL = 'svn://svn.chromium.org/chrome' |
| SVN_MIRROR_URL = 'svn://svn-mirror.golo.chromium.org' |
| STATUS_URL = 'https://chromium-status.appspot.com/current?format=json' |
| |
| |
| def FindGclientFile(path): |
| """Returns the nearest higher-level gclient file from the specified path. |
| |
| Args: |
| path: The path to use. Defaults to cwd. |
| """ |
| return osutils.FindInPathParents( |
| '.gclient', path, test_func=os.path.isfile) |
| |
| |
| def FindGclientCheckoutRoot(path): |
| """Get the root of your gclient managed checkout.""" |
| gclient_path = FindGclientFile(path) |
| if gclient_path: |
| return os.path.dirname(gclient_path) |
| return None |
| |
| |
| def _UseGoloMirror(): |
| """Check whether to use the golo.chromium.org mirrors. |
| |
| This function returns whether or not we should use the mirrors from |
| golo.chromium.org, which are only accessible from within that subdomain. |
| """ |
| return cros_build_lib.GetHostName(fully_qualified=True).endswith( |
| '.golo.chromium.org') |
| |
| |
| def GetBaseURLs(): |
| """Get the base URLs for checking out Chromium and Chrome.""" |
| if _UseGoloMirror(): |
| external_url = '%s/chrome' % SVN_MIRROR_URL |
| internal_url = '%s/chrome-internal' % SVN_MIRROR_URL |
| else: |
| external_url = 'http://src.chromium.org/svn' |
| internal_url = 'svn://svn.chromium.org/chrome-internal' |
| |
| # No mirror for this one at the moment. |
| pdf_url = 'svn://svn.chromium.org/pdf' |
| |
| return external_url, internal_url, pdf_url |
| |
| |
| def GetTipOfTrunkSvnRevision(svn_url): |
| """Returns the current svn revision for the chrome tree.""" |
| cmd = ['svn', 'info', svn_url] |
| svn_info = cros_build_lib.RunCommand(cmd, redirect_stdout=True).output |
| |
| revision_re = re.compile(r'^Revision:\s+(\d+)') |
| for line in svn_info.splitlines(): |
| match = revision_re.match(line) |
| if match: |
| svn_revision = match.group(1) |
| cros_build_lib.Info('Found SVN Revision %s' % svn_revision) |
| return svn_revision |
| |
| raise Exception('Could not find revision information from %s' % svn_url) |
| |
| |
| def _GetGclientURLs(internal, use_pdf, rev): |
| """Get the URLs to use in gclient file. |
| |
| Args: See WriteConfigFile below. |
| """ |
| results = [] |
| external_url, internal_url, pdf_url = GetBaseURLs() |
| |
| if rev is None or isinstance(rev, (int, long)): |
| rev_str = '@%s' % rev if rev else '' |
| results.append(('src', '%s/trunk/src%s' % (external_url, rev_str))) |
| if internal: |
| results.append(('src-internal', '%s/trunk/src-internal' % internal_url)) |
| if use_pdf: |
| results.append(('src-pdf', '%s/trunk/chrome' % pdf_url)) |
| elif internal: |
| # TODO(petermayo): Fall back to the archive directory if needed. |
| primary_url = '%s/trunk/tools/buildspec/releases/%s' % (internal_url, rev) |
| results.append(('CHROME_DEPS', primary_url)) |
| else: |
| results.append(('CHROMIUM_DEPS', '%s/releases/%s' % (external_url, rev))) |
| |
| return results |
| |
| |
| def _GetGclientSolutions(internal, use_pdf, rev): |
| """Get the solutions array to write to the gclient file. |
| |
| Args: See WriteConfigFile below. |
| """ |
| urls = _GetGclientURLs(internal, use_pdf, rev) |
| custom_deps, custom_vars = {}, {} |
| # This suppresses pdf from a buildspec |
| if not use_pdf: |
| custom_deps.update({'src/pdf': None, 'src-pdf': None}) |
| if _UseGoloMirror(): |
| custom_vars.update({ |
| 'svn_url': SVN_MIRROR_URL, |
| 'webkit_trunk': '%s/webkit-readonly/trunk' % SVN_MIRROR_URL, |
| 'googlecode_url': SVN_MIRROR_URL + '/%s', |
| 'gsutil': SVN_MIRROR_URL + '/gsutil', |
| 'sourceforge_url': SVN_MIRROR_URL + '/%(repo)s' |
| }) |
| |
| # TODO(petermayo): Update DEPS file to exclude LayoutTests on Chrome OS. |
| custom_deps['src/third_party/WebKit/LayoutTests'] = None |
| |
| solutions = [{'name': name, |
| 'url': url, |
| 'custom_deps': custom_deps, |
| 'custom_vars': custom_vars} for (name, url) in urls] |
| return solutions |
| |
| |
| def _GetGclientSpec(internal, use_pdf, rev): |
| """Return a formatted gclient spec. |
| |
| Args: See WriteConfigFile below. |
| """ |
| solutions = _GetGclientSolutions(internal=internal, use_pdf=use_pdf, rev=rev) |
| return 'solutions = %s\n' % pprint.pformat(solutions) |
| |
| |
| def WriteConfigFile(gclient, cwd, internal, use_pdf, rev): |
| """Initialize the specified directory as a gclient checkout. |
| |
| For gclient documentation, see: |
| http://src.chromium.org/svn/trunk/tools/depot_tools/README.gclient |
| |
| Args: |
| gclient: Path to gclient. |
| cwd: Directory to sync. |
| internal: Whether you want an internal checkout. |
| use_pdf: Whether you want the PDF source code. |
| rev: Revision or tag to use. If None, use the latest from trunk. If this is |
| a number, use the specified revision. If this is a string, use the |
| specified tag. |
| """ |
| spec = _GetGclientSpec(internal=internal, use_pdf=use_pdf, rev=rev) |
| cmd = [gclient, 'config', '--spec', spec] |
| cros_build_lib.RunCommand(cmd, cwd=cwd) |
| |
| |
| def Revert(gclient, cwd): |
| """Revert all local changes. |
| |
| Args: |
| gclient: Path to gclient. |
| cwd: Directory to revert. |
| """ |
| cros_build_lib.RunCommand([gclient, 'revert', '--nohooks'], cwd=cwd) |
| |
| |
| def Sync(gclient, cwd, reset=False): |
| """Sync the specified directory using gclient. |
| |
| Args: |
| gclient: Path to gclient. |
| cwd: Directory to sync. |
| reset: Reset to pristine version of the source code. |
| """ |
| cmd = [gclient, 'sync', '--verbose', '--nohooks', '--transitive', |
| '--manually_grab_svn_rev'] |
| if reset: |
| cmd += ['--reset', '--force', '--delete_unversioned_trees'] |
| cros_build_lib.RunCommand(cmd, cwd=cwd) |