#!/bin/bash
#
# Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
#
# This code is free software; you can redistribute it and/or modify it
# under the terms of the GNU General Public License version 2 only, as
# published by the Free Software Foundation.
#
# This code is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
# version 2 for more details (a copy is included in the LICENSE file that
# accompanied this code).
#
# You should have received a copy of the GNU General Public License version
# 2 along with this work; if not, write to the Free Software Foundation,
# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
#
# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
# or visit www.oracle.com if you need additional information or have any
# questions.
#

# This script is processed by configure before it's usable. It is run from
# the root of the build directory.


################################################################################

# Check that we are run via the wrapper generated by configure
if [ -z "$SRC_ROOT" ]; then
    echo "Error: You must run this script using build/[conf]/compare.sh"
    exit 1
fi

if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
    FULLDUMP_CMD="$OTOOL -v -V -h -X -d"
    LDD_CMD="$OTOOL -L"
    DIS_CMD="$OTOOL -v -V -t"
    STAT_PRINT_SIZE="-f %z"
elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then
    FULLDUMP_CMD="$DUMPBIN -all"
    LDD_CMD="$DUMPBIN -dependents"
    DIS_CMD="$DUMPBIN -disasm:nobytes"
    STAT_PRINT_SIZE="-c %s"
elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
    FULLDUMP_CMD="dump -h -r -t -n -X64"
    LDD_CMD="$LDD"
    DIS_CMD="$OBJDUMP -d"
    STAT_PRINT_SIZE="-c %s"
else
    FULLDUMP_CMD="$READELF -a"
    LDD_CMD="$LDD"
    DIS_CMD="$OBJDUMP -d"
    STAT_PRINT_SIZE="-c %s"
fi

COMPARE_EXCEPTIONS_INCLUDE="$SRC_ROOT/common/bin/compare_exceptions.sh.incl"
if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
    echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE"
    exit 1
fi
# Include exception definitions
. "$COMPARE_EXCEPTIONS_INCLUDE"

################################################################################
# Compare text files and ignore specific differences:
#
#  * Timestamps in Java sources generated by idl2java
#  * Sorting order and cleanup style in .properties files

diff_text() {
    OTHER_FILE=$1
    THIS_FILE=$2

    SUFFIX="${THIS_FILE##*.}"
    NAME="${THIS_FILE##*/}"

    TMP=1

    if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then
        # Filter out date string, ant version and java version differences.
        TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
            $GREP '^[<>]' | \
            $SED -e '/[<>] Ant-Version: Apache Ant .*/d' \
                 -e '/[<>] Created-By: .* (Oracle [Corpatin)]*/d' \
                 -e '/[<>]  [Corpatin]*)/d' \
                 -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d')
    fi
    if test "x$SUFFIX" = "xjava"; then
        TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
            $GREP '^[<>]' | \
            $SED -e '/[<>] \* from.*\.idl/d' \
                 -e '/[<>] .*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
                 -e '/[<>] .*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}.*/d' \
                 -e '/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d' \
                 -e '/\/\/ Generated from input file.*/d' \
                 -e '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' \
                 -e '/\/\/ java GenerateCharacter.*/d')
    fi
    # Ignore date strings in class files.
    # Anonymous lambda classes get randomly assigned counters in their names.
    if test "x$SUFFIX" = "xclass"; then
        if [ "$NAME" = "module-info.class" ] || [ "$NAME" = "SystemModules.class" ]
        then
            # The SystemModules.class and module-info.class have several issues
            # with random ordering of elements in HashSets.
            MODULES_CLASS_FILTER="$SED \
                -e 's/,$//' \
                -e 's/;$//' \
                -e 's/^ *[0-9]*://' \
                -e 's/#[0-9]* */#/' \
                -e 's/ *\/\// \/\//' \
                -e 's/aload *[0-9]*/aload X/' \
                -e 's/ldc_w/ldc  /' \
                | $SORT \
                "
            $JAVAP -c -constants -l -p "${OTHER_FILE}" \
                | eval "$MODULES_CLASS_FILTER" >  ${OTHER_FILE}.javap &
            $JAVAP -c -constants -l -p "${THIS_FILE}" \
                | eval "$MODULES_CLASS_FILTER" > ${THIS_FILE}.javap &
            wait
            TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap)
        # To improve performance when large diffs are found, do a rough filtering of classes
        # elibeble for these exceptions
        elif $GREP -R -e '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}' \
                -e 'lambda\$[a-zA-Z0-9]*\$[0-9]' ${THIS_FILE} > /dev/null
        then
            $JAVAP -c -constants -l -p "${OTHER_FILE}" >  ${OTHER_FILE}.javap &
            $JAVAP -c -constants -l -p "${THIS_FILE}" > ${THIS_FILE}.javap &
            wait
            TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
                $GREP '^[<>]' | \
                $SED -e '/[<>].*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}.*/d' \
                     -e '/[<>].*lambda\$[a-zA-Z0-9]*\$[0-9]*/d')
        fi
    fi
    if test "x$SUFFIX" = "xproperties"; then
        # Filter out date string differences.
        TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
            $GREP '^[<>]' | \
            $SED -e '/[<>].*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}.*/d')
    fi
    if test "x$SUFFIX" = "xhtml"; then
	# Some javadoc versions do not put quotes around font size
	HTML_FILTER="$SED \
            -e 's/<font size=-1>/<font size=\"-1\">/g'"
	$CAT $THIS_FILE | eval "$HTML_FILTER" > $THIS_FILE.filtered
	$CAT $OTHER_FILE | eval "$HTML_FILTER" > $OTHER_FILE.filtered
        TMP=$(LC_ALL=C $DIFF $OTHER_FILE.filtered $THIS_FILE.filtered | \
            $GREP '^[<>]' | \
            $SED -e '/[<>] <!-- Generated by javadoc .* on .* -->/d' \
	         -e '/[<>] <meta name="date" content=".*">/d' )
    fi
    if test -n "$TMP"; then
        echo Files $OTHER_FILE and $THIS_FILE differ
        return 1
    fi

    return 0
}

################################################################################
# Compare directory structure

compare_dirs() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    mkdir -p $WORK_DIR

    (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_other)
    (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_this)

    $DIFF $WORK_DIR/dirs_other $WORK_DIR/dirs_this > $WORK_DIR/dirs_diff

    echo -n Directory structure...
    if [ -s $WORK_DIR/dirs_diff ]; then
        echo Differences found.
        REGRESSIONS=true
        # Differences in directories found.
        ONLY_OTHER=$($GREP '<' $WORK_DIR/dirs_diff)
        if [ "$ONLY_OTHER" ]; then
            echo Only in $OTHER
            $GREP '<' $WORK_DIR/dirs_diff | $SED 's|< ./|    |g'
        fi
        ONLY_THIS=$($GREP '>' $WORK_DIR/dirs_diff)
        if [ "$ONLY_THIS" ]; then
            echo Only in $THIS
            $GREP '>' $WORK_DIR/dirs_diff | $SED 's|> ./|    |g'
        fi
    else
        echo Identical!
    fi
}


