Index: slave/skia_slave_scripts/merge_into_android.py |
diff --git a/slave/skia_slave_scripts/merge_into_android.py b/slave/skia_slave_scripts/merge_into_android.py |
deleted file mode 100644 |
index 53fbb7ae2ce218c27c9107f3c9fd380e7b8c5e9a..0000000000000000000000000000000000000000 |
--- a/slave/skia_slave_scripts/merge_into_android.py |
+++ /dev/null |
@@ -1,206 +0,0 @@ |
-#!/usr/bin/env python |
-# Copyright (c) 2014 The Chromium Authors. All rights reserved. |
-# Use of this source code is governed by a BSD-style license that can be |
-# found in the LICENSE file. |
- |
- |
-"""Merge Skia into Android.""" |
- |
- |
-import os |
-import sys |
- |
-from build_step import BuildStep, BuildStepFailure, BuildStepWarning |
-import skia_vars |
-from sync_android import ANDROID_CHECKOUT_PATH, REPO, GitAuthenticate |
-from py.utils.git_utils import GIT |
-from py.utils import git_utils |
-from py.utils import misc |
-from py.utils import shell_utils |
- |
-SKIA_REPO_URL = skia_vars.GetGlobalVariable('skia_git_url') |
-SKIA_REV_URL = skia_vars.GetGlobalVariable('revlink_tmpl') |
- |
-MASTER_SKIA_URL = ('https://googleplex-android-review.googlesource.com/' |
- 'platform/external/skia') |
-MASTER_SKIA_REFS = 'HEAD:refs/heads/master-skia' |
- |
-UPSTREAM_REMOTE_NAME = 'upstream' |
- |
-ANDROID_USER_CONFIG = 'include/core/SkUserConfig.h' |
-UPSTREAM_USER_CONFIG = 'include/config/SkUserConfig.h' |
- |
-EXTERNAL_SKIA = os.path.join(ANDROID_CHECKOUT_PATH, 'external', 'skia') |
-# Path to gyp_to_android.py. |
-PLATFORM_TOOLS_BIN = os.path.join(EXTERNAL_SKIA, 'platform_tools', 'android', |
- 'bin') |
-sys.path.append(PLATFORM_TOOLS_BIN) |
-import gyp_to_android |
- |
-LOCAL_BRANCH_NAME = 'merge' |
- |
- |
-def RepoAbandon(branch): |
- """Run 'repo abandon <branch>' |
- |
- 'repo abandon' is similar to 'git branch -D', and is only necessary after |
- a branch created by 'repo start' is no longer needed.""" |
- shell_utils.run([REPO, 'abandon', branch]) |
- |
- |
-class MergeIntoAndroid(BuildStep): |
- """BuildStep which merges Skia into Android, with a generated Android.mk and |
- SkUserConfig.h""" |
- |
- def _Run(self): |
- with misc.ChDir(EXTERNAL_SKIA): |
- # Check to see whether there is an upstream yet. |
- if not UPSTREAM_REMOTE_NAME in shell_utils.run([GIT, 'remote', 'show']): |
- try: |
- shell_utils.run([GIT, 'remote', 'add', UPSTREAM_REMOTE_NAME, |
- SKIA_REPO_URL]) |
- except shell_utils.CommandFailedException as e: |
- if 'remote %s already exists' % UPSTREAM_REMOTE_NAME in e.output: |
- # Accept this error. The upstream remote name should have been in |
- # the output of git remote show, which would have made us skip this |
- # redundant command anyway. |
- print ('%s was already added. Why did it not show in git remote' |
- ' show?' % UPSTREAM_REMOTE_NAME) |
- else: |
- raise e |
- |
- # Update the upstream remote. |
- shell_utils.run([GIT, 'fetch', UPSTREAM_REMOTE_NAME]) |
- |
- # Create a stack of commits to submit, one at a time, until we reach a |
- # commit that has already been merged. |
- commit_stack = [] |
- head = git_utils.ShortHash('HEAD') |
- |
- print 'HEAD is at %s' % head |
- |
- if self._got_revision: |
- # Merge the revision that started this build. |
- commit = git_utils.ShortHash(self._got_revision) |
- else: |
- raise Exception('This build has no _got_revision to merge!') |
- |
- print ('Starting with %s, look for commits that have not been merged to ' |
- 'HEAD' % commit) |
- while not git_utils.AIsAncestorOfB(commit, head): |
- print 'Adding %s to list of commits to merge.' % commit |
- commit_stack.append(commit) |
- if git_utils.IsMerge(commit): |
- # Skia's commit history is not linear. There is no obvious way to |
- # merge each branch in, one commit at a time. So just start with the |
- # merge commit. |
- print '%s is a merge. Skipping merge of its parents.' % commit |
- break |
- commit = git_utils.ShortHash(commit + '~1') |
- else: |
- print '%s has already been merged.' % commit |
- |
- if len(commit_stack) == 0: |
- raise BuildStepWarning('Nothing to merge; did someone already merge %s?' |
- ' Exiting.' % commit) |
- |
- print 'Merging %s commit(s):\n%s' % (len(commit_stack), |
- '\n'.join(reversed(commit_stack))) |
- |
- # Now we have a list of commits to merge. |
- while len(commit_stack) > 0: |
- commit_to_merge = commit_stack.pop() |
- |
- print 'Attempting to merge ' + commit_to_merge |
- |
- # Start the merge. |
- try: |
- shell_utils.run([GIT, 'merge', commit_to_merge, '--no-commit']) |
- except shell_utils.CommandFailedException: |
- # Merge conflict. There may be a more elegant solution, but for now, |
- # undo the merge, and allow (/make) a human to do it. |
- git_utils.MergeAbort() |
- raise Exception('Failed to merge %s. Fall back to manual human ' |
- 'merge.' % commit_to_merge) |
- |
- |
- # Grab the upstream version of SkUserConfig, which will be used to |
- # generate Android's version. |
- shell_utils.run([GIT, 'checkout', commit_to_merge, '--', |
- UPSTREAM_USER_CONFIG]) |
- |
- # We don't want to commit the upstream version, so remove it from the |
- # index. |
- shell_utils.run([GIT, 'reset', 'HEAD', UPSTREAM_USER_CONFIG]) |
- |
- # Now generate Android.mk and SkUserConfig.h |
- gyp_failed = False |
- try: |
- gyp_to_android.main() |
- except AssertionError as e: |
- print e |
- # Failed to generate the makefiles. Make a human fix the problem. |
- git_utils.MergeAbort() |
- raise Exception('Failed to generate makefiles for %s. Fall back to ' |
- 'manual human merge.' % commit_to_merge) |
- except SystemExit as e: |
- gyp_failed = True |
- |
- if not gyp_failed: |
- git_utils.Add('Android.mk') |
- git_utils.Add(ANDROID_USER_CONFIG) |
- git_utils.Add(os.path.join('tests', 'Android.mk')) |
- git_utils.Add(os.path.join('tools', 'Android.mk')) |
- git_utils.Add(os.path.join('bench', 'Android.mk')) |
- git_utils.Add(os.path.join('gm', 'Android.mk')) |
- git_utils.Add(os.path.join('dm', 'Android.mk')) |
- |
- # Remove upstream user config, which is no longer needed. |
- os.remove(UPSTREAM_USER_CONFIG) |
- |
- # Create a new branch. |
- shell_utils.run([REPO, 'start', LOCAL_BRANCH_NAME, '.']) |
- |
- try: |
- orig_msg = shell_utils.run([GIT, 'show', commit_to_merge, |
- '--format="%s"', '-s']).rstrip() |
- message = 'Merge %s into master-skia\n\n' + SKIA_REV_URL |
- if gyp_failed: |
- message += '\n\nFIXME: Failed to generate makefiles!' |
- shell_utils.run([GIT, 'commit', '-m', message % (orig_msg, |
- commit_to_merge)]) |
- except shell_utils.CommandFailedException: |
- # It is possible that someone else already did the merge (for example, |
- # if they are testing a build slave). Clean up and exit. |
- RepoAbandon(LOCAL_BRANCH_NAME) |
- raise BuildStepWarning('Nothing to merge; did someone already merge ' |
- '%s?' % commit_to_merge) |
- |
- # For some reason, sometimes the bot's authentication from sync_android |
- # does not carry over to this step. Authenticate again. |
- with GitAuthenticate(): |
- # Now push to master-skia branch |
- try: |
- shell_utils.run([GIT, 'push', MASTER_SKIA_URL, MASTER_SKIA_REFS]) |
- except shell_utils.CommandFailedException: |
- # It's possible someone submitted in between our sync and push or |
- # push failed for some other reason. Abandon and let the next |
- # attempt try again. |
- RepoAbandon(LOCAL_BRANCH_NAME) |
- raise BuildStepFailure('git push failed!') |
- |
- # Our branch is no longer needed. Remove it. |
- shell_utils.run([REPO, 'sync', '-j32', '.']) |
- shell_utils.run([REPO, 'prune', '.']) |
- |
- # If gyp failed, this probably means there was an error in the gyp |
- # files. We still want to push the commit. This way, when it gets |
- # fixed with a future commit, we don't remain hung up on this one. |
- if gyp_failed: |
- raise BuildStepFailure('Merged %s, but failed to generate makefiles.' |
- ' Is there a mistake in the gyp files?' % |
- commit_to_merge) |
- |
- |
-if '__main__' == __name__: |
- sys.exit(BuildStep.RunBuildStep(MergeIntoAndroid)) |