1 #!/bin/bash
   2 #
   3 # Copyright (c) 2012, 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 # MANUAL
  26 #
  27 # ./common/bin/compareimages.sh old_jdk_image new_jdk_image
  28 #
  29 # Compare the directory structure.
  30 # Compare the filenames in the directories.
  31 # Compare the contents of the zip archives
  32 # Compare the contents of the jar archives
  33 # Compare the native libraries
  34 # Compare the native executables
  35 # Compare the remaining files
  36 #
  37 # ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other]
  38 #
  39 # Compare only the selected subset of the images.
  40 #
  41 # ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar
  42 #
  43 # Compare only the CodePointIM.jar file
  44 # Can be used to compare zips, libraries and executables.
  45 #
  46 
  47 if [ "x$1" = "x-h" ] || [ "x$1" = "x--help" ] || [ "x$1" == "x" ]; then
  48     echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image"
  49     echo ""
  50     echo "Compare the directory structure."
  51     echo "Compare the filenames in the directories."
  52     echo "Compare the contents of the zip archives"
  53     echo "Compare the contents of the jar archives"
  54     echo "Compare the native libraries"
  55     echo "Compare the native executables"
  56     echo "Compare the remaining files"
  57     echo ""
  58     echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image [zips jars libs execs other]"
  59     echo ""
  60     echo "Compare only the selected subset of the images."
  61     echo ""
  62     echo "bash ./common/bin/compareimages.sh old_jdk_image new_jdk_image CodePointIM.jar"
  63     echo ""
  64     echo "Compare only the CodePointIM.jar file"
  65     echo "Can be used to compare zips, libraries and executables."
  66     exit 10
  67 fi
  68 
  69 OLD="$1"
  70 NEW="$2"
  71 CMD="$3"
  72 
  73 DIFF_RESULT=0
  74 
  75 CMP_ZIPS=false
  76 CMP_JARS=false
  77 CMP_LIBS=false
  78 CMP_EXECS=false
  79 CMP_OTHER=false
  80 
  81 FILTER="cat"
  82 
  83 if [ -n "$CMD" ]; then
  84   case "$CMD" in
  85     zips)
  86           CMP_ZIPS=true
  87       ;;
  88     jars)
  89           CMP_JARS=true
  90       ;;
  91     libs)
  92           CMP_LIBS=true
  93       ;;
  94     execs)
  95           CMP_EXECS=true
  96       ;;
  97     other)
  98           CMP_OTHER=true
  99       ;;
 100     *)
 101           CMP_ZIPS=true
 102           CMP_JARS=true
 103           CMP_LIBS=true
 104           CMP_EXECS=true
 105           CMP_OTHER=true
 106           FILTER="grep $3"
 107       ;;
 108   esac
 109 else
 110     CMP_ZIPS=true
 111     CMP_JARS=true
 112     CMP_LIBS=true
 113     CMP_EXECS=true
 114     CMP_OTHER=true
 115 fi
 116 
 117 DIFFJARZIP="/bin/bash `dirname $0`/diffjarzip.sh"
 118 DIFFLIB="/bin/bash `dirname $0`/difflib.sh"
 119 DIFFEXEC="/bin/bash `dirname $0`/diffexec.sh"
 120 export COMPARE_ROOT=/tmp/cimages.$USER
 121 mkdir -p $COMPARE_ROOT
 122 
 123 # Load the correct exception list.
 124 case "`uname -s`" in
 125     Linux)
 126         . `dirname $0`/exception_list_linux
 127         ;;
 128 esac
 129 
 130 echo
 131 echo Comparing $OLD to $NEW
 132 echo
 133 
 134 (cd $OLD && find . -type d | sort > $COMPARE_ROOT/from_dirs)
 135 (cd $NEW && find . -type d | sort > $COMPARE_ROOT/to_dirs)
 136 
 137 echo -n Directory structure...
 138 if diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs > /dev/null; then
 139     echo Identical!
 140 else
 141     echo Differences found.
 142     DIFF_RESULT=1
 143     # Differences in directories found.
 144     ONLY_OLD=$(diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs | grep '<')
 145     if [ "$ONLY_OLD" ]; then
 146         echo Only in $OLD
 147         echo $ONLY_OLD | sed 's|< ./|\t|g' | sed 's/ /\n/g'
 148     fi
 149     # Differences in directories found.
 150     ONLY_NEW=$(diff $COMPARE_ROOT/from_dirs $COMPARE_ROOT/to_dirs | grep '>')
 151     if [ "$ONLY_NEW" ]; then
 152         echo Only in $NEW
 153         echo $ONLY_NEW | sed 's|> ./|\t|g' | sed 's/ /\n/g'
 154     fi
 155 fi
 156 
 157 (cd $OLD && find . -type f | sort > $COMPARE_ROOT/from_files)
 158 (cd $NEW && find . -type f | sort > $COMPARE_ROOT/to_files)
 159 
 160 echo -n File names...
 161 if diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files > /dev/null; then
 162     echo Identical!
 163 else
 164     echo Differences found.
 165     DIFF_RESULT=1
 166     # Differences in directories found.
 167     ONLY_OLD=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '<')
 168     if [ "$ONLY_OLD" ]; then
 169         echo Only in $OLD
 170         echo "$ONLY_OLD" | sed 's|< ./|    |g'
 171     fi
 172     # Differences in directories found.
 173     ONLY_NEW=$(diff $COMPARE_ROOT/from_files $COMPARE_ROOT/to_files | grep '>')
 174     if [ "$ONLY_NEW" ]; then
 175         echo Only in $NEW
 176         echo "$ONLY_NEW" | sed 's|> ./|    |g'
 177     fi
 178 fi
 179 
 180 echo -n Permissions...
 181 found=""
 182 for f in `cd $OLD && find . -type f`
 183 do
 184     if [ ! -f ${OLD}/$f ]; then continue; fi
 185     if [ ! -f ${NEW}/$f ]; then continue; fi
 186     OP=`ls -l ${OLD}/$f | awk '{printf("%.10s\n", $1);}'`
 187     NP=`ls -l ${NEW}/$f | awk '{printf("%.10s\n", $1);}'`
 188     if [ "$OP" != "$NP" ]
 189     then
 190         if [ -z "$found" ]; then echo ; found="yes"; fi
 191         printf "\told: ${OP} new: ${NP}\t$f\n"
 192     fi
 193 
 194     OF=`cd ${OLD} && file $f`
 195     NF=`cd ${NEW} && file $f`
 196     if [ "$f" = "./src.zip" ]
 197     then
 198         if [ "`echo $OF | grep -ic zip`" -gt 0 -a "`echo $NF | grep -ic zip`" -gt 0 ]
 199         then
 200             # the way we produces zip-files make it so that directories are stored in old file
 201             # but not in new (only files with full-path)
 202             # this makes file-5.09 report them as different
 203             continue;
 204         fi
 205     fi
 206 
 207     if [ "$OF" != "$NF" ]
 208     then
 209         if [ -z "$found" ]; then echo ; found="yes"; fi
 210         printf "\tFILE: old: ${OF} new: ${NF}\t$f\n"
 211     fi
 212 done
 213 if [ -z "$found" ]; then echo ; found="yes"; fi
 214 
 215 GENERAL_FILES=$(cd $OLD && find . -type f ! -name "*.so" ! -name "*.jar" ! -name "*.zip" \
 216                                   ! -name "*.debuginfo" ! -name "*.dylib" ! -name "jexec" \
 217                                   ! -name "ct.sym" ! -name "*.diz" \
 218                               | grep -v "./bin/"  | sort | $FILTER)
 219 echo General files...
 220 for f in $GENERAL_FILES
 221 do
 222     if [ -e $NEW/$f ]; then
 223         DIFF_OUT=$(diff $OLD/$f $NEW/$f 2>&1)
 224         if [ -n "$DIFF_OUT" ]; then
 225             echo $f
 226             echo "$DIFF_OUT"
 227         fi
 228     fi
 229 done
 230 
 231 
 232 if [ "x$CMP_ZIPS" == "xtrue" ]; then
 233     ZIPS=$(cd $OLD && find . -type f -name "*.zip" | sort | $FILTER)
 234 
 235     if [ -n "$ZIPS" ]; then
 236         echo Zip files...
 237 
 238         for f in $ZIPS
 239         do
 240             $DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW 
 241             if [ "$?" != "0" ]; then
 242                 DIFF_RESULT=1
 243             fi
 244         done
 245    fi        
 246 fi    
 247 
 248 if [ "x$CMP_JARS" == "xtrue" ]; then
 249     JARS=$(cd $OLD && find . -type f -name "*.jar" -o -name "ct.sym" | sort | $FILTER)
 250 
 251     if [ -n "$JARS" ]; then
 252         echo Jar files...
 253 
 254         for f in $JARS
 255         do
 256             DIFFJAR_OUTPUT=`$DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW`
 257             DIFFJAR_RESULT=$?
 258             if [ "$DIFFJAR_RESULT" != "0" ]; then
 259                 for diff in $LIST_DIFF_JAR; do
 260                     DIFFJAR_OUTPUT=`echo "$DIFFJAR_OUTPUT" | grep -v "$diff"`
 261                 done
 262                 if [ "`echo "$DIFFJAR_OUTPUT" | grep -v "Differing files in"`" != "" ]; then
 263                     DIFF_RESULT=1
 264                     echo "$DIFFJAR_OUTPUT"
 265                 fi
 266             fi
 267         done
 268     fi
 269 fi
 270 
 271 if [ "x$FILTER" != "xcat" ]; then
 272     VIEW=view
 273 else
 274     VIEW=
 275 fi
 276 
 277 if [ "x$CMP_LIBS" == "xtrue" ]; then
 278     LIBS=$(cd $OLD && find . -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' | sort | $FILTER)
 279 
 280     if [ -n "$LIBS" ]; then
 281         echo Libraries...
 282         for f in $LIBS
 283         do
 284             DIFFLIB_OUTPUT=`$DIFFLIB $OLD/$f $NEW/$f $OLD $NEW $VIEW`
 285             DIFFLIB_RESULT=$?
 286             if [ "$DIFFLIB_RESULT" = "0" ]; then
 287                 :
 288                 #echo "OK: $DIFFLIB_OUTPUT"
 289             elif [ "$DIFFLIB_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then
 290                 :
 291                 #echo "OK: $DIFFLIB_OUTPUT"
 292             elif [ "$DIFFLIB_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then
 293                 :
 294                 #echo "OK: $DIFFLIB_OUTPUT"
 295             else
 296                 echo "$DIFFLIB_OUTPUT"
 297                 DIFF_RESULT=1
 298             fi
 299         done
 300     fi
 301 fi
 302 
 303 if [ "x$CMP_EXECS" == "xtrue" ]; then
 304     if [ $OSTYPE == "cygwin" ]; then
 305         EXECS=$(cd $OLD && find . -type f -name '*.exe' | sort | $FILTER)
 306     else
 307         EXECS=$(cd $OLD && find . -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' \) | sort | $FILTER)
 308     fi
 309 
 310 
 311     if [ -n "$EXECS" ]; then
 312         echo Executables...
 313 
 314         for f in $EXECS
 315         do
 316             DIFFEXEC_OUTPUT=`$DIFFEXEC $OLD/$f $NEW/$f $OLD $NEW $VIEW`
 317             DIFFEXEC_RESULT=$?
 318             if [ "$DIFFEXEC_RESULT" = "0" ]; then
 319                 :
 320                 #echo "OK: $DIFFEXEC_OUTPUT"
 321             elif [ "$DIFFEXEC_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then
 322                 :
 323                 #echo "OK: $DIFFEXEC_OUTPUT"
 324             elif [ "$DIFFEXEC_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then
 325                 :
 326                 #echo "OK: $DIFFEXEC_OUTPUT"
 327             else
 328                 echo "$DIFFEXEC_OUTPUT"
 329                 DIFF_RESULT=1
 330             fi
 331         done
 332     fi
 333 fi
 334 
 335 exit $DIFF_RESULT