################################################################################
# Compare file structure

compare_files() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    $MKDIR -p $WORK_DIR

    (cd $OTHER_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_other)
    (cd $THIS_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_this)

    $DIFF $WORK_DIR/files_other $WORK_DIR/files_this > $WORK_DIR/files_diff

    echo -n File names...
    if [ -s $WORK_DIR/files_diff ]; then
        echo Differences found.
        REGRESSIONS=true
        # Differences in files found.
        ONLY_OTHER=$($GREP '<' $WORK_DIR/files_diff)
        if [ "$ONLY_OTHER" ]; then
            echo Only in $OTHER
            $GREP '<' $WORK_DIR/files_diff | $SED 's|< ./|    |g'
        fi
        ONLY_THIS=$($GREP '>' $WORK_DIR/files_diff)
        if [ "$ONLY_THIS" ]; then
            echo Only in $THIS
            $GREP '>' $WORK_DIR/files_diff | $SED 's|> ./|    |g'
        fi
    else
        echo Identical!
    fi
}


################################################################################
# Compare permissions

compare_permissions() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    mkdir -p $WORK_DIR

    echo -n Permissions...
    found=""
    for f in `cd $OTHER_DIR && $FIND . -type f`
    do
        if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi
        if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
        OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
        TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
        if [ "$OP" != "$TP" ]
        then
            if [ -z "$found" ]; then echo ; found="yes"; fi
            $PRINTF "\tother: ${OP} this: ${TP}\t$f\n"
        fi
    done
    if [ -z "$found" ]; then
        echo "Identical!"
    else
        REGRESSIONS=true
    fi
}

################################################################################
# Compare file command output

compare_file_types() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    $MKDIR -p $WORK_DIR

    FILE_TYPES_FILTER="$SED \
        -e 's/BuildID[^,]*//' \
        -e 's/last modified: .*//' \
        "

    echo -n File types...
    found=""
    for f in `cd $OTHER_DIR && $FIND . ! -type d`
    do
        if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi
        if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
        OF=$(cd ${OTHER_DIR} && $FILE -h $f | eval $FILE_TYPES_FILTER)
        TF=$(cd ${THIS_DIR} && $FILE -h $f | eval $FILE_TYPES_FILTER)
        if [ "$OF" != "$TF" ]
        then
            if [ "`echo $OF | $GREP -c 'Zip archive data'`" -gt 0 ] \
                && [ "`echo $TF | $GREP -c 'Zip archive data'`" -gt 0 ]
            then
                # the way we produce zip-files make it so that directories are stored in
                # old file but not in new (only files with full-path) this makes file
                # report them as different
                continue
            else
                if [ -z "$found" ]; then echo ; found="yes"; fi
                $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n"
            fi
        fi
    done
    if [ -z "$found" ]; then
        echo "Identical!"
    else
        REGRESSIONS=true
    fi
}

################################################################################
# Compare the rest of the files

compare_general_files() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" \
        ! -name "*.zip" ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \
        ! -name "modules" ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
        ! -name "*.cpl" ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
        ! -name "*.lib" ! -name "*.war" ! -name "JavaControlPanel" ! -name "*.jmod" \
        ! -name "*.obj" ! -name "*.o" ! -name "JavaControlPanelHelper" \
        ! -name "JavaUpdater" ! -name "JavaWSApplicationStub" \
        ! -name "jspawnhelper" ! -name "JavawsLauncher" ! -name "*.a" \
        ! -name "finish_installation" ! -name "Sparkle" ! -name "*.tar.gz" \
        | $GREP -v "./bin/"  | $SORT | $FILTER)

    echo Other files with binary differences...
    for f in $GENERAL_FILES
    do
        if [ -e $OTHER_DIR/$f ]; then
            SUFFIX="${f##*.}"
            if [ "$(basename $f)" = "release" ]; then
                # In release file, ignore differences in change numbers and order
                # of modules in list.
                OTHER_FILE=$WORK_DIR/$f.other
                THIS_FILE=$WORK_DIR/$f.this
                $MKDIR -p $(dirname $OTHER_FILE)
                $MKDIR -p $(dirname $THIS_FILE)
                RELEASE_FILTER="$SED \
                    -e 's/\:[0-9a-f]\{12,12\}/:CHANGE/g' \
                    -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
                    -e 's/^#.*/#COMMENT/g' \
                    -e 's/MODULES=/MODULES=\'$'\n/' \
                    -e 's/,/\'$'\n/g' \
                    | $SORT
                    "
                $CAT $OTHER_DIR/$f | eval "$RELEASE_FILTER" > $OTHER_FILE
                $CAT $THIS_DIR/$f  | eval "$RELEASE_FILTER" > $THIS_FILE
            elif [ "x$SUFFIX" = "xhtml" ]; then
                # Ignore time stamps in docs files
                OTHER_FILE=$WORK_DIR/$f.other
                THIS_FILE=$WORK_DIR/$f.this
                $MKDIR -p $(dirname $OTHER_FILE) $(dirname $THIS_FILE)
                # Older versions of compare might have left soft links with
                # these names.
                $RM $OTHER_FILE $THIS_FILE
                #Note that | doesn't work on mac sed.
                HTML_FILTER="$SED \
                    -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
                    -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
                    -e 's/[A-Z][a-z]*, [A-Z][a-z]* [0-9][0-9]*, [0-9]\{4\} [0-9][0-9:]* [AMP]\{2,2\} [A-Z][A-Z]*/<DATE>/'
                    "
                $CAT $OTHER_DIR/$f | eval "$HTML_FILTER" > $OTHER_FILE &
                $CAT $THIS_DIR/$f  | eval "$HTML_FILTER" > $THIS_FILE &
                wait
            else
                OTHER_FILE=$OTHER_DIR/$f
                THIS_FILE=$THIS_DIR/$f
            fi
            DIFF_OUT=$($DIFF $OTHER_FILE $THIS_FILE 2>&1)
            if [ -n "$DIFF_OUT" ]; then
                echo $f
                REGRESSIONS=true
                if [ "$SHOW_DIFFS" = "true" ]; then
                    echo "$DIFF_OUT"
                fi
            fi
        fi
    done


}

################################################################################
# Compare zip file

