funflow 1.0.0 → 1.0.1
raw patch · 2 files changed
+166/−159 lines, 2 filesdep ~asyncdep ~basedep ~bytestring
Dependency ranges changed: async, base, bytestring, clock, constraints, containers, contravariant, cryptonite, data-default, directory, exceptions, filepath, ghc-prim, hashable, hedis, hinotify, hostname, integer-gmp, lens, lifted-async, memory, monad-control, mtl, optparse-applicative, path, path-io, pretty, process, random, safe-exceptions, scientific, sqlite-simple, stm, store, tasty, tasty-hunit, temporary, text, time, transformers, unix, unordered-containers, vector, yaml
Files
- funflow.cabal +153/−159
- src/Control/Funflow/ContentHashable.hs +13/−0
funflow.cabal view
@@ -1,164 +1,158 @@-cabal-version: >=1.10-name: funflow-version: 1.0.0-license: MIT-license-file: LICENSE-maintainer: nicholas.clarke@tweag.io-author: Tom Nielsen, Nicholas Clarke, Andreas Herrmann-tested-with: ghc ==7.8.4 ghc ==7.10.2 ghc ==7.10.3 ghc ==8.0.1-homepage: https://github.com/tweag/funflow-bug-reports: https://github.com/tweag/funflow-synopsis: Workflows with arrows-description:- An arrow with resumable computations and logging-category: Control-build-type: Simple+Name: funflow+Version: 1.0.1+Synopsis: Workflows with arrows+Description:+ An arrow with resumable computations and logging++License: MIT+License-file: LICENSE+Author: Tom Nielsen, Nicholas Clarke, Andreas Herrmann+Maintainer: nicholas.clarke@tweag.io+build-type: Simple+Cabal-Version: >= 1.10+homepage: https://github.com/tweag/funflow+bug-reports: https://github.com/tweag/funflow+category: Control+Tested-With: GHC == 7.8.4, GHC == 7.10.2, GHC == 7.10.3, GHC == 8.0.1+ extra-source-files:- changelog.md+ changelog.md -library- exposed-modules:- Control.Arrow.Async- Control.Arrow.Free- Control.Funflow- Control.Funflow.Cache.TH- Control.Funflow.ContentHashable- Control.Funflow.ContentStore- Control.Funflow.Diagram- Control.Funflow.External- Control.Funflow.External.Docker- Control.Funflow.External.Executor- Control.Funflow.External.Coordinator- Control.Funflow.External.Coordinator.Memory- Control.Funflow.External.Coordinator.Redis- Control.Funflow.External.Coordinator.SQLite- Control.Funflow.Lock- Control.Funflow.Orphans- Control.Funflow.Steps- Control.Funflow.Pretty- Control.Funflow.Exec.Simple- hs-source-dirs: src- other-modules:- Control.Funflow.Base- Control.Funflow.Class- Control.Funflow.ContentStore.Notify- default-language: Haskell2010- ghc-options: -Wall -fno-warn-type-defaults- build-depends:- base >=4.6 && <5,- aeson >=1.2.3.0,- async >=2.1.1.1,- bytestring >=0.10.8.2,- clock >=0.7.2,- constraints >=0.9.1,- containers >=0.5.10.2,- contravariant >=1.4,- cryptonite >=0.24,- data-default >=0.7.1.1,- directory >=1.3.0.2,- exceptions >=0.8.3,- filepath >=1.4.1.2,- ghc-prim >=0.5.1.1,- hashable >=1.2.6.1,- hedis >=0.9.12,- hostname >=1.0,- integer-gmp >=1.0.1.0,- katip >=0.5.0.1,- lens >=4.15.4,- lifted-async >=0.9.3.2,- memory >=0.14.11,- monad-control >=1.0.2.2,- mtl >=2.2.1,- path >0.6.0,- path-io >=1.3.3,- pretty >=1.1.3.3,- process >=1.6.1.0,- random >=1.1,- safe-exceptions >=0.1.6.0,- scientific >=0.3.5.2,- sqlite-simple >=0.4.14.0,- stm >=2.4.4.1,- store >=0.4.3.2,- template-haskell >=2.11,- text >=1.2.2.2,- time >=1.8.0.2,- transformers >=0.5.2.0,- unix >=2.7.2.2,- unordered-containers >=0.2.8.0,- vector >=0.12.0.1,- yaml >=0.8.25.1- - if os(linux)- cpp-options: -DOS_Linux- other-modules:- Control.Funflow.ContentStore.Notify.Linux- build-depends:- hinotify >=0.3.9- else- - if (os(osx) || os(freebsd))- cpp-options: -DOS_BSD- other-modules:- Control.Funflow.ContentStore.Notify.BSD- build-depends:- kqueue -any+Library+ ghc-options: -Wall -fno-warn-type-defaults+ hs-source-dirs: src+ default-language: Haskell2010 -executable ffexecutord- main-is: app/FFExecutorD.hs- default-language: Haskell2010- build-depends:- base >=4.6 && <5,- bytestring >=0.10.8.2,- clock >=0.7.2,- funflow -any,- hedis >=0.9.12,- path >=0.6.1,- text >=1.2.2.2,- unix >=2.7.2.2,- safe-exceptions >=0.1.6.0,- optparse-applicative >=0.14.0.0+ Exposed-modules:+ Control.Arrow.Async+ , Control.Arrow.Free+ , Control.Funflow+ , Control.Funflow.Cache.TH+ , Control.Funflow.ContentHashable+ , Control.Funflow.ContentStore+ , Control.Funflow.Diagram+ , Control.Funflow.External+ , Control.Funflow.External.Docker+ , Control.Funflow.External.Executor+ , Control.Funflow.External.Coordinator+ , Control.Funflow.External.Coordinator.Memory+ , Control.Funflow.External.Coordinator.Redis+ , Control.Funflow.External.Coordinator.SQLite+ , Control.Funflow.Lock+ , Control.Funflow.Orphans+ , Control.Funflow.Steps+ , Control.Funflow.Pretty+ , Control.Funflow.Exec.Simple+ Other-modules:+ Control.Funflow.Base+ , Control.Funflow.Class+ , Control.Funflow.ContentStore.Notify+ Build-depends:+ base >= 4.6 && <5+ , aeson >= 1.2.3.0+ , async+ , bytestring+ , clock+ , constraints+ , containers+ , contravariant+ , cryptonite+ , data-default+ , directory+ , exceptions+ , filepath+ , ghc-prim+ , hashable+ , hedis+ , hostname+ , integer-gmp+ , katip >= 0.5.0.1+ , lens+ , lifted-async+ , memory+ , monad-control+ , mtl+ , path > 0.6.0+ , path-io+ , pretty+ , process+ , random+ , safe-exceptions+ , scientific+ , sqlite-simple+ , stm+ , store+ , template-haskell >= 2.11+ , text+ , time+ , transformers+ , unix+ , unordered-containers+ , vector+ , yaml+ if os(linux)+ CPP-options: -DOS_Linux+ Other-modules: Control.Funflow.ContentStore.Notify.Linux+ Build-depends: hinotify == 0.3.9+ else+ if os(darwin) || os(freebsd)+ CPP-options: -DOS_BSD+ Other-modules: Control.Funflow.ContentStore.Notify.BSD+ Build-depends: kqueue -test-suite test-funflow- type: exitcode-stdio-1.0- main-is: TestFunflow.hs- default-language: Haskell2010- ghc-options: -Wall -threaded- build-depends:- base >=4.6 && <5,- funflow -any,- filepath >=1.4.1.2,- hedis >=0.9.12,- path >=0.6.1,- path-io >=1.3.3,- text >=1.2.2.2,- safe-exceptions >=0.1.6.0,- unix >=2.7.2.2+Executable ffexecutord+ default-language: Haskell2010+ main-is: app/FFExecutorD.hs+ build-depends: base >=4.6 && <5+ , bytestring+ , clock+ , funflow+ , hedis+ , path+ , text+ , unix+ , safe-exceptions+ , optparse-applicative -test-suite unit-tests- type: exitcode-stdio-1.0- main-is: Test.hs- hs-source-dirs: test- other-modules:- Funflow.ContentStore- Funflow.SQLiteCoordinator- Funflow.TestFlows- Control.Arrow.Async.Tests- default-language: Haskell2010- ghc-options: -Wall -threaded- build-depends:- base >=4.10.1.0,- async >=2.1.1.1,- containers >=0.5.10.2,- data-default >=0.7,- directory >=1.3.0.2,- filepath >=1.4.1.2,- funflow -any,- path >=0.6.1,- path-io >=1.3.3,- process >=1.6.1.0,- random >=1.1,- safe-exceptions >=0.1.6.0,- tasty >=0.11.3,- tasty-hunit >=0.9.2,- temporary >=1.2.1.1,- unix >=2.7.2.2+Test-suite test-funflow+ type: exitcode-stdio-1.0+ default-language: Haskell2010++ main-is: TestFunflow.hs+ ghc-options: -Wall -threaded+ build-depends: base >=4.6 && <5+ , funflow+ , filepath+ , hedis+ , path+ , path-io+ , text+ , safe-exceptions+ , unix++Test-suite unit-tests+ type: exitcode-stdio-1.0+ default-language: Haskell2010+ hs-source-dirs: test+ main-is: Test.hs+ other-modules: Funflow.ContentStore+ Funflow.SQLiteCoordinator+ Funflow.TestFlows+ Control.Arrow.Async.Tests+ ghc-options: -Wall -threaded+ build-depends: base+ , async+ , containers+ , data-default >= 0.7+ , directory+ , filepath+ , funflow+ , path+ , path-io+ , process+ , random+ , safe-exceptions+ , tasty+ , tasty-hunit+ , temporary+ , unix
src/Control/Funflow/ContentHashable.hs view
@@ -49,6 +49,7 @@ ) where +import Control.Exception.Safe (catchJust) import Control.Funflow.Orphans () import Control.Monad (foldM, mzero, (>=>)) import Crypto.Hash (Context, Digest, SHA256,@@ -109,6 +110,7 @@ import qualified Path.IO import System.IO (IOMode (ReadMode), withBinaryFile)+import System.IO.Error (isPermissionError) import System.IO.Unsafe (unsafePerformIO) import System.Posix.Files (fileSize, getFileStatus) @@ -515,6 +517,13 @@ -- those as we would externally assured files, rather than just relying on the -- directory path. Doing this traversal is pretty cheap, and it's quite likely -- for directory contents to be modified without modifying the contents.+--+-- If an item in the directory cannot be read due to lacking permissions,+-- then it will be ignored and not included in the hash. If the flow does not+-- have permissions to access the contents of a subdirectory, then these+-- contents cannot influence the outcome of a task and it is okay to exclude+-- them from the hash. In that case we only hash the name, as that could+-- influence the outcome of a task. newtype ExternallyAssuredDirectory = ExternallyAssuredDirectory (Path.Path Path.Abs Path.Dir) deriving (Generic, Show) @@ -532,4 +541,8 @@ foldM hashDir ctx' (sort dirs) where hashFile ctx fp = contentHashUpdate ctx (ExternallyAssuredFile fp)+ `catchPermissionError` \_ -> contentHashUpdate ctx fp hashDir ctx dir = contentHashUpdate ctx (ExternallyAssuredDirectory dir)+ `catchPermissionError` \_ -> contentHashUpdate ctx dir+ catchPermissionError = catchJust $ \e ->+ if isPermissionError e then Just e else Nothing