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