compare_zip_file() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3
    ZIP_FILE=$4
    # Optionally provide different name for other zipfile
    OTHER_ZIP_FILE=$5

    THIS_ZIP=$THIS_DIR/$ZIP_FILE
    if [ -n "$OTHER_ZIP_FILE" ]; then
        OTHER_ZIP=$OTHER_DIR/$OTHER_ZIP_FILE
    else
        OTHER_ZIP=$OTHER_DIR/$ZIP_FILE
    fi

    THIS_SUFFIX="${THIS_ZIP##*.}"
    OTHER_SUFFIX="${OTHER_ZIP##*.}"
    if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then
        echo "The files do not have the same suffix type! ($THIS_SUFFIX != $OTHER_SUFFIX)"
        return 2
    fi

    TYPE="$THIS_SUFFIX"

    if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null
    then
        return 0
    fi
    # Not quite identical, the might still contain the same data.
    # Unpack the jar/zip files in temp dirs

    THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this
    OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other
    $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR
    $MKDIR -p $THIS_UNZIPDIR
    $MKDIR -p $OTHER_UNZIPDIR
    if [ "$TYPE" = "jar" -o "$TYPE" = "war" -o "$TYPE" = "zip" -o "$TYPE" = "jmod" ]
    then
        (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
        (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
    elif [ "$TYPE" = "gz" ]
    then
        (cd $THIS_UNZIPDIR && $GUNZIP -c $THIS_ZIP | $TAR xf -)
        (cd $OTHER_UNZIPDIR && $GUNZIP -c $OTHER_ZIP | $TAR xf -)
    else
        (cd $THIS_UNZIPDIR && $JIMAGE extract $THIS_ZIP)
        (cd $OTHER_UNZIPDIR && $JIMAGE extract $OTHER_ZIP)
    fi

    # Find all archives inside and unzip them as well to compare the contents rather than
    # the archives. pie.jar.pack.gz i app3.war is corrupt, skip it.
    EXCEPTIONS="pie.jar.pack.gz"
    for pack in $($FIND $THIS_UNZIPDIR \( -name "*.pack" -o -name "*.pack.gz" \) -a ! -name pie.jar.pack.gz); do
        ($UNPACK200 $pack $pack.jar)
        # Filter out the unzipped archives from the diff below.
        EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
    done
    for pack in $($FIND $OTHER_UNZIPDIR \( -name "*.pack" -o -name "*.pack.gz" \) -a ! -name pie.jar.pack.gz); do
        ($UNPACK200 $pack $pack.jar)
        EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
    done
    for zip in $($FIND $THIS_UNZIPDIR -name "*.jar" -o -name "*.zip"); do
        $MKDIR $zip.unzip
        (cd $zip.unzip && $UNARCHIVE $zip)
        EXCEPTIONS="$EXCEPTIONS $zip"
    done
    for zip in $($FIND $OTHER_UNZIPDIR -name "*.jar" -o -name "*.zip"); do
        $MKDIR $zip.unzip
        (cd $zip.unzip && $UNARCHIVE $zip)
        EXCEPTIONS="$EXCEPTIONS $zip"
    done

    CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff
    # On solaris, there is no -q option.
    if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
        LC_ALL=C $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \
            | $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \
            > $CONTENTS_DIFF_FILE
    else
        LC_ALL=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
    fi

    ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE)
    ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE)

    return_value=0

    if [ -n "$ONLY_OTHER" ]; then
        echo "        Only OTHER $ZIP_FILE contains:"
        echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR|            |"g | sed 's|: |/|g'
        return_value=1
    fi

    if [ -n "$ONLY_THIS" ]; then
        echo "        Only THIS $ZIP_FILE contains:"
        echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR|            |"g | sed 's|: |/|g'
        return_value=1
    fi

    if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
        DIFFING_FILES=$($GREP -e 'differ$' -e '^diff ' $CONTENTS_DIFF_FILE \
            | $SED -e 's/^Files //g' -e 's/diff -r //g' | $CUT -f 1 -d ' ' \
            | $SED "s|$OTHER_UNZIPDIR/||g")
    else
        DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \
            | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g")
    fi

    $RM -f $WORK_DIR/$ZIP_FILE.diffs
    for file in $DIFFING_FILES; do
        if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
            diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs
        fi
    done

    if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then
        return_value=1
        echo "        Differing files in $ZIP_FILE"
        $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP 'differ$' | cut -f 2 -d ' ' | \
            $SED "s|$OTHER_UNZIPDIR|            |g" > $WORK_DIR/$ZIP_FILE.difflist
        $CAT $WORK_DIR/$ZIP_FILE.difflist

        if [ -n "$SHOW_DIFFS" ]; then
            for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do
                if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then
                    LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap
                elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then
                    LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i
                else
                    LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i
                fi
            done
        fi
    fi

    return $return_value
}


################################################################################
# Compare all zip files

compare_all_zip_files() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" -o -name "*.tar.gz" \
        | $SORT | $FILTER )

    if [ -n "$ZIPS" ]; then
        echo Zip/tar.gz files...

        return_value=0
        for f in $ZIPS; do
            if [ -f "$OTHER_DIR/$f" ]; then
                compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
                if [ "$?" != "0" ]; then
                    return_value=1
                    REGRESSIONS=true
                fi
            fi
        done
    fi

    return $return_value
}

################################################################################
# Compare all jar files

compare_all_jar_files() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    # TODO filter?
    ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" \
        -o -name "modules" | $SORT | $FILTER)

    if [ -n "$ZIPS" ]; then
        echo Jar files...

        return_value=0
        for f in $ZIPS; do
            if [ -f "$OTHER_DIR/$f" ]; then
                compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
                if [ "$?" != "0" ]; then
                    return_value=1
                    REGRESSIONS=true
                fi
            fi
        done
    fi

    return $return_value
}

################################################################################
# Compare binary (executable/library) file

