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 "./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 "./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 "./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=`dirname $0`/diffjarzip.sh 118 DIFFLIB=`dirname $0`/difflib.sh 119 DIFFEXEC=`dirname $0`/diffexec.sh 120 export COMPARE_ROOT=/tmp/cimages 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|< ./|\t|g' | sed 's/ /\n/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|> ./|\t|g' | sed 's/ /\n/g' 177 fi 178 fi 179 180 if [ "x$CMP_ZIPS" == "xtrue" ]; then 181 ZIPS=$(cd $OLD && find . -type f -name "*.zip" | sort | $FILTER) 182 183 if [ -n "$ZIPS" ]; then 184 echo Zip files... 185 186 for f in $ZIPS 187 do 188 $DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW 189 if [ "$?" != "0" ]; then 190 DIFF_RESULT=1 191 fi 192 done 193 fi 194 fi 195 196 if [ "x$CMP_JARS" == "xtrue" ]; then 197 JARS=$(cd $OLD && find . -type f -name "*.jar" | sort | $FILTER) 198 199 if [ -n "$JARS" ]; then 200 echo Jar files... 201 202 for f in $JARS 203 do 204 DIFFJAR_OUTPUT=`$DIFFJARZIP $OLD/$f $NEW/$f $OLD $NEW` 205 DIFFJAR_RESULT=$? 206 if [ "$DIFFJAR_RESULT" != "0" ]; then 207 for diff in $LIST_DIFF_JAR; do 208 DIFFJAR_OUTPUT=`echo "$DIFFJAR_OUTPUT" | grep -v "$diff"` 209 done 210 if [ "`echo "$DIFFJAR_OUTPUT" | grep -v "Differing files in"`" != "" ]; then 211 DIFF_RESULT=1 212 echo "$DIFFJAR_OUTPUT" 213 fi 214 fi 215 done 216 fi 217 fi 218 219 if [ "x$FILTER" != "xcat" ]; then 220 VIEW=view 221 else 222 VIEW= 223 fi 224 225 if [ "x$CMP_LIBS" == "xtrue" ]; then 226 LIBS=$(cd $OLD && find . -name 'lib*.so' -o -name '*.dylib' -o -name '*.dll' | sort | $FILTER) 227 228 if [ -n "$LIBS" ]; then 229 echo Libraries... 230 for f in $LIBS 231 do 232 DIFFLIB_OUTPUT=`$DIFFLIB $OLD/$f $NEW/$f $OLD $NEW $VIEW` 233 DIFFLIB_RESULT=$? 234 if [ "$DIFFLIB_RESULT" = "0" ]; then 235 : 236 #echo "OK: $DIFFLIB_OUTPUT" 237 elif [ "$DIFFLIB_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then 238 : 239 #echo "OK: $DIFFLIB_OUTPUT" 240 elif [ "$DIFFLIB_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then 241 : 242 #echo "OK: $DIFFLIB_OUTPUT" 243 else 244 echo "$DIFFLIB_OUTPUT" 245 DIFF_RESULT=1 246 fi 247 done 248 fi 249 fi 250 251 if [ "x$CMP_EXECS" == "xtrue" ]; then 252 if [ $OSTYPE == "cygwin" ]; then 253 EXECS=$(cd $OLD && find . -type f -name '*.exe' | sort | $FILTER) 254 else 255 EXECS=$(cd $OLD && find . -type f -perm -100 \! \( -name '*.so' -o -name '*.dylib' -o -name '*.dll' \) | sort | $FILTER) 256 fi 257 258 259 if [ -n "$EXECS" ]; then 260 echo Executables... 261 262 for f in $EXECS 263 do 264 DIFFEXEC_OUTPUT=`$DIFFEXEC $OLD/$f $NEW/$f $OLD $NEW $VIEW` 265 DIFFEXEC_RESULT=$? 266 if [ "$DIFFEXEC_RESULT" = "0" ]; then 267 : 268 #echo "OK: $DIFFEXEC_OUTPUT" 269 elif [ "$DIFFEXEC_RESULT" = "2" ] && [[ "$LIST_DIFF_SIZE $LIST_DIFF_BYTE" == *"${f:2}"* ]]; then 270 : 271 #echo "OK: $DIFFEXEC_OUTPUT" 272 elif [ "$DIFFEXEC_RESULT" = "1" ] && [[ "$LIST_DIFF_BYTE" == *"${f:2}"* ]]; then 273 : 274 #echo "OK: $DIFFEXEC_OUTPUT" 275 else 276 echo "$DIFFEXEC_OUTPUT" 277 DIFF_RESULT=1 278 fi 279 done 280 fi 281 fi 282 283 exit $DIFF_RESULT