#!/usr/bin/python3
#
# Copyright 2016 The ANGLE Project Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
#
# update_chrome_angle.py:
#   Helper script that copies ANGLE libraries into the Chromium Canary (on Windows and macOS)
#   or Dev (on Linux) installed directory. Testing ANGLE this way is much faster than compiling
#   Chromium from source. The script checks for the most recent build in a set of search paths,
#   and copies that into:
#
#    - /opt/google/chrome-unstable on Linux
#    - the most recent Canary installation folder on Windows.
#    - /Applications/Google\ Chrome\ Canary.app on macOS
#

import glob, sys, os, shutil

# Set of search paths.
script_dir = os.path.dirname(sys.argv[0])
os.chdir(os.path.join(script_dir, ".."))

source_paths = glob.glob('out/*')

is_windows = sys.platform == 'cygwin' or sys.platform.startswith('win')
is_macos = sys.platform == 'darwin'

if is_windows:
    # Default Canary installation path.
    chrome_folder = os.path.join(os.environ['LOCALAPPDATA'], 'Google', 'Chrome SxS', 'Application')
    libs_to_copy = ['libGLESv2.dll', 'libEGL.dll']
    optional_libs_to_copy = []

elif is_macos:
    chrome_folder = '/Applications/Google Chrome Canary.app/Contents/Frameworks/Google Chrome Framework.framework/Libraries'
    libs_to_copy = ['libGLESv2.dylib', 'libEGL.dylib']
    optional_libs_to_copy = ['libchrome_zlib.dylib', 'libabsl.dylib', 'libc++.dylib']

else:
    # Must be Linux
    chrome_folder = '/opt/google/chrome-unstable'
    libs_to_copy = ['libGLESv2.so', 'libEGL.so']
    optional_libs_to_copy = ['libchrome_zlib.so', 'libabsl.so', 'libc++.so']

# Find the most recent ANGLE DLLs
binary_name = libs_to_copy[0]
newest_folder = None
newest_mtime = None
for path in source_paths:
    binary_path = os.path.join(path, binary_name)
    if os.path.exists(binary_path):
        binary_mtime = os.path.getmtime(binary_path)
        if (newest_folder is None) or (binary_mtime > newest_mtime):
            newest_folder = path
            newest_mtime = binary_mtime

if newest_folder is None:
    sys.exit("Could not find ANGLE binaries!")

source_folder = newest_folder

if is_windows:
    # Is a folder a chrome binary directory?
    def is_chrome_bin(str):
        chrome_file = os.path.join(chrome_folder, str)
        return os.path.isdir(chrome_file) and all([char.isdigit() or char == '.' for char in str])

    sorted_chrome_bins = sorted(
        [folder for folder in os.listdir(chrome_folder) if is_chrome_bin(folder)], reverse=True)

    dest_folder = os.path.join(chrome_folder, sorted_chrome_bins[0])
else:
    dest_folder = chrome_folder

print('Copying binaries from ' + source_folder + ' to ' + dest_folder + '.')


def copy_file(src, dst):
    print(' - ' + src + '   -->   ' + dst)
    if is_macos and os.path.isfile(dst):
        # For the codesign to work, the original file must be removed
        os.remove(dst)
    shutil.copyfile(src, dst)


def do_copy(filename, is_optional):
    src = os.path.join(source_folder, filename)
    if os.path.exists(src):
        # No backup is made.  Any backup becomes stale on the next update and could be a cause for
        # confusion.  Reintall Chromium if it needs to be recovered.
        dst = os.path.join(dest_folder, filename)
        copy_file(src, dst)

        if is_windows:
            copy_file(src + '.pdb', dst + '.pdb')

    elif not is_optional:
        print(' - COULD NOT FIND "' + src + '"')


for filename in libs_to_copy:
    do_copy(filename, False)
# Optionally copy the following, which are needed for a component build
# (i.e. is_component_build = true, which is the default)
for filename in optional_libs_to_copy:
    do_copy(filename, True)

if is_macos:
    # Clear all attributes, codesign doesn't work otherwise
    os.system('xattr -cr /Applications/Google\ Chrome\ Canary.app')
    # Re-sign the bundle
    os.system('codesign --force --sign - --deep /Applications/Google\ Chrome\ Canary.app')