compare_bin_file() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3
    BIN_FILE=$4
    OTHER_BIN_FILE=$5

    THIS_FILE=$THIS_DIR/$BIN_FILE
    if [ -n "$OTHER_BIN_FILE" ]; then
        OTHER_FILE=$OTHER_DIR/$OTHER_BIN_FILE
    else
        OTHER_FILE=$OTHER_DIR/$BIN_FILE
    fi
    NAME=$(basename $BIN_FILE)
    WORK_FILE_BASE=$WORK_DIR/$BIN_FILE
    FILE_WORK_DIR=$(dirname $WORK_FILE_BASE)

    $MKDIR -p $FILE_WORK_DIR

    # Make soft links to original files from work dir to facilitate debugging
    $LN -f -s $THIS_FILE $WORK_FILE_BASE.this
    $LN -f -s $OTHER_FILE $WORK_FILE_BASE.other

    ORIG_THIS_FILE="$THIS_FILE"
    ORIG_OTHER_FILE="$OTHER_FILE"

    if [ "$STRIP_ALL" = "true" ] || [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then
        THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME
        OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME
        $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other
        $CP $THIS_FILE $THIS_STRIPPED_FILE
        $CP $OTHER_FILE $OTHER_STRIPPED_FILE
        $STRIP $THIS_STRIPPED_FILE
        $STRIP $OTHER_STRIPPED_FILE
        THIS_FILE="$THIS_STRIPPED_FILE"
        OTHER_FILE="$OTHER_STRIPPED_FILE"
    fi

    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
        unset _NT_SYMBOL_PATH
        # On windows we need to unzip the debug symbols, if present
        OTHER_FILE_BASE=${OTHER_FILE/.dll/}
        OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/}
        OTHER_FILE_BASE=${OTHER_FILE_BASE/.cpl/}
        DIZ_NAME=$(basename $OTHER_FILE_BASE).diz
        # Some .exe files have the same name as a .dll file. Make sure the exe
        # files get the right debug symbols.
        if [ "$NAME" = "java.exe" ] \
               && [ -f "$OTHER/support/native/java.base/java_objs/java.diz" ]; then
            OTHER_DIZ_FILE="$OTHER/support/native/java.base/java_objs/java.diz"
        elif [ "$NAME" = "jimage.exe" ] \
               && [ -f "$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
            OTHER_DIZ_FILE="$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz"
        elif [ "$NAME" = "javacpl.exe" ] \
               && [ -f "$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
            OTHER_DIZ_FILE="$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz"
        elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
            OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
        else
            # Some files, jli.dll, appears twice in the image but only one of
            # thme has a diz file next to it.
            OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)"
            if [ ! -f "$OTHER_DIZ_FILE" ]; then
                # As a last resort, look for diz file in the whole build output
                # dir.
                OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)"
            fi
        fi
        if [ -n "$OTHER_DIZ_FILE" ]; then
            $MKDIR -p $FILE_WORK_DIR/other
            (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE)
            export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other"
        fi

        THIS_FILE_BASE=${THIS_FILE/.dll/}
        THIS_FILE_BASE=${THIS_FILE_BASE/.exe/}
        THIS_FILE_BASE=${THIS_FILE_BASE/.cpl/}
        # Some .exe files have the same name as a .dll file. Make sure the exe
        # files get the right debug symbols.
        if [ "$NAME" = "java.exe" ] \
               && [ -f "$THIS/support/native/java.base/java_objs/java.diz" ]; then
            THIS_DIZ_FILE="$THIS/support/native/java.base/java_objs/java.diz"
        elif [ "$NAME" = "jimage.exe" ] \
               && [ -f "$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
            THIS_DIZ_FILE="$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz"
        elif [ "$NAME" = "javacpl.exe" ] \
               && [ -f "$THIS/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
            THIS_DIZ_FILE="$THIS/support/native/jdk.plugin/javacpl/javacpl.diz"
        elif [ -f "${THIS_FILE_BASE}.diz" ]; then
            THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
        else
            THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)"
            if [ ! -f "$THIS_DIZ_FILE" ]; then
                # As a last resort, look for diz file in the whole build output
                # dir.
                THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)"
            fi
        fi
        if [ -n "$THIS_DIZ_FILE" ]; then
            $MKDIR -p $FILE_WORK_DIR/this
            (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE)
            export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this"
        fi
    fi

    if [ -z "$SKIP_BIN_DIFF" ]; then
        if cmp $OTHER_FILE $THIS_FILE > /dev/null; then
        # The files were bytewise identical.
            if [ -n "$VERBOSE" ]; then
                echo "        :           :         :         :          :          : $BIN_FILE"
            fi
            return 0
        fi
        BIN_MSG=" diff "
        if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then
            DIFF_BIN=true
            if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then
                BIN_MSG="*$BIN_MSG*"
                REGRESSIONS=true
            else
                BIN_MSG=" $BIN_MSG "
            fi
        else
            BIN_MSG="($BIN_MSG)"
            DIFF_BIN=
        fi
    fi

    if [ -n "$STAT" ]; then
        THIS_SIZE=$($STAT $STAT_PRINT_SIZE "$THIS_FILE")
        OTHER_SIZE=$($STAT $STAT_PRINT_SIZE "$OTHER_FILE")
    else
        THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }')
        OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }')
    fi
    if [ $THIS_SIZE -ne $OTHER_SIZE ]; then
        DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE)
        DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE)
        SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM)
        if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] \
            && [ "$DIFF_SIZE_REL" -lt 102 ]; then
            SIZE_MSG="($SIZE_MSG)"
            DIFF_SIZE=
        elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
            && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
            && [ "$DIFF_SIZE_NUM" = 512 ]; then
            # On windows, size of binaries increase in 512 increments.
            SIZE_MSG="($SIZE_MSG)"
            DIFF_SIZE=
        elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
            && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
            && [ "$DIFF_SIZE_NUM" = -512 ]; then
            # On windows, size of binaries increase in 512 increments.
            SIZE_MSG="($SIZE_MSG)"
            DIFF_SIZE=
        else
            if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then
                DIFF_SIZE=true
                if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then
                    SIZE_MSG="*$SIZE_MSG*"
                    REGRESSIONS=true
                else
                    SIZE_MSG=" $SIZE_MSG "
                fi
            else
                SIZE_MSG="($SIZE_MSG)"
                DIFF_SIZE=
            fi
        fi
    else
        SIZE_MSG="           "
        DIFF_SIZE=
        if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then
            SIZE_MSG="     !     "
        fi
    fi

    if [ "$SORT_ALL_SYMBOLS" = "true" ] || [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then
        SYM_SORT_CMD="sort"
    else
        SYM_SORT_CMD="cat"
    fi

    if [ -n "$SYMBOLS_DIFF_FILTER" ] && [ -z "$NEED_SYMBOLS_DIFF_FILTER" ] \
            || [[ "$NEED_SYMBOLS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
        this_SYMBOLS_DIFF_FILTER="$SYMBOLS_DIFF_FILTER"
    else
        this_SYMBOLS_DIFF_FILTER="$CAT"
    fi

    # Check symbols
    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
        # The output from dumpbin on windows differs depending on if the debug symbol
        # files are still around at the location the binary is pointing too. Need
        # to filter out that extra information.
        $DUMPBIN -exports $OTHER_FILE | $GREP  -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
        $DUMPBIN -exports $THIS_FILE  | $GREP  -E '^ +[0-9A-F]+ +[0-9A-F]+ [0-9A-F]+' | sed 's/ = .*//g' | cut -c27- | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
    elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
        # Some symbols get seemingly random 15 character prefixes. Filter them out.
        $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
        $NM -a $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SED 's/^\([a-zA-Z] [\.\$]\)[a-zA-Z0-9_\$]\{15,15\}\./\1./g' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
    elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
        $OBJDUMP -T $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
        $OBJDUMP -T $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME | $AWK '{print $2, $3, $4, $5}' | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
    elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
        $NM -j $ORIG_OTHER_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
        $NM -j $ORIG_THIS_FILE  2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
    else
        $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME \
            | $AWK '{print $2, $3, $4, $5}' \
            | eval "$this_SYMBOLS_DIFF_FILTER" \
            | $SYM_SORT_CMD \
            > $WORK_FILE_BASE.symbols.other
        $NM -a $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME \
            | $AWK '{print $2, $3, $4, $5}' \
            | eval "$this_SYMBOLS_DIFF_FILTER" \
            | $SYM_SORT_CMD \
            > $WORK_FILE_BASE.symbols.this
    fi

    LC_ALL=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
    if [ -s $WORK_FILE_BASE.symbols.diff ]; then
        SYM_MSG=" diff  "
        if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then
            DIFF_SYM=true
            if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then
                SYM_MSG="*$SYM_MSG*"
                REGRESSIONS=true
            else
                SYM_MSG=" $SYM_MSG "
            fi
        else
            SYM_MSG="($SYM_MSG)"
            DIFF_SYM=
        fi
    else
        SYM_MSG="         "
        DIFF_SYM=
        if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then
            SYM_MSG="    !    "
        fi
    fi

    # Check dependencies
    if [ -n "$LDD_CMD" ]; then
        if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
            LDD_FILTER="$GREP \.dll"
        else
            LDD_FILTER="$CAT"
        fi
        (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME 2>/dev/null \
                    | $LDD_FILTER | $AWK '{ print $1;}' | $SORT \
                    | $TEE $WORK_FILE_BASE.deps.other \
                    | $UNIQ > $WORK_FILE_BASE.deps.other.uniq)
        (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2</dev/null \
                    | $LDD_FILTER | $AWK '{ print $1;}' | $SORT \
                    | $TEE $WORK_FILE_BASE.deps.this \
                    | $UNIQ > $WORK_FILE_BASE.deps.this.uniq)
        (cd $FILE_WORK_DIR && $RM -f $NAME)

        LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this \
              > $WORK_FILE_BASE.deps.diff
        LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq \
              > $WORK_FILE_BASE.deps.diff.uniq

        if [ -s $WORK_FILE_BASE.deps.diff ]; then
            if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then
                DEP_MSG=" diff  "
            else
                DEP_MSG=" redun "
            fi
            if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then
                DIFF_DEP=true
                if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then
                    DEP_MSG="*$DEP_MSG*"
                    REGRESSIONS=true
                else
                    DEP_MSG=" $DEP_MSG "
                fi
            else
                DEP_MSG="($DEP_MSG)"
                DIFF_DEP=
            fi
        else
            DEP_MSG="         "
            DIFF_DEP=
            if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
                DEP_MSG="     !      "
            fi
        fi
    else
        DEP_MSG="    -    "
    fi

    # Some linux compilers add a unique Build ID
    if [ "$OPENJDK_TARGET_OS" = "linux" ]; then
      BUILD_ID_FILTER="$SED -r 's/(Build ID:) [0-9a-f]{40}/\1/'"
    else
      BUILD_ID_FILTER="$CAT"
    fi

    # Compare fulldump output
    if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then
        if [ -z "$FULLDUMP_DIFF_FILTER" ]; then
            FULLDUMP_DIFF_FILTER="$CAT"
        fi
        $FULLDUMP_CMD $OTHER_FILE | eval "$BUILD_ID_FILTER" | eval "$FULLDUMP_DIFF_FILTER" \
            > $WORK_FILE_BASE.fulldump.other 2>&1 &
        $FULLDUMP_CMD $THIS_FILE  | eval "$BUILD_ID_FILTER" | eval "$FULLDUMP_DIFF_FILTER" \
            > $WORK_FILE_BASE.fulldump.this  2>&1 &
        wait

        LC_ALL=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this \
            > $WORK_FILE_BASE.fulldump.diff

        if [ -s $WORK_FILE_BASE.fulldump.diff ]; then
            FULLDUMP_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}')
            FULLDUMP_MSG=$($PRINTF "%8d" $FULLDUMP_DIFF_SIZE)
            if [[ "$ACCEPTED_FULLDUMP_DIFF" != *"$BIN_FILE"* ]]; then
                DIFF_FULLDUMP=true
                if [[ "$KNOWN_FULLDUMP_DIFF" != *"$BIN_FILE"* ]]; then
                    FULLDUMP_MSG="*$FULLDUMP_MSG*"
                    REGRESSIONS=true
                else
                    FULLDUMP_MSG=" $FULLDUMP_MSG "
                fi
            else
                FULLDUMP_MSG="($FULLDUMP_MSG)"
                DIFF_FULLDUMP=
            fi
        else
            FULLDUMP_MSG="          "
            DIFF_FULLDUMP=
            if [[ "$KNOWN_FULLDUMP_DIFF $ACCEPTED_FULLDUMP_DIFF" = *"$BIN_FILE"* ]]; then
                FULLDUMP_MSG="    !    "
            fi
        fi
    fi

    # Compare disassemble output
    if [ -n "$DIS_CMD" ] && [ -z "$SKIP_DIS_DIFF" ]; then
        this_DIS_DIFF_FILTER="$CAT"
        if [ -n "$DIS_DIFF_FILTER" ]; then
            if [ -z "$NEED_DIS_DIFF_FILTER" ] \
                || [[ "$NEED_DIS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
                this_DIS_DIFF_FILTER="$DIS_DIFF_FILTER"
            fi
        fi
        if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
            DIS_GREP_ARG=-a
        else
            DIS_GREP_ARG=
        fi
        $DIS_CMD $OTHER_FILE | $GREP $DIS_GREP_ARG -v $NAME \
            | eval "$this_DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.other 2>&1 &
        $DIS_CMD $THIS_FILE  | $GREP $DIS_GREP_ARG -v $NAME \
            | eval "$this_DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.this  2>&1 &
        wait

        LC_ALL=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff

        if [ -s $WORK_FILE_BASE.dis.diff ]; then
            DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}')
            DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE)
            if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then
                DIFF_DIS=true
                if [ "$MAX_KNOWN_DIS_DIFF_SIZE" = "" ]; then
                    MAX_KNOWN_DIS_DIFF_SIZE="0"
                fi
                if [[ "$KNOWN_DIS_DIFF" = *"$BIN_FILE"* ]] \
                    && [ "$DIS_DIFF_SIZE" -lt "$MAX_KNOWN_DIS_DIFF_SIZE" ]; then
                    DIS_MSG=" $DIS_MSG "
                else
                    DIS_MSG="*$DIS_MSG*"
                    REGRESSIONS=true
                fi
            else
                DIS_MSG="($DIS_MSG)"
                DIFF_DIS=
            fi
        else
            DIS_MSG="          "
            DIFF_DIS=
            if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
                DIS_MSG="    !    "
            fi
        fi
    fi


    if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_FULLDUMP$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then
        if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi
        if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi
        if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi
        if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi
        if [ -n "$FULLDUMP_MSG" ]; then echo -n "$FULLDUMP_MSG:"; fi
        if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi
        echo " $BIN_FILE"
        if [ "$SHOW_DIFFS" = "true" ]; then
            if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then
                echo "Symbols diff:"
                $CAT $WORK_FILE_BASE.symbols.diff
            fi
            if [ -s "$WORK_FILE_BASE.deps.diff" ]; then
                echo "Deps diff:"
                $CAT $WORK_FILE_BASE.deps.diff
            fi
            if [ -s "$WORK_FILE_BASE.fulldump.diff" ]; then
                echo "Fulldump diff:"
                $CAT $WORK_FILE_BASE.fulldump.diff
            fi
            if [ -s "$WORK_FILE_BASE.dis.diff" ]; then
                echo "Disassembly diff:"
                $CAT $WORK_FILE_BASE.dis.diff
            fi
        fi
        return 1
    fi
    return 0
}

################################################################################
# Print binary diff header

print_binary_diff_header() {
    if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi
    if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n "   Size    :"; fi
    if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi
    if [ -z "$SKIP_DEP_DIFF" ]; then echo -n "  Deps   :"; fi
    if [ -z "$SKIP_FULLDUMP_DIFF" ]; then echo -n " Fulldump :"; fi
    if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass   :"; fi
    echo
}

################################################################################
# Compare all libraries

compare_all_libs() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' \
        -o -name '*.dll' -o -name '*.obj' -o -name '*.o' -o -name '*.a' \
        -o -name '*.cpl' \) | $SORT | $FILTER)

    if [ -n "$LIBS" ]; then
        echo Libraries...
        print_binary_diff_header
        for l in $LIBS; do
            if [ -f "$OTHER_DIR/$l" ]; then
                compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l
                if [ "$?" != "0" ]; then
                    return_value=1
                fi
            fi
        done
    fi

    return $return_value
}

