Hello community, here is the log from the commit of package ghc-hsexif for openSUSE:Factory checked in at 2017-05-10 20:48:09 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-hsexif (Old) and /work/SRC/openSUSE:Factory/.ghc-hsexif.new (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-hsexif" Wed May 10 20:48:09 2017 rev:2 rq:489356 version:0.6.1.1 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-hsexif/ghc-hsexif.changes 2017-04-12 17:12:28.890982644 +0200 +++ /work/SRC/openSUSE:Factory/.ghc-hsexif.new/ghc-hsexif.changes 2017-05-10 20:48:10.298708670 +0200 @@ -1,0 +2,20 @@ +Mon Mar 27 12:41:03 UTC 2017 - psim...@suse.com + +- Update to version 0.6.1.1 with cabal2obs. + +------------------------------------------------------------------- +Mon Feb 20 08:41:35 UTC 2017 - psim...@suse.com + +- Update to version 0.6.1.0 with cabal2obs. + +------------------------------------------------------------------- +Thu Oct 27 15:54:51 UTC 2016 - psim...@suse.com + +- Update to version 0.6.0.10 with cabal2obs. + +------------------------------------------------------------------- +Tue Oct 11 08:49:46 UTC 2016 - psim...@suse.com + +- Update to version 0.6.0.9 with cabal2obs. + +------------------------------------------------------------------- Old: ---- hsexif-0.6.0.8.tar.gz New: ---- hsexif-0.6.1.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-hsexif.spec ++++++ --- /var/tmp/diff_new_pack.JGH3p5/_old 2017-05-10 20:48:12.142448507 +0200 +++ /var/tmp/diff_new_pack.JGH3p5/_new 2017-05-10 20:48:12.146447942 +0200 @@ -1,7 +1,7 @@ # # spec file for package ghc-hsexif # -# Copyright (c) 2016 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2017 SUSE LINUX GmbH, Nuernberg, Germany. # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,15 +19,14 @@ %global pkg_name hsexif %bcond_with tests Name: ghc-%{pkg_name} -Version: 0.6.0.8 +Version: 0.6.1.1 Release: 0 Summary: EXIF handling library in pure Haskell License: BSD-3-Clause -Group: System/Libraries +Group: Development/Languages/Other Url: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz BuildRequires: ghc-Cabal-devel -# Begin cabal-rpm deps: BuildRequires: ghc-binary-devel BuildRequires: ghc-bytestring-devel BuildRequires: ghc-containers-devel @@ -40,7 +39,6 @@ BuildRequires: ghc-HUnit-devel BuildRequires: ghc-hspec-devel %endif -# End cabal-rpm deps %description The hsexif library provides functions for working with EXIF data contained in @@ -60,20 +58,14 @@ %prep %setup -q -n %{pkg_name}-%{version} - %build %ghc_lib_build - %install %ghc_lib_install - %check -%if %{with tests} -%{cabal} test -%endif - +%cabal_test %post devel %ghc_pkg_recache ++++++ hsexif-0.6.0.8.tar.gz -> hsexif-0.6.1.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hsexif-0.6.0.8/Graphics/HsExif.hs new/hsexif-0.6.1.1/Graphics/HsExif.hs --- old/hsexif-0.6.0.8/Graphics/HsExif.hs 2016-03-10 23:01:07.000000000 +0100 +++ new/hsexif-0.6.1.1/Graphics/HsExif.hs 2017-03-20 16:14:21.000000000 +0100 @@ -185,13 +185,15 @@ getExif :: Get (Map ExifTag ExifValue) getExif = do - header <- getWord16be - unless (header == 0xffd8) - $ fail "Not a JPEG file" - findAndParseExifBlock + firstBytes <- lookAhead $ (,) <$> getWord16be <*> getWord16be + case firstBytes of + (0xffd8,_ ) -> getWord16be >> findAndParseExifBlockJPEG + (0x4d4d,42) -> findAndParseExifBlockNEF + (0x4949,42) -> findAndParseExifBlockNEF + _ -> fail "Not a JPEG or NEF file" -findAndParseExifBlock :: Get (Map ExifTag ExifValue) -findAndParseExifBlock = do +findAndParseExifBlockJPEG :: Get (Map ExifTag ExifValue) +findAndParseExifBlockJPEG = do markerNumber <- getWord16be dataSize <- fromIntegral . toInteger <$> getWord16be case markerNumber of @@ -199,7 +201,10 @@ -- ffda is Start Of Stream => image -- I expect no more EXIF data after this point. 0xffda -> fail "No EXIF in JPEG" - _ -> skip (dataSize-2) >> findAndParseExifBlock + _ -> skip (dataSize-2) >> findAndParseExifBlockJPEG + +findAndParseExifBlockNEF :: Get (Map ExifTag ExifValue) +findAndParseExifBlockNEF = parseTiff data ByteAlign = Intel | Motorola @@ -221,6 +226,10 @@ nul <- toInteger <$> getWord16be unless (header == Char8.pack "Exif" && nul == 0) $ fail "invalid EXIF header" + parseTiff + +parseTiff :: Get (Map ExifTag ExifValue) +parseTiff = do tiffHeaderStart <- fromIntegral <$> bytesRead byteAlign <- parseTiffHeader let subIfdParse = parseSubIFD byteAlign tiffHeaderStart diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hsexif-0.6.0.8/hsexif.cabal new/hsexif-0.6.1.1/hsexif.cabal --- old/hsexif-0.6.0.8/hsexif.cabal 2016-03-10 23:01:07.000000000 +0100 +++ new/hsexif-0.6.1.1/hsexif.cabal 2017-03-20 16:26:35.000000000 +0100 @@ -1,5 +1,5 @@ name: hsexif -version: 0.6.0.8 +version: 0.6.1.1 synopsis: EXIF handling library in pure Haskell description: The hsexif library provides functions for working with EXIF data contained in JPEG files. Currently it only supports reading the data. @@ -11,7 +11,7 @@ -- copyright: category: Graphics build-type: Simple -extra-source-files: tests/*.jpg tests/*.png +extra-source-files: tests/*.jpg tests/*.png tests/*.NEF cabal-version: >=1.10 Flag iconv @@ -44,7 +44,7 @@ default-language: Haskell2010 build-depends: base, hspec, - HUnit >= 1.2 && <1.4, + HUnit >= 1.2 && <1.7, binary >=0.7 && <0.9, bytestring >=0.10 && <0.11, containers >= 0.5 && <0.6, Binary files old/hsexif-0.6.0.8/tests/RAW_NIKON_D1.NEF and new/hsexif-0.6.1.1/tests/RAW_NIKON_D1.NEF differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hsexif-0.6.0.8/tests/Tests.hs new/hsexif-0.6.1.1/tests/Tests.hs --- old/hsexif-0.6.0.8/tests/Tests.hs 2016-03-10 23:01:07.000000000 +0100 +++ new/hsexif-0.6.1.1/tests/Tests.hs 2017-03-20 16:14:21.000000000 +0100 @@ -5,6 +5,7 @@ import qualified Data.ByteString.Lazy as B import qualified Data.ByteString as BS import Data.Text (Text) +import qualified Data.Text as T import qualified Data.Map as Map import Data.Map (Map) import Data.Time.LocalTime @@ -21,16 +22,18 @@ main = do imageContents <- B.readFile "tests/test.jpg" noExif <- B.readFile "tests/noexif.jpg" - png <- B.readFile "tests/test.png" - gps <- B.readFile "tests/gps.jpg" + png <- B.readFile "tests/test.png" + gps <- B.readFile "tests/gps.jpg" gps2 <- B.readFile "tests/gps2.jpg" gps3 <- B.readFile "tests/gps3.jpg" partial <- B.readFile "tests/partial_exif.jpg" - let parseExifM = hush . parseExif - let exifData = parseExifM imageContents - let gpsExifData = parseExifM gps + tiff <- B.readFile "tests/RAW_NIKON_D1.NEF" + let parseExifM = hush . parseExif + let exifData = parseExifM imageContents + let gpsExifData = parseExifM gps let gps2ExifData = parseExifM gps2 let gps3ExifData = parseExifM gps3 + let tiffExifData = parseExifM tiff hspec $ do describe "not a JPG" $ testNotAJpeg png describe "no EXIF" $ testNoExif noExif @@ -46,10 +49,11 @@ describe "pretty printing" $ testPrettyPrint gpsExifData exifData gps2ExifData describe "flash fired" $ testFlashFired exifData describe "partial exif data" $ testPartialExif partial + describe "tiff file" $ testNef tiffExifData testNotAJpeg :: B.ByteString -> Spec testNotAJpeg imageContents = it "returns empty list if not a JPEG" $ - assertEqual' (Left "Not a JPEG file") (parseExif imageContents) + assertEqual' (Left "Not a JPEG or NEF file") (parseExif imageContents) testNoExif :: B.ByteString -> Spec testNoExif imageContents = it "returns empty list if no EXIF" $ @@ -206,14 +210,69 @@ testPartialExif imageContents = it "parses a partial exif JPEG" $ assertEqual' (Right []) (Map.toList <$> parseExif imageContents) +testNef :: Maybe (Map ExifTag ExifValue) -> Spec +testNef Nothing = it "parses EXIF from a NEF file" $ + assertBool "failed to parse EXIF from nef" False +testNef (Just exifMap) = it "parses EXIF from a NEF file" $ do + let makerNoteV = Map.lookup makerNote exifMap >>= getUndefMaybe + -- test only the length of the maker note + assertEqual' (Just 394) (BS.length <$> makerNoteV) + let cleanedExifMap = filter ((/=makerNote) . fst) (Map.toList exifMap) + assertEqualListDebug + (sort [(exposureTime, ExifRational 10 2500), + (fnumber, ExifRational 76 10), + (exposureProgram, ExifNumber 2), + (dateTimeOriginal, ExifText "2000:11:19 13:01:50"), + (dateTimeDigitized, ExifText "2000:11:19 13:01:50"), + (exposureBiasValue, ExifRational 0 6), + (maxApertureValue, ExifRational 30 10), + (meteringMode, ExifNumber 5), + (focalLength, ExifRational 200 10), + (userComment, ExifUndefined $ BS.concat $ replicate 48 "\NUL"), + (subSecTime, ExifText "24"), + (subSecTimeOriginal, ExifText "24"), + (subSecTimeDigitized, ExifText "24"), + (sensingMethod, ExifNumber 2), + (fileSource, ExifUndefined "\ETX"), + (sceneType, ExifUndefined "\SOH"), + (cfaPattern, ExifUndefined "\NUL\STX\NUL\STX\STX\SOH\SOH\NUL"), + (ExifTag IFD0 Nothing 0xfe (T.pack . show), ExifNumber 1), + (ExifTag IFD0 Nothing 0x100 (T.pack . show), ExifNumber 160), + (ExifTag IFD0 Nothing 0x101 (T.pack . show), ExifNumber 120), + (ExifTag IFD0 Nothing 0x102 (T.pack . show), ExifNumberList [8,8,8]), + (ExifTag IFD0 Nothing 0x103 (T.pack . show), ExifNumber 1), + (ExifTag IFD0 Nothing 0x106 (T.pack . show), ExifNumber 2), + (imageDescription, ExifText " "), + (make, ExifText "NIKON CORPORATION"), + (model, ExifText "NIKON D1 "), + (ExifTag IFD0 Nothing 0x111 (T.pack . show), ExifNumber 1280), + (ExifTag IFD0 Nothing 0x115 (T.pack . show), ExifNumber 3), + (ExifTag IFD0 Nothing 0x116 (T.pack . show), ExifNumber 120), + (ExifTag IFD0 Nothing 0x117 (T.pack . show), ExifNumber 57600), + (xResolution, ExifRational 300 1), + (yResolution, ExifRational 300 1), + (ExifTag IFD0 Nothing 0x11c (T.pack . show), ExifNumber 1), + (resolutionUnit, ExifNumber 2), + (software, ExifText "Ver.1.05\0"), + (dateTime, ExifText "2000:11:19 13:01:50"), + (ExifTag IFD0 Nothing 0x14a (T.pack . show), ExifNumber 58880), + (referenceBlackWhite, ExifRationalList [(0,1),(255,1),(0,1),(255,1),(0,1),(255,1)]), + (copyright, ExifText "Copyright,NIKON CORPORATION,1999\0"), + (exifIfdOffset, ExifNumber 528), + (ExifTag IFD0 Nothing 0x9003 (T.pack . show), ExifText "2000:11:19 13:01:50"), + (ExifTag IFD0 Nothing 0x9216 (T.pack . show), ExifNumberList [1,0,0,0]) + ]) + (sort cleanedExifMap) + assertEqualListDebug :: (Show a, Eq a) => [a] -> [a] -> Assertion assertEqualListDebug = assertEqualListDebug' (0 :: Int) where assertEqualListDebug' idx (x:xs) (y:ys) = do - assertEqual ("index " ++ show idx ++ " differs: " ++ show x ++ " /= " ++ show y) x y + assertEqual ("lengths are off by " ++ show (length ys - length xs) ++ + "; index " ++ show idx ++ " differs: " ++ show x ++ " /= " ++ show y) x y assertEqualListDebug' (idx+1) xs ys - assertEqualListDebug' _ (x:_) [] = assertBool ("List lengths differ, expected " ++ show x) False - assertEqualListDebug' _ [] (y:_) = assertBool ("List lengths differ, got " ++ show y) False + assertEqualListDebug' _ (x:r) [] = assertBool ("List lengths differ by " ++ show (length r) ++ ", expected " ++ show x) False + assertEqualListDebug' _ [] (y:r) = assertBool ("List lengths differ by " ++ show (length r) ++ ", got " ++ show y) False assertEqualListDebug' _ [] [] = assertBool "" True assertEqual' :: (Show a, Eq a) => a -> a -> Assertion