Skip to content

Commit a4f2082

Browse files
authored
Merge pull request #6817 from phadej/types-install-method-overwrite-policy
Make own modules for InstallMethod and OverwritePolicy
2 parents 827d655 + 8473569 commit a4f2082

File tree

10 files changed

+104
-61
lines changed

10 files changed

+104
-61
lines changed

cabal-install/Distribution/Client/CmdInstall.hs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,9 @@ import Distribution.Client.DistDirLayout
9292
import Distribution.Client.RebuildMonad
9393
( runRebuild )
9494
import Distribution.Client.InstallSymlink
95-
( OverwritePolicy(..), symlinkBinary, trySymlink )
95+
( symlinkBinary, trySymlink )
96+
import Distribution.Client.Types.OverwritePolicy
97+
( OverwritePolicy (..) )
9698
import Distribution.Simple.Flag
9799
( fromFlagOrDefault, flagToMaybe, flagElim )
98100
import Distribution.Simple.Setup

cabal-install/Distribution/Client/CmdInstall/ClientInstallFlags.hs

Lines changed: 20 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -8,24 +8,23 @@ module Distribution.Client.CmdInstall.ClientInstallFlags
88
) where
99

1010
import Distribution.Client.Compat.Prelude
11+
import Prelude ()
1112

1213
import Distribution.ReadE
13-
( ReadE(..), succeedReadE )
14+
( succeedReadE, parsecToReadE )
1415
import Distribution.Simple.Command
1516
( ShowOrParseArgs(..), OptionField(..), option, reqArg )
1617
import Distribution.Simple.Setup
1718
( Flag(..), trueArg, flagToList, toFlag )
19+
import Distribution.Parsec (Parsec (..), CabalParsing)
20+
import Distribution.Pretty (prettyShow)
1821

19-
import Distribution.Client.InstallSymlink
22+
import Distribution.Client.Types.InstallMethod
23+
( InstallMethod (..) )
24+
import Distribution.Client.Types.OverwritePolicy
2025
( OverwritePolicy(..) )
2126

22-
23-
data InstallMethod = InstallMethodCopy
24-
| InstallMethodSymlink
25-
deriving (Eq, Show, Generic, Bounded, Enum)
26-
27-
instance Binary InstallMethod
28-
instance Structured InstallMethod
27+
import qualified Distribution.Compat.CharParsing as P
2928

3029
data ClientInstallFlags = ClientInstallFlags
3130
{ cinstInstallLibs :: Flag Bool
@@ -67,42 +66,26 @@ clientInstallOptions _ =
6766
, option [] ["overwrite-policy"]
6867
"How to handle already existing symlinks."
6968
cinstOverwritePolicy (\v flags -> flags { cinstOverwritePolicy = v })
70-
$ reqArg
71-
"always|never"
72-
readOverwritePolicyFlag
73-
showOverwritePolicyFlag
69+
$ reqArg "always|never"
70+
(parsecToReadE (\err -> "Error parsing overwrite-policy: " ++ err) (toFlag `fmap` parsec))
71+
(map prettyShow . flagToList)
7472
, option [] ["install-method"]
7573
"How to install the executables."
7674
cinstInstallMethod (\v flags -> flags { cinstInstallMethod = v })
7775
$ reqArg
7876
"default|copy|symlink"
79-
readInstallMethodFlag
80-
showInstallMethodFlag
77+
(parsecToReadE (\err -> "Error parsing install-method: " ++ err) (toFlag `fmap` parsecInstallMethod))
78+
(map prettyShow . flagToList)
8179
, option [] ["installdir"]
8280
"Where to install (by symlinking or copying) the executables in."
8381
cinstInstalldir (\v flags -> flags { cinstInstalldir = v })
8482
$ reqArg "DIR" (succeedReadE Flag) flagToList
8583
]
8684

87-
readOverwritePolicyFlag :: ReadE (Flag OverwritePolicy)
88-
readOverwritePolicyFlag = ReadE $ \case
89-
"always" -> Right $ Flag AlwaysOverwrite
90-
"never" -> Right $ Flag NeverOverwrite
91-
policy -> Left $ "'" <> policy <> "' isn't a valid overwrite policy"
92-
93-
showOverwritePolicyFlag :: Flag OverwritePolicy -> [String]
94-
showOverwritePolicyFlag (Flag AlwaysOverwrite) = ["always"]
95-
showOverwritePolicyFlag (Flag NeverOverwrite) = ["never"]
96-
showOverwritePolicyFlag NoFlag = []
97-
98-
readInstallMethodFlag :: ReadE (Flag InstallMethod)
99-
readInstallMethodFlag = ReadE $ \case
100-
"default" -> Right $ NoFlag
101-
"copy" -> Right $ Flag InstallMethodCopy
102-
"symlink" -> Right $ Flag InstallMethodSymlink
103-
method -> Left $ "'" <> method <> "' isn't a valid install-method"
104-
105-
showInstallMethodFlag :: Flag InstallMethod -> [String]
106-
showInstallMethodFlag (Flag InstallMethodCopy) = ["copy"]
107-
showInstallMethodFlag (Flag InstallMethodSymlink) = ["symlink"]
108-
showInstallMethodFlag NoFlag = []
85+
parsecInstallMethod :: CabalParsing m => m InstallMethod
86+
parsecInstallMethod = do
87+
name <- P.munch1 isAlpha
88+
case name of
89+
"copy" -> pure InstallMethodCopy
90+
"symlink" -> pure InstallMethodSymlink
91+
_ -> P.unexpected $ "InstallMethod: " ++ name

