Skip to content

Commit 009c42d

Browse files
authored
Merge pull request #6428 from phadej/install-z
Implement cabal install -z
2 parents 9a2425a + 82ad220 commit 009c42d

File tree

6 files changed

+52
-19
lines changed

6 files changed

+52
-19
lines changed

cabal-install/Distribution/Client/CmdInstall.hs

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ import Distribution.Client.IndexUtils
7373
( getSourcePackages, getInstalledPackages )
7474
import Distribution.Client.ProjectConfig
7575
( readGlobalConfig, projectConfigWithBuilderRepoContext
76-
, resolveBuildTimeSettings, withProjectOrGlobalConfig )
76+
, resolveBuildTimeSettings, withProjectOrGlobalConfigIgn )
7777
import Distribution.Client.ProjectPlanning
7878
( storePackageInstallDirs' )
7979
import qualified Distribution.Simple.InstallDirs as InstallDirs
@@ -261,6 +261,7 @@ installAction ( configFlags, configExFlags, installFlags
261261
targetFilter = if installLibs then Just LibKind else Just ExeKind
262262
targetStrings' = if null targetStrings then ["."] else targetStrings
263263

264+
withProject :: IO ([PackageSpecifier UnresolvedSourcePackage], [TargetSelector], ProjectConfig)
264265
withProject = do
265266
let verbosity' = lessVerbose verbosity
266267

@@ -399,6 +400,7 @@ installAction ( configFlags, configExFlags, installFlags
399400
, selectors ++ packageTargets
400401
, projectConfig localBaseCtx )
401402

403+
withoutProject :: ProjectConfig -> IO ([PackageSpecifier pkg], [TargetSelector], ProjectConfig)
402404
withoutProject globalConfig = do
403405
let
404406
parsePkg pkgName
@@ -451,9 +453,11 @@ installAction ( configFlags, configExFlags, installFlags
451453
packageTargets = flip TargetPackageNamed Nothing . pkgName <$> packageIds
452454
return (packageSpecifiers, packageTargets, projectConfig)
453455

456+
let
457+
ignoreProject = fromFlagOrDefault False (cinstIgnoreProject clientInstallFlags)
458+
454459
(specs, selectors, config) <-
455-
withProjectOrGlobalConfig verbosity globalConfigFlag
456-
withProject withoutProject
460+
withProjectOrGlobalConfigIgn ignoreProject verbosity globalConfigFlag withProject withoutProject
457461

458462
home <- getHomeDirectory
459463
let
@@ -548,6 +552,13 @@ installAction ( configFlags, configExFlags, installFlags
548552
-- installables correctly. For that, we need a place to put a
549553
-- temporary dist directory.
550554
globalTmp <- getTemporaryDirectory
555+
556+
-- if we are installing executables, we shouldn't take into account
557+
-- environment specifiers.
558+
let envSpecs' :: [PackageSpecifier a]
559+
envSpecs' | installLibs = envSpecs
560+
| otherwise = []
561+
551562
withTempDirectory
552563
verbosity
553564
globalTmp
@@ -557,7 +568,7 @@ installAction ( configFlags, configExFlags, installFlags
557568
verbosity
558569
config
559570
tmpDir
560-
(envSpecs ++ specs)
571+
(envSpecs' ++ specs)
561572
InstallCommand
562573

563574
buildCtx <-

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ instance Structured InstallMethod
2929

3030
data ClientInstallFlags = ClientInstallFlags
3131
{ cinstInstallLibs :: Flag Bool
32+
, cinstIgnoreProject :: Flag Bool
3233
, cinstEnvironmentPath :: Flag FilePath
3334
, cinstOverwritePolicy :: Flag OverwritePolicy
3435
, cinstInstallMethod :: Flag InstallMethod
@@ -48,6 +49,7 @@ instance Structured ClientInstallFlags
4849
defaultClientInstallFlags :: ClientInstallFlags
4950
defaultClientInstallFlags = ClientInstallFlags
5051
{ cinstInstallLibs = toFlag False
52+
, cinstIgnoreProject = toFlag False
5153
, cinstEnvironmentPath = mempty
5254
, cinstOverwritePolicy = mempty
5355
, cinstInstallMethod = mempty
@@ -60,6 +62,10 @@ clientInstallOptions _ =
6062
"Install libraries rather than executables from the target package."
6163
cinstInstallLibs (\v flags -> flags { cinstInstallLibs = v })
6264
trueArg
65+
, option "z" ["ignore-project"]
66+
"Ignore local project configuration"
67+
cinstIgnoreProject (\v flags -> flags { cinstIgnoreProject = v })
68+
trueArg
6369
, option [] ["package-env", "env"]
6470
"Set the environment file that may be modified."
6571
cinstEnvironmentPath (\pf flags -> flags { cinstEnvironmentPath = pf })

cabal-install/Distribution/Client/CmdRepl.hs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,15 +30,13 @@ import qualified Distribution.Client.InstallPlan as InstallPlan
3030
import Distribution.Client.ProjectBuilding
3131
( rebuildTargetsDryRun, improveInstallPlanWithUpToDatePackages )
3232
import Distribution.Client.ProjectConfig
33-
( ProjectConfig(..), withProjectOrGlobalConfig
34-
, projectConfigConfigFile, readGlobalConfig )
33+
( ProjectConfig(..), withProjectOrGlobalConfigIgn
34+
, projectConfigConfigFile )
3535
import Distribution.Client.ProjectOrchestration
3636
import Distribution.Client.ProjectPlanning
3737
( ElaboratedSharedConfig(..), ElaboratedInstallPlan )
3838
import Distribution.Client.ProjectPlanning.Types
3939
( elabOrderExeDependencies )
40-
import Distribution.Client.RebuildMonad
41-
( runRebuild )
4240
import Distribution.Client.Setup
4341
( GlobalFlags, ConfigFlags(..), ConfigExFlags, InstallFlags )
4442
import qualified Distribution.Client.Setup as Client
@@ -237,11 +235,8 @@ replAction ( configFlags, configExFlags, installFlags
237235
with = withProject cliConfig verbosity targetStrings
238236
without config = withoutProject (config <> cliConfig) verbosity targetStrings
239237

240-
(baseCtx, targetSelectors, finalizer, replType) <- if ignoreProject
241-
then do
242-
globalConfig <- runRebuild "" $ readGlobalConfig verbosity globalConfigFlag
243-
without globalConfig
244-
else withProjectOrGlobalConfig verbosity globalConfigFlag with without
238+
(baseCtx, targetSelectors, finalizer, replType) <-
239+
withProjectOrGlobalConfigIgn ignoreProject verbosity globalConfigFlag with without
245240

246241
when (buildSettingOnlyDeps (buildSettings baseCtx)) $
247242
die' verbosity $ "The repl command does not support '--only-dependencies'. "

cabal-install/Distribution/Client/Config.hs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -341,12 +341,13 @@ instance Semigroup SavedConfig where
341341
combine = combine' savedInstallFlags
342342
lastNonEmptyNL = lastNonEmptyNL' savedInstallFlags
343343

344-
combinedSavedClientInstallFlags = ClientInstallFlags {
345-
cinstInstallLibs = combine cinstInstallLibs,
346-
cinstEnvironmentPath = combine cinstEnvironmentPath,
347-
cinstOverwritePolicy = combine cinstOverwritePolicy,
348-
cinstInstallMethod = combine cinstInstallMethod,
349-
cinstInstalldir = combine cinstInstalldir
344+
combinedSavedClientInstallFlags = ClientInstallFlags
345+
{ cinstInstallLibs = combine cinstInstallLibs
346+
, cinstIgnoreProject = combine cinstIgnoreProject
347+
, cinstEnvironmentPath = combine cinstEnvironmentPath
348+
, cinstOverwritePolicy = combine cinstOverwritePolicy
349+
, cinstInstallMethod = combine cinstInstallMethod
350+
, cinstInstalldir = combine cinstInstalldir
350351
}
351352
where
352353
combine = combine' savedClientInstallFlags

cabal-install/Distribution/Client/ProjectConfig.hs

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ module Distribution.Client.ProjectConfig (
2929
readGlobalConfig,
3030
readProjectLocalFreezeConfig,
3131
withProjectOrGlobalConfig,
32+
withProjectOrGlobalConfigIgn,
3233
writeProjectLocalExtraConfig,
3334
writeProjectLocalFreezeConfig,
3435
writeProjectConfigFile,
@@ -454,6 +455,24 @@ renderBadProjectRoot :: BadProjectRoot -> String
454455
renderBadProjectRoot (BadProjectRootExplicitFile projectFile) =
455456
"The given project file '" ++ projectFile ++ "' does not exist."
456457

458+
-- | Like 'withProjectOrGlobalConfig', with an additional boolean
459+
-- which tells to ignore local project.
460+
--
461+
-- Used to implement -z / --ignore-project behaviour
462+
--
463+
withProjectOrGlobalConfigIgn
464+
:: Bool -- ^ whether to ignore local project
465+
-> Verbosity
466+
-> Flag FilePath
467+
-> IO a
468+
-> (ProjectConfig -> IO a)
469+
-> IO a
470+
withProjectOrGlobalConfigIgn True verbosity gcf _with without = do
471+
globalConfig <- runRebuild "" $ readGlobalConfig verbosity gcf
472+
without globalConfig
473+
withProjectOrGlobalConfigIgn False verbosity gcf with without =
474+
withProjectOrGlobalConfig verbosity gcf with without
475+
457476
withProjectOrGlobalConfig :: Verbosity
458477
-> Flag FilePath
459478
-> IO a

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -366,6 +366,7 @@ instance Arbitrary ClientInstallFlags where
366366
arbitrary =
367367
ClientInstallFlags
368368
<$> arbitrary
369+
<*> arbitrary
369370
<*> arbitraryFlag arbitraryShortToken
370371
<*> arbitrary
371372
<*> arbitrary

0 commit comments

Comments
 (0)