diff --git a/.gitignore b/.gitignore index 48fe42f9..b8ab0eed 100644 --- a/.gitignore +++ b/.gitignore @@ -11,11 +11,14 @@ cmake-* build* asan_build* +xcode_build* +msvc_build* +cygwin_build* +mingw_build* po/POTFILES po/remove-potcdate.sed po/stamp-po src/doxygen.hpp test/tmp/* doc/html - contrib/vms/.vagrant diff --git a/doc/ChangeLog b/doc/ChangeLog index 369f6e67..f2ae4493 100644 --- a/doc/ChangeLog +++ b/doc/ChangeLog @@ -11,6 +11,15 @@ Release Notes: https://github.com/Exiv2/exiv2/issues/1018#issuecomment-604539346 Bugs/Fixes + +#1213 | Cleanup +#1209 | fix_1208_NikonLens_0.27 #1208 +#1197 | Add c++11 support 0.27 +#1193 | geotag changes +#1190 | Bump Revision Number to 0.27.3.1 +#1189 | Manpage Makeover +#1188 | Update ChangeLog for v0.27.3 RC1 +#1187 | Taglist command parsing correction #1185 | Update release notes v0.27.3 RC1 #1183 | fix_1180_date_separator #1178 | Reduce system calls in FileIo::eof() @@ -45,6 +54,7 @@ Bugs/Fixes #927 | Translation Exiv2 in Dutch (nl) Translation Security +#1210 | Insufficient verification (cycle) in Image::printIFDStructure() #1141 | fix 1091 Fix unbounded recursion in bigtiffimage.cpp #1116 | fix_1099_0.27 exiv2 aborts with registerNs #1115 | fix_1097_0.27 Segfault of exiv2 with pr flag @@ -55,6 +65,11 @@ Security #1125 | fix_984_0.27 NULL-pointer read in XMPMeta.cpp Build Infrastructure +#1218 | CMake issues concerning install and uninstall +#1213 | Setting LD_LIBRARY_PATH during tests +#1211 | http.cpp fails to compile on mingw/cygwin +#1201 | Cannon link prebuilt MinGW binaries in Qt project +#1200 | Numerous improvements to Appveyor and GitLib CI builds #1184 | fix_1121_CODEOWNERS_0.27 #1181 | GCC 9.3.0 broken on MinGW/msys2 and CYGWIN #1175 | fix_1102_msysGCC93_0.27 @@ -66,6 +81,7 @@ Build Infrastructure #1121 | Add CODEOWNERS Test Infrastructure +#1207 | Extensive changes and clarifications in README.md #1174 | add http test to iotest.sh #1172 | Fix 1164 unit tests 0.27 #1173 | enhanced_test6_0.27 diff --git a/releasenotes/releasenotes.txt b/releasenotes/releasenotes.txt index c6809938..7f65575a 100644 --- a/releasenotes/releasenotes.txt +++ b/releasenotes/releasenotes.txt @@ -6,27 +6,32 @@ Headline Features of Exiv2 v0.27.3 Thank you to Phil, Sridhar, Luis, Kevin, and Andreas S for working with me on the release. As always, thanks to my wife Alison and our cat Lizzie for their support. -1) Bug and security fixes +1) Bug and security fixes: + - Security fixes + - Improved Unicode/charset handling in comments - Improved lens recognition - Updated Catalan and Dutch localisation + +2) Changes to downloadable build bundles: + - Revised documentation and man page - Replace license.txt with COPYING - Removed contrib/ directory from bundle - share/locale has localisation files - - Security fixes + - msvc bundle built with vs2019 -2) Build, test and documentation - - Improved documentation and man page +3) Build and Test: + - Support for C++11 and C++14 - Improved test harness and documentation - - Visual Studio test support + - Test support for Visual Studio - Cross compiling support - UNIX support (Solaris, FreeBSD and NetBSD) - - http test support (WIP) + - Http test support -3) New Additions +4) Additions: - contrib/vs2019 Visual Studio support + - contrib/Qt Qt sample project - .github/CONTRIBUTORS file - Defined security process (TBD) - - Exif 2.32 support (TBD) Detailed Change List since 0.27.2 --------------------------------- @@ -39,11 +44,11 @@ Future Releases I returned from retirement to undertake the 0.27.3 project. It's likely that I will work on 0.27.4 in Spring 2021. -Team Exiv2 are looking for contributors to work on Exiv2 v0.28 +Team Exiv2 is looking for contributors to work on Exiv2 v0.28 Robin Mills robin@clanmills.com -2020-04-27 +2020-05-23 ------------------------- Release Notes for v0.27.2 diff --git a/test/functions.source b/test/functions.source index f780cec5..ae23c6dd 100644 --- a/test/functions.source +++ b/test/functions.source @@ -2,6 +2,7 @@ # Library of bash functions use by test/*.sh # The scripts begin "source functions.source" +# Don't detab this file! removeTest() addModTest() need them! ## # run a test @@ -25,7 +26,7 @@ echoTest() { local count=1 for i in $@ ; do - echo $((count++)): $i + echo $((count++)): $i done echo ----------------------- } @@ -83,197 +84,197 @@ copyTestFiles() # result analysis reportTest() { - cat $results | tr '\\' '/' > ${results}-new - mv -f ${results}-new $results - if [ ! -z `which dos2unix` ]; then - dos2unix $results >/dev/null 2>&1 - fi - - if [ $# -eq 0 ]; then - lhs=$results - rhs=$good - else - if [ $# -eq 3 ] ; then - diffargs=$1 - lhs=$2 - rhs=$3 - else - lhs=$1 - rhs=$2 - fi - fi - - if [ "$PLATFORM" == "cygwin" ]; then - diff $diffargs $(cygpath -aw $lhs) $(cygpath -aw $rhs) - else - diff $diffargs $lhs $rhs - fi - rc=$? - if [ $rc -eq 0 ] ; then - echo "all testcases passed." - else - diff $diffargs $lhs $rhs + cat $results | tr '\\' '/' > ${results}-new + mv -f ${results}-new $results + if [ ! -z `which dos2unix` ]; then + dos2unix $results >/dev/null 2>&1 + fi + + if [ $# -eq 0 ]; then + lhs=$results + rhs=$good + else + if [ $# -eq 3 ] ; then + diffargs=$1 + lhs=$2 + rhs=$3 + else + lhs=$1 + rhs=$2 + fi + fi + + if [ "$PLATFORM" == "cygwin" ]; then + diff $diffargs $(cygpath -aw $lhs) $(cygpath -aw $rhs) + else + diff $diffargs $lhs $rhs + fi + rc=$? + if [ $rc -eq 0 ] ; then + echo "all testcases passed." + else + diff $diffargs $lhs $rhs exit 3 - fi + fi } ## # moved here from write-test.sh # Function: -# runTestCase number file +# runTestCase number file # Params: -# number: Test case number -# file : Input file +# number: Test case number +# file : Input file # Abstract: # Run the requested test case number with the given file runTestCase() { - rtc_number=$1 - rtc_infile=$2 + rtc_number=$1 + rtc_infile=$2 - rtc_outfile=test${rtc_number}.jpg - rtc_jpgthumb=thumb${rtc_number}.jpg - rtc_tifthumb=thumb${rtc_number}.tif + rtc_outfile=test${rtc_number}.jpg + rtc_jpgthumb=thumb${rtc_number}.jpg + rtc_tifthumb=thumb${rtc_number}.tif - rm -f $rtc_outfile $rtc_jpgthumb $rtc_tifthumb - rm -f iii ttt; + rm -f $rtc_outfile $rtc_jpgthumb $rtc_tifthumb + rm -f iii ttt; - echo "------------------------------------------------------------" - runTest exifprint $rtc_infile > iii; - cp $rtc_infile $rtc_outfile; - runTest write-test $rtc_infile $rtc_number > ttt; - diff $diffargs iii ttt + echo "------------------------------------------------------------" + runTest exifprint $rtc_infile > iii; + cp $rtc_infile $rtc_outfile; + runTest write-test $rtc_infile $rtc_number > ttt; + diff $diffargs iii ttt } ## # moved here from imagetest.sh eraseTest() { - src=$1 - test=${src}.etst - good=$datapath/${src}.egd + src=$1 + test=${src}.etst + good=$datapath/${src}.egd - #setup - cp $datapath/$src $test + #setup + cp $datapath/$src $test - #run tests - ${bin}metacopy $test $test + #run tests + ${bin}metacopy $test $test - #check results - diffCheck $test $good - printf "." + #check results + diffCheck $test $good + printf "." } copyTest() { - num=$1 # case number - src=$2 # input file - dst=$3 # copy to hear - test=${dst}.c${num}tst - good=$datapath/${dst}.c${num}gd + num=$1 # case number + src=$2 # input file + dst=$3 # copy to hear + test=${dst}.c${num}tst + good=$datapath/${dst}.c${num}gd - #setup - cp $datapath/$dst $test + #setup + cp $datapath/$dst $test - #run tests - ${bin}metacopy -a $datapath/$src $test + #run tests + ${bin}metacopy -a $datapath/$src $test - #check results - diffCheck $test $good - printf "." + #check results + diffCheck $test $good + printf "." } iptcTest() { - num=$1 # case number - src=$2 # input file - dst=$3 # copy to hear - test=${dst}.i${num}tst - good=$datapath/${dst}.i${num}gd + num=$1 # case number + src=$2 # input file + dst=$3 # copy to hear + test=${dst}.i${num}tst + good=$datapath/${dst}.i${num}gd - #setup - cp $datapath/$dst $test + #setup + cp $datapath/$dst $test - #run tests - runTest metacopy -ip $datapath/$src $test + #run tests + runTest metacopy -ip $datapath/$src $test - #check results - diffCheck $test $good - printf "." + #check results + diffCheck $test $good + printf "." } ## # Make sure to pass the test file first and the known good file second diffCheck() { - test=$(real_path $1) - good=$(real_path $2) - if [ -z "$errors" ]; then let -a errors=0; fi - - #run diff and check results - if [ $PLATFORM == SunOS ]; then - bdiff $diffargs "$test" "$good" - elif [ $PLATFORM == FreeBSD -o $PLATFORM == NetBSD ]; then - diff $diffargs "$test" "$good" - else - diff --binary $diffargs "$test" "$good" - fi - if [ $? -ne 0 ]; then - errors=$(expr $errors + 1) - else - rm $test - fi + test=$(real_path $1) + good=$(real_path $2) + if [ -z "$errors" ]; then let -a errors=0; fi + + #run diff and check results + if [ $PLATFORM == SunOS ]; then + bdiff $diffargs "$test" "$good" + elif [ $PLATFORM == FreeBSD -o $PLATFORM == NetBSD ]; then + diff $diffargs "$test" "$good" + else + diff --binary $diffargs "$test" "$good" + fi + if [ $? -ne 0 ]; then + errors=$(expr $errors + 1) + else + rm $test + fi } ## # moved here from iotest.sh ioTest() { - src=$datapath/$1 - out1=${1}.1 - out2=${1}.2 - - #run tests - runTest iotest $src $out1 $out2 - if [ $? -ne 0 ]; then - errors=`expr $errors + 1` - return - fi - - #check results - diffCheck $out1 $src - diffCheck $out2 $src - printf "." + src=$datapath/$1 + out1=${1}.1 + out2=${1}.2 + + #run tests + runTest iotest $src $out1 $out2 + if [ $? -ne 0 ]; then + errors=`expr $errors + 1` + return + fi + + #check results + diffCheck $out1 $src + diffCheck $out2 $src + printf "." } ## # moved here from iptctest.sh printTest() { - src=$1 - test=${src}.iptst - good=$datapath/${src}.ipgd + src=$1 + test=${src}.iptst + good=$datapath/${src}.ipgd - #run tests - runTest iptcprint $datapath/$src > $test + #run tests + runTest iptcprint $datapath/$src > $test - #check results - diffCheck $test $good - printf "." + #check results + diffCheck $test $good + printf "." } removeTest() { - src=$1 - tmp="temp" - test=${src}.irtst - good=$datapath/${src}.irgd + src=$1 + tmp="temp" + test=${src}.irtst + good=$datapath/${src}.irgd - #setup - cp $datapath/$src $tmp + #setup + cp $datapath/$src $tmp - #run tests - runTest iptctest $tmp <<-eoc + #run tests + runTest iptctest $tmp <<-eoc r Iptc.Application2.Byline r Iptc.Application2.Caption r Iptc.Application2.Keywords @@ -281,61 +282,61 @@ removeTest() r Iptc.Application2.Keywords r Iptc.Application2.CountryName eoc - runTest iptcprint $tmp > $test + runTest iptcprint $tmp > $test - #check results - diffCheck $test $good - printf "." - rm $tmp + #check results + diffCheck $test $good + printf "." + rm $tmp } addModTest() { - src=$1 - tmp="temp" - test=${src}.iatst - good=$datapath/${src}.iagd - - #setup - cp $datapath/$src $tmp - - #run tests - runTest iptctest $tmp <<-eoc - a Iptc.Application2.Headline The headline I am - a Iptc.Application2.Keywords Yet another keyword - m Iptc.Application2.DateCreated 2004-8-3 - a Iptc.Application2.Urgency 3 - m Iptc.Application2.SuppCategory "bla bla ba" - a Iptc.Envelope.ModelVersion 2 - a Iptc.Envelope.TimeSent 14:41:0-05:00 + src=$1 + tmp="temp" + test=${src}.iatst + good=$datapath/${src}.iagd + + #setup + cp $datapath/$src $tmp + + #run tests + runTest iptctest $tmp <<-eoc + a Iptc.Application2.Headline The headline I am + a Iptc.Application2.Keywords Yet another keyword + m Iptc.Application2.DateCreated 2004-8-3 + a Iptc.Application2.Urgency 3 + m Iptc.Application2.SuppCategory "bla bla ba" + a Iptc.Envelope.ModelVersion 2 + a Iptc.Envelope.TimeSent 14:41:0-05:00 a Iptc.Application2.RasterizedCaption 230 42 34 2 90 84 23 146 eoc - runTest iptcprint $tmp > $test + runTest iptcprint $tmp > $test - #check results - diffCheck $test $good - printf "." - rm $tmp + #check results + diffCheck $test $good + printf "." + rm $tmp } extendedTest() { - src=$1 - tmp="temp" - test=${src}.ixtst - good=$datapath/${src}.ixgd - - #setup - cp $datapath/$src $tmp - - #run tests - runTest iptctest $tmp < $datapath/ext.dat - runTest iptcprint $tmp > $test - - #check results - diffCheck $test $good - printf "." - rm $tmp + src=$1 + tmp="temp" + test=${src}.ixtst + good=$datapath/${src}.ixgd + + #setup + cp $datapath/$src $tmp + + #run tests + runTest iptctest $tmp < $datapath/ext.dat + runTest iptcprint $tmp > $test + + #check results + diffCheck $test $good + printf "." + rm $tmp } ## @@ -369,54 +370,54 @@ real_path () else readlink -f "$1" fi - fi + fi } ## # print checksum for one file checkSum() { - if [ "$PLATFORM" == 'NetBSD' -o "$PLATFORM" == 'FreeBSD' -o "$PLATFORM" == 'Darwin' ]; then - md5 -q $1 - else - md5sum $1 | cut -d' ' -f 1 - fi + if [ "$PLATFORM" == 'NetBSD' -o "$PLATFORM" == 'FreeBSD' -o "$PLATFORM" == 'Darwin' ]; then + md5 -q $1 + else + md5sum $1 | cut -d' ' -f 1 + fi } ## # startHttpServer - power up the python web server startHttpServer() { - cd "${testdir}/.." # testdir is the tmp output directory - - # PLATFORM = the scripting host (eg mingw) - # host = the build host (eg windows for msvc) - if [ $PLATFORM == 'cygwin' -o $PLATFORM == 'mingw' ]; then - host=$(runTest exiv2 -vVg platform | tail -1 | cut -d= -f 2) # windows - fi - if [ "$host" != windows ]; then host="$PLATFORM" ; fi - - if [ "$host" == "cygwin" ]; then dport=12762 - elif [ "$host" == "mingw" ]; then dport=12761 - else dport=12760 - fi - - if [ ! -z $EXIV2_PORT ]; then port=$EXIV2_PORT ; else port=$dport ; fi - if [ ! -z $EXIV2_HTTP ]; then http=$EXIV2_HTTP ; else http=http://localhost; fi - exiv2_url=$http:$port - python3 -m http.server $port & # start a background local HTTP server in the "real" test directory - sleep 2 # wait for it to init or die! - exiv2_httpServer=$! - # ask the server to reply - echo $exiv2_url status = $(python3 -c "import urllib.request;print(urllib.request.urlopen('$exiv2_url/').status)") + cd "${testdir}/.." # testdir is the tmp output directory + + # PLATFORM = the scripting host (eg mingw) + # host = the build host (eg windows for msvc) + if [ $PLATFORM == 'cygwin' -o $PLATFORM == 'mingw' ]; then + host=$(runTest exiv2 -vVg platform | tail -1 | cut -d= -f 2) # windows + fi + if [ "$host" != windows ]; then host="$PLATFORM" ; fi + + if [ "$host" == "cygwin" ]; then dport=12762 + elif [ "$host" == "mingw" ]; then dport=12761 + else dport=12760 + fi + + if [ ! -z $EXIV2_PORT ]; then port=$EXIV2_PORT ; else port=$dport ; fi + if [ ! -z $EXIV2_HTTP ]; then http=$EXIV2_HTTP ; else http=http://localhost; fi + exiv2_url=$http:$port + python3 -m http.server $port & # start a background local HTTP server in the "real" test directory + sleep 2 # wait for it to init or die! + exiv2_httpServer=$! + # ask the server to reply + echo $exiv2_url status = $(python3 -c "import urllib.request;print(urllib.request.urlopen('$exiv2_url/').status)") } ## # closeHttpServer - power down the python web server closeHttpServer() { - if [ ! -z $exiv2_httpServer ]; then - echo kill exiv2_httpServer $exiv2_httpServer - kill $exiv2_httpServer # kill the server - fi + if [ ! -z $exiv2_httpServer ]; then + echo kill exiv2_httpServer $exiv2_httpServer + kill $exiv2_httpServer # kill the server + fi } ## @@ -454,22 +455,22 @@ prepareTest() datadir="../data" if [ -z "$EXIV2_BINDIR" ] ; then - bin="$here/../build/bin/" + bin="$here/../build/bin/" else bin="$EXIV2_BINDIR/" fi - # update PATHs to ensure we load the the correct dynamlic library - if [ $PLATFORM == 'mingw' -a $PLATFORM == 'cygwin' ]; then - export PATH="$bin:$PATH" - elif [ 'PLATFORM' == 'Darwin' ]; then - export DYLD_LIBRARY_PATH="$bin/../lib:$DYLD_LIBRARY_PATH" - else - export LD_LIBRARY_PATH="$bin/../lib:$LD_LIBRARY_PATH" - fi - - ## - # figure out arguments for diff + # update PATHs to ensure we load the the correct dynamlic library + if [ $PLATFORM == 'mingw' -a $PLATFORM == 'cygwin' ]; then + export PATH="$bin:$PATH" + elif [ 'PLATFORM' == 'Darwin' ]; then + export DYLD_LIBRARY_PATH="$bin/../lib:$DYLD_LIBRARY_PATH" + else + export LD_LIBRARY_PATH="$bin/../lib:$LD_LIBRARY_PATH" + fi + + ## + # figure out arguments for diff good="$here/data/${this}.out" results="$here/tmp/${this}.out" mkdir -p $here/tmp @@ -477,8 +478,8 @@ prepareTest() echo '' >> $tmpfile if [ "$PLATFORM" == SunOS -o "$PLATFORM" == FreeBSD -o "$PLATFORM" == NetBSD ] ; then - da1="" - da2="" + da1="" + da2="" else diffargs="--strip-trailing-cr" diff -q $diffargs $tmpfile $tmpfile 2>/dev/null @@ -498,9 +499,9 @@ prepareTest() fi diffargs="$da1 $da2" - ## - # test that exiv2 and some sample apps are in the bin! - for e in exiv2 exifprint easyaccess-test metacopy ; do + ## + # test that exiv2 and some sample apps are in the bin! + for e in exiv2 exifprint easyaccess-test metacopy ; do e="${bin}${e}${exe}" if [ ! -e "$e" ]; then echo '******************************************' @@ -508,7 +509,7 @@ prepareTest() echo '******************************************' exit 42 fi - done + done } prepareTest