cabal-install/Distribution/Client/Install.hs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,8 @@ import qualified Distribution.Client.BuildReports.Anonymous as BuildReports
9494
import qualified Distribution.Client.BuildReports.Storage as BuildReports
9595
( storeAnonymous, storeLocal, fromInstallPlan, fromPlanningFailure )
9696
import qualified Distribution.Client.InstallSymlink as InstallSymlink
97-
( OverwritePolicy(..), symlinkBinaries )
97+
( symlinkBinaries )
98+
import Distribution.Client.Types.OverwritePolicy (OverwritePolicy (..))
9899
import qualified Distribution.Client.Win32SelfUpgrade as Win32SelfUpgrade
99100
import qualified Distribution.Client.World as World
100101
import qualified Distribution.InstalledPackageInfo as Installed
@@ -963,7 +964,7 @@ symlinkBinaries :: Verbosity
963964
symlinkBinaries verbosity platform comp configFlags installFlags
964965
plan buildOutcomes = do
965966
failed <- InstallSymlink.symlinkBinaries platform comp
966-
InstallSymlink.NeverOverwrite
967+
NeverOverwrite
967968
configFlags installFlags
968969
plan buildOutcomes
969970
case failed of

cabal-install/Distribution/Client/InstallSymlink.hs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,13 @@
1313
-- Managing installing binaries with symlinks.
1414
-----------------------------------------------------------------------------
1515
module Distribution.Client.InstallSymlink (
16-
OverwritePolicy(..),
1716
symlinkBinaries,
1817
symlinkBinary,
1918
trySymlink,
2019
) where
2120

22-
import Distribution.Compat.Binary
23-
( Binary )
24-
import Distribution.Utils.Structured
25-
( Structured )
21+
import Distribution.Client.Compat.Prelude hiding (ioError)
22+
import Prelude ()
2623

2724
import Distribution.Client.Types
2825
( ConfiguredPackage(..), BuildOutcomes )
@@ -60,28 +57,18 @@ import System.Directory
6057
import System.FilePath
6158
( (</>), splitPath, joinPath, isAbsolute )
6259

63-
import Prelude hiding (ioError)
6460
import System.IO.Error
6561
( isDoesNotExistError, ioError )
6662
import Distribution.Compat.Exception ( catchIO )
6763
import Control.Exception
6864
( assert )
69-
import Data.Maybe
70-
( catMaybes )
71-
import GHC.Generics
72-
( Generic )
7365

7466
import Distribution.Client.Compat.Directory ( createFileLink, getSymbolicLinkTarget, pathIsSymbolicLink )
67+
import Distribution.Client.Types.OverwritePolicy
7568

7669
import qualified Data.ByteString as BS
7770
import qualified Data.ByteString.Char8 as BS8
7871

