Skip to content

Commit 5e8deb0

Browse files
committed
Refactor clean and sdist to use NixStyleFlags
- Consistently use `NixStyleFlags` for all v2- commands. - This will simplify future changes such as #7999. - Mostly keep option parsers unchanged with the following exceptions: - Reorder options to by consistent with nixStyleOptions ConfigFlags > ProjectFlags > ExtraFlags - Add --ignore-project to clean, which currently does nothing, but will be useful for future clean improvements.
1 parent 9a104a9 commit 5e8deb0

File tree

3 files changed

+65
-77
lines changed

3 files changed

+65
-77
lines changed

cabal-install/src/Distribution/Client/CmdClean.hs

Lines changed: 28 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,22 @@ import Distribution.Client.Compat.Prelude
66

77
import Distribution.Client.DistDirLayout
88
( DistDirLayout(..), defaultDistDirLayout )
9+
import Distribution.Client.NixStyleOptions
10+
( NixStyleFlags (..), defaultNixStyleFlags )
911
import Distribution.Client.ProjectConfig
1012
( findProjectRoot )
13+
import Distribution.Client.ProjectFlags
14+
( ProjectFlags(..), projectFlagsOptions )
1115
import Distribution.Client.ScriptUtils
1216
( getScriptCacheDirectoryRoot )
1317
import Distribution.Client.Setup
14-
( GlobalFlags )
15-
import Distribution.ReadE ( succeedReadE )
18+
( ConfigFlags(..), GlobalFlags, liftOptions )
1619
import Distribution.Simple.Setup
17-
( Flag(..), toFlag, fromFlagOrDefault, flagToList, flagToMaybe
20+
( Flag(..), toFlag, fromFlagOrDefault, flagToMaybe
1821
, optionDistPref, optionVerbosity, falseArg
1922
)
2023
import Distribution.Simple.Command
21-
( CommandUI(..), option, reqArg )
24+
( CommandUI(..), option )
2225
import Distribution.Simple.Utils
2326
( info, die', wrapText, handleDoesNotExist )
2427
import Distribution.Verbosity
@@ -36,21 +39,15 @@ import System.FilePath
3639
( (</>) )
3740

3841
data CleanFlags = CleanFlags
39-
{ cleanSaveConfig :: Flag Bool
40-
, cleanVerbosity :: Flag Verbosity
41-
, cleanDistDir :: Flag FilePath
42-
, cleanProjectFile :: Flag FilePath
42+
{ cleanSaveConfig :: Flag Bool
4343
} deriving (Eq)
4444

4545
defaultCleanFlags :: CleanFlags
4646
defaultCleanFlags = CleanFlags
47-
{ cleanSaveConfig = toFlag False
48-
, cleanVerbosity = toFlag normal
49-
, cleanDistDir = NoFlag
50-
, cleanProjectFile = mempty
47+
{ cleanSaveConfig = toFlag False
5148
}
5249

53-
cleanCommand :: CommandUI CleanFlags
50+
cleanCommand :: CommandUI (NixStyleFlags CleanFlags)
5451
cleanCommand = CommandUI
5552
{ commandName = "v2-clean"
5653
, commandSynopsis = "Clean the package store and remove temporary files."
@@ -61,31 +58,33 @@ cleanCommand = CommandUI
6158
++ "(.hi, .o, preprocessed sources, etc.) and also empties out the "
6259
++ "local caches (by default).\n\n"
6360
, commandNotes = Nothing
64-
, commandDefaultFlags = defaultCleanFlags
61+
, commandDefaultFlags = defaultNixStyleFlags defaultCleanFlags
6562
, commandOptions = \showOrParseArgs ->
6663
[ optionVerbosity
67-
cleanVerbosity (\v flags -> flags { cleanVerbosity = v })
64+
(configVerbosity . configFlags)
65+
(\v flags -> flags { configFlags = (configFlags flags) { configVerbosity = v } })
6866
, optionDistPref
69-
cleanDistDir (\dd flags -> flags { cleanDistDir = dd })
67+
(configDistPref . configFlags)
68+
(\dd flags -> flags { configFlags = (configFlags flags) { configDistPref = dd } })
7069
showOrParseArgs
71-
, option [] ["project-file"]
72-
("Set the name of the cabal.project file"
73-
++ " to search for in parent directories")
74-
cleanProjectFile (\pf flags -> flags {cleanProjectFile = pf})
75-
(reqArg "FILE" (succeedReadE Flag) flagToList)
76-
, option ['s'] ["save-config"]
70+
] ++ liftOptions projectFlags
71+
(\x flags -> flags { projectFlags = x })
72+
(projectFlagsOptions showOrParseArgs)
73+
++
74+
[ option ['s'] ["save-config"]
7775
"Save configuration, only remove build artifacts"
78-
cleanSaveConfig (\sc flags -> flags { cleanSaveConfig = sc })
76+
(cleanSaveConfig . extraFlags)
77+
(\sc flags -> flags { extraFlags = (extraFlags flags) { cleanSaveConfig = sc } })
7978
falseArg
8079
]
8180
}
8281

83-
cleanAction :: CleanFlags -> [String] -> GlobalFlags -> IO ()
84-
cleanAction CleanFlags{..} extraArgs _ = do
85-
let verbosity = fromFlagOrDefault normal cleanVerbosity
86-
saveConfig = fromFlagOrDefault False cleanSaveConfig
87-
mdistDirectory = flagToMaybe cleanDistDir
88-
mprojectFile = flagToMaybe cleanProjectFile
82+
cleanAction :: NixStyleFlags CleanFlags -> [String] -> GlobalFlags -> IO ()
83+
cleanAction NixStyleFlags{..} extraArgs _ = do
84+
let verbosity = fromFlagOrDefault normal $ configVerbosity configFlags
85+
saveConfig = fromFlagOrDefault False $ cleanSaveConfig extraFlags
86+
mdistDirectory = flagToMaybe $ configDistPref configFlags
87+
mprojectFile = flagToMaybe $ flagProjectFileName projectFlags
8988

9089
-- TODO interpret extraArgs as targets and clean those targets only (issue #7506)
9190
--

cabal-install/src/Distribution/Client/CmdSdist.hs

Lines changed: 34 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,12 @@ import Distribution.Client.CmdErrorMessages
1616
import Distribution.Client.ProjectOrchestration
1717
( ProjectBaseContext(..), CurrentCommand(..), establishProjectBaseContext, establishProjectBaseContextWithRoot)
1818
import Distribution.Client.NixStyleOptions
19-
( NixStyleFlags (..), defaultNixStyleFlags )
19+
( NixStyleFlags(..), defaultNixStyleFlags )
2020
import Distribution.Client.TargetSelector
2121
( TargetSelector(..), ComponentKind
2222
, readTargetSelectors, reportTargetSelectorProblems )
2323
import Distribution.Client.Setup
24-
( GlobalFlags(..) )
24+
( ConfigFlags(..), GlobalFlags(..), liftOptions )
2525
import Distribution.Solver.Types.SourcePackage
2626
( SourcePackage(..) )
2727
import Distribution.Client.Types
@@ -31,23 +31,21 @@ import Distribution.Client.DistDirLayout
3131
import Distribution.Client.ProjectConfig
3232
( ProjectConfig, withProjectOrGlobalConfig, commandLineFlagsToProjectConfig, projectConfigConfigFile, projectConfigShared )
3333
import Distribution.Client.ProjectFlags
34-
( ProjectFlags (..), defaultProjectFlags, projectFlagsOptions )
34+
( ProjectFlags(..), projectFlagsOptions )
3535

36-
import Distribution.Compat.Lens
37-
( _1, _2 )
3836
import Distribution.Package
3937
( Package(packageId) )
4038
import Distribution.PackageDescription.Configuration
4139
( flattenPackageDescription )
4240
import Distribution.ReadE
4341
( succeedReadE )
4442
import Distribution.Simple.Command
45-
( CommandUI(..), OptionField, option, reqArg, liftOptionL, ShowOrParseArgs )
43+
( CommandUI(..), OptionField, option, reqArg, ShowOrParseArgs )
4644
import Distribution.Simple.PreProcess
4745
( knownSuffixHandlers )
4846
import Distribution.Simple.Setup
4947
( Flag(..), toFlag, fromFlagOrDefault, flagToList, flagToMaybe
50-
, optionVerbosity, optionDistPref, trueArg, configVerbosity, configDistPref
48+
, optionVerbosity, optionDistPref, trueArg
5149
)
5250
import Distribution.Simple.SrcDist
5351
( listPackageSourcesWithDie )
@@ -75,7 +73,7 @@ import System.FilePath
7573
-- Command
7674
-------------------------------------------------------------------------------
7775

78-
sdistCommand :: CommandUI (ProjectFlags, SdistFlags)
76+
sdistCommand :: CommandUI (NixStyleFlags SdistFlags)
7977
sdistCommand = CommandUI
8078
{ commandName = "v2-sdist"
8179
, commandSynopsis = "Generate a source distribution file (.tar.gz)."
@@ -84,60 +82,63 @@ sdistCommand = CommandUI
8482
, commandDescription = Just $ \_ -> wrapText
8583
"Generates tarballs of project packages suitable for upload to Hackage."
8684
, commandNotes = Nothing
87-
, commandDefaultFlags = (defaultProjectFlags, defaultSdistFlags)
88-
, commandOptions = \showOrParseArgs ->
89-
map (liftOptionL _1) (projectFlagsOptions showOrParseArgs) ++
90-
map (liftOptionL _2) (sdistOptions showOrParseArgs)
85+
, commandDefaultFlags = defaultNixStyleFlags defaultSdistFlags
86+
, commandOptions = sdistOptions
9187
}
9288

9389
-------------------------------------------------------------------------------
9490
-- Flags
9591
-------------------------------------------------------------------------------
9692

9793
data SdistFlags = SdistFlags
98-
{ sdistVerbosity :: Flag Verbosity
99-
, sdistDistDir :: Flag FilePath
100-
, sdistListSources :: Flag Bool
94+
{ sdistListSources :: Flag Bool
10195
, sdistNulSeparated :: Flag Bool
10296
, sdistOutputPath :: Flag FilePath
10397
}
10498

10599
defaultSdistFlags :: SdistFlags
106100
defaultSdistFlags = SdistFlags
107-
{ sdistVerbosity = toFlag normal
108-
, sdistDistDir = mempty
109-
, sdistListSources = toFlag False
101+
{ sdistListSources = toFlag False
110102
, sdistNulSeparated = toFlag False
111103
, sdistOutputPath = mempty
112104
}
113105

114-
sdistOptions :: ShowOrParseArgs -> [OptionField SdistFlags]
106+
sdistOptions :: ShowOrParseArgs -> [OptionField (NixStyleFlags SdistFlags)]
115107
sdistOptions showOrParseArgs =
116108
[ optionVerbosity
117-
sdistVerbosity (\v flags -> flags { sdistVerbosity = v })
109+
(configVerbosity . configFlags)
110+
(\v flags -> flags { configFlags = (configFlags flags) { configVerbosity = v } })
118111
, optionDistPref
119-
sdistDistDir (\dd flags -> flags { sdistDistDir = dd })
112+
(configDistPref . configFlags)
113+
(\dd flags -> flags { configFlags = (configFlags flags) { configDistPref = dd } })
120114
showOrParseArgs
121-
, option ['l'] ["list-only"]
115+
] ++ liftOptions projectFlags
116+
(\x flags -> flags { projectFlags = x })
117+
(projectFlagsOptions showOrParseArgs)
118+
++
119+
[ option ['l'] ["list-only"]
122120
"Just list the sources, do not make a tarball"
123-
sdistListSources (\v flags -> flags { sdistListSources = v })
121+
(sdistListSources . extraFlags)
122+
(\v flags -> flags { extraFlags = (extraFlags flags) { sdistListSources = v } })
124123
trueArg
125124
, option [] ["null-sep"]
126125
"Separate the source files with NUL bytes rather than newlines."
127-
sdistNulSeparated (\v flags -> flags { sdistNulSeparated = v })
126+
(sdistNulSeparated . extraFlags)
127+
(\v flags -> flags { extraFlags = (extraFlags flags) { sdistNulSeparated = v } })
128128
trueArg
129129
, option ['o'] ["output-directory", "outputdir"]
130130
"Choose the output directory of this command. '-' sends all output to stdout"
131-
sdistOutputPath (\o flags -> flags { sdistOutputPath = o })
131+
(sdistOutputPath . extraFlags)
132+
(\o flags -> flags { extraFlags = (extraFlags flags) { sdistOutputPath = o } })
132133
(reqArg "PATH" (succeedReadE Flag) flagToList)
133134
]
134135

135136
-------------------------------------------------------------------------------
136137
-- Action
137138
-------------------------------------------------------------------------------
138139

139-
sdistAction :: (ProjectFlags, SdistFlags) -> [String] -> GlobalFlags -> IO ()
140-
sdistAction (ProjectFlags{..}, SdistFlags{..}) targetStrings globalFlags = do
140+
sdistAction :: NixStyleFlags SdistFlags -> [String] -> GlobalFlags -> IO ()
141+
sdistAction flags@NixStyleFlags{..} targetStrings globalFlags = do
141142
(baseCtx, distDirLayout) <- withProjectOrGlobalConfig verbosity ignoreProject globalConfigFlag withProject withoutProject
142143

143144
let localPkgs = localPackages baseCtx
@@ -183,22 +184,14 @@ sdistAction (ProjectFlags{..}, SdistFlags{..}) targetStrings globalFlags = do
183184
| otherwise ->
184185
traverse_ (\pkg -> packageToSdist verbosity (distProjectRootDirectory distDirLayout) format (outputPath pkg) pkg) pkgs
185186
where
186-
verbosity = fromFlagOrDefault normal sdistVerbosity
187-
listSources = fromFlagOrDefault False sdistListSources
188-
nulSeparated = fromFlagOrDefault False sdistNulSeparated
189-
mOutputPath = flagToMaybe sdistOutputPath
190-
ignoreProject = flagIgnoreProject
187+
verbosity = fromFlagOrDefault normal $ configVerbosity configFlags
188+
listSources = fromFlagOrDefault False $ sdistListSources extraFlags
189+
nulSeparated = fromFlagOrDefault False $ sdistNulSeparated extraFlags
190+
mOutputPath = flagToMaybe $ sdistOutputPath extraFlags
191+
ignoreProject = flagIgnoreProject projectFlags
191192

192193
prjConfig :: ProjectConfig
193-
prjConfig = commandLineFlagsToProjectConfig
194-
globalFlags
195-
(defaultNixStyleFlags ())
196-
{ configFlags = (configFlags $ defaultNixStyleFlags ())
197-
{ configVerbosity = sdistVerbosity
198-
, configDistPref = sdistDistDir
199-
}
200-
}
201-
mempty
194+
prjConfig = commandLineFlagsToProjectConfig globalFlags flags mempty
202195

203196
globalConfigFlag = projectConfigConfigFile (projectConfigShared prjConfig)
204197

cabal-install/src/Distribution/Client/ProjectFlags.hs

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,11 @@ module Distribution.Client.ProjectFlags (
1010
import Distribution.Client.Compat.Prelude
1111
import Prelude ()
1212

13+
import Distribution.Client.Setup (yesNoOpt)
1314
import Distribution.ReadE (succeedReadE)
1415
import Distribution.Simple.Command
15-
( MkOptDescr, OptionField(optionName), ShowOrParseArgs (..), boolOpt', option
16-
, reqArg )
17-
import Distribution.Simple.Setup (Flag (..), flagToList, flagToMaybe, toFlag, trueArg)
16+
( OptionField(optionName), ShowOrParseArgs (..), option, reqArg )
17+
import Distribution.Simple.Setup (Flag (..), flagToList, toFlag)
1818

1919
data ProjectFlags = ProjectFlags
2020
{ flagProjectFileName :: Flag FilePath
@@ -63,7 +63,3 @@ instance Monoid ProjectFlags where
6363

6464
instance Semigroup ProjectFlags where
6565
(<>) = gmappend
66-
67-
yesNoOpt :: ShowOrParseArgs -> MkOptDescr (b -> Flag Bool) (Flag Bool -> b -> b) b
68-
yesNoOpt ShowArgs sf lf = trueArg sf lf
69-
yesNoOpt _ sf lf = boolOpt' flagToMaybe Flag (sf, lf) ([], map ("no-" ++) lf) sf lf

0 commit comments

Comments
 (0)