#!/bin/bash
###############################################################################
# Copyright (c) 2018, 2020 Kichwa Coders Ltd and others.
#
# This program and the accompanying materials
# are made available under the terms of the Eclipse Public License 2.0
# which accompanies this distribution, and is available at
# https://www.eclipse.org/legal/epl-2.0/
#
# SPDX-License-Identifier: EPL-2.0
###############################################################################

set -e


##
# This script is reused by other projects, if so, COREPROJECT should be set
# to the project to use a basis for project settings
##
: ${COREPROJECT:=core/org.eclipse.cdt.core}

##
# Setup Eclipse Core Preferences
##
git ls-files  -- \*\*/.project | while read i ; do
    d=`dirname $i`;
    mkdir -p $d/.settings
    if ! test -e $d/.settings/org.eclipse.core.resources.prefs; then
        echo 'eclipse.preferences.version=1' > $d/.settings/org.eclipse.core.resources.prefs
        echo 'encoding/<project>=UTF-8' >> $d/.settings/org.eclipse.core.resources.prefs
    fi
    if ! grep 'encoding/<project>=UTF-8' $d/.settings/org.eclipse.core.resources.prefs > /dev/null; then
        echo 'encoding/<project>=UTF-8' >> $d/.settings/org.eclipse.core.resources.prefs
    fi
    if ! grep 'eclipse.preferences.version=1' $d/.settings/org.eclipse.core.resources.prefs > /dev/null; then
        echo 'eclipse.preferences.version=1' >> $d/.settings/org.eclipse.core.resources.prefs
    fi
done

##
# Copy JDT/PDE preferences
##
git ls-files  -- \*\*/.project ":!$COREPROJECT/.project" | while read i ; do
    d=`dirname $i`;
    natures=$(xmllint --xpath 'string(//projectDescription/natures)' $i)
    mkdir -p $d/.settings

    # JDT
    if [[ $natures == *"org.eclipse.jdt.core.javanature"* ]]; then
        cp $COREPROJECT/.settings/org.eclipse.jdt.* $d/.settings
        # For test plug-ins we are more lenient so don't warn on some items
        if echo $i | grep -E '\.tests?[/\.]' > /dev/null; then
            sed -i \
                '-es@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.discouragedReference=warning@org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.deprecation=warning@org.eclipse.jdt.core.compiler.problem.deprecation=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.discouragedReference=warning@org.eclipse.jdt.core.compiler.problem.discouragedReference=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.emptyStatement=warning@org.eclipse.jdt.core.compiler.problem.emptyStatement=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.fieldHiding=warning@org.eclipse.jdt.core.compiler.problem.fieldHiding=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.finalParameterBound=warning@org.eclipse.jdt.core.compiler.problem.finalParameterBound=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.forbiddenReference=error@org.eclipse.jdt.core.compiler.problem.forbiddenReference=warning@' \
                '-es@org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=warning@org.eclipse.jdt.core.compiler.problem.uncheckedTypeOperation=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.unusedLocal=warning@org.eclipse.jdt.core.compiler.problem.unusedLocal=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=warning@org.eclipse.jdt.core.compiler.problem.unusedPrivateMember=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.potentialNullReference=warning@org.eclipse.jdt.core.compiler.problem.potentialNullReference=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.rawTypeReference=warning@org.eclipse.jdt.core.compiler.problem.rawTypeReference=ignore@' \
                '-es@org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=warning@org.eclipse.jdt.core.compiler.problem.incompleteEnumSwitch=ignore@' \
                $d/.settings/org.eclipse.jdt.core.prefs
        fi
        if echo $i | grep 'org.eclipse.cdt.examples.dsf' > /dev/null; then
            sed -i \
                '-es@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=warning@org.eclipse.jdt.core.compiler.problem.nonExternalizedStringLiteral=ignore@' \
                $d/.settings/org.eclipse.jdt.core.prefs
        fi
    else
        rm -f $d/.settings/org.eclipse.jdt*.prefs
    fi

    # PDE
    if [[ $natures == *"org.eclipse.pde.PluginNature"* ]]; then
        cp $COREPROJECT/.settings/org.eclipse.pde.prefs $d/.settings
        cp $COREPROJECT/.settings/org.eclipse.pde.api.tools.prefs $d/.settings
        if echo $i | grep -E '\.tests?[/\.]' > /dev/null; then
            sed -i \
                '-es@compilers.p.not-externalized-att=1@compilers.p.not-externalized-att=2@' \
                $d/.settings/org.eclipse.pde.prefs
        fi
    else
        rm -f $d/.settings/org.eclipse.pde*.prefs
    fi
done

##
# Verify API Tooling is enabled for all non-test/example bundles
##
git ls-files  -- \*\*/.project | while read i ; do
    d=`dirname $i`;
    natures=$(xmllint --xpath 'string(//projectDescription/natures)' $i)
    if [[ $natures == *"org.eclipse.pde.PluginNature"* ]] && [[ $natures == *"org.eclipse.jdt.core.javanature"* ]]; then
        if [[ $natures != *"org.eclipse.pde.api.tools.apiAnalysisNature"* ]]; then
            if ! echo $i | grep -E '\.tests?[/\.]' > /dev/null && ! echo $i | grep -E '\.examples?[/\.]' > /dev/null; then
                echo "$d is missing API Tools Nature - Turn it on in Eclipse by 1) Right-click project 2) Plug-in tools -> API Tools Setup"
                exit 1
            fi
        fi
    fi
done