#!/bin/sh

# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.

if [ -z "$JOB_URL" ]; then
  JOB_URL=http://deadlock.netbeans.org/job/nbms-and-javadoc/
fi

sigtest_prev=$WORKSPACE/nbbuild/build/prior-sigtest
if [ -d $sigtest_prev ]
then
    echo SigTest: Previous Snapshots
    ls $sigtest_prev
    echo SigTest: Checking All Changes
    ANT_OPTS='-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp/ant-check-sigtests.hprof' ant -Dsigtest.basedir=$sigtest_prev check-sigtests
    for report in `pwd`/nbbuild/build/sigtest/check-snapshot/*; do
    if ! expr "$report" : ".*/TESTS-.*" && grep 'failures="1"' $report >/dev/null; then
        sigtest_email=`cat $report | grep "^email:" | grep -v commit.mail | cut -c 8-`
        if [ -z "$sigtest_email" ]; then
        sigtest_email="api-changes@netbeans.org"
        fi
        content=`cat $report`
        (
            echo "Code changes:";
            echo "${BUILD_URL}changes"; 
            echo "API changes:";
            echo "${BUILD_URL}artifact/nbbuild/build/sigtest/check-snapshot/html/index.html"; 
            echo "Failure output is available as StdErr output of sigtest test for appropriate module.";
    #                echo "${BUILD_URL}artifact/$sigtest_out/`basename $report`"; 
            echo; 
            expr "$content" : ".*CDATA\[\(.*\)\]\].*"
        ) | mail -s "`basename $report` - sigchanges in $JOB_NAME build #$BUILD_NUMBER" $sigtest_email
    fi
    done
    echo SigTest: Checking All Changes Done
else
    echo SigTest: Did not find previous Snapshot
fi

echo SigTest: Generating Golden Files
ant gen-sigtests || exit 1
echo SigTest: Golden Files generated successfully

echo SigTest: Finding Incompatible Changes
ant check-sigtests-release -Dfail.on.error=false || exit 1
echo SigTest: Finding Incompatible Changes finished successfully
