Hello community, here is the log from the commit of package ghc-turtle for openSUSE:Leap:15.2 checked in at 2020-02-19 18:41:54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Leap:15.2/ghc-turtle (Old) and /work/SRC/openSUSE:Leap:15.2/.ghc-turtle.new.26092 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "ghc-turtle" Wed Feb 19 18:41:54 2020 rev:13 rq:771506 version:1.5.15 Changes: -------- --- /work/SRC/openSUSE:Leap:15.2/ghc-turtle/ghc-turtle.changes 2020-01-15 15:02:42.761819101 +0100 +++ /work/SRC/openSUSE:Leap:15.2/.ghc-turtle.new.26092/ghc-turtle.changes 2020-02-19 18:41:54.786249889 +0100 @@ -1,0 +2,42 @@ +Fri Nov 8 16:15:04 UTC 2019 - Peter Simons <psim...@suse.com> + +- Drop obsolete group attributes. + +------------------------------------------------------------------- +Fri Sep 20 02:02:13 UTC 2019 - psim...@suse.com + +- Update turtle to version 1.5.15. + 1.5.15 + + * Add `toLines` + * Add `Turtle.Bytes.{fromUTF8,toUTF8}` + * Add `Turtle.Bytes.{compress,decompress}` + * Always expose a `MonadFail` instance, relying on the `fail` package + where needed. Related GHC 8.8 preparedness. + +------------------------------------------------------------------- +Sun Jul 28 08:15:57 UTC 2019 - Peter Simons <psim...@suse.com> + +- Update Cabal file for more accurate build dependencies. + +------------------------------------------------------------------- +Fri May 17 08:26:56 UTC 2019 - Peter Simons <psim...@suse.com> + +- Update Cabal file for more accurate build dependencies. + +------------------------------------------------------------------- +Fri May 3 19:02:57 UTC 2019 - Peter Simons <psim...@suse.com> + +- Update Cabal build instructions for more accurate dependencies. + +------------------------------------------------------------------- +Sat Apr 20 09:17:06 UTC 2019 - psim...@suse.com + +- Update turtle to version 1.5.14. + 1.5.14 + + * Fix `cptree` to copy symlinks instead of descending into them + * See: https://github.com/Gabriel439/Haskell-Turtle-Library/pull/344 + * Build against newer versions of `Win32` package + +------------------------------------------------------------------- Old: ---- turtle-1.5.13.tar.gz New: ---- turtle-1.5.15.tar.gz turtle.cabal ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ ghc-turtle.spec ++++++ --- /var/tmp/diff_new_pack.vcIQG7/_old 2020-02-19 18:41:55.242250845 +0100 +++ /var/tmp/diff_new_pack.vcIQG7/_new 2020-02-19 18:41:55.246250854 +0100 @@ -1,7 +1,7 @@ # # spec file for package ghc-turtle # -# Copyright (c) 2018 SUSE LINUX GmbH, Nuernberg, Germany. +# Copyright (c) 2019 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,13 +19,13 @@ %global pkg_name turtle %bcond_with tests Name: ghc-%{pkg_name} -Version: 1.5.13 +Version: 1.5.15 Release: 0 Summary: Shell programming, Haskell-style License: BSD-3-Clause -Group: Development/Libraries/Haskell 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-ansi-wl-pprint-devel BuildRequires: ghc-async-devel @@ -43,6 +43,7 @@ BuildRequires: ghc-rpm-macros BuildRequires: ghc-semigroups-devel BuildRequires: ghc-stm-devel +BuildRequires: ghc-streaming-commons-devel BuildRequires: ghc-system-fileio-devel BuildRequires: ghc-system-filepath-devel BuildRequires: ghc-temporary-devel @@ -53,6 +54,7 @@ BuildRequires: ghc-unix-devel %if %{with tests} BuildRequires: ghc-doctest-devel +BuildRequires: ghc-fail-devel %endif %description @@ -87,7 +89,6 @@ %package devel Summary: Haskell %{pkg_name} library development files -Group: Development/Libraries/Haskell Requires: %{name} = %{version}-%{release} Requires: ghc-compiler = %{ghc_version} Requires(post): ghc-compiler = %{ghc_version} @@ -98,6 +99,7 @@ %prep %setup -q -n %{pkg_name}-%{version} +cp -p %{SOURCE1} %{pkg_name}.cabal %build %ghc_lib_build ++++++ turtle-1.5.13.tar.gz -> turtle-1.5.15.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/CHANGELOG.md new/turtle-1.5.15/CHANGELOG.md --- old/turtle-1.5.13/CHANGELOG.md 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/CHANGELOG.md 2019-09-19 15:36:21.000000000 +0200 @@ -1,3 +1,17 @@ +1.5.15 + +* Add `toLines` +* Add `Turtle.Bytes.{fromUTF8,toUTF8}` +* Add `Turtle.Bytes.{compress,decompress}` +* Always expose a `MonadFail` instance, relying on the `fail` package + where needed. Related GHC 8.8 preparedness. + +1.5.14 + +* Fix `cptree` to copy symlinks instead of descending into them + * See: https://github.com/Gabriel439/Haskell-Turtle-Library/pull/344 +* Build against newer versions of `Win32` package + 1.5.13 * Fix `chmod` bug diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/src/Turtle/Bytes.hs new/turtle-1.5.15/src/Turtle/Bytes.hs --- old/turtle-1.5.13/src/Turtle/Bytes.hs 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/src/Turtle/Bytes.hs 2019-09-19 15:36:21.000000000 +0200 @@ -16,6 +16,12 @@ , append , stderr , strict + , compress + , decompress + , WindowBits(..) + , Zlib.defaultWindowBits + , fromUTF8 + , toUTF8 -- * Subprocess management , proc @@ -43,7 +49,9 @@ import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Managed (MonadManaged(..)) import Data.ByteString (ByteString) +import Data.Streaming.Zlib (Inflate, Popper, PopperRes(..), WindowBits(..)) import Data.Text (Text) +import Data.Text.Encoding (Decoding(..)) import Filesystem.Path (FilePath) import Prelude hiding (FilePath) import System.Exit (ExitCode(..)) @@ -61,7 +69,10 @@ import qualified Control.Monad import qualified Control.Monad.Managed as Managed import qualified Data.ByteString +import qualified Data.Streaming.Zlib as Zlib import qualified Data.Text +import qualified Data.Text.Encoding as Encoding +import qualified Data.Text.Encoding.Error as Encoding.Error import qualified Foreign import qualified System.IO import qualified System.Process as Process @@ -657,3 +668,136 @@ -> Shell (Either ByteString ByteString) -- ^ Chunks of either output (`Right`) or error (`Left`) inshellWithErr cmd = streamWithErr (Process.shell (Data.Text.unpack cmd)) + +-- | Internal utility used by both `compress` and `decompress` +fromPopper :: Popper -> Shell ByteString +fromPopper popper = loop + where + loop = do + result <- liftIO popper + + case result of + PRDone -> + empty + PRNext compressedByteString -> + return compressedByteString <|> loop + PRError exception -> + liftIO (Exception.throwIO exception) + +{-| Compress a stream using @zlib@ + + Note that this can decompress streams that are the concatenation of + multiple compressed streams (just like @gzip@) + +>>> let compressed = select [ "ABC", "DEF" ] & compress 0 defaultWindowBits +>>> compressed & decompress defaultWindowBits & view +"ABCDEF" +>>> (compressed <|> compressed) & decompress defaultWindowBits & view +"ABCDEF" +"ABCDEF" +-} +compress + :: Int + -- ^ Compression level + -> WindowBits + -- ^ + -> Shell ByteString + -- ^ + -> Shell ByteString +compress compressionLevel windowBits bytestrings = do + deflate <- liftIO (Zlib.initDeflate compressionLevel windowBits) + + let loop = do + bytestring <- bytestrings + + popper <- liftIO (Zlib.feedDeflate deflate bytestring) + + fromPopper popper + + let wrapUp = do + let popper = liftIO (Zlib.finishDeflate deflate) + + fromPopper popper + + loop <|> wrapUp + +data DecompressionState = Uninitialized | Decompressing Inflate + +-- | Decompress a stream using @zlib@ (just like the @gzip@ command) +decompress :: WindowBits -> Shell ByteString -> Shell ByteString +decompress windowBits (Shell k) = Shell k' + where + k' (FoldShell step begin done) = k (FoldShell step' begin' done') + where + begin' = (begin, Uninitialized) + + step' (x0, Uninitialized) compressedByteString = do + inflate <- Zlib.initInflate windowBits + + step' (x0, Decompressing inflate) compressedByteString + step' (x0, Decompressing inflate) compressedByteString = do + popper <- Zlib.feedInflate inflate compressedByteString + + let loop x = do + result <- popper + + case result of + PRDone -> do + compressedByteString' <- Zlib.getUnusedInflate inflate + + if Data.ByteString.null compressedByteString' + then return (x, Decompressing inflate) + else do + decompressedByteString <- Zlib.finishInflate inflate + + x' <- step x decompressedByteString + + step' (x', Uninitialized) compressedByteString' + PRNext decompressedByteString -> do + x' <- step x decompressedByteString + + loop x' + PRError exception -> do + Exception.throwIO exception + + loop x0 + + done' (x0, Uninitialized) = do + done x0 + done' (x0, Decompressing inflate) = do + decompressedByteString <- Zlib.finishInflate inflate + + x0' <- step x0 decompressedByteString + + done' (x0', Uninitialized) + +{-| Decode a stream of bytes as UTF8 `Text` + + NOTE: This function will throw a pure exception (i.e. an `error`) if UTF8 + decoding fails (mainly due to limitations in the @text@ package's stream + decoding API) +-} +toUTF8 :: Shell ByteString -> Shell Text +toUTF8 (Shell k) = Shell k' + where + k' (FoldShell step begin done) = + k (FoldShell step' begin' done') + where + begin' = + (mempty, Encoding.streamDecodeUtf8With Encoding.Error.strictDecode, begin) + + step' (prefix, decoder, x) suffix = do + let bytes = prefix <> suffix + + let Some text prefix' decoder' = decoder bytes + + x' <- step x text + + return (prefix', decoder', x') + + done' (_, _, x) = do + done x + +-- | Encode a stream of bytes as UTF8 `Text` +fromUTF8 :: Shell Text -> Shell ByteString +fromUTF8 = fmap Encoding.encodeUtf8 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/src/Turtle/Prelude.hs new/turtle-1.5.15/src/Turtle/Prelude.hs --- old/turtle-1.5.13/src/Turtle/Prelude.hs 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/src/Turtle/Prelude.hs 2019-09-19 15:36:21.000000000 +0200 @@ -130,6 +130,7 @@ #if !defined(mingw32_HOST_OS) , symlink #endif + , isNotSymbolicLink , rm , rmdir , rmtree @@ -205,6 +206,7 @@ , sort , sortOn , sortBy + , toLines -- * Folds , countChars @@ -299,7 +301,7 @@ import Control.Foldl (Fold(..), genericLength, handles, list, premap) import qualified Control.Foldl import qualified Control.Foldl.Text -import Control.Monad (guard, liftM, msum, when, unless, (>=>), mfilter) +import Control.Monad (foldM, guard, liftM, msum, when, unless, (>=>), mfilter) import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Managed (MonadManaged(..), managed, managed_, runManaged) #ifdef mingw32_HOST_OS @@ -307,6 +309,8 @@ #endif import Data.IORef (newIORef, readIORef, writeIORef) import qualified Data.List as List +import Data.List.NonEmpty (NonEmpty(..)) +import qualified Data.List.NonEmpty as NonEmpty import Data.Monoid ((<>)) import Data.Ord (comparing) import qualified Data.Set as Set @@ -353,7 +357,7 @@ touchFile ) import System.Posix.Files (createSymbolicLink) #endif -import Prelude hiding (FilePath) +import Prelude hiding (FilePath, lines) import Turtle.Pattern (Pattern, anyChar, chars, match, selfless, sepBy) import Turtle.Shell @@ -1095,20 +1099,46 @@ #endif +{-| Returns `True` if the given `FilePath` is not a symbolic link + + This comes in handy in conjunction with `lsif`: + + > lsif isNotSymbolicLink +-} +isNotSymbolicLink :: MonadIO io => FilePath -> io Bool +isNotSymbolicLink = fmap (not . PosixCompat.isSymbolicLink) . lstat + -- | Copy a directory tree cptree :: MonadIO io => FilePath -> FilePath -> io () cptree oldTree newTree = sh (do - oldPath <- lstree oldTree + oldPath <- lsif isNotSymbolicLink oldTree + -- The `system-filepath` library treats a path like "/tmp" as a file and not -- a directory and fails to strip it as a prefix from `/tmp/foo`. Adding -- `(</> "")` to the end of the path makes clear that the path is a -- directory Just suffix <- return (Filesystem.stripPrefix (oldTree </> "") oldPath) + let newPath = newTree </> suffix + isFile <- testfile oldPath - if isFile - then mktree (Filesystem.directory newPath) >> cp oldPath newPath - else mktree newPath ) + + fileStatus <- lstat oldPath + + if PosixCompat.isSymbolicLink fileStatus + then do + oldTarget <- liftIO (PosixCompat.readSymbolicLink (Filesystem.encodeString oldPath)) + + mktree (Filesystem.directory newPath) + + liftIO (PosixCompat.createSymbolicLink oldTarget (Filesystem.encodeString newPath)) + else if isFile + then do + mktree (Filesystem.directory newPath) + + cp oldPath newPath + else do + mktree newPath ) -- | Remove a file rm :: MonadIO io => FilePath -> io () @@ -2139,3 +2169,39 @@ -- [(1,'a'),(2,'c'),(3,'d'),(3,'e'),(4,'b'),(7,'f')] sortBy :: (Functor io, MonadIO io) => (a -> a -> Ordering) -> Shell a -> io [a] sortBy f s = List.sortBy f <$> fold s list + +{-| Group an arbitrary stream of `Text` into newline-delimited `Line`s + +>>> stdout (toLines ("ABC" <|> "DEF" <|> "GHI") +ABCDEFGHI +>>> stdout (toLines empty) -- Note that this always emits at least 1 `Line` + +>>> stdout (toLines ("ABC\nDEF" <|> "" <|> "GHI\nJKL")) +ABC +DEFGHI +JKL +-} +toLines :: Shell Text -> Shell Line +toLines (Shell k) = Shell k' + where + k' (FoldShell step begin done) = + k (FoldShell step' begin' done') + where + step' (Pair x prefix) text = do + let suffix :| lines = Turtle.Line.textToLines text + + let line = prefix <> suffix + + let lines' = line :| lines + + x' <- foldM step x (NonEmpty.init lines') + + let prefix' = NonEmpty.last lines' + + return (Pair x' prefix') + + begin' = (Pair begin "") + + done' (Pair x prefix) = do + x' <- step x prefix + done x' diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/src/Turtle/Shell.hs new/turtle-1.5.15/src/Turtle/Shell.hs --- old/turtle-1.5.13/src/Turtle/Shell.hs 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/src/Turtle/Shell.hs 2019-09-19 15:36:21.000000000 +0200 @@ -81,9 +81,7 @@ import Control.Monad.Catch (MonadThrow(..), MonadCatch(..)) import Control.Monad.IO.Class (MonadIO(..)) import Control.Monad.Managed (MonadManaged(..), with) -#if MIN_VERSION_base(4,9,0) import qualified Control.Monad.Fail as Fail -#endif import Control.Foldl (Fold(..), FoldM(..)) import qualified Control.Foldl as Foldl import Data.Foldable (Foldable) @@ -182,7 +180,9 @@ let step1 x a = _foldShell (f a) (FoldShell step0 x return) _foldShell m (FoldShell step1 begin0 done0) ) - fail _ = mzero +#if!(MIN_VERSION_base(4,13,0)) + fail = Fail.fail +#endif instance Alternative Shell where empty = Shell (\(FoldShell _ begin done) -> done begin) @@ -213,10 +213,8 @@ instance MonadCatch Shell where m `catch` k = Shell (\f-> _foldShell m f `catch` (\e -> _foldShell (k e) f)) -#if MIN_VERSION_base(4,9,0) instance Fail.MonadFail Shell where - fail = Prelude.fail -#endif + fail _ = mzero #if __GLASGOW_HASKELL__ >= 804 instance Monoid a => Semigroup (Shell a) where diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/src/Turtle/Tutorial.hs new/turtle-1.5.15/src/Turtle/Tutorial.hs --- old/turtle-1.5.13/src/Turtle/Tutorial.hs 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/src/Turtle/Tutorial.hs 2019-09-19 15:36:21.000000000 +0200 @@ -1490,10 +1490,10 @@ -- $monadio -- --- If you are sick of having type `liftIO` everywhere, you can omit it. This --- is because all subroutines in @turtle@ are overloaded using the `MonadIO` --- type class, like our original `pwd` command where we first encountered the --- the `MonadIO` type: +-- If you are sick of having to type `liftIO` everywhere, you can omit it. +-- This is because all subroutines in @turtle@ are overloaded using the +-- `MonadIO` type class, like our original `pwd` command where we first +-- encountered the the `MonadIO` type: -- -- @ -- Prelude Turtle> :type pwd diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/test/cptree.hs new/turtle-1.5.15/test/cptree.hs --- old/turtle-1.5.13/test/cptree.hs 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/test/cptree.hs 2019-09-19 15:36:21.000000000 +0200 @@ -3,10 +3,11 @@ import Turtle import Filesystem.Path.CurrentOS () import System.IO.Temp (withSystemTempDirectory) +import qualified Control.Monad.Fail as Fail import Control.Monad (unless) check :: String -> Bool-> IO () -check errorMessage successs = unless successs $ fail errorMessage +check errorMessage successs = unless successs $ Fail.fail errorMessage main :: IO () main = withSystemTempDirectory "tempDir" (runTest . fromString) diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/turtle-1.5.13/turtle.cabal new/turtle-1.5.15/turtle.cabal --- old/turtle-1.5.13/turtle.cabal 2018-12-20 17:51:10.000000000 +0100 +++ new/turtle-1.5.15/turtle.cabal 2019-09-19 15:36:21.000000000 +0200 @@ -1,5 +1,5 @@ Name: turtle -Version: 1.5.13 +Version: 1.5.15 Cabal-Version: >=1.10 Build-Type: Simple License: BSD3 @@ -53,7 +53,7 @@ ansi-wl-pprint >= 0.6 && < 0.7 , async >= 2.0.0.0 && < 2.3 , bytestring >= 0.9.1.8 && < 0.11, - clock >= 0.4.1.2 && < 0.8 , + clock >= 0.4.1.2 && < 0.9 , containers >= 0.5.0.0 && < 0.7 , directory >= 1.0.7 && < 1.4 , exceptions >= 0.4 && < 0.11, @@ -61,21 +61,24 @@ hostname < 1.1 , managed >= 1.0.3 && < 1.1 , process >= 1.0.1.1 && < 1.7 , - semigroups >= 0.5.0 && < 0.19, + semigroups >= 0.5.0 && < 0.20, system-filepath >= 0.3.1 && < 0.5 , system-fileio >= 0.2.1 && < 0.4 , stm < 2.6 , + streaming-commons < 0.3 , temporary < 1.4 , - text < 1.3 , - time < 1.9 , + text >= 1.0.0 && < 1.3 , + time < 1.10, transformers >= 0.2.0.0 && < 0.6 , - optparse-applicative >= 0.13 && < 0.15, + optparse-applicative >= 0.13 && < 0.16, optional-args >= 1.0 && < 2.0 , unix-compat >= 0.4 && < 0.6 if os(windows) - Build-Depends: Win32 >= 2.2.0.1 && < 2.6 + Build-Depends: Win32 >= 2.2.0.1 && < 2.9 else Build-Depends: unix >= 2.5.1.0 && < 2.8 + if !impl(ghc >= 8.0) + Build-Depends: fail >= 4.9.0.0 && < 4.10 Exposed-Modules: Turtle, Turtle.Bytes, @@ -129,6 +132,7 @@ Default-Language: Haskell2010 Build-Depends: base >= 4 && < 5, + fail, temporary, system-filepath >= 0.4, turtle ++++++ turtle.cabal ++++++ Name: turtle Version: 1.5.15 x-revision: 1 Cabal-Version: >=1.10 Build-Type: Simple License: BSD3 License-File: LICENSE Copyright: 2015 Gabriel Gonzalez Author: Gabriel Gonzalez Maintainer: gabriel...@gmail.com Tested-With: GHC == 7.10.2, GHC == 8.0.1 Bug-Reports: https://github.com/Gabriel439/Haskell-Turtle-Library/issues Synopsis: Shell programming, Haskell-style Description: @turtle@ is a reimplementation of the Unix command line environment in Haskell so that you can use Haskell as both a shell and a scripting language. . Features include: . * Batteries included: Command an extended suite of predefined utilities . * Interoperability: You can still run external shell commands . * Portability: Works on Windows, OS X, and Linux . * Exception safety: Safely acquire and release resources . * Streaming: Transform or fold command output in constant space . * Patterns: Use typed regular expressions that can parse structured values . * Formatting: Type-safe @printf@-style text formatting . * Modern: Supports @text@ and @system-filepath@ . Read "Turtle.Tutorial" for a detailed tutorial or "Turtle.Prelude" for a quick-start guide . @turtle@ is designed to be beginner-friendly, but as a result lacks certain features, like tracing commands. If you feel comfortable using @turtle@ then you should also check out the @Shelly@ library which provides similar functionality. Category: System Extra-Source-Files: CHANGELOG.md Source-Repository head Type: git Location: https://github.com/Gabriel439/Haskell-Turtle-Library Library HS-Source-Dirs: src Build-Depends: base >= 4.11 && < 5 , ansi-wl-pprint >= 0.6 && < 0.7 , async >= 2.0.0.0 && < 2.3 , bytestring >= 0.9.1.8 && < 0.11, clock >= 0.4.1.2 && < 0.9 , containers >= 0.5.0.0 && < 0.7 , directory >= 1.0.7 && < 1.4 , exceptions >= 0.4 && < 0.11, foldl >= 1.1 && < 1.5 , hostname < 1.1 , managed >= 1.0.3 && < 1.1 , process >= 1.0.1.1 && < 1.7 , semigroups >= 0.5.0 && < 0.20, system-filepath >= 0.3.1 && < 0.5 , system-fileio >= 0.2.1 && < 0.4 , stm < 2.6 , streaming-commons < 0.3 , temporary < 1.4 , text >= 1.0.0 && < 1.3 , time < 1.10, transformers >= 0.2.0.0 && < 0.6 , optparse-applicative >= 0.13 && < 0.16, optional-args >= 1.0 && < 2.0 , unix-compat >= 0.4 && < 0.6 if os(windows) Build-Depends: Win32 >= 2.2.0.1 && < 2.9 else Build-Depends: unix >= 2.5.1.0 && < 2.8 if !impl(ghc >= 8.0) Build-Depends: fail >= 4.9.0.0 && < 4.10 Exposed-Modules: Turtle, Turtle.Bytes, Turtle.Format, Turtle.Pattern, Turtle.Shell, Turtle.Options, Turtle.Line, Turtle.Prelude, Turtle.Tutorial Other-Modules: Turtle.Internal GHC-Options: -Wall Default-Language: Haskell2010 test-suite tests Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-Is: Main.hs GHC-Options: -Wall Default-Language: Haskell2010 Build-Depends: base >= 4 && < 5 , doctest >= 0.7 && < 0.17 test-suite regression-broken-pipe Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-Is: RegressionBrokenPipe.hs GHC-Options: -Wall -threaded Default-Language: Haskell2010 Build-Depends: base >= 4 && < 5, turtle test-suite regression-masking-exception Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-Is: RegressionMaskingException.hs GHC-Options: -Wall -threaded Default-Language: Haskell2010 Build-Depends: base >= 4 && < 5, turtle test-suite cptree Type: exitcode-stdio-1.0 HS-Source-Dirs: test Main-Is: cptree.hs GHC-Options: -Wall -threaded Default-Language: Haskell2010 Build-Depends: base >= 4 && < 5, fail, temporary, system-filepath >= 0.4, turtle benchmark bench Type: exitcode-stdio-1.0 HS-Source-Dirs: bench Main-Is: Main.hs GHC-Options: -O2 -Wall -threaded Default-Language: Haskell2010 Build-Depends: base >= 4 && < 5 , text < 1.3, turtle if impl(ghc < 7.8) Build-Depends: criterion >= 0.4 && < 1.1.4.0 else Build-Depends: criterion >= 0.4 && < 1.6