From 34910f853bec178eb200fe9dd5d439e8e5387c84 Mon Sep 17 00:00:00 2001 From: Julian Ospald Date: Fri, 5 Nov 2021 22:30:47 +0100 Subject: [PATCH] Split GHCup.Utils.File module --- app/ghcup/BrickMain.hs | 2 +- app/ghcup/GHCup/OptParse/ChangeLog.hs | 2 +- app/ghcup/GHCup/OptParse/Compile.hs | 2 +- app/ghcup/GHCup/OptParse/DInfo.hs | 2 +- app/ghcup/GHCup/OptParse/Install.hs | 2 +- ghcup.cabal | 9 +++-- lib/GHCup.hs | 3 +- lib/GHCup/Download.hs | 2 +- lib/GHCup/Platform.hs | 2 +- .../File/Common.hs => System/Directory.hs} | 29 +-------------- .../Directory.hs-boot} | 2 +- lib/GHCup/System/Process.hs | 19 ++++++++++ lib/GHCup/System/Process/Common.hs | 37 +++++++++++++++++++ .../{Utils/File => System/Process}/Posix.hs | 6 +-- .../{Utils/File => System/Process}/Windows.hs | 7 ++-- lib/GHCup/Utils.hs | 3 +- lib/GHCup/Utils/File.hs | 17 --------- lib/GHCup/Utils/Logger.hs | 2 +- 18 files changed, 82 insertions(+), 66 deletions(-) rename lib/GHCup/{Utils/File/Common.hs => System/Directory.hs} (68%) rename lib/GHCup/{Utils/File/Common.hs-boot => System/Directory.hs-boot} (69%) create mode 100644 lib/GHCup/System/Process.hs create mode 100644 lib/GHCup/System/Process/Common.hs rename lib/GHCup/{Utils/File => System/Process}/Posix.hs (99%) rename lib/GHCup/{Utils/File => System/Process}/Windows.hs (98%) delete mode 100644 lib/GHCup/Utils/File.hs diff --git a/app/ghcup/BrickMain.hs b/app/ghcup/BrickMain.hs index c6e870c..34e80b2 100644 --- a/app/ghcup/BrickMain.hs +++ b/app/ghcup/BrickMain.hs @@ -15,7 +15,7 @@ import GHCup.Types hiding ( LeanAppState(..) ) import GHCup.Utils import GHCup.Utils.Logger import GHCup.Utils.Prelude ( decUTF8Safe ) -import GHCup.Utils.File +import GHCup.System.Process import Brick import Brick.Widgets.Border diff --git a/app/ghcup/GHCup/OptParse/ChangeLog.hs b/app/ghcup/GHCup/OptParse/ChangeLog.hs index cc0470b..62056ad 100644 --- a/app/ghcup/GHCup/OptParse/ChangeLog.hs +++ b/app/ghcup/GHCup/OptParse/ChangeLog.hs @@ -35,7 +35,7 @@ import GHCup.Utils import Data.Versions import URI.ByteString (serializeURIRef') import GHCup.Utils.Prelude -import GHCup.Utils.File (exec) +import GHCup.System.Process (exec) import Data.Char (toLower) diff --git a/app/ghcup/GHCup/OptParse/Compile.hs b/app/ghcup/GHCup/OptParse/Compile.hs index fa89c1b..5d9c13d 100644 --- a/app/ghcup/GHCup/OptParse/Compile.hs +++ b/app/ghcup/GHCup/OptParse/Compile.hs @@ -13,13 +13,13 @@ module GHCup.OptParse.Compile where import GHCup import GHCup.Errors -import GHCup.Utils.File import GHCup.Types import GHCup.Types.Optics import GHCup.Utils import GHCup.Utils.Logger import GHCup.OptParse.Common import GHCup.Utils.String.QQ +import GHCup.System.Process #if !MIN_VERSION_base(4,13,0) import Control.Monad.Fail ( MonadFail ) diff --git a/app/ghcup/GHCup/OptParse/DInfo.hs b/app/ghcup/GHCup/OptParse/DInfo.hs index 46c3d3d..84ee63c 100644 --- a/app/ghcup/GHCup/OptParse/DInfo.hs +++ b/app/ghcup/GHCup/OptParse/DInfo.hs @@ -20,6 +20,7 @@ import GHCup.Types import GHCup.Utils.Prelude import GHCup.Utils.Dirs import GHCup.Utils.Logger +import GHCup.System.Process #if !MIN_VERSION_base(4,13,0) import Control.Monad.Fail ( MonadFail ) @@ -36,7 +37,6 @@ import Text.PrettyPrint.HughesPJClass ( prettyShow ) import qualified Data.Text as T import Control.Exception.Safe (MonadMask) -import GHCup.Utils.File import Language.Haskell.TH diff --git a/app/ghcup/GHCup/OptParse/Install.hs b/app/ghcup/GHCup/OptParse/Install.hs index 386f90d..641f3bf 100644 --- a/app/ghcup/GHCup/OptParse/Install.hs +++ b/app/ghcup/GHCup/OptParse/Install.hs @@ -17,9 +17,9 @@ import GHCup.OptParse.Common import GHCup import GHCup.Errors import GHCup.Types -import GHCup.Utils.File import GHCup.Utils.Logger import GHCup.Utils.String.QQ +import GHCup.System.Process import Codec.Archive #if !MIN_VERSION_base(4,13,0) diff --git a/ghcup.cabal b/ghcup.cabal index 09d1778..3da2e39 100644 --- a/ghcup.cabal +++ b/ghcup.cabal @@ -61,8 +61,9 @@ library GHCup.Types.Optics GHCup.Utils GHCup.Utils.Dirs - GHCup.Utils.File - GHCup.Utils.File.Common + GHCup.System.Process + GHCup.System.Directory + GHCup.System.Process.Common GHCup.Utils.Logger GHCup.Utils.MegaParsec GHCup.Utils.Prelude @@ -152,7 +153,7 @@ library if os(windows) cpp-options: -DIS_WINDOWS other-modules: - GHCup.Utils.File.Windows + GHCup.System.Process.Windows GHCup.Utils.Prelude.Windows GHCup.Utils.Windows @@ -163,7 +164,7 @@ library else other-modules: - GHCup.Utils.File.Posix + GHCup.System.Process.Posix GHCup.Utils.Posix GHCup.Utils.Prelude.Posix System.Console.Terminal.Common diff --git a/lib/GHCup.hs b/lib/GHCup.hs index 015815c..ed9eb59 100644 --- a/lib/GHCup.hs +++ b/lib/GHCup.hs @@ -33,12 +33,13 @@ import GHCup.Types import GHCup.Types.JSON ( ) import GHCup.Types.Optics import GHCup.Utils -import GHCup.Utils.File import GHCup.Utils.Logger import GHCup.Utils.Prelude import GHCup.Utils.String.QQ import GHCup.Utils.Version.QQ import GHCup.Version +import GHCup.System.Directory +import GHCup.System.Process import Codec.Archive ( ArchiveResult ) import Control.Applicative diff --git a/lib/GHCup/Download.hs b/lib/GHCup/Download.hs index acb6e4d..5204da1 100644 --- a/lib/GHCup/Download.hs +++ b/lib/GHCup/Download.hs @@ -34,7 +34,7 @@ import GHCup.Types import GHCup.Types.Optics import GHCup.Types.JSON ( ) import GHCup.Utils.Dirs -import GHCup.Utils.File +import GHCup.System.Process import GHCup.Utils.Logger import GHCup.Utils.Prelude import GHCup.Version diff --git a/lib/GHCup/Platform.hs b/lib/GHCup/Platform.hs index 146f0a1..712cad2 100644 --- a/lib/GHCup/Platform.hs +++ b/lib/GHCup/Platform.hs @@ -23,7 +23,7 @@ import GHCup.Errors import GHCup.Types import GHCup.Types.Optics import GHCup.Types.JSON ( ) -import GHCup.Utils.File +import GHCup.System.Process import GHCup.Utils.Logger import GHCup.Utils.Prelude import GHCup.Utils.String.QQ diff --git a/lib/GHCup/Utils/File/Common.hs b/lib/GHCup/System/Directory.hs similarity index 68% rename from lib/GHCup/Utils/File/Common.hs rename to lib/GHCup/System/Directory.hs index 23ba8af..939baaa 100644 --- a/lib/GHCup/Utils/File/Common.hs +++ b/lib/GHCup/System/Directory.hs @@ -3,7 +3,7 @@ {-# LANGUAGE TemplateHaskell #-} {-# LANGUAGE ViewPatterns #-} -module GHCup.Utils.File.Common where +module GHCup.System.Directory where import GHCup.Utils.Prelude @@ -12,42 +12,15 @@ import Data.Maybe import Data.Text ( Text ) import Data.Void import GHC.IO.Exception -import Optics hiding ((<|), (|>)) import System.Directory import System.FilePath -import Text.PrettyPrint.HughesPJClass hiding ( (<>) ) import Text.Regex.Posix import qualified Data.Text as T -import qualified Data.ByteString.Lazy as BL import qualified Text.Megaparsec as MP -data ProcessError = NonZeroExit Int FilePath [String] - | PTerminated FilePath [String] - | PStopped FilePath [String] - | NoSuchPid FilePath [String] - deriving Show - -instance Pretty ProcessError where - pPrint (NonZeroExit e exe args) = - text "Process" <+> pPrint exe <+> text "with arguments" <+> pPrint args <+> text "failed with exit code" <+> text (show e <> ".") - pPrint (PTerminated exe args) = - text "Process" <+> pPrint exe <+> text "with arguments" <+> pPrint args <+> text "terminated." - pPrint (PStopped exe args) = - text "Process" <+> pPrint exe <+> text "with arguments" <+> pPrint args <+> text "stopped." - pPrint (NoSuchPid exe args) = - text "Could not find PID for process running " <+> pPrint exe <+> text " with arguments " <+> text (show args) <+> text "." - -data CapturedProcess = CapturedProcess - { _exitCode :: ExitCode - , _stdOut :: BL.ByteString - , _stdErr :: BL.ByteString - } - deriving (Eq, Show) - -makeLenses ''CapturedProcess diff --git a/lib/GHCup/Utils/File/Common.hs-boot b/lib/GHCup/System/Directory.hs-boot similarity index 69% rename from lib/GHCup/Utils/File/Common.hs-boot rename to lib/GHCup/System/Directory.hs-boot index 5933883..102cb72 100644 --- a/lib/GHCup/Utils/File/Common.hs-boot +++ b/lib/GHCup/System/Directory.hs-boot @@ -1,4 +1,4 @@ -module GHCup.Utils.File.Common where +module GHCup.System.Directory where import Text.Regex.Posix diff --git a/lib/GHCup/System/Process.hs b/lib/GHCup/System/Process.hs new file mode 100644 index 0000000..d626e81 --- /dev/null +++ b/lib/GHCup/System/Process.hs @@ -0,0 +1,19 @@ +{-# LANGUAGE CPP #-} + +module GHCup.System.Process ( + module GHCup.System.Process.Common, +#if IS_WINDOWS + module GHCup.System.Process.Windows +#else + module GHCup.System.Process.Posix +#endif +) where + + +#if IS_WINDOWS +import GHCup.System.Process.Windows +#else +import GHCup.System.Process.Posix +#endif + +import GHCup.System.Process.Common diff --git a/lib/GHCup/System/Process/Common.hs b/lib/GHCup/System/Process/Common.hs new file mode 100644 index 0000000..e314041 --- /dev/null +++ b/lib/GHCup/System/Process/Common.hs @@ -0,0 +1,37 @@ +{-# LANGUAGE TemplateHaskell #-} + +module GHCup.System.Process.Common where + + +import GHC.IO.Exception +import Optics hiding ((<|), (|>)) +import Text.PrettyPrint.HughesPJClass hiding ( (<>) ) + +import qualified Data.ByteString.Lazy as BL + + + +data ProcessError = NonZeroExit Int FilePath [String] + | PTerminated FilePath [String] + | PStopped FilePath [String] + | NoSuchPid FilePath [String] + deriving Show + +instance Pretty ProcessError where + pPrint (NonZeroExit e exe args) = + text "Process" <+> pPrint exe <+> text "with arguments" <+> pPrint args <+> text "failed with exit code" <+> text (show e <> ".") + pPrint (PTerminated exe args) = + text "Process" <+> pPrint exe <+> text "with arguments" <+> pPrint args <+> text "terminated." + pPrint (PStopped exe args) = + text "Process" <+> pPrint exe <+> text "with arguments" <+> pPrint args <+> text "stopped." + pPrint (NoSuchPid exe args) = + text "Could not find PID for process running " <+> pPrint exe <+> text " with arguments " <+> text (show args) <+> text "." + +data CapturedProcess = CapturedProcess + { _exitCode :: ExitCode + , _stdOut :: BL.ByteString + , _stdErr :: BL.ByteString + } + deriving (Eq, Show) + +makeLenses ''CapturedProcess diff --git a/lib/GHCup/Utils/File/Posix.hs b/lib/GHCup/System/Process/Posix.hs similarity index 99% rename from lib/GHCup/Utils/File/Posix.hs rename to lib/GHCup/System/Process/Posix.hs index fdd788b..b217818 100644 --- a/lib/GHCup/Utils/File/Posix.hs +++ b/lib/GHCup/System/Process/Posix.hs @@ -2,7 +2,7 @@ {-# LANGUAGE FlexibleContexts #-} {-| -Module : GHCup.Utils.File.Posix +Module : GHCup.System.Process.Posix Description : File and unix APIs Copyright : (c) Julian Ospald, 2020 License : LGPL-3.0 @@ -13,13 +13,13 @@ Portability : POSIX This module handles file and executable handling. Some of these functions use sophisticated logging. -} -module GHCup.Utils.File.Posix where +module GHCup.System.Process.Posix where -import GHCup.Utils.File.Common import GHCup.Utils.Prelude import GHCup.Utils.Logger import GHCup.Types import GHCup.Types.Optics +import GHCup.System.Process.Common import Control.Concurrent import Control.Concurrent.Async diff --git a/lib/GHCup/Utils/File/Windows.hs b/lib/GHCup/System/Process/Windows.hs similarity index 98% rename from lib/GHCup/Utils/File/Windows.hs rename to lib/GHCup/System/Process/Windows.hs index b7b6e17..73180ef 100644 --- a/lib/GHCup/Utils/File/Windows.hs +++ b/lib/GHCup/System/Process/Windows.hs @@ -2,7 +2,7 @@ {-# LANGUAGE FlexibleContexts #-} {-| -Module : GHCup.Utils.File.Windows +Module : GHCup.System.Process.Windows Description : File and windows APIs Copyright : (c) Julian Ospald, 2020 License : LGPL-3.0 @@ -13,13 +13,14 @@ Portability : Windows This module handles file and executable handling. Some of these functions use sophisticated logging. -} -module GHCup.Utils.File.Windows where +module GHCup.System.Process.Windows where import {-# SOURCE #-} GHCup.Utils ( getLinkTarget, pathIsLink ) import GHCup.Utils.Dirs -import GHCup.Utils.File.Common import GHCup.Types import GHCup.Types.Optics +import GHCup.System.Directory +import GHCup.System.Process.Common import Control.Concurrent import Control.DeepSeq diff --git a/lib/GHCup/Utils.hs b/lib/GHCup/Utils.hs index dab1789..938169f 100644 --- a/lib/GHCup/Utils.hs +++ b/lib/GHCup/Utils.hs @@ -42,11 +42,12 @@ import GHCup.Types import GHCup.Types.Optics import GHCup.Types.JSON ( ) import GHCup.Utils.Dirs -import GHCup.Utils.File import GHCup.Utils.Logger import GHCup.Utils.MegaParsec import GHCup.Utils.Prelude import GHCup.Utils.String.QQ +import GHCup.System.Directory +import GHCup.System.Process import Codec.Archive hiding ( Directory ) import Control.Applicative diff --git a/lib/GHCup/Utils/File.hs b/lib/GHCup/Utils/File.hs deleted file mode 100644 index 9f74867..0000000 --- a/lib/GHCup/Utils/File.hs +++ /dev/null @@ -1,17 +0,0 @@ -{-# LANGUAGE CPP #-} - -module GHCup.Utils.File ( - module GHCup.Utils.File.Common, -#if IS_WINDOWS - module GHCup.Utils.File.Windows -#else - module GHCup.Utils.File.Posix -#endif -) where - -import GHCup.Utils.File.Common -#if IS_WINDOWS -import GHCup.Utils.File.Windows -#else -import GHCup.Utils.File.Posix -#endif diff --git a/lib/GHCup/Utils/Logger.hs b/lib/GHCup/Utils/Logger.hs index 980485a..d3f77dd 100644 --- a/lib/GHCup/Utils/Logger.hs +++ b/lib/GHCup/Utils/Logger.hs @@ -18,7 +18,7 @@ module GHCup.Utils.Logger where import GHCup.Types import GHCup.Types.Optics -import {-# SOURCE #-} GHCup.Utils.File.Common +import {-# SOURCE #-} GHCup.System.Directory import GHCup.Utils.String.QQ import Control.Exception.Safe