#!/usr/bin/env python3
#
# Copyright (C) 2017 Apple Inc. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
# PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
# PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
# OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

"Copies the most recently updated FeatureDefines.xcconfig file to all the others."

# A webkitpy import needs to go first for autoinstaller to work with subsequent imports.
from webkitpy.style.checkers.featuredefines import FEATURE_DEFINE_FILES

import os
import shutil
import six


newest_file = max(FEATURE_DEFINE_FILES, key=os.path.getctime)
remaining_files = FEATURE_DEFINE_FILES
remaining_files.remove(newest_file)

print("Copy %s to each of: %s " % (newest_file, ", ".join(remaining_files)))
response = six.moves.input("Continue [Y/n]: ")

if not response:
    response = 'y'

if response.lower() == 'y':
    for destination in remaining_files:
        shutil.copyfile(newest_file, destination)

