#!/usr/bin/env ruby

# Copyright (C) 2010 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. AND ITS CONTRIBUTORS ``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 ITS 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.

base_directory = ENV['TARGET_BUILD_DIR'] or throw "Unable to find TARGET_BUILD_DIR in the environment!"
project_name = ENV['PRODUCT_NAME'] or throw "Unable to find PRODUCT_NAME in the environment!"
is_shallow_bundle = (ENV['SHALLOW_BUNDLE'] || "NO").upcase == "YES"

$INAPPROPRIATE_FILES = {
  "JavaScriptCore" => {
    "Headers" => ["*.tmp"],
    "Resources" => ["*.txt", "*.in", "*.idl", "*.h"],
  },
  "WebCore" => {
    "Resources" => ["*.txt", "*.in", "*.idl", "*.h"],
  },
  "WebKitLegacy" => {
    "Headers" => ["*.tmp"],
    "Resources" => ["*.txt", "*.in", "*.idl", "*.h"],
  },
  "WebKit" => {
    "Headers" => ["*.tmp"],
    "Resources" => ["*.txt", "*.in", "*.idl", "*.h"],
  },
}

Dir.chdir base_directory

$error_printed = false

def print_error msg
  $error_printed = true
  STDERR.puts "ERROR: #{msg}"
end

def print_inappropriate_file_error framework, relative_path
  print_error "#{framework}.framework/#{relative_path} should not be present in the framework."
end

def check_framework framework, is_shallow_bundle
  $INAPPROPRIATE_FILES[framework].each do |directory, patterns|
    framework_bundle_path = is_shallow_bundle ? "#{framework}.framework" : "#{framework}.framework/Versions/A/#{directory}"
    Dir.chdir framework_bundle_path do
      patterns.each do |pattern|
        Dir.glob(pattern).each do |inappropriate_file|
          print_inappropriate_file_error framework, is_shallow_bundle ? inappropriate_file : "#{directory}/#{inappropriate_file}"
          File.unlink inappropriate_file
        end
      end
    end
  end
end

check_framework project_name, is_shallow_bundle

if $error_printed
  STDERR.puts
  STDERR.puts "    Inappropriate files were detected and have been removed from the framework."
  STDERR.puts "    If this error continues to appear after building again then the build system needs"
  STDERR.puts "    to be modified so that the inappropriate files are no longer copied in to the framework."
  STDERR.puts
  exit 1
end
