compare.sh revision 2084:7de7decfd096
1#!/bin/bash
2#
3# Copyright (c) 2012, 2016, Oracle and/or its affiliates. All rights reserved.
4# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5#
6# This code is free software; you can redistribute it and/or modify it
7# under the terms of the GNU General Public License version 2 only, as
8# published by the Free Software Foundation.
9#
10# This code is distributed in the hope that it will be useful, but WITHOUT
11# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12# FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
13# version 2 for more details (a copy is included in the LICENSE file that
14# accompanied this code).
15#
16# You should have received a copy of the GNU General Public License version
17# 2 along with this work; if not, write to the Free Software Foundation,
18# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19#
20# Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21# or visit www.oracle.com if you need additional information or have any
22# questions.
23#
24
25# This script is processed by configure before it's usable. It is run from
26# the root of the build directory.
27
28
29################################################################################
30
31# Check that we are run via the wrapper generated by configure
32if [ -z "$SRC_ROOT" ]; then
33    echo "Error: You must run this script using build/[conf]/compare.sh"
34    exit 1
35fi
36
37if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
38    FULLDUMP_CMD="$OTOOL -v -V -h -X -d"
39    LDD_CMD="$OTOOL -L"
40    DIS_CMD="$OTOOL -v -V -t"
41    STAT_PRINT_SIZE="-f %z"
42elif [ "$OPENJDK_TARGET_OS" = "windows" ]; then
43    FULLDUMP_CMD="$DUMPBIN -all"
44    LDD_CMD="$DUMPBIN -dependents"
45    DIS_CMD="$DUMPBIN -disasm:nobytes"
46    STAT_PRINT_SIZE="-c %s"
47elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
48    FULLDUMP_CMD="dump -h -r -t -n -X64"
49    LDD_CMD="$LDD"
50    DIS_CMD="$OBJDUMP -d"
51    STAT_PRINT_SIZE="-c %s"
52else
53    FULLDUMP_CMD="$READELF -a"
54    LDD_CMD="$LDD"
55    DIS_CMD="$OBJDUMP -d"
56    STAT_PRINT_SIZE="-c %s"
57fi
58
59COMPARE_EXCEPTIONS_INCLUDE="$SRC_ROOT/common/bin/compare_exceptions.sh.incl"
60if [ ! -e "$COMPARE_EXCEPTIONS_INCLUDE" ]; then
61    echo "Error: Cannot locate the exceptions file, it should have been here: $COMPARE_EXCEPTIONS_INCLUDE"
62    exit 1
63fi
64# Include exception definitions
65. "$COMPARE_EXCEPTIONS_INCLUDE"
66
67################################################################################
68# Compare text files and ignore specific differences:
69#
70#  * Timestamps in Java sources generated by idl2java
71#  * Sorting order and cleanup style in .properties files
72
73diff_text() {
74    OTHER_FILE=$1
75    THIS_FILE=$2
76
77    SUFFIX="${THIS_FILE##*.}"
78    NAME="${THIS_FILE##*/}"
79
80    TMP=1
81
82    if [[ "$THIS_FILE" = *"META-INF/MANIFEST.MF" ]]; then
83        # Filter out date string, ant version and java version differences.
84        TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
85            $GREP '^[<>]' | \
86            $SED -e '/[<>] Ant-Version: Apache Ant .*/d' \
87                 -e '/[<>] Created-By: .* (Oracle [Corpatin)]*/d' \
88                 -e '/[<>]  [Corpatin]*)/d' \
89                 -e '/[<>].*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d')
90    fi
91    if test "x$SUFFIX" = "xjava"; then
92        TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
93            $GREP '^[<>]' | \
94            $SED -e '/[<>] \* from.*\.idl/d' \
95                 -e '/[<>] .*[0-9]\{4\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}_[0-9]\{2\}-b[0-9]\{2\}.*/d' \
96                 -e '/[<>] .*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}.*/d' \
97                 -e '/[<>] \*.*[0-9]\{4\} [0-9][0-9]*:[0-9]\{2\}:[0-9]\{2\}.*/d' \
98                 -e '/\/\/ Generated from input file.*/d' \
99                 -e '/\/\/ This file was generated AUTOMATICALLY from a template file.*/d' \
100                 -e '/\/\/ java GenerateCharacter.*/d')
101    fi
102    # Ignore date strings in class files.
103    # Anonymous lambda classes get randomly assigned counters in their names.
104    if test "x$SUFFIX" = "xclass"; then
105        if [ "$NAME" = "module-info.class" ] || [ "$NAME" = "SystemModules.class" ]
106        then
107            # The SystemModules.class and module-info.class have several issues
108            # with random ordering of elements in HashSets.
109            MODULES_CLASS_FILTER="$SED \
110                -e 's/,$//' \
111                -e 's/;$//' \
112                -e 's/^ *[0-9]*://' \
113                -e 's/#[0-9]* */#/' \
114                -e 's/ *\/\// \/\//' \
115                -e 's/aload *[0-9]*/aload X/' \
116                -e 's/ldc_w/ldc  /' \
117                | $SORT \
118                "
119            $JAVAP -c -constants -l -p "${OTHER_FILE}" \
120                | eval "$MODULES_CLASS_FILTER" >  ${OTHER_FILE}.javap &
121            $JAVAP -c -constants -l -p "${THIS_FILE}" \
122                | eval "$MODULES_CLASS_FILTER" > ${THIS_FILE}.javap &
123            wait
124            TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap)
125        # To improve performance when large diffs are found, do a rough filtering of classes
126        # elibeble for these exceptions
127        elif $GREP -R -e '[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}' \
128                -e 'lambda\$[a-zA-Z0-9]*\$[0-9]' ${THIS_FILE} > /dev/null
129        then
130            $JAVAP -c -constants -l -p "${OTHER_FILE}" >  ${OTHER_FILE}.javap &
131            $JAVAP -c -constants -l -p "${THIS_FILE}" > ${THIS_FILE}.javap &
132            wait
133            TMP=$($DIFF ${OTHER_FILE}.javap ${THIS_FILE}.javap | \
134                $GREP '^[<>]' | \
135                $SED -e '/[<>].*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}.*/d' \
136                     -e '/[<>].*lambda\$[a-zA-Z0-9]*\$[0-9]*/d')
137        fi
138    fi
139    if test "x$SUFFIX" = "xproperties"; then
140        # Filter out date string differences.
141        TMP=$(LC_ALL=C $DIFF $OTHER_FILE $THIS_FILE | \
142            $GREP '^[<>]' | \
143            $SED -e '/[<>].*[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}.*/d')
144    fi
145    if test "x$SUFFIX" = "xhtml"; then
146	# Some javadoc versions do not put quotes around font size
147	HTML_FILTER="$SED \
148            -e 's/<font size=-1>/<font size=\"-1\">/g'"
149	$CAT $THIS_FILE | eval "$HTML_FILTER" > $THIS_FILE.filtered
150	$CAT $OTHER_FILE | eval "$HTML_FILTER" > $OTHER_FILE.filtered
151        TMP=$(LC_ALL=C $DIFF $OTHER_FILE.filtered $THIS_FILE.filtered | \
152            $GREP '^[<>]' | \
153            $SED -e '/[<>] <!-- Generated by javadoc .* on .* -->/d' \
154	         -e '/[<>] <meta name="date" content=".*">/d' )
155    fi
156    if test -n "$TMP"; then
157        echo Files $OTHER_FILE and $THIS_FILE differ
158        return 1
159    fi
160
161    return 0
162}
163
164################################################################################
165# Compare directory structure
166
167compare_dirs() {
168    THIS_DIR=$1
169    OTHER_DIR=$2
170    WORK_DIR=$3
171
172    mkdir -p $WORK_DIR
173
174    (cd $OTHER_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_other)
175    (cd $THIS_DIR && $FIND . -type d | $SORT > $WORK_DIR/dirs_this)
176
177    $DIFF $WORK_DIR/dirs_other $WORK_DIR/dirs_this > $WORK_DIR/dirs_diff
178
179    echo -n Directory structure...
180    if [ -s $WORK_DIR/dirs_diff ]; then
181        echo Differences found.
182        REGRESSIONS=true
183        # Differences in directories found.
184        ONLY_OTHER=$($GREP '<' $WORK_DIR/dirs_diff)
185        if [ "$ONLY_OTHER" ]; then
186            echo Only in $OTHER
187            $GREP '<' $WORK_DIR/dirs_diff | $SED 's|< ./|    |g'
188        fi
189        ONLY_THIS=$($GREP '>' $WORK_DIR/dirs_diff)
190        if [ "$ONLY_THIS" ]; then
191            echo Only in $THIS
192            $GREP '>' $WORK_DIR/dirs_diff | $SED 's|> ./|    |g'
193        fi
194    else
195        echo Identical!
196    fi
197}
198
199
200################################################################################
201# Compare file structure
202
203compare_files() {
204    THIS_DIR=$1
205    OTHER_DIR=$2
206    WORK_DIR=$3
207
208    $MKDIR -p $WORK_DIR
209
210    (cd $OTHER_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_other)
211    (cd $THIS_DIR && $FIND . ! -type d | $SORT > $WORK_DIR/files_this)
212
213    $DIFF $WORK_DIR/files_other $WORK_DIR/files_this > $WORK_DIR/files_diff
214
215    echo -n File names...
216    if [ -s $WORK_DIR/files_diff ]; then
217        echo Differences found.
218        REGRESSIONS=true
219        # Differences in files found.
220        ONLY_OTHER=$($GREP '<' $WORK_DIR/files_diff)
221        if [ "$ONLY_OTHER" ]; then
222            echo Only in $OTHER
223            $GREP '<' $WORK_DIR/files_diff | $SED 's|< ./|    |g'
224        fi
225        ONLY_THIS=$($GREP '>' $WORK_DIR/files_diff)
226        if [ "$ONLY_THIS" ]; then
227            echo Only in $THIS
228            $GREP '>' $WORK_DIR/files_diff | $SED 's|> ./|    |g'
229        fi
230    else
231        echo Identical!
232    fi
233}
234
235
236################################################################################
237# Compare permissions
238
239compare_permissions() {
240    THIS_DIR=$1
241    OTHER_DIR=$2
242    WORK_DIR=$3
243
244    mkdir -p $WORK_DIR
245
246    echo -n Permissions...
247    found=""
248    for f in `cd $OTHER_DIR && $FIND . -type f`
249    do
250        if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi
251        if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
252        OP=`ls -l ${OTHER_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
253        TP=`ls -l ${THIS_DIR}/$f | awk '{printf("%.10s\n", $1);}'`
254        if [ "$OP" != "$TP" ]
255        then
256            if [ -z "$found" ]; then echo ; found="yes"; fi
257            $PRINTF "\tother: ${OP} this: ${TP}\t$f\n"
258        fi
259    done
260    if [ -z "$found" ]; then
261        echo "Identical!"
262    else
263        REGRESSIONS=true
264    fi
265}
266
267################################################################################
268# Compare file command output
269
270compare_file_types() {
271    THIS_DIR=$1
272    OTHER_DIR=$2
273    WORK_DIR=$3
274
275    $MKDIR -p $WORK_DIR
276
277    FILE_TYPES_FILTER="$SED \
278        -e 's/BuildID[^,]*//' \
279        -e 's/last modified: .*//' \
280        "
281
282    echo -n File types...
283    found=""
284    for f in `cd $OTHER_DIR && $FIND . ! -type d`
285    do
286        if [ ! -f ${OTHER_DIR}/$f ]; then continue; fi
287        if [ ! -f ${THIS_DIR}/$f ]; then continue; fi
288        OF=$(cd ${OTHER_DIR} && $FILE -h $f | eval $FILE_TYPES_FILTER)
289        TF=$(cd ${THIS_DIR} && $FILE -h $f | eval $FILE_TYPES_FILTER)
290        if [ "$OF" != "$TF" ]
291        then
292            if [ "`echo $OF | $GREP -c 'Zip archive data'`" -gt 0 ] \
293                && [ "`echo $TF | $GREP -c 'Zip archive data'`" -gt 0 ]
294            then
295                # the way we produce zip-files make it so that directories are stored in
296                # old file but not in new (only files with full-path) this makes file
297                # report them as different
298                continue
299            else
300                if [ -z "$found" ]; then echo ; found="yes"; fi
301                $PRINTF "\tother: ${OF}\n\tthis : ${TF}\n"
302            fi
303        fi
304    done
305    if [ -z "$found" ]; then
306        echo "Identical!"
307    else
308        REGRESSIONS=true
309    fi
310}
311
312################################################################################
313# Compare the rest of the files
314
315compare_general_files() {
316    THIS_DIR=$1
317    OTHER_DIR=$2
318    WORK_DIR=$3
319
320    GENERAL_FILES=$(cd $THIS_DIR && $FIND . -type f ! -name "*.so" ! -name "*.jar" \
321        ! -name "*.zip" ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \
322        ! -name "modules" ! -name "ct.sym" ! -name "*.diz" ! -name "*.dll" \
323        ! -name "*.cpl" ! -name "*.pdb" ! -name "*.exp" ! -name "*.ilk" \
324        ! -name "*.lib" ! -name "*.war" ! -name "JavaControlPanel" ! -name "*.jmod" \
325        ! -name "*.obj" ! -name "*.o" ! -name "JavaControlPanelHelper" \
326        ! -name "JavaUpdater" ! -name "JavaWSApplicationStub" \
327        ! -name "jspawnhelper" ! -name "JavawsLauncher" ! -name "*.a" \
328        ! -name "finish_installation" ! -name "Sparkle" ! -name "*.tar.gz" \
329        | $GREP -v "./bin/"  | $SORT | $FILTER)
330
331    echo Other files with binary differences...
332    for f in $GENERAL_FILES
333    do
334        if [ -e $OTHER_DIR/$f ]; then
335            SUFFIX="${f##*.}"
336            if [ "$(basename $f)" = "release" ]; then
337                # In release file, ignore differences in change numbers and order
338                # of modules in list.
339                OTHER_FILE=$WORK_DIR/$f.other
340                THIS_FILE=$WORK_DIR/$f.this
341                $MKDIR -p $(dirname $OTHER_FILE)
342                $MKDIR -p $(dirname $THIS_FILE)
343                RELEASE_FILTER="$SED \
344                    -e 's/\:[0-9a-f]\{12,12\}/:CHANGE/g' \
345                    -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
346                    -e 's/^#.*/#COMMENT/g' \
347                    -e 's/MODULES=/MODULES=\'$'\n/' \
348                    -e 's/,/\'$'\n/g' \
349                    | $SORT
350                    "
351                $CAT $OTHER_DIR/$f | eval "$RELEASE_FILTER" > $OTHER_FILE
352                $CAT $THIS_DIR/$f  | eval "$RELEASE_FILTER" > $THIS_FILE
353            elif [ "x$SUFFIX" = "xhtml" ]; then
354                # Ignore time stamps in docs files
355                OTHER_FILE=$WORK_DIR/$f.other
356                THIS_FILE=$WORK_DIR/$f.this
357                $MKDIR -p $(dirname $OTHER_FILE) $(dirname $THIS_FILE)
358                # Older versions of compare might have left soft links with
359                # these names.
360                $RM $OTHER_FILE $THIS_FILE
361                #Note that | doesn't work on mac sed.
362                HTML_FILTER="$SED \
363                    -e 's/[0-9]\{4\}-[0-9]\{2\}-[0-9]\{2\}-[0-9]\{6\}/<DATE>/g' \
364                    -e 's/\(-- Generated by javadoc \).*\( --\)/\1(removed)\2/' \
365                    -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>/'
366                    "
367                $CAT $OTHER_DIR/$f | eval "$HTML_FILTER" > $OTHER_FILE &
368                $CAT $THIS_DIR/$f  | eval "$HTML_FILTER" > $THIS_FILE &
369                wait
370            else
371                OTHER_FILE=$OTHER_DIR/$f
372                THIS_FILE=$THIS_DIR/$f
373            fi
374            DIFF_OUT=$($DIFF $OTHER_FILE $THIS_FILE 2>&1)
375            if [ -n "$DIFF_OUT" ]; then
376                echo $f
377                REGRESSIONS=true
378                if [ "$SHOW_DIFFS" = "true" ]; then
379                    echo "$DIFF_OUT"
380                fi
381            fi
382        fi
383    done
384
385
386}
387
388################################################################################
389# Compare zip file
390
391compare_zip_file() {
392    THIS_DIR=$1
393    OTHER_DIR=$2
394    WORK_DIR=$3
395    ZIP_FILE=$4
396    # Optionally provide different name for other zipfile
397    OTHER_ZIP_FILE=$5
398
399    THIS_ZIP=$THIS_DIR/$ZIP_FILE
400    if [ -n "$OTHER_ZIP_FILE" ]; then
401        OTHER_ZIP=$OTHER_DIR/$OTHER_ZIP_FILE
402    else
403        OTHER_ZIP=$OTHER_DIR/$ZIP_FILE
404    fi
405
406    THIS_SUFFIX="${THIS_ZIP##*.}"
407    OTHER_SUFFIX="${OTHER_ZIP##*.}"
408    if [ "$THIS_SUFFIX" != "$OTHER_SUFFIX" ]; then
409        echo "The files do not have the same suffix type! ($THIS_SUFFIX != $OTHER_SUFFIX)"
410        return 2
411    fi
412
413    TYPE="$THIS_SUFFIX"
414
415    if $CMP $OTHER_ZIP $THIS_ZIP > /dev/null
416    then
417        return 0
418    fi
419    # Not quite identical, the might still contain the same data.
420    # Unpack the jar/zip files in temp dirs
421
422    THIS_UNZIPDIR=$WORK_DIR/$ZIP_FILE.this
423    OTHER_UNZIPDIR=$WORK_DIR/$ZIP_FILE.other
424    $RM -rf $THIS_UNZIPDIR $OTHER_UNZIPDIR
425    $MKDIR -p $THIS_UNZIPDIR
426    $MKDIR -p $OTHER_UNZIPDIR
427    if [ "$TYPE" = "jar" -o "$TYPE" = "war" -o "$TYPE" = "zip" -o "$TYPE" = "jmod" ]
428    then
429        (cd $THIS_UNZIPDIR && $UNARCHIVE $THIS_ZIP)
430        (cd $OTHER_UNZIPDIR && $UNARCHIVE $OTHER_ZIP)
431    elif [ "$TYPE" = "gz" ]
432    then
433        (cd $THIS_UNZIPDIR && $GUNZIP -c $THIS_ZIP | $TAR xf -)
434        (cd $OTHER_UNZIPDIR && $GUNZIP -c $OTHER_ZIP | $TAR xf -)
435    else
436        (cd $THIS_UNZIPDIR && $JIMAGE extract $THIS_ZIP)
437        (cd $OTHER_UNZIPDIR && $JIMAGE extract $OTHER_ZIP)
438    fi
439
440    # Find all archives inside and unzip them as well to compare the contents rather than
441    # the archives. pie.jar.pack.gz i app3.war is corrupt, skip it.
442    EXCEPTIONS="pie.jar.pack.gz"
443    for pack in $($FIND $THIS_UNZIPDIR \( -name "*.pack" -o -name "*.pack.gz" \) -a ! -name pie.jar.pack.gz); do
444        ($UNPACK200 $pack $pack.jar)
445        # Filter out the unzipped archives from the diff below.
446        EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
447    done
448    for pack in $($FIND $OTHER_UNZIPDIR \( -name "*.pack" -o -name "*.pack.gz" \) -a ! -name pie.jar.pack.gz); do
449        ($UNPACK200 $pack $pack.jar)
450        EXCEPTIONS="$EXCEPTIONS $pack $pack.jar"
451    done
452    for zip in $($FIND $THIS_UNZIPDIR -name "*.jar" -o -name "*.zip"); do
453        $MKDIR $zip.unzip
454        (cd $zip.unzip && $UNARCHIVE $zip)
455        EXCEPTIONS="$EXCEPTIONS $zip"
456    done
457    for zip in $($FIND $OTHER_UNZIPDIR -name "*.jar" -o -name "*.zip"); do
458        $MKDIR $zip.unzip
459        (cd $zip.unzip && $UNARCHIVE $zip)
460        EXCEPTIONS="$EXCEPTIONS $zip"
461    done
462
463    CONTENTS_DIFF_FILE=$WORK_DIR/$ZIP_FILE.diff
464    # On solaris, there is no -q option.
465    if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
466        LC_ALL=C $DIFF -r $OTHER_UNZIPDIR $THIS_UNZIPDIR \
467            | $GREP -v -e "^<" -e "^>" -e "^Common subdirectories:" \
468            > $CONTENTS_DIFF_FILE
469    else
470        LC_ALL=C $DIFF -rq $OTHER_UNZIPDIR $THIS_UNZIPDIR > $CONTENTS_DIFF_FILE
471    fi
472
473    ONLY_OTHER=$($GREP "^Only in $OTHER_UNZIPDIR" $CONTENTS_DIFF_FILE)
474    ONLY_THIS=$($GREP "^Only in $THIS_UNZIPDIR" $CONTENTS_DIFF_FILE)
475
476    return_value=0
477
478    if [ -n "$ONLY_OTHER" ]; then
479        echo "        Only OTHER $ZIP_FILE contains:"
480        echo "$ONLY_OTHER" | sed "s|Only in $OTHER_UNZIPDIR|            |"g | sed 's|: |/|g'
481        return_value=1
482    fi
483
484    if [ -n "$ONLY_THIS" ]; then
485        echo "        Only THIS $ZIP_FILE contains:"
486        echo "$ONLY_THIS" | sed "s|Only in $THIS_UNZIPDIR|            |"g | sed 's|: |/|g'
487        return_value=1
488    fi
489
490    if [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
491        DIFFING_FILES=$($GREP -e 'differ$' -e '^diff ' $CONTENTS_DIFF_FILE \
492            | $SED -e 's/^Files //g' -e 's/diff -r //g' | $CUT -f 1 -d ' ' \
493            | $SED "s|$OTHER_UNZIPDIR/||g")
494    else
495        DIFFING_FILES=$($GREP -e "differ$" $CONTENTS_DIFF_FILE \
496            | $CUT -f 2 -d ' ' | $SED "s|$OTHER_UNZIPDIR/||g")
497    fi
498
499    $RM -f $WORK_DIR/$ZIP_FILE.diffs
500    for file in $DIFFING_FILES; do
501        if [[ "$ACCEPTED_JARZIP_CONTENTS $EXCEPTIONS" != *"$file"* ]]; then
502            diff_text $OTHER_UNZIPDIR/$file $THIS_UNZIPDIR/$file >> $WORK_DIR/$ZIP_FILE.diffs
503        fi
504    done
505
506    if [ -s "$WORK_DIR/$ZIP_FILE.diffs" ]; then
507        return_value=1
508        echo "        Differing files in $ZIP_FILE"
509        $CAT $WORK_DIR/$ZIP_FILE.diffs | $GREP 'differ$' | cut -f 2 -d ' ' | \
510            $SED "s|$OTHER_UNZIPDIR|            |g" > $WORK_DIR/$ZIP_FILE.difflist
511        $CAT $WORK_DIR/$ZIP_FILE.difflist
512
513        if [ -n "$SHOW_DIFFS" ]; then
514            for i in $(cat $WORK_DIR/$ZIP_FILE.difflist) ; do
515                if [ -f "${OTHER_UNZIPDIR}/$i.javap" ]; then
516                    LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i.javap ${THIS_UNZIPDIR}/$i.javap
517                elif [ -f "${OTHER_UNZIPDIR}/$i.cleaned" ]; then
518                    LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i.cleaned ${THIS_UNZIPDIR}/$i
519                else
520                    LC_ALL=C $DIFF ${OTHER_UNZIPDIR}/$i ${THIS_UNZIPDIR}/$i
521                fi
522            done
523        fi
524    fi
525
526    return $return_value
527}
528
529
530################################################################################
531# Compare all zip files
532
533compare_all_zip_files() {
534    THIS_DIR=$1
535    OTHER_DIR=$2
536    WORK_DIR=$3
537
538    ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.zip" -o -name "*.tar.gz" \
539        | $SORT | $FILTER )
540
541    if [ -n "$ZIPS" ]; then
542        echo Zip/tar.gz files...
543
544        return_value=0
545        for f in $ZIPS; do
546            if [ -f "$OTHER_DIR/$f" ]; then
547                compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
548                if [ "$?" != "0" ]; then
549                    return_value=1
550                    REGRESSIONS=true
551                fi
552            fi
553        done
554    fi
555
556    return $return_value
557}
558
559################################################################################
560# Compare all jar files
561
562compare_all_jar_files() {
563    THIS_DIR=$1
564    OTHER_DIR=$2
565    WORK_DIR=$3
566
567    # TODO filter?
568    ZIPS=$(cd $THIS_DIR && $FIND . -type f -name "*.jar" -o -name "*.war" \
569        -o -name "modules" | $SORT | $FILTER)
570
571    if [ -n "$ZIPS" ]; then
572        echo Jar files...
573
574        return_value=0
575        for f in $ZIPS; do
576            if [ -f "$OTHER_DIR/$f" ]; then
577                compare_zip_file $THIS_DIR $OTHER_DIR $WORK_DIR $f
578                if [ "$?" != "0" ]; then
579                    return_value=1
580                    REGRESSIONS=true
581                fi
582            fi
583        done
584    fi
585
586    return $return_value
587}
588
589################################################################################
590# Compare binary (executable/library) file
591
592compare_bin_file() {
593    THIS_DIR=$1
594    OTHER_DIR=$2
595    WORK_DIR=$3
596    BIN_FILE=$4
597    OTHER_BIN_FILE=$5
598
599    THIS_FILE=$THIS_DIR/$BIN_FILE
600    if [ -n "$OTHER_BIN_FILE" ]; then
601        OTHER_FILE=$OTHER_DIR/$OTHER_BIN_FILE
602    else
603        OTHER_FILE=$OTHER_DIR/$BIN_FILE
604    fi
605    NAME=$(basename $BIN_FILE)
606    WORK_FILE_BASE=$WORK_DIR/$BIN_FILE
607    FILE_WORK_DIR=$(dirname $WORK_FILE_BASE)
608
609    $MKDIR -p $FILE_WORK_DIR
610
611    # Make soft links to original files from work dir to facilitate debugging
612    $LN -f -s $THIS_FILE $WORK_FILE_BASE.this
613    $LN -f -s $OTHER_FILE $WORK_FILE_BASE.other
614
615    ORIG_THIS_FILE="$THIS_FILE"
616    ORIG_OTHER_FILE="$OTHER_FILE"
617
618    if [ "$STRIP_ALL" = "true" ] || [[ "$STRIP_BEFORE_COMPARE" = *"$BIN_FILE"* ]]; then
619        THIS_STRIPPED_FILE=$FILE_WORK_DIR/this/$NAME
620        OTHER_STRIPPED_FILE=$FILE_WORK_DIR/other/$NAME
621        $MKDIR -p $FILE_WORK_DIR/this $FILE_WORK_DIR/other
622        $CP $THIS_FILE $THIS_STRIPPED_FILE
623        $CP $OTHER_FILE $OTHER_STRIPPED_FILE
624        $STRIP $THIS_STRIPPED_FILE
625        $STRIP $OTHER_STRIPPED_FILE
626        THIS_FILE="$THIS_STRIPPED_FILE"
627        OTHER_FILE="$OTHER_STRIPPED_FILE"
628    fi
629
630    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
631        unset _NT_SYMBOL_PATH
632        # On windows we need to unzip the debug symbols, if present
633        OTHER_FILE_BASE=${OTHER_FILE/.dll/}
634        OTHER_FILE_BASE=${OTHER_FILE_BASE/.exe/}
635        OTHER_FILE_BASE=${OTHER_FILE_BASE/.cpl/}
636        DIZ_NAME=$(basename $OTHER_FILE_BASE).diz
637        # Some .exe files have the same name as a .dll file. Make sure the exe
638        # files get the right debug symbols.
639        if [ "$NAME" = "java.exe" ] \
640               && [ -f "$OTHER/support/native/java.base/java_objs/java.diz" ]; then
641            OTHER_DIZ_FILE="$OTHER/support/native/java.base/java_objs/java.diz"
642        elif [ "$NAME" = "jimage.exe" ] \
643               && [ -f "$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
644            OTHER_DIZ_FILE="$OTHER/support/native/jdk.jlink/jimage_objs/jimage.diz"
645        elif [ "$NAME" = "javacpl.exe" ] \
646               && [ -f "$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
647            OTHER_DIZ_FILE="$OTHER/support/native/jdk.plugin/javacpl/javacpl.diz"
648        elif [ -f "${OTHER_FILE_BASE}.diz" ]; then
649            OTHER_DIZ_FILE=${OTHER_FILE_BASE}.diz
650        else
651            # Some files, jli.dll, appears twice in the image but only one of
652            # thme has a diz file next to it.
653            OTHER_DIZ_FILE="$($FIND $OTHER_DIR -name $DIZ_NAME | $SED 1q)"
654            if [ ! -f "$OTHER_DIZ_FILE" ]; then
655                # As a last resort, look for diz file in the whole build output
656                # dir.
657                OTHER_DIZ_FILE="$($FIND $OTHER -name $DIZ_NAME | $SED 1q)"
658            fi
659        fi
660        if [ -n "$OTHER_DIZ_FILE" ]; then
661            $MKDIR -p $FILE_WORK_DIR/other
662            (cd $FILE_WORK_DIR/other ; $UNARCHIVE -o $OTHER_DIZ_FILE)
663            export _NT_SYMBOL_PATH="$FILE_WORK_DIR/other"
664        fi
665
666        THIS_FILE_BASE=${THIS_FILE/.dll/}
667        THIS_FILE_BASE=${THIS_FILE_BASE/.exe/}
668        THIS_FILE_BASE=${THIS_FILE_BASE/.cpl/}
669        # Some .exe files have the same name as a .dll file. Make sure the exe
670        # files get the right debug symbols.
671        if [ "$NAME" = "java.exe" ] \
672               && [ -f "$THIS/support/native/java.base/java_objs/java.diz" ]; then
673            THIS_DIZ_FILE="$THIS/support/native/java.base/java_objs/java.diz"
674        elif [ "$NAME" = "jimage.exe" ] \
675               && [ -f "$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz" ]; then
676            THIS_DIZ_FILE="$THIS/support/native/jdk.jlink/jimage_objs/jimage.diz"
677        elif [ "$NAME" = "javacpl.exe" ] \
678               && [ -f "$THIS/support/native/jdk.plugin/javacpl/javacpl.diz" ]; then
679            THIS_DIZ_FILE="$THIS/support/native/jdk.plugin/javacpl/javacpl.diz"
680        elif [ -f "${THIS_FILE_BASE}.diz" ]; then
681            THIS_DIZ_FILE=${THIS_FILE/.dll/}.diz
682        else
683            THIS_DIZ_FILE="$($FIND $THIS_DIR -name $DIZ_NAME | $SED 1q)"
684            if [ ! -f "$THIS_DIZ_FILE" ]; then
685                # As a last resort, look for diz file in the whole build output
686                # dir.
687                THIS_DIZ_FILE="$($FIND $THIS -name $DIZ_NAME | $SED 1q)"
688            fi
689        fi
690        if [ -n "$THIS_DIZ_FILE" ]; then
691            $MKDIR -p $FILE_WORK_DIR/this
692            (cd $FILE_WORK_DIR/this ; $UNARCHIVE -o $THIS_DIZ_FILE)
693            export _NT_SYMBOL_PATH="$_NT_SYMBOL_PATH;$FILE_WORK_DIR/this"
694        fi
695    fi
696
697    if [ -z "$SKIP_BIN_DIFF" ]; then
698        if cmp $OTHER_FILE $THIS_FILE > /dev/null; then
699        # The files were bytewise identical.
700            if [ -n "$VERBOSE" ]; then
701                echo "        :           :         :         :          :          : $BIN_FILE"
702            fi
703            return 0
704        fi
705        BIN_MSG=" diff "
706        if [[ "$ACCEPTED_BIN_DIFF" != *"$BIN_FILE"* ]]; then
707            DIFF_BIN=true
708            if [[ "$KNOWN_BIN_DIFF" != *"$BIN_FILE"* ]]; then
709                BIN_MSG="*$BIN_MSG*"
710                REGRESSIONS=true
711            else
712                BIN_MSG=" $BIN_MSG "
713            fi
714        else
715            BIN_MSG="($BIN_MSG)"
716            DIFF_BIN=
717        fi
718    fi
719
720    if [ -n "$STAT" ]; then
721        THIS_SIZE=$($STAT $STAT_PRINT_SIZE "$THIS_FILE")
722        OTHER_SIZE=$($STAT $STAT_PRINT_SIZE "$OTHER_FILE")
723    else
724        THIS_SIZE=$(ls -l "$THIS_FILE" | awk '{ print $5 }')
725        OTHER_SIZE=$(ls -l "$OTHER_FILE" | awk '{ print $5 }')
726    fi
727    if [ $THIS_SIZE -ne $OTHER_SIZE ]; then
728        DIFF_SIZE_NUM=$($EXPR $THIS_SIZE - $OTHER_SIZE)
729        DIFF_SIZE_REL=$($EXPR $THIS_SIZE \* 100 / $OTHER_SIZE)
730        SIZE_MSG=$($PRINTF "%3d%% %4d" $DIFF_SIZE_REL $DIFF_SIZE_NUM)
731        if [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] && [ "$DIFF_SIZE_REL" -gt 98 ] \
732            && [ "$DIFF_SIZE_REL" -lt 102 ]; then
733            SIZE_MSG="($SIZE_MSG)"
734            DIFF_SIZE=
735        elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
736            && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
737            && [ "$DIFF_SIZE_NUM" = 512 ]; then
738            # On windows, size of binaries increase in 512 increments.
739            SIZE_MSG="($SIZE_MSG)"
740            DIFF_SIZE=
741        elif [ "$OPENJDK_TARGET_OS" = "windows" ] \
742            && [[ "$ACCEPTED_SMALL_SIZE_DIFF" = *"$BIN_FILE"* ]] \
743            && [ "$DIFF_SIZE_NUM" = -512 ]; then
744            # On windows, size of binaries increase in 512 increments.
745            SIZE_MSG="($SIZE_MSG)"
746            DIFF_SIZE=
747        else
748            if [[ "$ACCEPTED_SIZE_DIFF" != *"$BIN_FILE"* ]]; then
749                DIFF_SIZE=true
750                if [[ "$KNOWN_SIZE_DIFF" != *"$BIN_FILE"* ]]; then
751                    SIZE_MSG="*$SIZE_MSG*"
752                    REGRESSIONS=true
753                else
754                    SIZE_MSG=" $SIZE_MSG "
755                fi
756            else
757                SIZE_MSG="($SIZE_MSG)"
758                DIFF_SIZE=
759            fi
760        fi
761    else
762        SIZE_MSG="           "
763        DIFF_SIZE=
764        if [[ "$KNOWN_SIZE_DIFF $ACCEPTED_SIZE_DIFF" = *"$BIN_FILE"* ]]; then
765            SIZE_MSG="     !     "
766        fi
767    fi
768
769    if [ "$SORT_ALL_SYMBOLS" = "true" ] || [[ "$SORT_SYMBOLS" = *"$BIN_FILE"* ]]; then
770        SYM_SORT_CMD="sort"
771    else
772        SYM_SORT_CMD="cat"
773    fi
774
775    if [ -n "$SYMBOLS_DIFF_FILTER" ] && [ -z "$NEED_SYMBOLS_DIFF_FILTER" ] \
776            || [[ "$NEED_SYMBOLS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
777        this_SYMBOLS_DIFF_FILTER="$SYMBOLS_DIFF_FILTER"
778    else
779        this_SYMBOLS_DIFF_FILTER="$CAT"
780    fi
781
782    # Check symbols
783    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
784        # The output from dumpbin on windows differs depending on if the debug symbol
785        # files are still around at the location the binary is pointing too. Need
786        # to filter out that extra information.
787        $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
788        $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
789    elif [ "$OPENJDK_TARGET_OS" = "solaris" ]; then
790        # Some symbols get seemingly random 15 character prefixes. Filter them out.
791        $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
792        $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
793    elif [ "$OPENJDK_TARGET_OS" = "aix" ]; then
794        $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
795        $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
796    elif [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
797        $NM -j $ORIG_OTHER_FILE 2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.other
798        $NM -j $ORIG_THIS_FILE  2> /dev/null | $SYM_SORT_CMD > $WORK_FILE_BASE.symbols.this
799    else
800        $NM -a $ORIG_OTHER_FILE 2> /dev/null | $GREP -v $NAME \
801            | $AWK '{print $2, $3, $4, $5}' \
802            | eval "$this_SYMBOLS_DIFF_FILTER" \
803            | $SYM_SORT_CMD \
804            > $WORK_FILE_BASE.symbols.other
805        $NM -a $ORIG_THIS_FILE  2> /dev/null | $GREP -v $NAME \
806            | $AWK '{print $2, $3, $4, $5}' \
807            | eval "$this_SYMBOLS_DIFF_FILTER" \
808            | $SYM_SORT_CMD \
809            > $WORK_FILE_BASE.symbols.this
810    fi
811
812    LC_ALL=C $DIFF $WORK_FILE_BASE.symbols.other $WORK_FILE_BASE.symbols.this > $WORK_FILE_BASE.symbols.diff
813    if [ -s $WORK_FILE_BASE.symbols.diff ]; then
814        SYM_MSG=" diff  "
815        if [[ "$ACCEPTED_SYM_DIFF" != *"$BIN_FILE"* ]]; then
816            DIFF_SYM=true
817            if [[ "$KNOWN_SYM_DIFF" != *"$BIN_FILE"* ]]; then
818                SYM_MSG="*$SYM_MSG*"
819                REGRESSIONS=true
820            else
821                SYM_MSG=" $SYM_MSG "
822            fi
823        else
824            SYM_MSG="($SYM_MSG)"
825            DIFF_SYM=
826        fi
827    else
828        SYM_MSG="         "
829        DIFF_SYM=
830        if [[ "$KNOWN_SYM_DIFF $ACCEPTED_SYM_DIFF" = *"$BIN_FILE"* ]]; then
831            SYM_MSG="    !    "
832        fi
833    fi
834
835    # Check dependencies
836    if [ -n "$LDD_CMD" ]; then
837        if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
838            LDD_FILTER="$GREP \.dll"
839        else
840            LDD_FILTER="$CAT"
841        fi
842        (cd $FILE_WORK_DIR && $CP $OTHER_FILE . && $LDD_CMD $NAME 2>/dev/null \
843                    | $LDD_FILTER | $AWK '{ print $1;}' | $SORT \
844                    | $TEE $WORK_FILE_BASE.deps.other \
845                    | $UNIQ > $WORK_FILE_BASE.deps.other.uniq)
846        (cd $FILE_WORK_DIR && $CP $THIS_FILE . && $LDD_CMD $NAME 2</dev/null \
847                    | $LDD_FILTER | $AWK '{ print $1;}' | $SORT \
848                    | $TEE $WORK_FILE_BASE.deps.this \
849                    | $UNIQ > $WORK_FILE_BASE.deps.this.uniq)
850        (cd $FILE_WORK_DIR && $RM -f $NAME)
851
852        LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other $WORK_FILE_BASE.deps.this \
853              > $WORK_FILE_BASE.deps.diff
854        LC_ALL=C $DIFF $WORK_FILE_BASE.deps.other.uniq $WORK_FILE_BASE.deps.this.uniq \
855              > $WORK_FILE_BASE.deps.diff.uniq
856
857        if [ -s $WORK_FILE_BASE.deps.diff ]; then
858            if [ -s $WORK_FILE_BASE.deps.diff.uniq ]; then
859                DEP_MSG=" diff  "
860            else
861                DEP_MSG=" redun "
862            fi
863            if [[ "$ACCEPTED_DEP_DIFF" != *"$BIN_FILE"* ]]; then
864                DIFF_DEP=true
865                if [[ "$KNOWN_DEP_DIFF" != *"$BIN_FILE"* ]]; then
866                    DEP_MSG="*$DEP_MSG*"
867                    REGRESSIONS=true
868                else
869                    DEP_MSG=" $DEP_MSG "
870                fi
871            else
872                DEP_MSG="($DEP_MSG)"
873                DIFF_DEP=
874            fi
875        else
876            DEP_MSG="         "
877            DIFF_DEP=
878            if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
879                DEP_MSG="     !      "
880            fi
881        fi
882    else
883        DEP_MSG="    -    "
884    fi
885
886    # Some linux compilers add a unique Build ID
887    if [ "$OPENJDK_TARGET_OS" = "linux" ]; then
888      BUILD_ID_FILTER="$SED -r 's/(Build ID:) [0-9a-f]{40}/\1/'"
889    else
890      BUILD_ID_FILTER="$CAT"
891    fi
892
893    # Compare fulldump output
894    if [ -n "$FULLDUMP_CMD" ] && [ -z "$SKIP_FULLDUMP_DIFF" ]; then
895        if [ -z "$FULLDUMP_DIFF_FILTER" ]; then
896            FULLDUMP_DIFF_FILTER="$CAT"
897        fi
898        $FULLDUMP_CMD $OTHER_FILE | eval "$BUILD_ID_FILTER" | eval "$FULLDUMP_DIFF_FILTER" \
899            > $WORK_FILE_BASE.fulldump.other 2>&1 &
900        $FULLDUMP_CMD $THIS_FILE  | eval "$BUILD_ID_FILTER" | eval "$FULLDUMP_DIFF_FILTER" \
901            > $WORK_FILE_BASE.fulldump.this  2>&1 &
902        wait
903
904        LC_ALL=C $DIFF $WORK_FILE_BASE.fulldump.other $WORK_FILE_BASE.fulldump.this \
905            > $WORK_FILE_BASE.fulldump.diff
906
907        if [ -s $WORK_FILE_BASE.fulldump.diff ]; then
908            FULLDUMP_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.fulldump.diff | awk '{print $5}')
909            FULLDUMP_MSG=$($PRINTF "%8d" $FULLDUMP_DIFF_SIZE)
910            if [[ "$ACCEPTED_FULLDUMP_DIFF" != *"$BIN_FILE"* ]]; then
911                DIFF_FULLDUMP=true
912                if [[ "$KNOWN_FULLDUMP_DIFF" != *"$BIN_FILE"* ]]; then
913                    FULLDUMP_MSG="*$FULLDUMP_MSG*"
914                    REGRESSIONS=true
915                else
916                    FULLDUMP_MSG=" $FULLDUMP_MSG "
917                fi
918            else
919                FULLDUMP_MSG="($FULLDUMP_MSG)"
920                DIFF_FULLDUMP=
921            fi
922        else
923            FULLDUMP_MSG="          "
924            DIFF_FULLDUMP=
925            if [[ "$KNOWN_FULLDUMP_DIFF $ACCEPTED_FULLDUMP_DIFF" = *"$BIN_FILE"* ]]; then
926                FULLDUMP_MSG="    !    "
927            fi
928        fi
929    fi
930
931    # Compare disassemble output
932    if [ -n "$DIS_CMD" ] && [ -z "$SKIP_DIS_DIFF" ]; then
933        this_DIS_DIFF_FILTER="$CAT"
934        if [ -n "$DIS_DIFF_FILTER" ]; then
935            if [ -z "$NEED_DIS_DIFF_FILTER" ] \
936                || [[ "$NEED_DIS_DIFF_FILTER" = *"$BIN_FILE"* ]]; then
937                this_DIS_DIFF_FILTER="$DIS_DIFF_FILTER"
938            fi
939        fi
940        if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
941            DIS_GREP_ARG=-a
942        else
943            DIS_GREP_ARG=
944        fi
945        $DIS_CMD $OTHER_FILE | $GREP $DIS_GREP_ARG -v $NAME \
946            | eval "$this_DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.other 2>&1 &
947        $DIS_CMD $THIS_FILE  | $GREP $DIS_GREP_ARG -v $NAME \
948            | eval "$this_DIS_DIFF_FILTER" > $WORK_FILE_BASE.dis.this  2>&1 &
949        wait
950
951        LC_ALL=C $DIFF $WORK_FILE_BASE.dis.other $WORK_FILE_BASE.dis.this > $WORK_FILE_BASE.dis.diff
952
953        if [ -s $WORK_FILE_BASE.dis.diff ]; then
954            DIS_DIFF_SIZE=$(ls -n $WORK_FILE_BASE.dis.diff | awk '{print $5}')
955            DIS_MSG=$($PRINTF "%8d" $DIS_DIFF_SIZE)
956            if [[ "$ACCEPTED_DIS_DIFF" != *"$BIN_FILE"* ]]; then
957                DIFF_DIS=true
958                if [ "$MAX_KNOWN_DIS_DIFF_SIZE" = "" ]; then
959                    MAX_KNOWN_DIS_DIFF_SIZE="0"
960                fi
961                if [[ "$KNOWN_DIS_DIFF" = *"$BIN_FILE"* ]] \
962                    && [ "$DIS_DIFF_SIZE" -lt "$MAX_KNOWN_DIS_DIFF_SIZE" ]; then
963                    DIS_MSG=" $DIS_MSG "
964                else
965                    DIS_MSG="*$DIS_MSG*"
966                    REGRESSIONS=true
967                fi
968            else
969                DIS_MSG="($DIS_MSG)"
970                DIFF_DIS=
971            fi
972        else
973            DIS_MSG="          "
974            DIFF_DIS=
975            if [[ "$KNOWN_DEP_DIFF $ACCEPTED_DEP_DIFF" = *"$BIN_FILE"* ]]; then
976                DIS_MSG="    !    "
977            fi
978        fi
979    fi
980
981
982    if [ -n "$DIFF_BIN$DIFF_SIZE$DIFF_SYM$DIFF_DEP$DIFF_FULLDUMP$DIFF_DIS" ] || [ -n "$VERBOSE" ]; then
983        if [ -n "$BIN_MSG" ]; then echo -n "$BIN_MSG:"; fi
984        if [ -n "$SIZE_MSG" ]; then echo -n "$SIZE_MSG:"; fi
985        if [ -n "$SYM_MSG" ]; then echo -n "$SYM_MSG:"; fi
986        if [ -n "$DEP_MSG" ]; then echo -n "$DEP_MSG:"; fi
987        if [ -n "$FULLDUMP_MSG" ]; then echo -n "$FULLDUMP_MSG:"; fi
988        if [ -n "$DIS_MSG" ]; then echo -n "$DIS_MSG:"; fi
989        echo " $BIN_FILE"
990        if [ "$SHOW_DIFFS" = "true" ]; then
991            if [ -s "$WORK_FILE_BASE.symbols.diff" ]; then
992                echo "Symbols diff:"
993                $CAT $WORK_FILE_BASE.symbols.diff
994            fi
995            if [ -s "$WORK_FILE_BASE.deps.diff" ]; then
996                echo "Deps diff:"
997                $CAT $WORK_FILE_BASE.deps.diff
998            fi
999            if [ -s "$WORK_FILE_BASE.fulldump.diff" ]; then
1000                echo "Fulldump diff:"
1001                $CAT $WORK_FILE_BASE.fulldump.diff
1002            fi
1003            if [ -s "$WORK_FILE_BASE.dis.diff" ]; then
1004                echo "Disassembly diff:"
1005                $CAT $WORK_FILE_BASE.dis.diff
1006            fi
1007        fi
1008        return 1
1009    fi
1010    return 0
1011}
1012
1013################################################################################
1014# Print binary diff header
1015
1016print_binary_diff_header() {
1017    if [ -z "$SKIP_BIN_DIFF" ]; then echo -n " Binary :"; fi
1018    if [ -z "$SKIP_SIZE_DIFF" ]; then echo -n "   Size    :"; fi
1019    if [ -z "$SKIP_SYM_DIFF" ]; then echo -n " Symbols :"; fi
1020    if [ -z "$SKIP_DEP_DIFF" ]; then echo -n "  Deps   :"; fi
1021    if [ -z "$SKIP_FULLDUMP_DIFF" ]; then echo -n " Fulldump :"; fi
1022    if [ -z "$SKIP_DIS_DIFF" ]; then echo -n " Disass   :"; fi
1023    echo
1024}
1025
1026################################################################################
1027# Compare all libraries
1028
1029compare_all_libs() {
1030    THIS_DIR=$1
1031    OTHER_DIR=$2
1032    WORK_DIR=$3
1033
1034    LIBS=$(cd $THIS_DIR && $FIND . -type f \( -name 'lib*.so' -o -name '*.dylib' \
1035        -o -name '*.dll' -o -name '*.obj' -o -name '*.o' -o -name '*.a' \
1036        -o -name '*.cpl' \) | $SORT | $FILTER)
1037
1038    if [ -n "$LIBS" ]; then
1039        echo Libraries...
1040        print_binary_diff_header
1041        for l in $LIBS; do
1042            if [ -f "$OTHER_DIR/$l" ]; then
1043                compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $l
1044                if [ "$?" != "0" ]; then
1045                    return_value=1
1046                fi
1047            fi
1048        done
1049    fi
1050
1051    return $return_value
1052}
1053
1054################################################################################
1055# Compare all executables
1056
1057compare_all_execs() {
1058    THIS_DIR=$1
1059    OTHER_DIR=$2
1060    WORK_DIR=$3
1061
1062    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
1063        EXECS=$(cd $THIS_DIR && $FIND . -type f -name '*.exe' | $SORT | $FILTER)
1064    else
1065        EXECS=$(cd $THIS_DIR && $FIND . -name db -prune -o -type f -perm -100 \! \
1066            \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' -o -name '*.cgi' \
1067            -o -name '*.jar' -o -name '*.diz' -o -name 'jcontrol' -o -name '*.properties' \
1068            -o -name '*.data' -o -name '*.bfc' -o -name '*.src' -o -name '*.txt' \
1069            -o -name '*.cfg' -o -name 'meta-index' -o -name '*.properties.ja' \
1070            -o -name '*.xml' -o -name '*.html' -o -name '*.png' -o -name 'README' \
1071            -o -name '*.zip' -o -name '*.jimage' -o -name '*.java' -o -name '*.mf' \
1072            -o -name '*.jpg' -o -name '*.wsdl' -o -name '*.js' -o -name '*.sh' \
1073            -o -name '*.bat' -o -name '*LICENSE' -o -name '*.d' -o -name '*store' \
1074            -o -name 'blacklist' -o -name '*certs' -o -name '*.ttf' \
1075            -o -name '*.jfc' -o -name '*.dat'  -o -name 'release' -o -name '*.dir'\
1076            -o -name '*.sym' -o -name '*.idl' -o -name '*.h' -o -name '*.access' \
1077            -o -name '*.template' -o -name '*.policy' -o -name '*.security' \
1078            -o -name 'COPYRIGHT' -o -name '*.1' \
1079            -o -name 'classlist' \) | $SORT | $FILTER)
1080    fi
1081
1082    if [ -n "$EXECS" ]; then
1083        echo Executables...
1084        print_binary_diff_header
1085        for e in $EXECS; do
1086            if [ -f "$OTHER_DIR/$e" ]; then
1087                compare_bin_file $THIS_DIR $OTHER_DIR $WORK_DIR $e
1088                if [ "$?" != "0" ]; then
1089                    return_value=1
1090                fi
1091            fi
1092        done
1093    fi
1094
1095    return $return_value
1096}
1097
1098################################################################################
1099# Initiate configuration
1100
1101THIS="$SCRIPT_DIR"
1102echo "$THIS"
1103THIS_SCRIPT="$0"
1104
1105if [ -z "$1" ] || [ "$1" = "-h" ] || [ "$1" = "-?" ] || [ "$1" = "/h" ] || [ "$1" = "/?" ] || [ "$1" = "-help" ] || [ "$1" = "--help" ]; then
1106    echo "bash ./compare.sh [OPTIONS] [FILTER]"
1107    echo ""
1108    echo "-all                Compare all files in all known ways"
1109    echo "-names              Compare the file names and directory structure"
1110    echo "-perms              Compare the permission bits on all files and directories"
1111    echo "-types              Compare the output of the file command on all files"
1112    echo "-general            Compare the files not convered by the specialized comparisons"
1113    echo "-zips               Compare the contents of all zip files"
1114    echo "-jars               Compare the contents of all jar files"
1115    echo "-libs               Compare all native libraries"
1116    echo "-execs              Compare all executables"
1117    echo "-v                  Verbose output, does not hide known differences"
1118    echo "-vv                 More verbose output, shows diff output of all comparisons"
1119    echo "-o [OTHER]          Compare with build in other directory. Will default to the old build directory"
1120    echo ""
1121    echo "--sort-symbols      Sort all symbols before comparing"
1122    echo "--strip             Strip all binaries before comparing"
1123    echo "--clean             Clean all previous comparison results first"
1124    echo ""
1125    echo "[FILTER]            List filenames in the image to compare, works for jars, zips, libs and execs"
1126    echo "Example:"
1127    echo "bash ./common/bin/compareimages.sh CodePointIM.jar"
1128    echo ""
1129    echo "-2zips <file1> <file2> Compare two zip files only"
1130    echo "-2bins <file1> <file2> Compare two binary files only"
1131    echo "-2dirs <dir1> <dir2> Compare two directories as if they were images"
1132    echo ""
1133    exit 10
1134fi
1135
1136CMP_NAMES=false
1137CMP_PERMS=false
1138CMP_TYPES=false
1139CMP_GENERAL=false
1140CMP_ZIPS=false
1141CMP_JARS=false
1142CMP_LIBS=false
1143CMP_EXECS=false
1144
1145while [ -n "$1" ]; do
1146    case "$1" in
1147        -v)
1148            VERBOSE=true
1149            ;;
1150        -vv)
1151            VERBOSE=true
1152            SHOW_DIFFS=true
1153            ;;
1154        -o)
1155            OTHER="$2"
1156            shift
1157            ;;
1158        -all)
1159            CMP_NAMES=true
1160            if [ "$OPENJDK_TARGET_OS" != "windows" ]; then
1161                CMP_PERMS=true
1162            fi
1163            CMP_TYPES=true
1164            CMP_GENERAL=true
1165            CMP_ZIPS=true
1166            CMP_JARS=true
1167            CMP_LIBS=true
1168            CMP_EXECS=true
1169            ;;
1170        -names)
1171            CMP_NAMES=true
1172            ;;
1173        -perms)
1174            CMP_PERMS=true
1175            ;;
1176        -types)
1177            CMP_TYPES=true
1178            ;;
1179        -general)
1180            CMP_GENERAL=true
1181            ;;
1182        -zips)
1183            CMP_ZIPS=true
1184            ;;
1185        -jars)
1186            CMP_JARS=true
1187            ;;
1188        -libs)
1189            CMP_LIBS=true
1190            ;;
1191        -execs)
1192            CMP_EXECS=true
1193            ;;
1194        -2dirs)
1195            THIS="$(cd "$2" > /dev/null && pwd )"
1196            OTHER="$(cd "$3" > /dev/null && pwd )"
1197            THIS_BASE_DIR="$THIS"
1198            OTHER_BASE_DIR="$OTHER"
1199            SKIP_DEFAULT=true
1200            shift
1201            shift
1202            ;;
1203        -2zips)
1204            CMP_2_ZIPS=true
1205            THIS_FILE=$2
1206            OTHER_FILE=$3
1207            shift
1208            shift
1209            ;;
1210        -2bins)
1211            CMP_2_BINS=true
1212            THIS_FILE=$2
1213            OTHER_FILE=$3
1214            shift
1215            shift
1216            ;;
1217        --sort-symbols)
1218            SORT_ALL_SYMBOLS=true
1219            ;;
1220        --strip)
1221            STRIP_ALL=true
1222            ;;
1223        --clean)
1224            CLEAN_OUTPUT=true
1225            ;;
1226        *)
1227            CMP_NAMES=false
1228            CMP_PERMS=false
1229            CMP_TYPES=false
1230            CMP_ZIPS=true
1231            CMP_JARS=true
1232            CMP_LIBS=true
1233            CMP_EXECS=true
1234
1235            if [ -z "$FILTER" ]; then
1236                FILTER="$GREP"
1237            fi
1238            FILTER="$FILTER -e $1"
1239            ;;
1240    esac
1241    shift
1242done
1243
1244if [ "$STRIP_ALL" = "true" ] && [ -z "$STRIP" ]; then
1245  echo Warning: Not stripping even with --strip, since strip is missing on this platform
1246  STRIP_ALL=false
1247fi
1248
1249COMPARE_ROOT=/tmp/cimages.$USER
1250if [ "$CLEAN_OUTPUT" = "true" ]; then
1251    echo Cleaning old output in $COMPARE_ROOT.
1252    $RM -rf $COMPARE_ROOT
1253fi
1254$MKDIR -p $COMPARE_ROOT
1255if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
1256    if [ "$(uname -o)" = "Cygwin" ]; then
1257        COMPARE_ROOT=$(cygpath -msa $COMPARE_ROOT)
1258    fi
1259fi
1260
1261if [ "$CMP_2_ZIPS" = "true" ]; then
1262    THIS_DIR="$(dirname $THIS_FILE)"
1263    THIS_DIR="$(cd "$THIS_DIR" > /dev/null && pwd )"
1264    OTHER_DIR="$(dirname $OTHER_FILE)"
1265    OTHER_DIR="$(cd "$OTHER_DIR" > /dev/null && pwd )"
1266    THIS_FILE_NAME="$(basename $THIS_FILE)"
1267    OTHER_FILE_NAME="$(basename $OTHER_FILE)"
1268    echo Comparing $THIS_DIR/$THIS_FILE_NAME and $OTHER_DIR/$OTHER_FILE_NAME
1269    compare_zip_file $THIS_DIR $OTHER_DIR $COMPARE_ROOT/2zips $THIS_FILE_NAME $OTHER_FILE_NAME
1270    exit
1271fi
1272
1273if [ "$CMP_2_BINS" = "true" ]; then
1274    THIS_DIR="$(dirname $THIS_FILE)"
1275    THIS_DIR="$(cd "$THIS_DIR" > /dev/null && pwd )"
1276    OTHER_DIR="$(dirname $OTHER_FILE)"
1277    OTHER_DIR="$(cd "$OTHER_DIR" > /dev/null && pwd )"
1278    THIS_FILE_NAME="$(basename $THIS_FILE)"
1279    OTHER_FILE_NAME="$(basename $OTHER_FILE)"
1280    echo Comparing $THIS_DIR/$THIS_FILE_NAME and $OTHER_DIR/$OTHER_FILE_NAME
1281    compare_bin_file $THIS_DIR $OTHER_DIR $COMPARE_ROOT/2bins $THIS_FILE_NAME $OTHER_FILE_NAME
1282    exit
1283fi
1284
1285if [ "$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
1286    CMP_NAMES=true
1287    CMP_PERMS=true
1288    CMP_TYPES=true
1289    CMP_GENERAL=true
1290    CMP_ZIPS=true
1291    CMP_JARS=true
1292    CMP_LIBS=true
1293    CMP_EXECS=true
1294fi
1295
1296if [ -z "$FILTER" ]; then
1297    FILTER="$CAT"
1298fi
1299
1300if [ "$SKIP_DEFAULT" != "true" ]; then
1301    if [ -z "$OTHER" ]; then
1302        echo "Nothing to compare to, set with -o"
1303        exit 1
1304    else
1305        if [ ! -d "$OTHER" ]; then
1306            echo "Other build directory does not exist:"
1307            echo "$OTHER"
1308            exit 1
1309        fi
1310        OTHER="$( cd "$OTHER" > /dev/null && pwd )"
1311        echo "Comparing to:"
1312        echo "$OTHER"
1313        echo
1314    fi
1315
1316
1317    # Find the common images to compare, prioritizing later build stages
1318    if [ -d "$THIS/install/jdk" ] && [ -d "$OTHER/install/jdk" ]; then
1319        THIS_JDK="$THIS/install/jdk"
1320        THIS_JRE="$THIS/install/jre"
1321        OTHER_JDK="$OTHER/install/jdk"
1322        OTHER_JRE="$OTHER/install/jre"
1323        echo "Selecting install images for compare"
1324    elif [ -d "$THIS/images/jdk" ] && [ -d "$OTHER/deploy/images/jdk" ]; then
1325        THIS_JDK="$THIS/images/jdk"
1326        THIS_JRE="$THIS/images/jre"
1327        OTHER_JDK="$OTHER/deploy/images/jdk"
1328        OTHER_JRE="$OTHER/deploy/images/jre"
1329        echo "Selecting deploy images for compare"
1330    elif [ -d "$THIS/images/jdk" ] && [ -d "$OTHER/images/jdk" ]; then
1331        THIS_JDK="$THIS/images/jdk"
1332        THIS_JRE="$THIS/images/jre"
1333        OTHER_JDK="$OTHER/images/jdk"
1334        OTHER_JRE="$OTHER/images/jre"
1335        echo "Selecting jdk images for compare"
1336    else
1337        echo "No common images found."
1338        exit 1
1339    fi
1340    echo "  $THIS_JDK"
1341    echo "  $OTHER_JDK"
1342
1343    if [ -d "$THIS/images/jdk-bundle" -o -d "$THIS/deploy/images/jdk-bundle" ] \
1344	     && [ -d "$OTHER/images/jdk-bundle" -o -d "$OTHER/deploy/images/jdk-bundle" ]; then
1345	if [ -d "$THIS/deploy/images/jdk-bundle" ]; then
1346            THIS_JDK_BUNDLE="$THIS/deploy/images/jdk-bundle"
1347            THIS_JRE_BUNDLE="$THIS/deploy/images/jre-bundle"
1348	else
1349            THIS_JDK_BUNDLE="$THIS/images/jdk-bundle"
1350            THIS_JRE_BUNDLE="$THIS/images/jre-bundle"
1351	fi
1352	if [ -d "$OTHER/deploy/images/jdk-bundle" ]; then
1353            OTHER_JDK_BUNDLE="$OTHER/deploy/images/jdk-bundle"
1354            OTHER_JRE_BUNDLE="$OTHER/deploy/images/jre-bundle"
1355	else
1356            OTHER_JDK_BUNDLE="$OTHER/images/jdk-bundle"
1357            OTHER_JRE_BUNDLE="$OTHER/images/jre-bundle"
1358	fi
1359        echo "Also comparing jdk macosx bundles"
1360        echo "  $THIS_JDK_BUNDLE"
1361        echo "  $OTHER_JDK_BUNDLE"
1362    fi
1363
1364    if [ -d "$THIS/deploy/bundles" -o -d "$THIS/deploy/images/bundles" ] \
1365	     && [ -d "$OTHER/deploy/bundles" -o -d "$OTHER/deploy/images/bundles" ]; then
1366	if [ -d "$THIS/deploy/images/bundles" ]; then
1367            THIS_DEPLOY_BUNDLE_DIR="$THIS/deploy/images/bundles"
1368	else
1369            THIS_DEPLOY_BUNDLE_DIR="$THIS/deploy/bundles"
1370	fi
1371	if [ -d "$OTHER/deploy/images/bundles" ]; then
1372            OTHER_DEPLOY_BUNDLE_DIR="$OTHER/deploy/images/bundles"
1373	else
1374            OTHER_DEPLOY_BUNDLE_DIR="$OTHER/deploy/bundles"
1375	fi
1376        echo "Also comparing deploy javadoc bundles"
1377    fi
1378
1379    if [ -d "$THIS/images/JavaAppletPlugin.plugin" ] \
1380	     && [ -d "$OTHER/images/JavaAppletPlugin.plugin" -o -d "$OTHER/deploy/images/JavaAppletPlugin.plugin" ]; then
1381	if [ -d "$THIS/images/JavaAppletPlugin.plugin" ]; then
1382            THIS_DEPLOY_APPLET_PLUGIN_DIR="$THIS/images/JavaAppletPlugin.plugin"
1383	else
1384            THIS_DEPLOY_APPLET_PLUGIN_DIR="$THIS/deploy/images/JavaAppletPlugin.plugin"
1385	fi
1386	if [ -d "$OTHER/images/JavaAppletPlugin.plugin" ]; then
1387            OTHER_DEPLOY_APPLET_PLUGIN_DIR="$OTHER/images/JavaAppletPlugin.plugin"
1388	else
1389            OTHER_DEPLOY_APPLET_PLUGIN_DIR="$OTHER/deploy/images/JavaAppletPlugin.plugin"
1390	fi
1391        echo "Also comparing deploy applet image"
1392        echo "  $THIS_DEPLOY_APPLET_PLUGIN_DIR"
1393        echo "  $OTHER_DEPLOY_APPLET_PLUGIN_DIR"
1394    fi
1395
1396    if [ -d "$THIS/install/sparkle/Sparkle.framework" ] \
1397           && [ -d "$OTHER/install/sparkle/Sparkle.framework" ]; then
1398        THIS_SPARKLE_DIR="$THIS/install/sparkle/Sparkle.framework"
1399        OTHER_SPARKLE_DIR="$OTHER/install/sparkle/Sparkle.framework"
1400        echo "Also comparing install sparkle framework"
1401        echo "  $THIS_SPARKLE_DIR"
1402        echo "  $OTHER_SPARKLE_DIR"
1403    fi
1404
1405    if [ -d "$OTHER/images" ]; then
1406        OTHER_SEC_DIR="$OTHER/images"
1407    else
1408        OTHER_SEC_DIR="$OTHER/tmp"
1409    fi
1410    OTHER_SEC_BIN="$OTHER_SEC_DIR/sec-bin.zip"
1411    THIS_SEC_DIR="$THIS/images"
1412    THIS_SEC_BIN="$THIS_SEC_DIR/sec-bin.zip"
1413    if [ "$OPENJDK_TARGET_OS" = "windows" ]; then
1414        if [ "$OPENJDK_TARGET_CPU" = "x86_64" ]; then
1415            JGSS_WINDOWS_BIN="jgss-windows-x64-bin.zip"
1416        else
1417            JGSS_WINDOWS_BIN="jgss-windows-i586-bin.zip"
1418        fi
1419        OTHER_SEC_WINDOWS_BIN="$OTHER_SEC_DIR/sec-windows-bin.zip"
1420        OTHER_JGSS_WINDOWS_BIN="$OTHER_SEC_DIR/$JGSS_WINDOWS_BIN"
1421        THIS_SEC_WINDOWS_BIN="$THIS_SEC_DIR/sec-windows-bin.zip"
1422        THIS_JGSS_WINDOWS_BIN="$THIS_SEC_DIR/$JGSS_WINDOWS_BIN"
1423    fi
1424
1425    if [ -d "$THIS/images/docs" ] && [ -d "$OTHER/images/docs" ]; then
1426        THIS_DOCS="$THIS/images/docs"
1427        OTHER_DOCS="$OTHER/images/docs"
1428        echo "Also comparing docs"
1429    else
1430        echo "WARNING! Docs haven't been built and won't be compared."
1431    fi
1432fi
1433
1434################################################################################
1435# Do the work
1436
1437if [ "$CMP_NAMES" = "true" ]; then
1438    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1439        echo -n "JDK "
1440        compare_dirs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1441        echo -n "JRE "
1442        compare_dirs $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1443
1444        echo -n "JDK "
1445        compare_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1446        echo -n "JRE "
1447        compare_files $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1448    fi
1449    if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
1450        echo -n "JDK Bundle "
1451        compare_dirs $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1452        echo -n "JRE Bundle "
1453        compare_dirs $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
1454
1455        echo -n "JDK Bundle "
1456        compare_files $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1457        echo -n "JRE Bundle "
1458        compare_files $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
1459    fi
1460    if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
1461        echo -n "Docs "
1462        compare_dirs $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
1463        echo -n "Docs "
1464        compare_files $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
1465    fi
1466    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1467        compare_dirs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1468        compare_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1469    fi
1470    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1471        echo -n "JavaAppletPlugin "
1472        compare_dirs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1473        echo -n "JavaAppletPlugin "
1474        compare_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1475    fi
1476    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
1477        echo -n "Sparkle.framework "
1478        compare_dirs $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1479        echo -n "Sparkle.framework "
1480        compare_files $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1481    fi
1482fi
1483
1484if [ "$CMP_PERMS" = "true" ]; then
1485    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1486        echo -n "JDK "
1487        compare_permissions $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1488        echo -n "JRE "
1489        compare_permissions $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1490    fi
1491    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1492        compare_permissions $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1493    fi
1494    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1495        echo -n "JavaAppletPlugin "
1496        compare_permissions $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1497    fi
1498    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
1499        echo -n "Sparkle.framework "
1500        compare_permissions $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1501    fi
1502fi
1503
1504if [ "$CMP_TYPES" = "true" ]; then
1505    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1506        echo -n "JDK "
1507        compare_file_types $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1508        echo -n "JRE "
1509        compare_file_types $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1510    fi
1511    if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
1512        echo -n "JDK Bundle "
1513        compare_file_types $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1514        echo -n "JRE Bundle "
1515        compare_file_types $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
1516    fi
1517    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1518        compare_file_types $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1519    fi
1520    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1521        echo -n "JavaAppletPlugin "
1522        compare_file_types $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1523    fi
1524    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
1525        echo -n "Sparkle.framework "
1526        compare_file_types $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1527    fi
1528fi
1529
1530if [ "$CMP_GENERAL" = "true" ]; then
1531    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1532        echo -n "JDK "
1533        compare_general_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1534        echo -n "JRE "
1535        compare_general_files $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1536    fi
1537    if [ -n "$THIS_JDK_BUNDLE" ] && [ -n "$OTHER_JDK_BUNDLE" ]; then
1538        echo -n "JDK Bundle "
1539        compare_general_files $THIS_JDK_BUNDLE $OTHER_JDK_BUNDLE $COMPARE_ROOT/jdk-bundle
1540        echo -n "JRE Bundle "
1541        compare_general_files $THIS_JRE_BUNDLE $OTHER_JRE_BUNDLE $COMPARE_ROOT/jre-bundle
1542    fi
1543    if [ -n "$THIS_DOCS" ] && [ -n "$OTHER_DOCS" ]; then
1544        echo -n "Docs "
1545        compare_general_files $THIS_DOCS $OTHER_DOCS $COMPARE_ROOT/docs
1546    fi
1547    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1548        compare_general_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1549    fi
1550    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1551        echo -n "JavaAppletPlugin "
1552        compare_general_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1553    fi
1554    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
1555        echo -n "Sparkle.framework "
1556        compare_general_files $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1557    fi
1558fi
1559
1560if [ "$CMP_ZIPS" = "true" ]; then
1561    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1562        compare_all_zip_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1563    fi
1564    if [ -n "$THIS_SEC_BIN" ] && [ -n "$OTHER_SEC_BIN" ]; then
1565        if [ -n "$(echo $THIS_SEC_BIN | $FILTER)" ]; then
1566            echo "sec-bin.zip..."
1567            compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-bin.zip
1568        fi
1569    fi
1570    if [ -n "$THIS_SEC_WINDOWS_BIN" ] && [ -n "$OTHER_SEC_WINDOWS_BIN" ]; then
1571        if [ -n "$(echo $THIS_SEC_WINDOWS_BIN | $FILTER)" ]; then
1572            echo "sec-windows-bin.zip..."
1573            compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin sec-windows-bin.zip
1574        fi
1575    fi
1576    if [ -n "$THIS_JGSS_WINDOWS_BIN" ] && [ -n "$OTHER_JGSS_WINDOWS_BIN" ]; then
1577        if [ -n "$(echo $THIS_JGSS_WINDOWS_BIN | $FILTER)" ]; then
1578            echo "$JGSS_WINDOWS_BIN..."
1579            compare_zip_file $THIS_SEC_DIR $OTHER_SEC_DIR $COMPARE_ROOT/sec-bin $JGSS_WINDOWS_BIN
1580        fi
1581    fi
1582    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1583        compare_all_zip_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1584    fi
1585    if [ -n "$THIS_DEPLOY_BUNDLE_DIR" ] && [ -n "$OTHER_DEPLOY_BUNDLE_DIR" ]; then
1586        compare_all_zip_files $THIS_DEPLOY_BUNDLE_DIR $OTHER_DEPLOY_BUNDLE_DIR $COMPARE_ROOT/deploy-bundle
1587    fi
1588    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1589        compare_all_zip_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1590    fi
1591fi
1592
1593if [ "$CMP_JARS" = "true" ]; then
1594    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1595        compare_all_jar_files $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1596    fi
1597    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1598        compare_all_jar_files $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1599    fi
1600    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1601        compare_all_jar_files $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1602    fi
1603fi
1604
1605if [ "$CMP_LIBS" = "true" ]; then
1606    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1607        echo -n "JDK "
1608        compare_all_libs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1609        if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
1610            echo -n "JRE "
1611            compare_all_libs $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1612        fi
1613    fi
1614    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1615        compare_all_libs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1616    fi
1617    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1618        echo -n "JavaAppletPlugin "
1619        compare_all_libs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1620    fi
1621    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
1622        echo -n "Sparkle.framework "
1623        compare_all_libs $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1624    fi
1625fi
1626
1627if [ "$CMP_EXECS" = "true" ]; then
1628    if [ -n "$THIS_JDK" ] && [ -n "$OTHER_JDK" ]; then
1629        compare_all_execs $THIS_JDK $OTHER_JDK $COMPARE_ROOT/jdk
1630        if [ "$OPENJDK_TARGET_OS" = "macosx" ]; then
1631            echo -n "JRE "
1632            compare_all_execs $THIS_JRE $OTHER_JRE $COMPARE_ROOT/jre
1633        fi
1634    fi
1635    if [ -n "$THIS_BASE_DIR" ] && [ -n "$OTHER_BASE_DIR" ]; then
1636        compare_all_execs $THIS_BASE_DIR $OTHER_BASE_DIR $COMPARE_ROOT/base_dir
1637    fi
1638    if [ -n "$THIS_DEPLOY_APPLET_PLUGIN_DIR" ] && [ -n "$OTHER_DEPLOY_APPLET_PLUGIN_DIR" ]; then
1639        echo -n "JavaAppletPlugin "
1640        compare_all_execs $THIS_DEPLOY_APPLET_PLUGIN_DIR $OTHER_DEPLOY_APPLET_PLUGIN_DIR $COMPARE_ROOT/plugin
1641    fi
1642    if [ -n "$THIS_SPARKLE_DIR" ] && [ -n "$OTHER_SPARKLE_DIR" ]; then
1643        echo -n "Sparkle.framework "
1644        compare_all_execs $THIS_SPARKLE_DIR $OTHER_SPARKLE_DIR $COMPARE_ROOT/sparkle
1645    fi
1646fi
1647
1648echo
1649
1650if [ -n "$REGRESSIONS" ]; then
1651    echo "REGRESSIONS FOUND!"
1652    echo
1653    exit 1
1654else
1655    echo "No regressions found"
1656    echo
1657    exit 0
1658fi
1659