################################################################################
# Compare all executables

compare_all_execs() {
    THIS_DIR=$1
    OTHER_DIR=$2
    WORK_DIR=$3

    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
        EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER)
    else
        EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \
            \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' \
            -o -name '*.jar' -o -name '*.diz' -o -name 'jcontrol' -o -name '*.properties' \
            -o -name '*.data' -o -name '*.bfc' -o -name '*.src' -o -name '*.txt' \
            -o -name '*.cfg' -o -name 'meta-index' -o -name '*.properties.ja' \
            -o -name '*.xml' -o -name '*.html' -o -name '*.png' -o -name 'README' \
            -o -name '*.zip' -o -name '*.jimage' -o -name '*.java' -o -name '*.mf' \
            -o -name '*.jpg' -o -name '*.wsdl' -o -name '*.js' -o -name '*.sh' \
            -o -name '*.bat' -o -name '*LICENSE' -o -name '*.d' -o -name '*store' \
            -o -name 'blacklist' -o -name '*certs' -o -name '*.ttf' \
            -o -name '*.jfc' -o -name '*.dat'  -o -name 'release' -o -name '*.dir'\
            -o -name '*.sym' -o -name '*.idl' -o -name '*.h' -o -name '*.access' \
            -o -name '*.template' -o -name '*.policy' -o -name '*.security' \
            -o -name 'COPYRIGHT' -o -name '*.1' \
            -o -name 'classlist' \) | $SORT | $FILTER)
    fi

    if [ -n "$EXECS" ]; then
        echo Executables...
        print_binary_diff_header
        for e in $EXECS; do
            if [ -f "$OTHER_DIR/$e" ]; then
                compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e
                if [ "$?" != "0" ]; then
                    return_value=1
                fi
            fi
        done
    fi

    return $return_value
}

