diff --git a/cabal-install/Distribution/Client/Config.hs b/cabal-install/Distribution/Client/Config.hs index 39f309172b6e77cc62f1082d81d1e337a86b2eb4..8b7ec285b1f6d07b44bbc6149f5f5b8efb094fce 100644 --- a/cabal-install/Distribution/Client/Config.hs +++ b/cabal-install/Distribution/Client/Config.hs @@ -553,7 +553,8 @@ loadConfig verbosity configFileFlag = addBaseConf $ do readConfigFile :: SavedConfig -> FilePath -> IO (Maybe (ParseResult SavedConfig)) readConfigFile initial file = handleNotExists $ - fmap (Just . parseConfig initial) (readFile file) + fmap (Just . parseConfig (ConstraintSourceMainConfig file) initial) + (readFile file) where handleNotExists action = catchIO action $ \ioe -> @@ -608,8 +609,8 @@ commentSavedConfig = do -- | All config file fields. -- -configFieldDescriptions :: [FieldDescr SavedConfig] -configFieldDescriptions = +configFieldDescriptions :: ConstraintSource -> [FieldDescr SavedConfig] +configFieldDescriptions src = toSavedConfig liftGlobalFlag (commandOptions (globalCommand []) ParseArgs) @@ -678,7 +679,7 @@ configFieldDescriptions = ] ++ toSavedConfig liftConfigExFlag - (configureExOptions ParseArgs ConstraintSourceMainConfig) + (configureExOptions ParseArgs src) [] [] ++ toSavedConfig liftInstallFlag @@ -789,8 +790,11 @@ liftReportFlag :: FieldDescr ReportFlags -> FieldDescr SavedConfig liftReportFlag = liftField savedReportFlags (\flags conf -> conf { savedReportFlags = flags }) -parseConfig :: SavedConfig -> String -> ParseResult SavedConfig -parseConfig initial = \str -> do +parseConfig :: ConstraintSource + -> SavedConfig + -> String + -> ParseResult SavedConfig +parseConfig src initial = \str -> do fields <- readFields str let (knownSections, others) = partition isKnownSection fields config <- parse others @@ -829,7 +833,7 @@ parseConfig initial = \str -> do isKnownSection (ParseUtils.Section _ "program-default-options" _ _) = True isKnownSection _ = False - parse = parseFields (configFieldDescriptions + parse = parseFields (configFieldDescriptions src ++ deprecatedFieldDescriptions) initial parseSections (rs, h, u, g, p, a) @@ -887,7 +891,8 @@ showConfigWithComments comment vals = Disp.render $ [] -> Disp.text "" (x:xs) -> foldl' (\ r r' -> r $+$ Disp.text "" $+$ r') x xs $+$ Disp.text "" - $+$ ppFields (skipSomeFields configFieldDescriptions) mcomment vals + $+$ ppFields (skipSomeFields (configFieldDescriptions ConstraintSourceUnknown)) + mcomment vals $+$ Disp.text "" $+$ ppSection "haddock" "" haddockFlagsFields (fmap savedHaddockFlags mcomment) (savedHaddockFlags vals) diff --git a/cabal-install/Distribution/Client/Configure.hs b/cabal-install/Distribution/Client/Configure.hs index b80a2755ccd1f002c731a96c83b794b991f3c987..ba416492c064e7868c258fc98d1d1ff5fa1bcf5a 100644 --- a/cabal-install/Distribution/Client/Configure.hs +++ b/cabal-install/Distribution/Client/Configure.hs @@ -19,7 +19,8 @@ module Distribution.Client.Configure ( import Distribution.Client.Dependency import Distribution.Client.Dependency.Types - ( AllowNewer(..), isAllowNewer, LabeledPackageConstraint(..) ) + ( AllowNewer(..), isAllowNewer, ConstraintSource(..) + , LabeledPackageConstraint(..) ) import qualified Distribution.Client.InstallPlan as InstallPlan import Distribution.Client.InstallPlan (InstallPlan) import Distribution.Client.IndexUtils as IndexUtils @@ -263,22 +264,23 @@ planLocalPackage verbosity comp platform configFlags configExFlags -- version constraints from the config file or command line -- TODO: should warn or error on constraints that are not on direct -- deps or flag constraints not on the package in question. - [ LabeledPackageConstraint (userToPackageConstraint uc) (Just src) + [ LabeledPackageConstraint (userToPackageConstraint uc) src | (uc, src) <- configExConstraints configExFlags ] . addConstraints -- package flags from the config file or command line [ let pc = PackageConstraintFlags (packageName pkg) (configConfigurationsFlags configFlags) - in LabeledPackageConstraint pc Nothing ] + in LabeledPackageConstraint pc ConstraintSourceConfigFlagOrTarget + ] . addConstraints -- '--enable-tests' and '--enable-benchmarks' constraints from - -- command line + -- the config file or command line [ let pc = PackageConstraintStanzas (packageName pkg) $ [ TestStanzas | testsEnabled ] ++ [ BenchStanzas | benchmarksEnabled ] - in LabeledPackageConstraint pc Nothing + in LabeledPackageConstraint pc ConstraintSourceConfigFlagOrTarget ] $ standardInstallPolicy diff --git a/cabal-install/Distribution/Client/Dependency.hs b/cabal-install/Distribution/Client/Dependency.hs index ceb2123cb341ee32ddfc5bf515231b0fb57d83ed..1389694110ddff3f46990efb994fd3dbbea0cd11 100644 --- a/cabal-install/Distribution/Client/Dependency.hs +++ b/cabal-install/Distribution/Client/Dependency.hs @@ -161,8 +161,7 @@ debugDepResolverParams p = ++ "\nstrategy: " ++ show (depResolverPreferenceDefault p) where debugLabeledConstraint (LabeledPackageConstraint pc src) = - debugPackageConstraint pc ++ maybe "" showSrc src - showSrc src = " (" ++ debugConstraintSource src ++ ")" + debugPackageConstraint pc ++ " (" ++ debugConstraintSource src ++ ")" -- | A package selection preference for a particular package. -- @@ -281,7 +280,7 @@ dontUpgradeNonUpgradeablePackages params = extraConstraints = [ LabeledPackageConstraint (PackageConstraintInstalled pkgname) - (Just ConstraintSourceNonUpgradeablePackage) + ConstraintSourceNonUpgradeablePackage | all (/=PackageName "base") (depResolverTargets params) , pkgname <- map PackageName [ "base", "ghc-prim", "integer-gmp" , "integer-simple" ] @@ -484,8 +483,7 @@ applySandboxInstallPolicy . addConstraints [ let pc = PackageConstraintVersion (packageName pkg) (thisVersion (packageVersion pkg)) - in LabeledPackageConstraint pc - (Just ConstraintSourceModifiedAddSourceDep) + in LabeledPackageConstraint pc ConstraintSourceModifiedAddSourceDep | pkg <- modifiedDeps ] . addTargets [ packageName pkg | pkg <- modifiedDeps ] diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Message.hs b/cabal-install/Distribution/Client/Dependency/Modular/Message.hs index df006aa10ea53546ae8bcd9ceb74412850ef2db2..42c3750cf48f12af0a4692583b17228a7742147d 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Message.hs +++ b/cabal-install/Distribution/Client/Dependency/Modular/Message.hs @@ -113,6 +113,5 @@ showFR _ (MalformedFlagChoice qfn) = " (INTERNAL ERROR: MALFORMED FLAG CH showFR _ (MalformedStanzaChoice qsn) = " (INTERNAL ERROR: MALFORMED STANZA CHOICE: " ++ showQSN qsn ++ ")" showFR _ EmptyGoalChoice = " (INTERNAL ERROR: EMPTY GOAL CHOICE)" -showConstraintSource :: Maybe ConstraintSource -> String -showConstraintSource Nothing = "global constraint" -showConstraintSource (Just src) = "global constraint from " ++ debugConstraintSource src +showConstraintSource :: ConstraintSource -> String +showConstraintSource src = "constraint from " ++ debugConstraintSource src diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Preference.hs b/cabal-install/Distribution/Client/Dependency/Modular/Preference.hs index 92970bc4f7e25760a3a3e6323923d02f8ac1be51..46a7c3efc591f2a9a054898945513f976204ef69 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Preference.hs +++ b/cabal-install/Distribution/Client/Dependency/Modular/Preference.hs @@ -101,18 +101,18 @@ processPackageConstraintP :: ConflictSet QPN -> LabeledPackageConstraint -> Tree a -> Tree a -processPackageConstraintP c i (LabeledPackageConstraint pc src) r = - case (i, pc) of - (I v _, PackageConstraintVersion _ vr) - | checkVR vr v -> r - | otherwise -> Fail c (GlobalConstraintVersion vr src) - (_, PackageConstraintInstalled _) - | instI i -> r - | otherwise -> Fail c (GlobalConstraintInstalled src) - (_, PackageConstraintSource _) - | not (instI i) -> r - | otherwise -> Fail c (GlobalConstraintSource src) - (_, _) -> r +processPackageConstraintP c i (LabeledPackageConstraint pc src) r = go i pc + where + go (I v _) (PackageConstraintVersion _ vr) + | checkVR vr v = r + | otherwise = Fail c (GlobalConstraintVersion vr src) + go _ (PackageConstraintInstalled _) + | instI i = r + | otherwise = Fail c (GlobalConstraintInstalled src) + go _ (PackageConstraintSource _) + | not (instI i) = r + | otherwise = Fail c (GlobalConstraintSource src) + go _ _ = r -- | Helper function that tries to enforce a single package constraint on a -- given flag setting for an F-node. Translates the constraint into a @@ -124,14 +124,14 @@ processPackageConstraintF :: Flag -> LabeledPackageConstraint -> Tree a -> Tree a -processPackageConstraintF f c b' (LabeledPackageConstraint pc src) r = - case pc of - PackageConstraintFlags _ fa -> - case L.lookup f fa of - Nothing -> r - Just b | b == b' -> r - | otherwise -> Fail c (GlobalConstraintFlag src) - _ -> r +processPackageConstraintF f c b' (LabeledPackageConstraint pc src) r = go pc + where + go (PackageConstraintFlags _ fa) = + case L.lookup f fa of + Nothing -> r + Just b | b == b' -> r + | otherwise -> Fail c (GlobalConstraintFlag src) + go _ = r -- | Helper function that tries to enforce a single package constraint on a -- given flag setting for an F-node. Translates the constraint into a @@ -143,12 +143,12 @@ processPackageConstraintS :: OptionalStanza -> LabeledPackageConstraint -> Tree a -> Tree a -processPackageConstraintS s c b' (LabeledPackageConstraint pc src) r = - case pc of - PackageConstraintStanzas _ ss -> - if not b' && s `elem` ss then Fail c (GlobalConstraintFlag src) - else r - _ -> r +processPackageConstraintS s c b' (LabeledPackageConstraint pc src) r = go pc + where + go (PackageConstraintStanzas _ ss) = + if not b' && s `elem` ss then Fail c (GlobalConstraintFlag src) + else r + go _ = r -- | Traversal that tries to establish various kinds of user constraints. Works -- by selectively disabling choices that have been ruled out by global user diff --git a/cabal-install/Distribution/Client/Dependency/Modular/Tree.hs b/cabal-install/Distribution/Client/Dependency/Modular/Tree.hs index ac9766b43cc02d6217fdbcfe315001d28e2e74cb..87ed15b6b2d96ed3a70204debc87e3fbb0d6a191 100644 --- a/cabal-install/Distribution/Client/Dependency/Modular/Tree.hs +++ b/cabal-install/Distribution/Client/Dependency/Modular/Tree.hs @@ -56,10 +56,10 @@ data FailReason = InconsistentInitialConstraints | CannotReinstall | Shadowed | Broken - | GlobalConstraintVersion VR (Maybe ConstraintSource) - | GlobalConstraintInstalled (Maybe ConstraintSource) - | GlobalConstraintSource (Maybe ConstraintSource) - | GlobalConstraintFlag (Maybe ConstraintSource) + | GlobalConstraintVersion VR ConstraintSource + | GlobalConstraintInstalled ConstraintSource + | GlobalConstraintSource ConstraintSource + | GlobalConstraintFlag ConstraintSource | ManualFlag | BuildFailureNotInIndex PN | MalformedFlagChoice QFN diff --git a/cabal-install/Distribution/Client/Dependency/Types.hs b/cabal-install/Distribution/Client/Dependency/Types.hs index 6b765f2f8fd6a0de9d3c11e644495a1077035592..077467bade2d67e6deb8858d4a526dc925a96cd5 100644 --- a/cabal-install/Distribution/Client/Dependency/Types.hs +++ b/cabal-install/Distribution/Client/Dependency/Types.hs @@ -256,29 +256,56 @@ instance Monoid fail => Alternative (Progress step fail) where empty = Fail mempty p <|> q = foldProgress Step (const q) Done p --- | 'PackageConstraint' labeled with its source. The source is optional --- because not all constraints are tracked currently. +-- | 'PackageConstraint' labeled with its source. data LabeledPackageConstraint - = LabeledPackageConstraint PackageConstraint (Maybe ConstraintSource) + = LabeledPackageConstraint PackageConstraint ConstraintSource unlabelPackageConstraint :: LabeledPackageConstraint -> PackageConstraint unlabelPackageConstraint (LabeledPackageConstraint pc _) = pc -- | Source of a 'PackageConstraint'. -data ConstraintSource - = ConstraintSourceMainConfig - | ConstraintSourceSandboxConfig - | ConstraintSourceUserConfig - | ConstraintSourceCommandlineFlag - | ConstraintSourceUserTarget - | ConstraintSourceNonUpgradeablePackage - | ConstraintSourceModifiedAddSourceDep +data ConstraintSource = + + -- | Main config file, which is ~/.cabal/config by default. + ConstraintSourceMainConfig FilePath + + -- | Sandbox config file, which is ./cabal.sandbox.config by default. + | ConstraintSourceSandboxConfig FilePath + + -- | ./cabal.config. + | ConstraintSourceUserConfig + + -- | Flag specified on the command line. + | ConstraintSourceCommandlineFlag + + -- | Target specified by the user, e.g., @cabal install package-0.1.0.0@ + -- implies @package==0.1.0.0@. + | ConstraintSourceUserTarget + + -- | Internal requirement to use installed versions of packages like ghc-prim. + | ConstraintSourceNonUpgradeablePackage + + -- | Internal requirement to use the add-source version of a package when that + -- version is installed and the source is modified. + | ConstraintSourceModifiedAddSourceDep + + -- | Internal constraint used by @cabal freeze@. + | ConstraintSourceFreeze + + -- | Constraint specified by a config file, a command line flag, or a user + -- target, when a more specific source is not known. + | ConstraintSourceConfigFlagOrTarget + + -- | The source of the constraint is not specified. + | ConstraintSourceUnknown deriving (Eq, Show) -- | Description of a 'ConstraintSource'. debugConstraintSource :: ConstraintSource -> String -debugConstraintSource ConstraintSourceMainConfig = "main config file" -debugConstraintSource ConstraintSourceSandboxConfig = "sandbox config file" +debugConstraintSource (ConstraintSourceMainConfig path) = + "main config " ++ path +debugConstraintSource (ConstraintSourceSandboxConfig path) = + "sandbox config " ++ path debugConstraintSource ConstraintSourceUserConfig = "cabal.config" debugConstraintSource ConstraintSourceCommandlineFlag = "command line flag" debugConstraintSource ConstraintSourceUserTarget = "user target" @@ -286,3 +313,7 @@ debugConstraintSource ConstraintSourceNonUpgradeablePackage = "non-upgradeable package" debugConstraintSource ConstraintSourceModifiedAddSourceDep = "modified add-source dependency" +debugConstraintSource ConstraintSourceFreeze = "cabal freeze" +debugConstraintSource ConstraintSourceConfigFlagOrTarget = + "config file, command line flag, or user target" +debugConstraintSource ConstraintSourceUnknown = "unknown source" diff --git a/cabal-install/Distribution/Client/Freeze.hs b/cabal-install/Distribution/Client/Freeze.hs index e850761f9e16eab51cfc6e4c067caabf67bfb18a..04820e8af6bfc515b17a2567c4d4656108c55092 100644 --- a/cabal-install/Distribution/Client/Freeze.hs +++ b/cabal-install/Distribution/Client/Freeze.hs @@ -166,7 +166,7 @@ planPackages verbosity comp platform mSandboxPkgInfo freezeFlags . addConstraints [ let pkg = pkgSpecifierTarget pkgSpecifier pc = PackageConstraintStanzas pkg stanzas - in LabeledPackageConstraint pc Nothing + in LabeledPackageConstraint pc ConstraintSourceFreeze | pkgSpecifier <- pkgSpecifiers ] . maybe id applySandboxInstallPolicy mSandboxPkgInfo diff --git a/cabal-install/Distribution/Client/Install.hs b/cabal-install/Distribution/Client/Install.hs index 66f4622a826af973094f8b6c8e62711feeba8339..009627f7ef7f00c00f6fe3294ff6bf513c2d1935 100644 --- a/cabal-install/Distribution/Client/Install.hs +++ b/cabal-install/Distribution/Client/Install.hs @@ -70,7 +70,7 @@ import Distribution.Client.Configure ( chooseCabalVersion, configureSetupScript ) import Distribution.Client.Dependency import Distribution.Client.Dependency.Types - ( Solver(..), LabeledPackageConstraint(..) ) + ( Solver(..), ConstraintSource(..), LabeledPackageConstraint(..) ) import Distribution.Client.FetchUtils import Distribution.Client.HttpUtils ( configureTransport, HttpTransport (..) ) @@ -372,7 +372,7 @@ planPackages comp platform mSandboxPkgInfo solver . addConstraints -- version constraints from the config file or command line - [ LabeledPackageConstraint (userToPackageConstraint pc) (Just src) + [ LabeledPackageConstraint (userToPackageConstraint pc) src | (pc, src) <- configExConstraints configExFlags ] . addConstraints @@ -380,7 +380,7 @@ planPackages comp platform mSandboxPkgInfo solver -- is silly. We should check if the flags are appropriate [ let pc = PackageConstraintFlags (pkgSpecifierTarget pkgSpecifier) flags - in LabeledPackageConstraint pc Nothing + in LabeledPackageConstraint pc ConstraintSourceConfigFlagOrTarget | let flags = configConfigurationsFlags configFlags , not (null flags) , pkgSpecifier <- pkgSpecifiers ] @@ -388,7 +388,7 @@ planPackages comp platform mSandboxPkgInfo solver . addConstraints [ let pc = PackageConstraintStanzas (pkgSpecifierTarget pkgSpecifier) stanzas - in LabeledPackageConstraint pc Nothing + in LabeledPackageConstraint pc ConstraintSourceConfigFlagOrTarget | pkgSpecifier <- pkgSpecifiers ] . maybe id applySandboxInstallPolicy mSandboxPkgInfo diff --git a/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs b/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs index 7e9061915ad4261251c969d940f79f9c03ecbec7..15b93d5fa6cbe5db04f3693bc6cec5b165ecc659 100644 --- a/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs +++ b/cabal-install/Distribution/Client/Sandbox/PackageEnvironment.hs @@ -329,7 +329,7 @@ tryLoadSandboxPackageEnvironmentFile :: Verbosity -> FilePath -> (Flag FilePath) tryLoadSandboxPackageEnvironmentFile verbosity pkgEnvFile configFileFlag = do let pkgEnvDir = takeDirectory pkgEnvFile minp <- readPackageEnvironmentFile - ConstraintSourceSandboxConfig mempty pkgEnvFile + (ConstraintSourceSandboxConfig pkgEnvFile) mempty pkgEnvFile pkgEnv <- handleParseResult verbosity pkgEnvFile minp -- Get the saved sandbox directory. @@ -429,7 +429,7 @@ pkgEnvFieldDescrs src = [ configFieldDescriptions' :: [FieldDescr SavedConfig] configFieldDescriptions' = filter (\(FieldDescr name _ _) -> name /= "preference" && name /= "constraint") - configFieldDescriptions + (configFieldDescriptions src) toPkgEnv :: FieldDescr SavedConfig -> FieldDescr PackageEnvironment toPkgEnv fieldDescr = @@ -566,7 +566,7 @@ showPackageEnvironmentWithComments :: (Maybe PackageEnvironment) -> PackageEnvironment -> String showPackageEnvironmentWithComments mdefPkgEnv pkgEnv = Disp.render $ - ppFields (pkgEnvFieldDescrs ConstraintSourceSandboxConfig) + ppFields (pkgEnvFieldDescrs ConstraintSourceUnknown) mdefPkgEnv pkgEnv $+$ Disp.text "" $+$ ppSection "install-dirs" "" installDirsFields diff --git a/cabal-install/Distribution/Client/Targets.hs b/cabal-install/Distribution/Client/Targets.hs index 1890145c3b966e38c4aae019af259766355ab6fb..6725bd5fafe195b7ded9ec3be131af82bb115040 100644 --- a/cabal-install/Distribution/Client/Targets.hs +++ b/cabal-install/Distribution/Client/Targets.hs @@ -191,9 +191,9 @@ pkgSpecifierConstraints :: Package pkg => PackageSpecifier pkg -> [LabeledPackageConstraint] pkgSpecifierConstraints (NamedPackage _ constraints) = map toLpc constraints where - toLpc pc = LabeledPackageConstraint pc (Just ConstraintSourceUserTarget) + toLpc pc = LabeledPackageConstraint pc ConstraintSourceUserTarget pkgSpecifierConstraints (SpecificSourcePackage pkg) = - [LabeledPackageConstraint pc (Just ConstraintSourceUserTarget)] + [LabeledPackageConstraint pc ConstraintSourceUserTarget] where pc = PackageConstraintVersion (packageName pkg) (thisVersion (packageVersion pkg)) diff --git a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs b/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs index 8066a7c5b5e3f53f8334e89f7115fddad2db547a..d76270f8ea43a17fa19494a1af43f1b1390d1503 100644 --- a/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs +++ b/cabal-install/tests/UnitTests/Distribution/Client/Dependency/Modular/DSL.hs @@ -287,11 +287,11 @@ exResolve db targets indepGoals = runProgress $ (C.PackageName p) [TestStanzas]) (exDbPkgs db) targets' = map (\p -> NamedPackage (C.PackageName p) []) targets - params = addConstraints - (map (\pc -> LabeledPackageConstraint pc Nothing) enableTests) + params = addConstraints (map toLpc enableTests) $ (standardInstallPolicy instIdx avaiIdx targets') { depResolverIndependentGoals = indepGoals } + toLpc pc = LabeledPackageConstraint pc ConstraintSourceUnknown extractInstallPlan :: CI.InstallPlan.InstallPlan -> [(ExamplePkgName, ExamplePkgVersion)]