1#!/usr/bin/env python2
2#
3# Copyright 2017 The Chromium OS Authors. All rights reserved.
4# Use of this source code is governed by a BSD-style license that can be
5# found in the LICENSE file.
6"""Script to patch Android repo with diffs that are needed by the suite.
7
8Run this script before running the suite.
9"""
10from __future__ import print_function
11
12import config
13import os
14import subprocess
15
16# The patches to be added to the android repo.
17# An error may occur if it is already patched, or meets some error.
18# FIXME: Needs to be FIXED in the future.
19def try_patch_skia():
20  skia_dir = os.path.join(config.android_home, config.bench_dict['Skia'])
21  # You may want to change the file based on aosp or internal
22  if config.android_type == 'internal':
23    print('No need to patch skia for internal repo.')
24    return
25  elif config.android_type == 'aosp':
26    skia_patch = os.path.join(
27        os.path.dirname(os.path.realpath(__file__)), 'skia_aosp.diff')
28  else:
29    raise ValueError('Adnroid source type should be either aosp or internal.')
30  # FIXME: A quick hack, need to handle errors and check whether has been
31  # applied in the future.
32  try:
33    subprocess.check_call(['git', '-C', skia_dir, 'apply', skia_patch])
34    print('Skia patched successfully!')
35  except subprocess.CalledProcessError:
36    print('Skia patch not applied, error or already patched.')
37
38
39def try_patch_autotest():
40  # Patch autotest, which includes all the testcases on device, setting device,
41  # and running the benchmarks
42  autotest_dir = os.path.join(config.android_home, config.autotest_dir)
43  autotest_patch = os.path.join(
44      os.path.dirname(os.path.realpath(__file__)), 'autotest.diff')
45  dex2oat_dir = os.path.join(autotest_dir, 'server/site_tests/android_Dex2oat')
46  panorama_dir = os.path.join(autotest_dir,
47                              'server/site_tests/android_Panorama')
48  # FIXME: A quick hack, need to handle errors and check whether has been
49  # applied in the future.
50  try:
51    subprocess.check_call(['git', '-C', autotest_dir, 'apply', autotest_patch])
52    subprocess.check_call(['cp', '-rf', 'dex2oat_input', dex2oat_dir])
53    subprocess.check_call(['cp', '-rf', 'panorama_input', panorama_dir])
54    print('Autotest patched successfully!')
55  except subprocess.CalledProcessError:
56    print('Autotest patch not applied, error or already patched.')
57
58
59def try_patch_panorama():
60  panorama_dir = os.path.join(config.android_home,
61                              config.bench_dict['Panorama'])
62  panorama_patch = os.path.join(
63      os.path.dirname(os.path.realpath(__file__)), 'panorama.diff')
64  # FIXME: A quick hack, need to handle errors and check whether has been
65  # applied in the future.
66  try:
67    subprocess.check_call(['git', '-C', panorama_dir, 'apply', panorama_patch])
68    print('Panorama patched successfully!')
69  except subprocess.CalledProcessError:
70    print('Panorama patch not applied, error or already patched.')
71
72
73def try_patch_synthmark():
74  synthmark_dir = 'devrel/tools/synthmark'
75  # FIXME: A quick hack, need to handle errors and check whether has been
76  # applied in the future.
77  try:
78    subprocess.check_call([
79        'bash', '-c', 'mkdir devrel && '
80        'cd devrel && '
81        'repo init -u sso://devrel/manifest && '
82        'repo sync tools/synthmark'
83    ])
84    synthmark_patch = os.path.join(
85        os.path.dirname(os.path.realpath(__file__)), 'synthmark.diff')
86    subprocess.check_call(['git', '-C', synthmark_dir,
87                           'apply', synthmark_patch])
88
89    subprocess.check_call(['mv', '-f', synthmark_dir, config.android_home])
90    subprocess.check_call(['rm', '-rf', 'devrel'])
91    print('Synthmark patched successfully!')
92  except subprocess.CalledProcessError:
93    print('Synthmark patch not applied, error or already patched.')
94
95
96def main():
97  try_patch_skia()
98  try_patch_autotest()
99  try_patch_panorama()
100  try_patch_synthmark()
101
102
103if __name__ == '__main__':
104  main()
105