################################################################################
# Initiate configuration

THIS="$SCRIPT_DIR"
echo "$THIS"
THIS_SCRIPT="$0"

if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then
    echo "bash ./compare.sh [OPTIONS] [FILTER]"
    echo ""
    echo "-all                Compare all files in all known ways"
    echo "-names              Compare the file names and directory structure"
    echo "-perms              Compare the permission bits on all files and directories"
    echo "-types              Compare the output of the file command on all files"
    echo "-general            Compare the files not convered by the specialized comparisons"
    echo "-zips               Compare the contents of all zip files"
    echo "-jars               Compare the contents of all jar files"
    echo "-libs               Compare all native libraries"
    echo "-execs              Compare all executables"
    echo "-v                  Verbose output, does not hide known differences"
    echo "-vv                 More verbose output, shows diff output of all comparisons"
    echo "-o [OTHER]          Compare with build in other directory. Will default to the old build directory"
    echo ""
    echo "--sort-symbols      Sort all symbols before comparing"
    echo "--strip             Strip all binaries before comparing"
    echo "--clean             Clean all previous comparison results first"
    echo ""
    echo "[FILTER]            List filenames in the image to compare, works for jars, zips, libs and execs"
    echo "Example:"
    echo "bash ./common/bin/compareimages.sh CodePointIM.jar"
    echo ""
    echo "-2zips <file1> <file2> Compare two zip files only"
    echo "-2bins <file1> <file2> Compare two binary files only"
    echo "-2dirs <dir1> <dir2> Compare two directories as if they were images"
    echo ""
    exit 10
fi

CMP_NAMES=false
CMP_PERMS=false
CMP_TYPES=false
CMP_GENERAL=false
CMP_ZIPS=false
CMP_JARS=false
CMP_LIBS=false
CMP_EXECS=false

while [ -n "$1" ]; do
    case "$1" in
        -v)
            VERBOSE=true
            ;;
        -vv)
            VERBOSE=true
            SHOW_DIFFS=true
            ;;
        -o)
            OTHER="$2"
            shift
            ;;
        -all)
            CMP_NAMES=true
            if [ "$OPENJDK_TARGET_OS" != "windows" ]; then
                CMP_PERMS=true
            fi
            CMP_TYPES=true
            CMP_GENERAL=true
            CMP_ZIPS=true
            CMP_JARS=true
            CMP_LIBS=true
            CMP_EXECS=true
            ;;
        -names)
            CMP_NAMES=true
            ;;
        -perms)
            CMP_PERMS=true
            ;;
        -types)
            CMP_TYPES=true
            ;;
        -general)
            CMP_GENERAL=true
            ;;
        -zips)
            CMP_ZIPS=true
            ;;
        -jars)
            CMP_JARS=true
            ;;
        -libs)
            CMP_LIBS=true
            ;;
        -execs)
            CMP_EXECS=true
            ;;
        -2dirs)
            THIS="$(cd "$2" > /dev/null && pwd )"
            OTHER="$(cd "$3" > /dev/null && pwd )"
            THIS_BASE_DIR="$THIS"
            OTHER_BASE_DIR="$OTHER"
            SKIP_DEFAULT=true
            shift
            shift
            ;;
        -2zips)
            CMP_2_ZIPS=true
            THIS_FILE=$2
            OTHER_FILE=$3
            shift
            shift
            ;;
        -2bins)
            CMP_2_BINS=true
            THIS_FILE=$2
            OTHER_FILE=$3
            shift
            shift
            ;;
        --sort-symbols)
            SORT_ALL_SYMBOLS=true
            ;;
        --strip)
            STRIP_ALL=true
            ;;
        --clean)
            CLEAN_OUTPUT=true
            ;;
        *)
            CMP_NAMES=false
            CMP_PERMS=false
            CMP_TYPES=false
            CMP_ZIPS=true
            CMP_JARS=true
            CMP_LIBS=true
            CMP_EXECS=true

            if [ -z "$FILTER" ]; then
                FILTER="$GREP"
            fi
            FILTER="$FILTER -e $1"
            ;;
    esac
    shift
done

if [ "$STRIP_ALL" = "true" ] && [ -z "$STRIP" ]; then
  echo Warning: Not stripping even with --strip, since strip is missing on this platform
  STRIP_ALL=false
fi

COMPARE_ROOT=/tmp/cimages.$USER
if [ "$CLEAN_OUTPUT" = "true" ]; then
    echo Cleaning old output in $COMPARE_ROOT.
    $RM -rf $COMPARE_ROOT
fi
$MKDIR -p $COMPARE_ROOT
if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
    if [ "$(uname -o)" = "Cygwin" ]; then
        COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT)
    fi
fi

