forked from commercialhaskell/stack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDockerParser.hs
More file actions
151 lines (148 loc) · 5.59 KB
/
Copy pathDockerParser.hs
File metadata and controls
151 lines (148 loc) · 5.59 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
{-# LANGUAGE NoImplicitPrelude #-}
module Stack.Options.DockerParser
( dockerOptsParser
) where
import Data.List ( intercalate )
import qualified Data.Text as T
import Distribution.Version ( anyVersion )
import Options.Applicative
( Parser, auto, completer, help, listCompleter, long, metavar
, option, str, value
)
import Options.Applicative.Args ( argsOption )
import Options.Applicative.Builder.Extra
( dirCompleter, eitherReader', fileCompleter
, firstBoolFlagsFalse, firstBoolFlagsNoDefault
, firstBoolFlagsTrue, optionalFirst
)
import Stack.Docker ( dockerCmdName )
import Stack.Prelude
import Stack.Options.Utils ( hideMods )
import Stack.Types.Version ( IntersectingVersionRange (..) )
import Stack.Types.Docker
( DockerMonoidRepoOrImage (..), DockerOptsMonoid (..)
, dockerAutoPullArgName, dockerImageArgName
, dockerContainerNameArgName, dockerDetachArgName
, dockerEnvArgName, dockerPersistArgName
, dockerRegistryLoginArgName, dockerRegistryPasswordArgName
, dockerRegistryUsernameArgName, dockerRepoArgName
, dockerRunArgsArgName, dockerMountArgName
, dockerMountModeArgName, dockerNetworkArgName
, dockerSetUserArgName, dockerStackExeArgName
, dockerStackExeDownloadVal, dockerStackExeHostVal
, dockerStackExeImageVal, parseDockerStackExe
)
-- | Options parser configuration for Docker.
dockerOptsParser :: Bool -> Parser DockerOptsMonoid
dockerOptsParser hide0 = DockerOptsMonoid (Any False)
<$> firstBoolFlagsNoDefault
dockerCmdName
"using a Docker container. --docker implies 'system-ghc: true'"
hide
<*> fmap First
( Just . DockerMonoidRepo <$> option str
( long (dockerOptName dockerRepoArgName)
<> hide
<> metavar "NAME"
<> help "Docker repository name"
)
<|> Just . DockerMonoidImage <$> option str
( long (dockerOptName dockerImageArgName)
<> hide
<> metavar "IMAGE"
<> help "Exact Docker image ID (overrides docker-repo)"
)
<|> pure Nothing
)
<*> firstBoolFlagsNoDefault
(dockerOptName dockerRegistryLoginArgName)
"registry requires login"
hide
<*> firstStrOption
( long (dockerOptName dockerRegistryUsernameArgName)
<> hide
<> metavar "USERNAME"
<> help "Docker registry username"
)
<*> firstStrOption
( long (dockerOptName dockerRegistryPasswordArgName)
<> hide
<> metavar "PASSWORD"
<> help "Docker registry password"
)
<*> firstBoolFlagsTrue
(dockerOptName dockerAutoPullArgName)
"automatic pulling latest version of image"
hide
<*> firstBoolFlagsFalse
(dockerOptName dockerDetachArgName)
"running a detached Docker container"
hide
<*> firstBoolFlagsFalse
(dockerOptName dockerPersistArgName)
"not deleting container after it exits"
hide
<*> firstStrOption
( long (dockerOptName dockerContainerNameArgName)
<> hide
<> metavar "NAME"
<> help "Docker container name"
)
<*> firstStrOption
( long (dockerOptName dockerNetworkArgName)
<> hide
<> metavar "NETWORK"
<> help "Docker network"
)
<*> argsOption
( long (dockerOptName dockerRunArgsArgName)
<> hide
<> value []
<> metavar "'ARG1 [ARG2 ...]'"
<> help "Additional options to pass to 'docker run'")
<*> many (option auto
( long (dockerOptName dockerMountArgName)
<> hide
<> metavar "(PATH | HOST-PATH:CONTAINER-PATH)"
<> completer dirCompleter
<> help "Mount volumes from host in container (can be specified \
\multiple times)"
))
<*> firstStrOption
( long (dockerOptName dockerMountModeArgName)
<> hide
<> metavar "SUFFIX"
<> help "Volume mount mode suffix"
)
<*> many (option str
( long (dockerOptName dockerEnvArgName)
<> hide
<> metavar "NAME=VALUE"
<> help "Set environment variable in container (can be specified \
\multiple times)"
))
<*> optionalFirst (option (eitherReader' parseDockerStackExe)
( let specialOpts = [ dockerStackExeDownloadVal
, dockerStackExeHostVal
, dockerStackExeImageVal
]
in long (dockerOptName dockerStackExeArgName)
<> hide
<> metavar (intercalate "|" (specialOpts ++ ["PATH"]))
<> completer (listCompleter specialOpts <> fileCompleter)
<> help ( concat
[ "Location of "
, stackProgName
, " executable used in container"
]
)
))
<*> firstBoolFlagsNoDefault
(dockerOptName dockerSetUserArgName)
"setting user in container to match host"
hide
<*> pure (IntersectingVersionRange anyVersion)
where
dockerOptName optName = dockerCmdName ++ "-" ++ T.unpack optName
firstStrOption = optionalFirst . option str
hide = hideMods hide0