79-
data OverwritePolicy = NeverOverwrite | AlwaysOverwrite
80-
deriving (Show, Eq, Generic, Bounded, Enum)
81-
82-
instance Binary OverwritePolicy
83-
instance Structured OverwritePolicy
84-
8572
-- | We would like by default to install binaries into some location that is on
8673
-- the user's PATH. For per-user installations on Unix systems that basically
8774
-- means the @~/bin/@ directory. On the majority of platforms the @~/bin/@
@@ -120,7 +107,7 @@ symlinkBinaries platform comp overwritePolicy
120107
publicBinDir <- canonicalizePath symlinkBinDir
121108
-- TODO: do we want to do this here? :
122109
-- createDirectoryIfMissing True publicBinDir
123-
fmap catMaybes $ sequence
110+
fmap catMaybes $ sequenceA
124111
[ do privateBinDir <- pkgBinDir pkg ipid
125112
ok <- symlinkBinary
126113
overwritePolicy
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{-# LANGUAGE DeriveGeneric #-}
2+
module Distribution.Client.Types.InstallMethod where
3+
4+
import Distribution.Client.Compat.Prelude
5+
import Prelude ()
6+
7+
import Distribution.Parsec (Parsec (..))
8+
import Distribution.Pretty (Pretty (..))
9+
10+
import qualified Distribution.Compat.CharParsing as P
11+
import qualified Text.PrettyPrint as PP
12+
13+
data InstallMethod
14+
= InstallMethodCopy
15+
| InstallMethodSymlink
16+
deriving (Eq, Show, Generic, Bounded, Enum)
17+
18+
instance Binary InstallMethod
19+
instance Structured InstallMethod
20+
21+
-- | Last
22+
instance Semigroup InstallMethod where
23+
_ <> x = x
24+
25+
instance Parsec InstallMethod where
26+
parsec = do
27+
name <- P.munch1 isAlpha
28+
case name of
29+
"copy" -> pure InstallMethodCopy
30+
"symlink" -> pure InstallMethodSymlink
31+
_ -> P.unexpected $ "InstallMethod: " ++ name
32+
33+
instance Pretty InstallMethod where
34+
pretty InstallMethodCopy = PP.text "copy"
35+
pretty InstallMethodSymlink = PP.text "symlink"
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
{-# LANGUAGE DeriveGeneric #-}
2+
module Distribution.Client.Types.OverwritePolicy where
3+
4+
import Distribution.Client.Compat.Prelude
5+
import Prelude ()
6+
7+
import Distribution.Parsec (Parsec (..))
8+
import Distribution.Pretty (Pretty (..))
9+
10+
import qualified Distribution.Compat.CharParsing as P
11+
import qualified Text.PrettyPrint as PP
12+
13+
data OverwritePolicy
14+
= NeverOverwrite
15+
| AlwaysOverwrite
16+
deriving (Show, Eq, Generic, Bounded, Enum)
17+
18+
instance Binary OverwritePolicy
19+
instance Structured OverwritePolicy
20+
21+
instance Parsec OverwritePolicy where
22+
parsec = do
23+
name <- P.munch1 isAlpha
24+
case name of
25+
"always" -> pure AlwaysOverwrite
26+
"never" -> pure NeverOverwrite
27+
_ -> P.unexpected $ "OverwritePolicy: " ++ name
28+
29+
instance Pretty OverwritePolicy where
30+
pretty NeverOverwrite = PP.text "never"
31+
pretty AlwaysOverwrite = PP.text "always"

cabal-install/cabal-install.cabal

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -256,9 +256,11 @@ executable cabal
256256
Distribution.Client.Types
257257
Distribution.Client.Types.AllowNewer
258258
Distribution.Client.Types.BuildResults
259-
Distribution.Client.Types.Credentials
260259
Distribution.Client.Types.ConfiguredId
261260
Distribution.Client.Types.ConfiguredPackage
261+
Distribution.Client.Types.Credentials
262+
Distribution.Client.Types.InstallMethod
263+
Distribution.Client.Types.OverwritePolicy
262264
Distribution.Client.Types.PackageLocation
263265
Distribution.Client.Types.PackageSpecifier
264266
Distribution.Client.Types.ReadyPackage

cabal-install/cabal-install.cabal.pp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,9 +197,11 @@
197197
Distribution.Client.Types
198198
Distribution.Client.Types.AllowNewer
199199
Distribution.Client.Types.BuildResults
200-
Distribution.Client.Types.Credentials
201200
Distribution.Client.Types.ConfiguredId
202201
Distribution.Client.Types.ConfiguredPackage
202+
Distribution.Client.Types.Credentials
203+
Distribution.Client.Types.InstallMethod
204+
Distribution.Client.Types.OverwritePolicy
203205
Distribution.Client.Types.PackageLocation
204206
Distribution.Client.Types.PackageSpecifier
205207
Distribution.Client.Types.ReadyPackage

cabal-install/tests/UnitTests/Distribution/Client/ArbitraryInstances.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ import Distribution.Client.Glob (FilePathGlob (..), Fil
3737
import Distribution.Client.IndexUtils.ActiveRepos (ActiveRepoEntry (..), ActiveRepos (..), CombineStrategy (..))
3838
import Distribution.Client.IndexUtils.IndexState (RepoIndexState (..), TotalIndexState, makeTotalIndexState)
3939
import Distribution.Client.IndexUtils.Timestamp (Timestamp, epochTimeToTimestamp)
40-
import Distribution.Client.InstallSymlink (OverwritePolicy)
40+
import Distribution.Client.Types.OverwritePolicy (OverwritePolicy)
4141
import Distribution.Client.Targets
4242
import Distribution.Client.Types (RepoName (..), WriteGhcEnvironmentFilesPolicy)
4343
import Distribution.Client.Types.AllowNewer

cabal-install/tests/UnitTests/Distribution/Client/TreeDiffInstances.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import Distribution.Client.Dependency.Types
1414
import Distribution.Client.IndexUtils.ActiveRepos
1515
import Distribution.Client.IndexUtils.IndexState
1616
import Distribution.Client.IndexUtils.Timestamp
17-
import Distribution.Client.InstallSymlink
1817
import Distribution.Client.ProjectConfig.Types
1918
import Distribution.Client.Targets
2019
import Distribution.Client.Types
20+
import Distribution.Client.Types.OverwritePolicy (OverwritePolicy)
2121
import Distribution.Client.Types.SourceRepo (SourceRepositoryPackage)
2222

2323
import UnitTests.Distribution.Client.GenericInstances ()

0 commit comments

Comments
 (0)