if [ "$CMP_2_ZIPS" = "true" ]; then
    THIS_DIR="$(dirname $THIS_FILE)"
    THIS_DIR="$(cd "$THIS_DIR" > /dev/null && pwd )"
    OTHER_DIR="$(dirname $OTHER_FILE)"
    OTHER_DIR="$(cd "$OTHER_DIR" > /dev/null && pwd )"
    THIS_FILE_NAME="$(basename $THIS_FILE)"
    OTHER_FILE_NAME="$(basename $OTHER_FILE)"
    echo Comparing $THIS_DIR/$THIS_FILE_NAME and $OTHER_DIR/$OTHER_FILE_NAME
    compare_zip_file $THIS_DIR $OTHER_DIR $COMPARE_ROOT/2zips $THIS_FILE_NAME $OTHER_FILE_NAME
    exit
fi

if [ "$CMP_2_BINS" = "true" ]; then
    THIS_DIR="$(dirname $THIS_FILE)"
    THIS_DIR="$(cd "$THIS_DIR" > /dev/null && pwd )"
    OTHER_DIR="$(dirname $OTHER_FILE)"
    OTHER_DIR="$(cd "$OTHER_DIR" > /dev/null && pwd )"
    THIS_FILE_NAME="$(basename $THIS_FILE)"
    OTHER_FILE_NAME="$(basename $OTHER_FILE)"
    echo Comparing $THIS_DIR/$THIS_FILE_NAME and $OTHER_DIR/$OTHER_FILE_NAME
    compare_bin_file $THIS_DIR $OTHER_DIR $COMPARE_ROOT/2bins $THIS_FILE_NAME $OTHER_FILE_NAME
    exit
fi

if [ "$CMP_NAMES" = "false" ] && [ "$CMP_TYPES" = "false" ] && [ "$CMP_PERMS" = "false" ] && [ "$CMP_GENERAL" = "false" ] && [ "$CMP_ZIPS" = "false" ] && [ "$CMP_JARS" = "false" ] && [ "$CMP_LIBS" = "false" ] && [ "$CMP_EXECS" = "false" ]; then
    CMP_NAMES=true
    CMP_PERMS=true
    CMP_TYPES=true
    CMP_GENERAL=true
    CMP_ZIPS=true
    CMP_JARS=true
    CMP_LIBS=true
    CMP_EXECS=true
fi

if [ -z "$FILTER" ]; then
    FILTER="$CAT"
fi

