cabal-install 1.18.0.4 → 1.18.0.5
raw patch · 5 files changed
+33/−16 lines, 5 filesdep ~base
Dependency ranges changed: base
Files
- Distribution/Client/Dependency/Modular/Builder.hs +14/−10
- Distribution/Client/Dependency/Modular/Dependency.hs +12/−2
- Distribution/Client/Dependency/Modular/Explore.hs +3/−3
- Distribution/Client/Dependency/Modular/Flag.hs +3/−0
- cabal-install.cabal +1/−1
Distribution/Client/Dependency/Modular/Builder.hs view
@@ -78,17 +78,21 @@ qfdefs = L.map (\ (fn, b) -> Flagged (FN (PI qpn i) fn) b [] []) $ M.toList fdefs -- Combine new package and flag goals gs = L.map (flip OpenGoal gr) (qfdefs ++ qfdeps)- -- IMPORTANT AND SUBTLE: The order of the concatenation above is- -- important. Flags occur potentially multiple times: both via the- -- flag declaration ('qfdefs') and via dependencies ('qfdeps').- -- We want the information from qfdeps if it's present, because that- -- includes dependencies between flags. We use qfdefs mainly so that- -- we are forced to make choices for flags that don't affect- -- dependencies at all.+ -- NOTE: --- -- When goals are actually extended in 'extendOpen', later additions- -- override earlier additions, so it's important that the- -- lower-quality templates without dependency information come first.+ -- In the expression @qfdefs ++ qfdeps@ above, flags occur potentially+ -- multiple times, both via the flag declaration and via dependencies.+ -- The order is potentially important, because the occurrences via+ -- dependencies may record flag-dependency information. After a number+ -- of bugs involving computing this information incorrectly, however,+ -- we're currently not using carefully computed inter-flag dependencies+ -- anymore, but instead use 'simplifyVar' when computing conflict sets+ -- to map all flags of one package to a single flag for conflict set+ -- purposes, thereby treating them all as interdependent.+ --+ -- If we ever move to a more clever algorithm again, then the line above+ -- needs to be looked at very carefully, and probably be replaced by+ -- more systematically computed flag dependency information. -- | Datatype that encodes what to build next data BuildType =
Distribution/Client/Dependency/Modular/Dependency.hs view
@@ -21,6 +21,16 @@ data Var qpn = P qpn | F (FN qpn) | S (SN qpn) deriving (Eq, Ord, Show) +-- | For computing conflict sets, we map flag choice vars to a+-- single flag choice. This means that all flag choices are treated+-- as interdependent. So if one flag of a package ends up in a+-- conflict set, then all flags are being treated as being part of+-- the conflict set.+simplifyVar :: Var qpn -> Var qpn+simplifyVar (P qpn) = P qpn+simplifyVar (F (FN pi _)) = F (FN pi (mkFlag "flag"))+simplifyVar (S qsn) = S qsn+ showVar :: Var QPN -> String showVar (P qpn) = showQPN qpn showVar (F qfn) = showQFN qfn@@ -175,7 +185,7 @@ goalReasonToVars :: GoalReason qpn -> ConflictSet qpn goalReasonToVars UserGoal = S.empty goalReasonToVars (PDependency (PI qpn _)) = S.singleton (P qpn)-goalReasonToVars (FDependency qfn _) = S.singleton (F qfn)+goalReasonToVars (FDependency qfn _) = S.singleton (simplifyVar (F qfn)) goalReasonToVars (SDependency qsn) = S.singleton (S qsn) goalReasonChainToVars :: Ord qpn => GoalReasonChain qpn -> ConflictSet qpn@@ -194,4 +204,4 @@ -- | Compute a conflic set from a goal. The conflict set contains the -- closure of goal reasons as well as the variable of the goal itself. toConflictSet :: Ord qpn => Goal qpn -> ConflictSet qpn-toConflictSet (Goal g grs) = S.insert g (goalReasonChainToVars grs)+toConflictSet (Goal g grs) = S.insert (simplifyVar g) (goalReasonChainToVars grs)
Distribution/Client/Dependency/Modular/Explore.hs view
@@ -66,9 +66,9 @@ combine _ [] c = (Just c, []) combine var ((k, ( d, v)) : xs) c = (\ ~(e, ys) -> (e, (k, v) : ys)) $ case d of- Just e | not (var `S.member` e) -> (Just e, [])- | otherwise -> combine var xs (e `S.union` c)- Nothing -> (Nothing, snd $ combine var xs S.empty)+ Just e | not (simplifyVar var `S.member` e) -> (Just e, [])+ | otherwise -> combine var xs (e `S.union` c)+ Nothing -> (Nothing, snd $ combine var xs S.empty) -- | Naive backtracking exploration of the search tree. This will yield correct -- assignments only once the tree itself is validated.
Distribution/Client/Dependency/Modular/Flag.hs view
@@ -25,6 +25,9 @@ unFlag :: Flag -> String unFlag (FlagName fn) = fn +mkFlag :: String -> Flag+mkFlag fn = FlagName fn+ -- | Flag info. Default value, whether the flag is manual, and -- whether the flag is weak. Manual flags can only be set explicitly. -- Weak flags are typically deferred by the solver.
cabal-install.cabal view
@@ -1,5 +1,5 @@ Name: cabal-install-Version: 1.18.0.4+Version: 1.18.0.5 Synopsis: The command-line interface for Cabal and Hackage. Description: The \'cabal\' command-line program simplifies the process of managing