Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor clean and sdist to use NixStyleFlags #8017

Draft
wants to merge 1 commit into
base: master
Choose a base branch
from
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
57 changes: 28 additions & 29 deletions cabal-install/src/Distribution/Client/CmdClean.hs
Original file line number Diff line number Diff line change
Expand Up @@ -6,19 +6,22 @@ import Distribution.Client.Compat.Prelude

import Distribution.Client.DistDirLayout
( DistDirLayout(..), defaultDistDirLayout )
import Distribution.Client.NixStyleOptions
( NixStyleFlags (..), defaultNixStyleFlags )
import Distribution.Client.ProjectConfig
( findProjectRoot )
import Distribution.Client.ProjectFlags
( ProjectFlags(..), projectFlagsOptions )
import Distribution.Client.ScriptUtils
( getScriptCacheDirectoryRoot )
import Distribution.Client.Setup
( GlobalFlags )
import Distribution.ReadE ( succeedReadE )
( ConfigFlags(..), GlobalFlags, liftOptions )
import Distribution.Simple.Setup
( Flag(..), toFlag, fromFlagOrDefault, flagToList, flagToMaybe
( Flag(..), toFlag, fromFlagOrDefault, flagToMaybe
, optionDistPref, optionVerbosity, falseArg
)
import Distribution.Simple.Command
( CommandUI(..), option, reqArg )
( CommandUI(..), option )
import Distribution.Simple.Utils
( info, die', wrapText, handleDoesNotExist )
import Distribution.Verbosity
Expand All @@ -36,21 +39,15 @@ import System.FilePath
( (</>) )

data CleanFlags = CleanFlags
{ cleanSaveConfig :: Flag Bool
, cleanVerbosity :: Flag Verbosity
, cleanDistDir :: Flag FilePath
, cleanProjectFile :: Flag FilePath
{ cleanSaveConfig :: Flag Bool
} deriving (Eq)

defaultCleanFlags :: CleanFlags
defaultCleanFlags = CleanFlags
{ cleanSaveConfig = toFlag False
, cleanVerbosity = toFlag normal
, cleanDistDir = NoFlag
, cleanProjectFile = mempty
{ cleanSaveConfig = toFlag False
}

cleanCommand :: CommandUI CleanFlags
cleanCommand :: CommandUI (NixStyleFlags CleanFlags)
cleanCommand = CommandUI
{ commandName = "v2-clean"
, commandSynopsis = "Clean the package store and remove temporary files."
Expand All @@ -61,31 +58,33 @@ cleanCommand = CommandUI
++ "(.hi, .o, preprocessed sources, etc.) and also empties out the "
++ "local caches (by default).\n\n"
, commandNotes = Nothing
, commandDefaultFlags = defaultCleanFlags
, commandDefaultFlags = defaultNixStyleFlags defaultCleanFlags
, commandOptions = \showOrParseArgs ->
[ optionVerbosity
cleanVerbosity (\v flags -> flags { cleanVerbosity = v })
(configVerbosity . configFlags)
(\v flags -> flags { configFlags = (configFlags flags) { configVerbosity = v } })
, optionDistPref
cleanDistDir (\dd flags -> flags { cleanDistDir = dd })
(configDistPref . configFlags)
(\dd flags -> flags { configFlags = (configFlags flags) { configDistPref = dd } })
showOrParseArgs
, option [] ["project-file"]
("Set the name of the cabal.project file"
++ " to search for in parent directories")
cleanProjectFile (\pf flags -> flags {cleanProjectFile = pf})
(reqArg "FILE" (succeedReadE Flag) flagToList)
, option ['s'] ["save-config"]
] ++ liftOptions projectFlags
(\x flags -> flags { projectFlags = x })
(projectFlagsOptions showOrParseArgs)
++
[ option ['s'] ["save-config"]
"Save configuration, only remove build artifacts"
cleanSaveConfig (\sc flags -> flags { cleanSaveConfig = sc })
(cleanSaveConfig . extraFlags)
(\sc flags -> flags { extraFlags = (extraFlags flags) { cleanSaveConfig = sc } })
falseArg
]
}

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

-- TODO interpret extraArgs as targets and clean those targets only (issue #7506)
--
Expand Down
75 changes: 34 additions & 41 deletions cabal-install/src/Distribution/Client/CmdSdist.hs
Original file line number Diff line number Diff line change
Expand Up @@ -16,12 +16,12 @@ import Distribution.Client.CmdErrorMessages
import Distribution.Client.ProjectOrchestration
( ProjectBaseContext(..), CurrentCommand(..), establishProjectBaseContext, establishProjectBaseContextWithRoot)
import Distribution.Client.NixStyleOptions
( NixStyleFlags (..), defaultNixStyleFlags )
( NixStyleFlags(..), defaultNixStyleFlags )
import Distribution.Client.TargetSelector
( TargetSelector(..), ComponentKind
, readTargetSelectors, reportTargetSelectorProblems )
import Distribution.Client.Setup
( GlobalFlags(..) )
( ConfigFlags(..), GlobalFlags(..), liftOptions )
import Distribution.Solver.Types.SourcePackage
( SourcePackage(..) )
import Distribution.Client.Types
Expand All @@ -31,23 +31,21 @@ import Distribution.Client.DistDirLayout
import Distribution.Client.ProjectConfig
( ProjectConfig, withProjectOrGlobalConfig, commandLineFlagsToProjectConfig, projectConfigConfigFile, projectConfigShared )
import Distribution.Client.ProjectFlags
( ProjectFlags (..), defaultProjectFlags, projectFlagsOptions )
( ProjectFlags(..), projectFlagsOptions )

import Distribution.Compat.Lens
( _1, _2 )
import Distribution.Package
( Package(packageId) )
import Distribution.PackageDescription.Configuration
( flattenPackageDescription )
import Distribution.ReadE
( succeedReadE )
import Distribution.Simple.Command
( CommandUI(..), OptionField, option, reqArg, liftOptionL, ShowOrParseArgs )
( CommandUI(..), OptionField, option, reqArg, ShowOrParseArgs )
import Distribution.Simple.PreProcess
( knownSuffixHandlers )
import Distribution.Simple.Setup
( Flag(..), toFlag, fromFlagOrDefault, flagToList, flagToMaybe
, optionVerbosity, optionDistPref, trueArg, configVerbosity, configDistPref
, optionVerbosity, optionDistPref, trueArg
)
import Distribution.Simple.SrcDist
( listPackageSourcesWithDie )
Expand Down Expand Up @@ -75,7 +73,7 @@ import System.FilePath
-- Command
-------------------------------------------------------------------------------

sdistCommand :: CommandUI (ProjectFlags, SdistFlags)
sdistCommand :: CommandUI (NixStyleFlags SdistFlags)
sdistCommand = CommandUI
{ commandName = "v2-sdist"
, commandSynopsis = "Generate a source distribution file (.tar.gz)."
Expand All @@ -84,60 +82,63 @@ sdistCommand = CommandUI
, commandDescription = Just $ \_ -> wrapText
"Generates tarballs of project packages suitable for upload to Hackage."
, commandNotes = Nothing
, commandDefaultFlags = (defaultProjectFlags, defaultSdistFlags)
, commandOptions = \showOrParseArgs ->
map (liftOptionL _1) (projectFlagsOptions showOrParseArgs) ++
map (liftOptionL _2) (sdistOptions showOrParseArgs)
, commandDefaultFlags = defaultNixStyleFlags defaultSdistFlags
, commandOptions = sdistOptions
}

-------------------------------------------------------------------------------
-- Flags
-------------------------------------------------------------------------------

data SdistFlags = SdistFlags
{ sdistVerbosity :: Flag Verbosity
, sdistDistDir :: Flag FilePath
, sdistListSources :: Flag Bool
{ sdistListSources :: Flag Bool
, sdistNulSeparated :: Flag Bool
, sdistOutputPath :: Flag FilePath
}

defaultSdistFlags :: SdistFlags
defaultSdistFlags = SdistFlags
{ sdistVerbosity = toFlag normal
, sdistDistDir = mempty
, sdistListSources = toFlag False
{ sdistListSources = toFlag False
, sdistNulSeparated = toFlag False
, sdistOutputPath = mempty
}

sdistOptions :: ShowOrParseArgs -> [OptionField SdistFlags]
sdistOptions :: ShowOrParseArgs -> [OptionField (NixStyleFlags SdistFlags)]
sdistOptions showOrParseArgs =
[ optionVerbosity
sdistVerbosity (\v flags -> flags { sdistVerbosity = v })
(configVerbosity . configFlags)
(\v flags -> flags { configFlags = (configFlags flags) { configVerbosity = v } })
, optionDistPref
sdistDistDir (\dd flags -> flags { sdistDistDir = dd })
(configDistPref . configFlags)
(\dd flags -> flags { configFlags = (configFlags flags) { configDistPref = dd } })
showOrParseArgs
, option ['l'] ["list-only"]
] ++ liftOptions projectFlags
(\x flags -> flags { projectFlags = x })
(projectFlagsOptions showOrParseArgs)
++
[ option ['l'] ["list-only"]
"Just list the sources, do not make a tarball"
sdistListSources (\v flags -> flags { sdistListSources = v })
(sdistListSources . extraFlags)
(\v flags -> flags { extraFlags = (extraFlags flags) { sdistListSources = v } })
trueArg
, option [] ["null-sep"]
"Separate the source files with NUL bytes rather than newlines."
sdistNulSeparated (\v flags -> flags { sdistNulSeparated = v })
(sdistNulSeparated . extraFlags)
(\v flags -> flags { extraFlags = (extraFlags flags) { sdistNulSeparated = v } })
trueArg
, option ['o'] ["output-directory", "outputdir"]
"Choose the output directory of this command. '-' sends all output to stdout"
sdistOutputPath (\o flags -> flags { sdistOutputPath = o })
(sdistOutputPath . extraFlags)
(\o flags -> flags { extraFlags = (extraFlags flags) { sdistOutputPath = o } })
(reqArg "PATH" (succeedReadE Flag) flagToList)
]

-------------------------------------------------------------------------------
-- Action
-------------------------------------------------------------------------------

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

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

prjConfig :: ProjectConfig
prjConfig = commandLineFlagsToProjectConfig
globalFlags
(defaultNixStyleFlags ())
{ configFlags = (configFlags $ defaultNixStyleFlags ())
{ configVerbosity = sdistVerbosity
, configDistPref = sdistDistDir
}
}
mempty
prjConfig = commandLineFlagsToProjectConfig globalFlags flags mempty

globalConfigFlag = projectConfigConfigFile (projectConfigShared prjConfig)

Expand Down
10 changes: 3 additions & 7 deletions cabal-install/src/Distribution/Client/ProjectFlags.hs
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ module Distribution.Client.ProjectFlags (
import Distribution.Client.Compat.Prelude
import Prelude ()

import Distribution.Client.Setup (yesNoOpt)
import Distribution.ReadE (succeedReadE)
import Distribution.Simple.Command
( MkOptDescr, OptionField(optionName), ShowOrParseArgs (..), boolOpt', option
, reqArg )
import Distribution.Simple.Setup (Flag (..), flagToList, flagToMaybe, toFlag, trueArg)
( OptionField(optionName), ShowOrParseArgs (..), option, reqArg )
import Distribution.Simple.Setup (Flag (..), flagToList, toFlag)

data ProjectFlags = ProjectFlags
{ flagProjectFileName :: Flag FilePath
Expand Down Expand Up @@ -63,7 +63,3 @@ instance Monoid ProjectFlags where

instance Semigroup ProjectFlags where
(<>) = gmappend

yesNoOpt :: ShowOrParseArgs -> MkOptDescr (b -> Flag Bool) (Flag Bool -> b -> b) b
yesNoOpt ShowArgs sf lf = trueArg sf lf
yesNoOpt _ sf lf = boolOpt' flagToMaybe Flag (sf, lf) ([], map ("no-" ++) lf) sf lf
10 changes: 10 additions & 0 deletions changelog.d/pr-8017
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
synopsis: Refactor clean and sdist option parsing
packages: cabal-install
prs: #8017

description: {

- Reorder options for clean and sdist to be consistent with other commands.
- Add --ignore-project flag to clean.

}