merge_from_chromium.py revision 5568eda06be15d573395eaba779d62c09f6f96f1
19df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)#!/usr/bin/env python
29df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)#
39df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# Copyright (C) 2012 The Android Open Source Project
49df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)#
59df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# Licensed under the Apache License, Version 2.0 (the "License");
69df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# you may not use this file except in compliance with the License.
79df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# You may obtain a copy of the License at
89df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)#
99df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)#      http://www.apache.org/licenses/LICENSE-2.0
109df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)#
119df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# Unless required by applicable law or agreed to in writing, software
129df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# distributed under the License is distributed on an "AS IS" BASIS,
139df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
149df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# See the License for the specific language governing permissions and
159df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# limitations under the License.
169df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
179df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)"""
189df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)Merge Chromium into the Android tree. See the output of --help for details.
199df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
209df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)"""
216a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)import optparse
226a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)import os
236a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)import re
246a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)import sys
251c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)
261c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)import merge_common
276a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
286a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
299df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# We need to import this *after* merging from upstream to get the latest
309df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)# version. Set it to none here to catch uses before it's imported.
319df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)webview_licenses = None
329df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
339df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
341c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)AUTOGEN_MESSAGE = 'This commit was generated by merge_from_chromium.py.'
359df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
369df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
379df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)def _ReadGitFile(git_url, git_branch, sha1, path):
389df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  """Reads a file from a remote git project at a specific revision.
399df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  Args:
409df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    git_url: The URL of the git server.
419df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    git_branch: The branch to read.
429df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    sha1: The SHA1 at which to read.
439df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    path: The relative path of the file to read.
449df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  Returns:
459df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    The contents of the specified file.
469df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  """
479df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
489df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  # We fetch the branch to a temporary head so that we don't download the same
499df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  # commits multiple times.
501c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'fetch', '-f', git_url,
511c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                 git_branch + ':cached_upstream'])
529df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
539df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  args = ['git', 'show', '%s:%s' % (sha1, path)]
541c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  return merge_common.GetCommandStdout(args)
559df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
569df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
57bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)def _ParseDEPS(git_url, git_branch, sha1):
589df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  """Parses the .DEPS.git file from Chromium and returns its contents.
596a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Args:
609df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    git_url: The URL of the git server.
619df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    git_branch: The branch to read.
629df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    sha1: The SHA1 at which to read.
636a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Returns:
646a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    A dictionary of the contents of .DEPS.git at the specified revision
656a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
666a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
676a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  class FromImpl(object):
686a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    """Used to implement the From syntax."""
696a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
706a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    def __init__(self, module_name):
716a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      self.module_name = module_name
726a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
736a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    def __str__(self):
746a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      return 'From("%s")' % self.module_name
756a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
766a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  class _VarImpl(object):
776a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    def __init__(self, custom_vars, local_scope):
786a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      self._custom_vars = custom_vars
796a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      self._local_scope = local_scope
806a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
816a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    def Lookup(self, var_name):
826a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      """Implements the Var syntax."""
836a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      if var_name in self._custom_vars:
846a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)        return self._custom_vars[var_name]
856a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      elif var_name in self._local_scope.get('vars', {}):
866a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)        return self._local_scope['vars'][var_name]
876a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      raise Exception('Var is not defined: %s' % var_name)
886a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
896a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  tmp_locals = {}
906a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  var = _VarImpl({}, tmp_locals)
916a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  tmp_globals = {'From': FromImpl, 'Var': var.Lookup, 'deps_os': {}}
92bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)  deps_content = _ReadGitFile(git_url, git_branch, sha1, '.DEPS.git')
936a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  exec(deps_content) in tmp_globals, tmp_locals
946a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  return tmp_locals
956a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
966a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
976a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)def _GetThirdPartyProjectMergeInfo(third_party_projects, deps_vars):
986a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """Gets the git URL for each project and the SHA1 at which it should be
996a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  merged.
1006a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Args:
1019df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    third_party_projects: The list of projects to consider.
1029df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    deps_vars: The dictionary of dependencies from .DEPS.git.
1036a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Returns:
1046a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    A dictionary from project to git URL and SHA1 - 'path: (url, sha1)'
1056a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
1066a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1076a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  deps_fallback_order = [
1086a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      deps_vars['deps'],
1096a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      deps_vars['deps_os']['unix'],
1106a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      deps_vars['deps_os']['android'],
1116a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  ]
1126a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  result = {}
1136a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  for path in third_party_projects:
1146a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    for deps in deps_fallback_order:
1156a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      url_plus_sha1 = deps.get(os.path.join('src', path))
1166a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      if url_plus_sha1:
1176a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)        break
1186a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    else:
1196a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      raise RuntimeError(
1206a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)          ('Could not find .DEPS.git entry for project %s. This probably '
1211c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)           'means that the project list in merge_from_chromium.py needs to be '
1228720718313473184ad1e64c7df67766c44353396Torne (Richard Coles)           'updated.') %
1236a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)          path)
1246a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    match = re.match('(.*?)@(.*)', url_plus_sha1)
1256a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    url = match.group(1)
1266a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    sha1 = match.group(2)
1276a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    print '  Got URL %s and SHA1 %s for project %s' % (url, sha1, path)
1286a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    result[path] = {'url': url, 'sha1': sha1}
1296a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  return result
1306a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1316a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
132bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)def _MergeProjects(git_url, git_branch, svn_revision, root_sha1):
1336a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """Merges into this repository all projects required by the specified branch
1346a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  of Chromium, at the SVN revision. Uses a git subtree merge for each project.
1356a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Directories in the main Chromium repository which are not needed by Clank are
1366a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  not merged.
1376a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Args:
1386a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    git_url: The URL of the git server for the Chromium branch to merge to
139bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)    git_branch: The branch name to merge to
1406a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    svn_revision: The SVN revision for the main Chromium repository
1416a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    root_sha1: The git SHA1 for the main Chromium repository
1426a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
1436a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1446a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # The logic for this step lives here, in the Android tree, as it makes no
1456a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # sense for a Chromium tree to know about this merge.
1466a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1476a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Parsing DEPS ...'
148bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)  deps_vars = _ParseDEPS(git_url, git_branch, root_sha1)
1496a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1501c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_info = _GetThirdPartyProjectMergeInfo(merge_common.THIRD_PARTY_PROJECTS,
1511c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                              deps_vars)
1526a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1536a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  for path in merge_info:
1546a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    url = merge_info[path]['url']
1556a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    sha1 = merge_info[path]['sha1']
1561c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    dest_dir = os.path.join(merge_common.REPOSITORY_ROOT, path)
1571c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'checkout',
1581c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                   '-b', 'merge-from-chromium',
1591c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                   '-t', 'goog/master-chromium'], cwd=dest_dir)
1606a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    print 'Fetching project %s at %s ...' % (path, sha1)
1611c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'fetch', url], cwd=dest_dir)
1621c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    if merge_common.GetCommandStdout(['git', 'rev-list', '-1', 'HEAD..' + sha1],
1631c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                     cwd=dest_dir):
1646a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      print 'Merging project %s at %s ...' % (path, sha1)
1656a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      # Merge conflicts make git merge return 1, so ignore errors
1661c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)      merge_common.GetCommandStdout(['git', 'merge', '--no-commit', sha1],
1671c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                    cwd=dest_dir, ignore_errors=True)
1681c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)      merge_common.CheckNoConflictsAndCommitMerge(
1699df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)          'Merge %s from %s at %s\n\n%s' % (path, url, sha1, AUTOGEN_MESSAGE),
1709df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)          cwd=dest_dir)
1716a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    else:
1726a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      print 'No new commits to merge in project %s' % path
1736a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1746a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # Handle root repository separately.
1751c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'checkout', '-b', 'merge-from-chromium',
1761c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                 '-t', 'goog/master-chromium'])
1776a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Fetching Chromium at %s ...' % root_sha1
1781c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'fetch', git_url, git_branch])
1796a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Merging Chromium at %s ...' % root_sha1
1806a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # Merge conflicts make git merge return 1, so ignore errors
1811c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'merge', '--no-commit', root_sha1],
1821c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                ignore_errors=True)
1831c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.CheckNoConflictsAndCommitMerge(
184bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)      'Merge Chromium from %s branch %s at r%s (%s)\n\n%s'
185bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)      % (git_url, git_branch, svn_revision, root_sha1, AUTOGEN_MESSAGE))
1866a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
1876a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Getting directories to exclude ...'
1889df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
1899df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  # We import this now that we have merged the latest version.
1909df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  # It imports to a global in order that it can be used to generate NOTICE
191c7fa5294b03fbc8ccab655d87faaa6d6d704018eTorne (Richard Coles)  # later. We also disable writing bytecode to keep the source tree clean.
1921c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  sys.path.append(os.path.join(merge_common.REPOSITORY_ROOT, 'android_webview',
1931c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                               'tools'))
194c7fa5294b03fbc8ccab655d87faaa6d6d704018eTorne (Richard Coles)  sys.dont_write_bytecode = True
1959df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  global webview_licenses
1969df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  import webview_licenses
197cadf645507c329e0f5d7fbb67d9311cfa26ac638Torne (Richard Coles)  import known_issues
1989df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
199cadf645507c329e0f5d7fbb67d9311cfa26ac638Torne (Richard Coles)  for path, exclude_list in known_issues.KNOWN_INCOMPATIBLE.iteritems():
2003c67328c9fd2fd48405af3950e59893bfdf1287bTorne (Richard Coles)    print '  %s' % '\n  '.join(os.path.join(path, x) for x in exclude_list)
2011c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    dest_dir = os.path.join(merge_common.REPOSITORY_ROOT, path)
2021c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'rm', '-rf', '--ignore-unmatch'] +
2031c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                  exclude_list, cwd=dest_dir)
2043c67328c9fd2fd48405af3950e59893bfdf1287bTorne (Richard Coles)    if _ModifiedFilesInIndex(dest_dir):
2051c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)      merge_common.GetCommandStdout(['git', 'commit', '-m',
2061c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                     'Exclude incompatible directories'],
2071c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                    cwd=dest_dir)
2083c67328c9fd2fd48405af3950e59893bfdf1287bTorne (Richard Coles)
2099df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  directories_left_over = webview_licenses.GetIncompatibleDirectories()
2109df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  if directories_left_over:
2119df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    raise RuntimeError('Incompatibly licensed directories remain: ' +
2123c67328c9fd2fd48405af3950e59893bfdf1287bTorne (Richard Coles)                       '\n'.join(directories_left_over))
2136a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  return True
2146a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2156a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2166a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)def _GenerateMakefiles(svn_revision):
2176a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """Run gyp to generate the makefiles required to build Chromium in the
2186a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Android build system.
2196a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
2206a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2216a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Regenerating makefiles ...'
2229df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  # TODO(torne): The .tmp files are generated by
2236a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # third_party/WebKit/Source/WebCore/WebCore.gyp/WebCore.gyp into the source
2246a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # tree. We should avoid this, or at least use a more specific name to avoid
2256a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # accidentally removing or adding other files.
2261c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  for path in merge_common.ALL_PROJECTS:
2271c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    dest_dir = os.path.join(merge_common.REPOSITORY_ROOT, path)
2281c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'rm', '--ignore-unmatch',
2295568eda06be15d573395eaba779d62c09f6f96f1Torne (Richard Coles)                                   'GypAndroid.*.mk', '*.target.*.mk',
2305568eda06be15d573395eaba779d62c09f6f96f1Torne (Richard Coles)                                   '*.host.*.mk', '*.tmp'], cwd=dest_dir)
2311c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)
2325568eda06be15d573395eaba779d62c09f6f96f1Torne (Richard Coles)  merge_common.GetCommandStdout(['android_webview/tools/gyp_webview'])
2331c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)
2341c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  for path in merge_common.ALL_PROJECTS:
2351c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    dest_dir = os.path.join(merge_common.REPOSITORY_ROOT, path)
2369df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    # git add doesn't have an --ignore-unmatch so we have to do this instead:
2375568eda06be15d573395eaba779d62c09f6f96f1Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'add', '-f', 'GypAndroid.*.mk'],
2381c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                  ignore_errors=True, cwd=dest_dir)
2395568eda06be15d573395eaba779d62c09f6f96f1Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'add', '-f', '*.target.*.mk'],
2401c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                  ignore_errors=True, cwd=dest_dir)
2415568eda06be15d573395eaba779d62c09f6f96f1Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'add', '-f', '*.host.*.mk'],
2421c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                  ignore_errors=True, cwd=dest_dir)
2431c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout(['git', 'add', '-f', '*.tmp'],
2441c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                  ignore_errors=True, cwd=dest_dir)
2459df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    # Only try to commit the makefiles if something has actually changed.
2469df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    if _ModifiedFilesInIndex(dest_dir):
2471c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)      merge_common.GetCommandStdout(['git', 'commit', '-m',
2481c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)          'Update makefiles after merge of Chromium at r%s\n\n%s' %
2491c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)          (svn_revision, AUTOGEN_MESSAGE)], cwd=dest_dir)
2506a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2519df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
2521c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)def _ModifiedFilesInIndex(cwd=merge_common.REPOSITORY_ROOT):
2536a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """Returns whether git's index includes modified files, ie 'added' changes.
2546a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
2551c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  status = merge_common.GetCommandStdout(['git', 'status', '--porcelain'],
2561c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                         cwd=cwd)
2576a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  return re.search(r'^[MADRC]', status, flags=re.MULTILINE) != None
2586a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2596a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2606a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)def _GenerateNoticeFile(svn_revision):
2616a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """Generates a NOTICE file for all third-party code (from Android's
2626a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  perspective) that lives in the Chromium tree and commits it to the root of
2636a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  the repository.
2646a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Args:
2656a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    svn_revision: The SVN revision for the main Chromium repository
2666a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
2676a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2686a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Regenerating NOTICE file ...'
2696a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2709df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  contents = webview_licenses.GenerateNoticeFile()
2716a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2721c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  with open(os.path.join(merge_common.REPOSITORY_ROOT, 'NOTICE'), 'w') as f:
2736a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    f.write(contents)
2741c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'add', 'NOTICE'])
2756a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # Only try to commit the NOTICE update if the file has actually changed.
2766a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  if _ModifiedFilesInIndex():
2771c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout([
2786a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)        'git', 'commit', '-m',
2796a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)        'Update NOTICE file after merge of Chromium at r%s\n\n%s'
2806a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)        % (svn_revision, AUTOGEN_MESSAGE)])
2816a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
2826a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
283e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)def _GenerateLastChange(svn_revision):
284e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  """Write a build/util/LASTCHANGE file containing the current revision. This is
285e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  used in the Chromium build to include the version number.
286e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  Args:
287e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)    svn_revision: The SVN revision for the main Chromium repository
288e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  """
289e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)
290e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  print 'Updating LASTCHANGE ...'
2911c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  with open(os.path.join(merge_common.REPOSITORY_ROOT, 'build/util/LASTCHANGE'),
2921c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)            'w') as f:
293e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)    f.write("LASTCHANGE=%s\n" % svn_revision)
2941c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'add', '-f', 'build/util/LASTCHANGE'])
295e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  if _ModifiedFilesInIndex():
2961c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    merge_common.GetCommandStdout([
297e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)        'git', 'commit', '-m',
298e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)        'Update LASTCHANGE file after merge of Chromium at r%s\n\n%s'
299e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)        % (svn_revision, AUTOGEN_MESSAGE)])
300e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)
301e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)
302bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)def _GetSVNRevisionAndSHA1(git_url, git_branch, svn_revision):
3036a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  print 'Getting SVN revision and SHA1 ...'
3041c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.GetCommandStdout(['git', 'fetch', '-f', git_url,
3051c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                 git_branch + ':cached_upstream'])
3066a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  if svn_revision:
3076a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    # Sometimes, we see multiple commits with the same git SVN ID. No idea why.
3086a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    # We take the most recent.
3091c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    sha1 = merge_common.GetCommandStdout([
3101c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)        'git', 'log', '--grep=git-svn-id: .*@%s' % svn_revision,
3111c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)        '--format=%H', 'cached_upstream']).split()[0]
3126a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  else:
3139df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    # Just use the latest commit.
3149df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    # TODO: We may be able to use a LKGR?
3151c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)    commit = merge_common.GetCommandStdout([
3161c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)        'git', 'log', '-n1', '--grep=git-svn-id:', '--format=%H%n%b',
3171c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)        'cached_upstream'])
3189df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    sha1 = commit.split()[0]
3199df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)    svn_revision = re.search(r'^git-svn-id: .*@([0-9]+)', commit,
3209df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)                             flags=re.MULTILINE).group(1)
3216a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  return (svn_revision, sha1)
3226a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3236a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3241896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)def _Snapshot(git_url, git_branch, svn_revision, autopush):
3256a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """Takes a snapshot of the specified Chromium tree at the specified SVN
3266a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  revision and merges it into this repository. Also generates Android makefiles
3276a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  and generates a top-level NOTICE file suitable for use in the Android build.
3286a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  Args:
3296a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    git_url: The URL of the git server for the Chromium branch to merge to
3306a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    svn_revision: The SVN revision for the main Chromium repository
3316a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  """
3326a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
333bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)  (svn_revision, root_sha1) = _GetSVNRevisionAndSHA1(git_url, git_branch,
334bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)                                                     svn_revision)
3351c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  if not merge_common.GetCommandStdout(['git', 'rev-list', '-1',
3361c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)                                        'HEAD..' + root_sha1]):
337bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)    print ('No new commits to merge from %s branch %s at r%s (%s)' %
338bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)        (git_url, git_branch, svn_revision, root_sha1))
3396a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    return
3406a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
341bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)  print ('Snapshotting Chromium from %s branch %s at r%s (%s)' %
342bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)         (git_url, git_branch, svn_revision, root_sha1))
3436a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3446a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  # 1. Merge, accounting for excluded directories
345bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)  _MergeProjects(git_url, git_branch, svn_revision, root_sha1)
3466a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3479df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  # 2. Generate Android NOTICE file
3486a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  _GenerateNoticeFile(svn_revision)
3496a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
350e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  # 3. Generate LASTCHANGE file
351e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  _GenerateLastChange(svn_revision)
352e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)
353e9d946910fc23e839e0ba89df0a59cdcd1aac8ddTorne (Richard Coles)  # 4. Generate Android makefiles
3549df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)  _GenerateMakefiles(svn_revision)
3559df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)
3561896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)  # 5. Push result to server
3571c263f2b522bcb9159547d14f9f57abac46967c7Torne (Richard Coles)  merge_common.PushToServer(autopush, 'merge-from-chromium', 'master-chromium')
3581896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)
3591896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)  return True
3601896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)
3616a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3626a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)def main():
3636a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  parser = optparse.OptionParser(usage='%prog [options]')
3646a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  parser.epilog = ('Takes a snapshot of the Chromium tree at the specified '
3656a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)                   'Chromium SVN revision and merges it into this repository. '
3666a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)                   'Paths marked as excluded for license reasons are removed '
3676a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)                   'as part of the merge. Also generates Android makefiles and '
3686a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)                   'generates a top-level NOTICE file suitable for use in the '
3696a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)                   'Android build.')
3706a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  parser.add_option(
3716a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      '', '--git_url',
372bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)      default='http://git.chromium.org/chromium/src.git',
3736a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      help=('The URL of the git server for the Chromium branch to merge. '
374bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)            'Defaults to upstream.'))
375bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)  parser.add_option(
376bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)      '', '--git_branch',
377bc79ddac4a295ce4616fbbc574f9c53702f1e02cTorne (Richard Coles)      default='git-svn',
3789df6a6c4638cfab15aa303682c15050a9509eb44Torne (Richard Coles)      help=('The name of the upstream branch to merge. Defaults to git-svn.'))
3796a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  parser.add_option(
3806a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      '', '--svn_revision',
3816a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      default=None,
3826a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)      help=('Merge to the specified chromium SVN revision, rather than using '
3836a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)            'the current latest revision.'))
3841896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)  parser.add_option(
3851896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)      '', '--autopush',
3861896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)      default=False, action='store_true',
3871896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)      help=('Automatically push the result to the server without prompting if'
3881896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)            'the merge was successful.'))
3896a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  (options, args) = parser.parse_args()
3906a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  if args:
3916a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    parser.print_help()
3926a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    return 1
3936a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3946a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  if 'ANDROID_BUILD_TOP' not in os.environ:
3956a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    print >>sys.stderr, 'You need to run the Android envsetup.sh and lunch.'
3966a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    return 1
3976a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
3981896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)  if not _Snapshot(options.git_url, options.git_branch, options.svn_revision,
3991896d5d734a45c412f47fe58816665d374617d3bTorne (Richard Coles)                   options.autopush):
4006a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)    return 1
4016a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
4026a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  return 0
4036a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)
4046a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)if __name__ == '__main__':
4056a8c82cdaffde31477cacabea89afefeded67f3eTorne (Richard Coles)  sys.exit(main())
406