if [ "$SKIP_DEFAULT" != "true" ]; then
    if [ -z "$OTHER" ]; then
        echo "Nothing to compare to, set with -o"
        exit 1
    else
        if [ ! -d "$OTHER" ]; then
            echo "Other build directory does not exist:"
            echo "$OTHER"
            exit 1
        fi
        OTHER="$( cd "$OTHER" > /dev/null && pwd )"
        echo "Comparing to:"
        echo "$OTHER"
        echo
    fi


    # Find the common images to compare, prioritizing later build stages
    if [ -d "$THIS/install/jdk" ] && [ -d "$OTHER/install/jdk" ]; then
        THIS_JDK="$THIS/install/jdk"
        THIS_JRE="$THIS/install/jre"
        OTHER_JDK="$OTHER/install/jdk"
        OTHER_JRE="$OTHER/install/jre"
        echo "Selecting install images for compare"
    elif [ -d "$THIS/images/jdk" ] && [ -d "$OTHER/deploy/images/jdk" ]; then
        THIS_JDK="$THIS/images/jdk"
        THIS_JRE="$THIS/images/jre"
        OTHER_JDK="$OTHER/deploy/images/jdk"
        OTHER_JRE="$OTHER/deploy/images/jre"
        echo "Selecting deploy images for compare"
    elif [ -d "$THIS/images/jdk" ] && [ -d "$OTHER/images/jdk" ]; then
        THIS_JDK="$THIS/images/jdk"
        THIS_JRE="$THIS/images/jre"
        OTHER_JDK="$OTHER/images/jdk"
        OTHER_JRE="$OTHER/images/jre"
        echo "Selecting jdk images for compare"
    else
        echo "No common images found."
        exit 1
    fi
    echo "  $THIS_JDK"
    echo "  $OTHER_JDK"

    if [ -d "$THIS/images/jdk-bundle" -o -d "$THIS/deploy/images/jdk-bundle" ] \
	     && [ -d "$OTHER/images/jdk-bundle" -o -d "$OTHER/deploy/images/jdk-bundle" ]; then
	if [ -d "$THIS/deploy/images/jdk-bundle" ]; then
            THIS_JDK_BUNDLE="$THIS/deploy/images/jdk-bundle"
            THIS_JRE_BUNDLE="$THIS/deploy/images/jre-bundle"
	else
            THIS_JDK_BUNDLE="$THIS/images/jdk-bundle"
            THIS_JRE_BUNDLE="$THIS/images/jre-bundle"
	fi
	if [ -d "$OTHER/deploy/images/jdk-bundle" ]; then
            OTHER_JDK_BUNDLE="$OTHER/deploy/images/jdk-bundle"
            OTHER_JRE_BUNDLE="$OTHER/deploy/images/jre-bundle"
	else
            OTHER_JDK_BUNDLE="$OTHER/images/jdk-bundle"
            OTHER_JRE_BUNDLE="$OTHER/images/jre-bundle"
	fi
        echo "Also comparing jdk macosx bundles"
        echo "  $THIS_JDK_BUNDLE"
        echo "  $OTHER_JDK_BUNDLE"
    fi

    if [ -d "$THIS/deploy/bundles" -o -d "$THIS/deploy/images/bundles" ] \
	     && [ -d "$OTHER/deploy/bundles" -o -d "$OTHER/deploy/images/bundles" ]; then
	if [ -d "$THIS/deploy/images/bundles" ]; then
            THIS_DEPLOY_BUNDLE_DIR="$THIS/deploy/images/bundles"
	else
            THIS_DEPLOY_BUNDLE_DIR="$THIS/deploy/bundles"
	fi
	if [ -d "$OTHER/deploy/images/bundles" ]; then
            OTHER_DEPLOY_BUNDLE_DIR="$OTHER/deploy/images/bundles"
	else
            OTHER_DEPLOY_BUNDLE_DIR="$OTHER/deploy/bundles"
	fi
        echo "Also comparing deploy javadoc bundles"
    fi

    if [ -d "$THIS/images/JavaAppletPlugin.plugin" ] \
	     && [ -d "$OTHER/images/JavaAppletPlugin.plugin" -o -d "$OTHER/deploy/images/JavaAppletPlugin.plugin" ]; then
	if [ -d "$THIS/images/JavaAppletPlugin.plugin" ]; then
            THIS_DEPLOY_APPLET_PLUGIN_DIR="$THIS/images/JavaAppletPlugin.plugin"
	else
            THIS_DEPLOY_APPLET_PLUGIN_DIR="$THIS/deploy/images/JavaAppletPlugin.plugin"
	fi
	if [ -d "$OTHER/images/JavaAppletPlugin.plugin" ]; then
            OTHER_DEPLOY_APPLET_PLUGIN_DIR="$OTHER/images/JavaAppletPlugin.plugin"
	else
            OTHER_DEPLOY_APPLET_PLUGIN_DIR="$OTHER/deploy/images/JavaAppletPlugin.plugin"
	fi
        echo "Also comparing deploy applet image"
        echo "  $THIS_DEPLOY_APPLET_PLUGIN_DIR"
        echo "  $OTHER_DEPLOY_APPLET_PLUGIN_DIR"
    fi

    if [ -d "$THIS/install/sparkle/Sparkle.framework" ] \
           && [ -d "$OTHER/install/sparkle/Sparkle.framework" ]; then
        THIS_SPARKLE_DIR="$THIS/install/sparkle/Sparkle.framework"
        OTHER_SPARKLE_DIR="$OTHER/install/sparkle/Sparkle.framework"
        echo "Also comparing install sparkle framework"
        echo "  $THIS_SPARKLE_DIR"
        echo "  $OTHER_SPARKLE_DIR"
    fi

    if [ -d "$OTHER/images" ]; then
        OTHER_SEC_DIR="$OTHER/images"
    else
        OTHER_SEC_DIR="$OTHER/tmp"
    fi
    OTHER_SEC_BIN="$OTHER_SEC_DIR/sec-bin.zip"
    THIS_SEC_DIR="$THIS/images"
    THIS_SEC_BIN="$THIS_SEC_DIR/sec-bin.zip"
    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
        if [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
            JGSS_WINDOWS_BIN="jgss-windows-x64-bin.zip"
        else
            JGSS_WINDOWS_BIN="jgss-windows-i586-bin.zip"
        fi
        OTHER_SEC_WINDOWS_BIN="$OTHER_SEC_DIR/sec-windows-bin.zip"
        OTHER_JGSS_WINDOWS_BIN="$OTHER_SEC_DIR/$JGSS_WINDOWS_BIN"
        THIS_SEC_WINDOWS_BIN="$THIS_SEC_DIR/sec-windows-bin.zip"
        THIS_JGSS_WINDOWS_BIN="$THIS_SEC_DIR/$JGSS_WINDOWS_BIN"
    fi

    if [ -d "$THIS/images/docs" ] && [ -d "$OTHER/images/docs" ]; then
        THIS_DOCS="$THIS/images/docs"
        OTHER_DOCS="$OTHER/images/docs"
        echo "Also comparing docs"
    else
        echo "WARNING! Docs haven't been built and won't be compared."
    fi
fi

################################################################################
# Do the work

if [ "$CMP_NAMES" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        echo -n "JDK "
        compare_dirs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        echo -n "JRE "
        compare_dirs $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre

        echo -n "JDK "
        compare_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        echo -n "JRE "
        compare_files $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
    fi
    if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
        echo -n "JDK Bundle "
        compare_dirs $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
        echo -n "JRE Bundle "
        compare_dirs $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle

        echo -n "JDK Bundle "
        compare_files $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
        echo -n "JRE Bundle "
        compare_files $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
    fi
    if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
        echo -n "Docs "
        compare_dirs $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
        echo -n "Docs "
        compare_files $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_dirs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
        compare_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        echo -n "JavaAppletPlugin "
        compare_dirs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
        echo -n "JavaAppletPlugin "
        compare_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
        echo -n "Sparkle.framework "
        compare_dirs $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
        echo -n "Sparkle.framework "
        compare_files $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
    fi
fi

if [ "$CMP_PERMS" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        echo -n "JDK "
        compare_permissions $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        echo -n "JRE "
        compare_permissions $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_permissions $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        echo -n "JavaAppletPlugin "
        compare_permissions $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
        echo -n "Sparkle.framework "
        compare_permissions $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
    fi
fi

if [ "$CMP_TYPES" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        echo -n "JDK "
        compare_file_types $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        echo -n "JRE "
        compare_file_types $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
    fi
    if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
        echo -n "JDK Bundle "
        compare_file_types $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
        echo -n "JRE Bundle "
        compare_file_types $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_file_types $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        echo -n "JavaAppletPlugin "
        compare_file_types $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
        echo -n "Sparkle.framework "
        compare_file_types $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
    fi
fi

if [ "$CMP_GENERAL" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        echo -n "JDK "
        compare_general_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        echo -n "JRE "
        compare_general_files $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
    fi
    if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
        echo -n "JDK Bundle "
        compare_general_files $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
        echo -n "JRE Bundle "
        compare_general_files $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
    fi
    if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
        echo -n "Docs "
        compare_general_files $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_general_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        echo -n "JavaAppletPlugin "
        compare_general_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
        echo -n "Sparkle.framework "
        compare_general_files $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
    fi
fi

if [ "$CMP_ZIPS" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        compare_all_zip_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
    fi
    if [ -n "$THIS_SEC_BIN" ] && [ -n "$OTHER_SEC_BIN" ]; then
        if [ -n "$(echo $THIS_SEC_BIN | $FILTER)" ]; then
            echo "sec-bin.zip..."
            compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-bin.zip
        fi
    fi
    if [ -n "$THIS_SEC_WINDOWS_BIN" ] && [ -n "$OTHER_SEC_WINDOWS_BIN" ]; then
        if [ -n "$(echo $THIS_SEC_WINDOWS_BIN | $FILTER)" ]; then
            echo "sec-windows-bin.zip..."
            compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-windows-bin.zip
        fi
    fi
    if [ -n "$THIS_JGSS_WINDOWS_BIN" ] && [ -n "$OTHER_JGSS_WINDOWS_BIN" ]; then
        if [ -n "$(echo $THIS_JGSS_WINDOWS_BIN | $FILTER)" ]; then
            echo "$JGSS_WINDOWS_BIN..."
            compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin $JGSS_WINDOWS_BIN
        fi
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_all_zip_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_BUNDLE_DIR" ] && [ -n "$OTHER_DEPLOY_BUNDLE_DIR" ]; then
        compare_all_zip_files $THIS_DEPLOY_BUNDLE_DIR $OTHER_DEPLOY_BUNDLE_DIR $COMPARE_ROOT/deploy-bundle
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        compare_all_zip_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
fi

if [ "$CMP_JARS" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        compare_all_jar_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_all_jar_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        compare_all_jar_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
fi

if [ "$CMP_LIBS" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        echo -n "JDK "
        compare_all_libs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
            echo -n "JRE "
            compare_all_libs $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
        fi
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_all_libs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        echo -n "JavaAppletPlugin "
        compare_all_libs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
        echo -n "Sparkle.framework "
        compare_all_libs $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
    fi
fi

if [ "$CMP_EXECS" = "true" ]; then
    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
        compare_all_execs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
        if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
            echo -n "JRE "
            compare_all_execs $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
        fi
    fi
    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
        compare_all_execs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
    fi
    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
        echo -n "JavaAppletPlugin "
        compare_all_execs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
    fi
    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
        echo -n "Sparkle.framework "
        compare_all_execs $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
    fi
fi

echo

if [ -n "$REGRESSIONS" ]; then
    echo "REGRESSIONS FOUND!"
    echo
    exit 1
else
    echo "No regressions found"
    echo
    exit 0
fi
