commit ghc-zip-archive for openSUSE:Factory
Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package ghc-zip-archive for openSUSE:Factory checked in at 2022-08-01 21:29:05 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/ghc-zip-archive (Old) and /work/SRC/openSUSE:Factory/.ghc-zip-archive.new.1533 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Package is "ghc-zip-archive" Mon Aug 1 21:29:05 2022 rev:20 rq:985834 version:0.4.2.1 Changes: -------- --- /work/SRC/openSUSE:Factory/ghc-zip-archive/ghc-zip-archive.changes 2020-12-22 11:49:47.322023616 +0100 +++ /work/SRC/openSUSE:Factory/.ghc-zip-archive.new.1533/ghc-zip-archive.changes 2022-08-01 21:29:13.097453230 +0200 @@ -1,0 +2,31 @@ +Thu Mar 3 00:30:15 UTC 2022 - Peter Simons <psimons@suse.com> + +- Update zip-archive to version 0.4.2.1. + zip-archive 0.4.2.1 + + * Fix Windows build regression (#61). + + zip-archive 0.4.2 + + * Fix problem with files with colon (#89). + * Remove build-tools. This was used to indicate that the 'unzip' + executable was needed for testing, but it was never intended to be used + this way and now the field is deprecated. The current test suite + simply skips the test using the unzip executable (with a warning) if + 'unzip' is not in the path. + * Remove existing symlinks when extracting zip files with symlinks (#60, + Vikrem). Previously, writeEntry would raise an error if it tried to + create a symlink and a symlink already existed at that path. This + behavior was inconsistent with its behavior for regular files, which + it overwrote without comment. This commit causes symlinks to be replaced + by writeEntry instead of an error being raised. + * Remove binary < 0.6 CPP. It's no longer needed because we don't support + binary < 0.6. Also use manySig instead of many, to get better error + messages. + * Add type annotation for printf. + * Better checking for unsafe paths (#55). This method allows things like + `foo/bar/../../baz`. + * Require base >= 4.5 (#56) + * Add GitHub CI. + +------------------------------------------------------------------- Old: ---- zip-archive-0.4.1.tar.gz zip-archive.cabal New: ---- zip-archive-0.4.2.1.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-zip-archive.spec ++++++ --- /var/tmp/diff_new_pack.UE0QiA/_old 2022-08-01 21:29:13.513454424 +0200 +++ /var/tmp/diff_new_pack.UE0QiA/_new 2022-08-01 21:29:13.517454435 +0200 @@ -1,7 +1,7 @@ # # spec file for package ghc-zip-archive # -# Copyright (c) 2020 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,13 +19,12 @@ %global pkg_name zip-archive %bcond_with tests Name: ghc-%{pkg_name} -Version: 0.4.1 +Version: 0.4.2.1 Release: 0 Summary: Library for creating and modifying zip archives License: BSD-3-Clause URL: https://hackage.haskell.org/package/%{pkg_name} Source0: https://hackage.haskell.org/package/%{pkg_name}-%{version}/%{pkg_name}-%{version}.tar.gz -Source1: https://hackage.haskell.org/package/%{pkg_name}-%{version}/revision/1.cabal#/%{pkg_name}.cabal BuildRequires: ghc-Cabal-devel BuildRequires: ghc-array-devel BuildRequires: ghc-binary-devel @@ -82,7 +81,6 @@ %prep %autosetup -n %{pkg_name}-%{version} -cp -p %{SOURCE1} %{pkg_name}.cabal %build %ghc_lib_build ++++++ zip-archive-0.4.1.tar.gz -> zip-archive-0.4.2.1.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zip-archive-0.4.1/changelog new/zip-archive-0.4.2.1/changelog --- old/zip-archive-0.4.1/changelog 2019-04-23 08:10:30.000000000 +0200 +++ new/zip-archive-0.4.2.1/changelog 2022-03-03 01:29:35.000000000 +0100 @@ -1,3 +1,30 @@ +zip-archive 0.4.2.1 + + * Fix Windows build regression (#61). + +zip-archive 0.4.2 + + * Fix problem with files with colon (#89). + * Remove build-tools. This was used to indicate that the 'unzip' + executable was needed for testing, but it was never intended to be used + this way and now the field is deprecated. The current test suite + simply skips the test using the unzip executable (with a warning) if + 'unzip' is not in the path. + * Remove existing symlinks when extracting zip files with symlinks (#60, + Vikrem). Previously, writeEntry would raise an error if it tried to + create a symlink and a symlink already existed at that path. This + behavior was inconsistent with its behavior for regular files, which + it overwrote without comment. This commit causes symlinks to be replaced + by writeEntry instead of an error being raised. + * Remove binary < 0.6 CPP. It's no longer needed because we don't support + binary < 0.6. Also use manySig instead of many, to get better error + messages. + * Add type annotation for printf. + * Better checking for unsafe paths (#55). This method allows things like + `foo/bar/../../baz`. + * Require base >= 4.5 (#56) + * Add GitHub CI. + zip-archive 0.4.1 * writEntry behavior change: Improve raising of UnsafePath error (#55). diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zip-archive-0.4.1/src/Codec/Archive/Zip.hs new/zip-archive-0.4.2.1/src/Codec/Archive/Zip.hs --- old/zip-archive-0.4.1/src/Codec/Archive/Zip.hs 2019-04-23 08:10:30.000000000 +0200 +++ new/zip-archive-0.4.2.1/src/Codec/Archive/Zip.hs 2022-03-03 01:21:09.000000000 +0100 @@ -90,11 +90,11 @@ import System.IO ( stderr, hPutStrLn ) import qualified Data.Digest.CRC32 as CRC32 import qualified Data.Map as M -#if MIN_VERSION_binary(0,6,0) import Control.Applicative -#endif -#ifndef _WINDOWS -import System.Posix.Files ( setFileTimes, setFileMode, fileMode, getSymbolicLinkStatus, symbolicLinkMode, readSymbolicLink, isSymbolicLink, unionFileModes, createSymbolicLink ) +#ifdef _WINDOWS +import Data.Char (isLetter) +#else +import System.Posix.Files ( setFileTimes, setFileMode, fileMode, getSymbolicLinkStatus, symbolicLinkMode, readSymbolicLink, isSymbolicLink, unionFileModes, createSymbolicLink, removeLink ) import System.Posix.Types ( CMode(..) ) import Data.List (partition) import Data.Maybe (fromJust) @@ -111,8 +111,8 @@ -- from zlib import qualified Codec.Compression.Zlib.Raw as Zlib +import System.IO.Error (isAlreadyExistsError) -#if !MIN_VERSION_binary(0, 6, 0) manySig :: Word32 -> Get a -> Get [a] manySig sig p = do sig' <- lookAhead getWord32le @@ -122,7 +122,6 @@ rs <- manySig sig p return $ r : rs else return [] -#endif ------------------------------------------------------------------------ @@ -335,13 +334,32 @@ when (OptVerbose `elem` opts) $ do let compmethod = case eCompressionMethod entryE of - Deflate -> "deflated" + Deflate -> ("deflated" :: String) NoCompression -> "stored" hPutStrLn stderr $ printf " adding: %s (%s %.f%%)" (eRelativePath entryE) compmethod (100 - (100 * compressionRatio entryE)) return entryE +-- check path, resolving .. and . components, raising +-- UnsafePath exception if this takes you outside of the root. +checkPath :: FilePath -> IO () +checkPath fp = + maybe (E.throwIO (UnsafePath fp)) (\_ -> return ()) + (resolve . splitDirectories $ fp) + where + resolve = + fmap reverse . foldl go (return []) + where + go acc x = do + xs <- acc + case x of + "." -> return xs + ".." -> case xs of + [] -> fail "outside of root path" + (_:ys) -> return ys + _ -> return (x:xs) + -- | Writes contents of an 'Entry' to a file. Throws a -- 'CRC32Mismatch' exception if the CRC32 checksum for the entry -- does not match the uncompressed data. @@ -350,15 +368,11 @@ when (isEncryptedEntry entry) $ E.throwIO $ CannotWriteEncryptedEntry (eRelativePath entry) let relpath = eRelativePath entry - let isUnsafePath = ".." `elem` splitDirectories relpath - when isUnsafePath $ - E.throwIO $ UnsafePath relpath + checkPath relpath path <- case [d | OptDestination d <- opts] of - (x:_) -> return (x </> relpath) - _ | isAbsolute relpath - -> E.throwIO $ UnsafePath relpath - | otherwise - -> return relpath + (x:_) -> return (x </> relpath) + [] | isAbsolute relpath -> E.throwIO $ UnsafePath relpath + | otherwise -> return relpath -- create directories if needed let dir = takeDirectory path exists <- doesDirectoryExist dir @@ -405,10 +419,18 @@ let symlinkPath = prefixPath </> eRelativePath entry when (OptVerbose `elem` opts) $ do hPutStrLn stderr $ "linking " ++ symlinkPath ++ " to " ++ targetPath - createSymbolicLink targetPath symlinkPath + forceSymLink targetPath symlinkPath else writeEntry opts entry +-- | Writes a symbolic link, but removes any conflicting files and retries if necessary. +forceSymLink :: FilePath -> FilePath -> IO () +forceSymLink target linkName = + createSymbolicLink target linkName `E.catch` + (\e -> if isAlreadyExistsError e + then removeLink linkName >> createSymbolicLink target linkName + else ioError e) + -- | Get the target of a 'Entry' representing a symbolic link. This might fail -- if the 'Entry' does not represent a symbolic link symbolicLinkEntryTarget :: Entry -> Maybe FilePath @@ -467,7 +489,13 @@ normalizePath path = let dir = takeDirectory path fn = takeFileName path - (_drive, dir') = splitDrive dir + dir' = case dir of +#ifdef _WINDOWS + (c:':':d:xs) | isLetter c + , d == '/' || d == '\\' + -> xs -- remove drive +#endif + _ -> dir -- note: some versions of filepath return ["."] if no dir dirParts = filter (/=".") $ splitDirectories dir' in intercalate "/" (dirParts ++ [fn]) @@ -661,15 +689,9 @@ getArchive :: Get Archive getArchive = do -#if MIN_VERSION_binary(0,6,0) - locals <- many getLocalFile - files <- many (getFileHeader (M.fromList locals)) - digSig <- Just `fmap` getDigitalSignature <|> return Nothing -#else locals <- manySig 0x04034b50 getLocalFile files <- manySig 0x02014b50 (getFileHeader (M.fromList locals)) - digSig <- lookAheadM getDigitalSignature -#endif + digSig <- Just `fmap` getDigitalSignature <|> return Nothing endSig <- getWord32le unless (endSig == 0x06054b50) $ fail "Did not find end of central directory signature" @@ -776,7 +798,6 @@ return (fromIntegral offset, compressedData) getWordsTilSig :: Word32 -> Get B.ByteString -#if MIN_VERSION_binary(0, 6, 0) getWordsTilSig sig = (B.fromChunks . reverse) `fmap` go Nothing [] where sig' = S.pack [fromIntegral $ sig .&. 0xFF, @@ -824,17 +845,6 @@ where len = S.length chunk prefixes' = Just $ (S.index chunk (len - 3), S.index chunk (len - 2), S.index chunk (len - 1)) -#else -getWordsTilSig sig = B.pack `fmap` go [] - where - go acc = do - sig' <- lookAhead getWord32le - if sig == sig' - then skip 4 >> return (reverse acc) - else do - w <- getWord8 - go (w:acc) -#endif putLocalFile :: Entry -> Put putLocalFile f = do @@ -974,22 +984,11 @@ -- > size of data 2 bytes -- > signature data (variable size) -#if MIN_VERSION_binary(0,6,0) getDigitalSignature :: Get B.ByteString getDigitalSignature = do getWord32le >>= ensure (== 0x05054b50) sigSize <- getWord16le getLazyByteString (toEnum $ fromEnum sigSize) -#else -getDigitalSignature :: Get (Maybe B.ByteString) -getDigitalSignature = do - hdrSig <- getWord32le - if hdrSig /= 0x05054b50 - then return Nothing - else do - sigSize <- getWord16le - getLazyByteString (toEnum $ fromEnum sigSize) >>= return . Just -#endif putDigitalSignature :: Maybe B.ByteString -> Put putDigitalSignature Nothing = return () diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zip-archive-0.4.1/tests/test-zip-archive.hs new/zip-archive-0.4.2.1/tests/test-zip-archive.hs --- old/zip-archive-0.4.1/tests/test-zip-archive.hs 2019-04-23 08:10:30.000000000 +0200 +++ new/zip-archive-0.4.2.1/tests/test-zip-archive.hs 2022-03-03 01:17:35.000000000 +0100 @@ -4,7 +4,6 @@ -- runghc Test.hs import Codec.Archive.Zip -import Control.Applicative import Control.Monad (unless) import Control.Exception (try) import System.Directory hiding (isSymbolicLink) @@ -73,6 +72,7 @@ , testExtractFilesWithPosixAttrs , testArchiveExtractSymlinks , testExtractExternalZipWithSymlinks + , testExtractOverwriteExternalZipWithSymlinks #endif ] #ifndef _WINDOWS @@ -261,6 +261,27 @@ assertBool "Target file exists" targetFileExists removeDirectoryRecursive tmpDir +testExtractOverwriteExternalZipWithSymlinks :: FilePath -> Test +testExtractOverwriteExternalZipWithSymlinks tmpDir = TestCase $ do + archive <- toArchive <$> BL.readFile "tests/zip_with_symlinks.zip" + extractFilesFromArchive [OptPreserveSymbolicLinks, OptDestination tmpDir] archive + asserts + extractFilesFromArchive [OptPreserveSymbolicLinks, OptDestination tmpDir] archive + asserts + where + zipRootDir = "zip_test_dir_with_symlinks" + symlinkDir = tmpDir </> zipRootDir </> "symlink_to_dir_1" + symlinkFile = tmpDir </> zipRootDir </> "symlink_to_file_1" + asserts = do + isDirSymlink <- pathIsSymbolicLink symlinkDir + targetDirExists <- doesDirectoryExist symlinkDir + isFileSymlink <- pathIsSymbolicLink symlinkFile + targetFileExists <- doesFileExist symlinkFile + assertBool "Symbolic link to directory is preserved" isDirSymlink + assertBool "Target directory exists" targetDirExists + assertBool "Symbolic link to file is preserved" isFileSymlink + assertBool "Target file exists" targetFileExists + testArchiveAndUnzip :: FilePath -> Test testArchiveAndUnzip tmpDir = TestCase $ do let dir = "test_dir_with_symlinks4" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/zip-archive-0.4.1/zip-archive.cabal new/zip-archive-0.4.2.1/zip-archive.cabal --- old/zip-archive-0.4.1/zip-archive.cabal 2019-04-23 08:10:30.000000000 +0200 +++ new/zip-archive-0.4.2.1/zip-archive.cabal 2022-03-03 01:29:00.000000000 +0100 @@ -1,5 +1,5 @@ Name: zip-archive -Version: 0.4.1 +Version: 0.4.2.1 Cabal-Version: 2.0 Build-type: Simple Synopsis: Library for creating and modifying zip archives. @@ -26,8 +26,8 @@ As an example of the use of the library, a standalone zip archiver and extracter is provided in the source distribution. Category: Codec -Tested-with: GHC == 7.8.2, GHC == 7.10.3, GHC == 8.0.2, - GHC == 8.2.2, GHC == 8.4.3, GHC == 8.6.1 +Tested-with: GHC == 8.6.5, GHC == 8.8.1, GHC == 8.10.4, GHC == 9.0.1, + GHC == 8.8.3, GHC == 9.2.1 License: BSD3 License-file: LICENSE Homepage: http://github.com/jgm/zip-archive @@ -52,7 +52,7 @@ Default: False Library - Build-depends: base >= 3 && < 5, + Build-depends: base >= 4.5 && < 5, pretty, containers, binary >= 0.6, @@ -81,7 +81,7 @@ Buildable: False Main-is: Main.hs Hs-Source-Dirs: . - Build-Depends: base >= 4.2 && < 5, + Build-Depends: base >= 4.5 && < 5, directory >= 1.1, bytestring >= 0.9.0, zip-archive @@ -94,7 +94,7 @@ Type: exitcode-stdio-1.0 Main-Is: test-zip-archive.hs Hs-Source-Dirs: tests - Build-Depends: base >= 4.2 && < 5, + Build-Depends: base >= 4.5 && < 5, directory >= 1.3, bytestring >= 0.9.0, process, time, HUnit, zip-archive, temporary, filepath Default-Language: Haskell98 @@ -103,4 +103,3 @@ cpp-options: -D_WINDOWS else Build-depends: unix - build-tools: unzip
participants (1)
-
Source-Sync