1
1
{-# LANGUAGE BangPatterns #-}
2
+ {-# LANGUAGE LambdaCase #-}
3
+ {-# LANGUAGE ViewPatterns #-}
2
4
3
5
module Distribution.Solver.Modular.Message (
4
6
Message (.. ),
5
7
showMessages
6
8
) where
7
9
10
+ import Data.Maybe (isJust )
8
11
import qualified Data.List as L
9
12
import Data.Map (Map )
10
13
import qualified Data.Map as M
@@ -17,7 +20,8 @@ import Distribution.Pretty (prettyShow) -- from Cabal
17
20
18
21
import qualified Distribution.Solver.Modular.ConflictSet as CS
19
22
import Distribution.Solver.Modular.Dependency
20
- import Distribution.Solver.Modular.Flag
23
+ import Distribution.Solver.Modular.Flag ( QFN , QSN )
24
+ import qualified Distribution.Solver.Modular.Flag as Flag ( showQFN , showQFNBool , showQSN , showQSNBool )
21
25
import Distribution.Solver.Modular.MessageUtils
22
26
(showUnsupportedExtension , showUnsupportedLanguage )
23
27
import Distribution.Solver.Modular.Package
@@ -60,24 +64,24 @@ showMessages = go 0
60
64
go ! l (Step (TryP qpn i) (Step Enter (Step (Skip conflicts) (Step Leave ms)))) =
61
65
goPSkip l qpn [i] conflicts ms
62
66
go ! l (Step (TryF qfn b) (Step Enter (Step (Failure c fr) (Step Leave ms)))) =
63
- (atLevel l $ " rejecting: " ++ showQFNBool qfn b ++ showFR c fr) (go l ms)
67
+ (atLevel l $ blurbQFNBool Rejecting qfn b ++ showFR c fr) (go l ms)
64
68
go ! l (Step (TryS qsn b) (Step Enter (Step (Failure c fr) (Step Leave ms)))) =
65
- (atLevel l $ " rejecting: " ++ showQSNBool qsn b ++ showFR c fr) (go l ms)
69
+ (atLevel l $ blurbQSNBool Rejecting qsn b ++ showFR c fr) (go l ms)
66
70
go ! l (Step (Next (Goal (P _ ) gr)) (Step (TryP qpn' i) ms@ (Step Enter (Step (Next _) _)))) =
67
- (atLevel l $ " trying: " ++ showQPNPOpt qpn' i ++ showGR gr) (go l ms)
71
+ (atLevel l $ blurbOption Trying qpn' i ++ showGR gr) (go l ms)
68
72
go ! l (Step (Next (Goal (P qpn) gr)) (Step (Failure _c UnknownPackage ) ms)) =
69
73
atLevel l (" unknown package: " ++ showQPN qpn ++ showGR gr) $ go l ms
70
74
-- standard display
71
75
go ! l (Step Enter ms) = go (l+ 1 ) ms
72
76
go ! l (Step Leave ms) = go (l- 1 ) ms
73
- go ! l (Step (TryP qpn i) ms) = (atLevel l $ " trying: " ++ showQPNPOpt qpn i) (go l ms)
74
- go ! l (Step (TryF qfn b) ms) = (atLevel l $ " trying: " ++ showQFNBool qfn b) (go l ms)
75
- go ! l (Step (TryS qsn b) ms) = (atLevel l $ " trying: " ++ showQSNBool qsn b) (go l ms)
77
+ go ! l (Step (TryP qpn i) ms) = (atLevel l $ blurbOption Trying qpn i) (go l ms)
78
+ go ! l (Step (TryF qfn b) ms) = (atLevel l $ blurbQFNBool Trying qfn b) (go l ms)
79
+ go ! l (Step (TryS qsn b) ms) = (atLevel l $ blurbQSNBool Trying qsn b) (go l ms)
76
80
go ! l (Step (Next (Goal (P qpn) gr)) ms) = (atLevel l $ showPackageGoal qpn gr) (go l ms)
77
81
go ! l (Step (Next _) ms) = go l ms -- ignore flag goals in the log
78
82
go ! l (Step (Skip conflicts) ms) =
79
83
-- 'Skip' should always be handled by 'goPSkip' in the case above.
80
- (atLevel l $ " skipping: " ++ showConflicts conflicts) (go l ms)
84
+ (atLevel l $ blurb Skipping ++ showConflicts conflicts) (go l ms)
81
85
go ! l (Step (Success ) ms) = (atLevel l $ " done" ) (go l ms)
82
86
go ! l (Step (Failure c fr) ms) = (atLevel l $ showFailure c fr) (go l ms)
83
87
@@ -96,9 +100,12 @@ showMessages = go 0
96
100
-> Progress Message a b
97
101
-> Progress String a b
98
102
goPReject l qpn is c fr (Step (TryP qpn' i) (Step Enter (Step (Failure _ fr') (Step Leave ms))))
99
- | qpn == qpn' && fr == fr' = goPReject l qpn (i : is) c fr ms
103
+ | qpn == qpn' && fr == fr' =
104
+ -- By prepending (i : is) we reverse the order of the instances.
105
+ goPReject l qpn (i : is) c fr ms
100
106
goPReject l qpn is c fr ms =
101
- (atLevel l $ " rejecting: " ++ L. intercalate " , " (map (showQPNPOpt qpn) (reverse is)) ++ showFR c fr) (go l ms)
107
+ (atLevel l $ blurbOptions Rejecting qpn (reverse is) ++ showFR c fr)
108
+ (go l ms)
102
109
103
110
-- Handle many subsequent skipped package instances.
104
111
goPSkip :: Int
@@ -108,11 +115,11 @@ showMessages = go 0
108
115
-> Progress Message a b
109
116
-> Progress String a b
110
117
goPSkip l qpn is conflicts (Step (TryP qpn' i) (Step Enter (Step (Skip conflicts') (Step Leave ms))))
111
- | qpn == qpn' && conflicts == conflicts' = goPSkip l qpn (i : is) conflicts ms
118
+ | qpn == qpn' && conflicts == conflicts' =
119
+ -- By prepending (i : is) we reverse the order of the instances.
120
+ goPSkip l qpn (i : is) conflicts ms
112
121
goPSkip l qpn is conflicts ms =
113
- let msg = " skipping: "
114
- ++ L. intercalate " , " (map (showQPNPOpt qpn) (reverse is))
115
- ++ showConflicts conflicts
122
+ let msg = blurbOptions Skipping qpn (reverse is) ++ showConflicts conflicts
116
123
in atLevel l msg (go l ms)
117
124
118
125
-- write a message with the current level number
@@ -206,12 +213,83 @@ data MergedPackageConflict = MergedPackageConflict {
206
213
, versionConflict :: Maybe VR
207
214
}
208
215
209
- showQPNPOpt :: QPN -> POption -> String
210
- showQPNPOpt qpn@ (Q _pp pn) (POption i linkedTo) =
216
+ data ProgressAction =
217
+ Trying
218
+ | Skipping
219
+ | Rejecting
220
+
221
+ blurb :: ProgressAction -> String
222
+ blurb = \ case
223
+ Trying -> " trying: "
224
+ Skipping -> " skipping: "
225
+ Rejecting -> " rejecting: "
226
+
227
+ blurbQFNBool :: ProgressAction -> QFN -> Bool -> String
228
+ blurbQFNBool a q b = blurb a ++ Flag. showQFNBool q b
229
+
230
+ blurbQSNBool :: ProgressAction -> QSN -> Bool -> String
231
+ blurbQSNBool a q b = blurb a ++ Flag. showQSNBool q b
232
+
233
+ blurbOption :: ProgressAction -> QPN -> POption -> String
234
+ blurbOption a q p = blurb a ++ showOption q p
235
+
236
+ blurbOptions :: ProgressAction -> QPN -> [POption ] -> String
237
+ blurbOptions a q ps = blurb a ++ showIsOrVs q (tryVs ps)
238
+
239
+ showOption :: QPN -> POption -> String
240
+ showOption qpn@ (Q _pp pn) (POption i linkedTo) =
211
241
case linkedTo of
212
242
Nothing -> showPI (PI qpn i) -- Consistent with prior to POption
213
243
Just pp' -> showQPN qpn ++ " ~>" ++ showPI (PI (Q pp' pn) i)
214
244
245
+ -- | A list of versions, or a list of instances.
246
+ data IsOrVs = Is [POption ] | Vs [Ver ] deriving Show
247
+
248
+ -- | Try to convert a list of options to a list of versions, or a list of
249
+ -- instances if any of the options is linked or installed. Singleton lists or
250
+ -- empty lists are always converted to Is.
251
+ -- >>> tryVs [v0, v1]
252
+ -- Vs [mkVersion [0],mkVersion [1]]
253
+ -- >>> tryVs [v0]
254
+ -- Is [POption (I (mkVersion [0]) InRepo) Nothing]
255
+ -- >>> tryVs [i0, i1]
256
+ -- Is [POption (I (mkVersion [0]) (Inst (UnitId "foo-bar-0-inplace"))) Nothing,POption (I (mkVersion [1]) (Inst (UnitId "foo-bar-1-inplace"))) Nothing]
257
+ -- >>> tryVs [i0, v1]
258
+ -- Is [POption (I (mkVersion [0]) (Inst (UnitId "foo-bar-0-inplace"))) Nothing,POption (I (mkVersion [1]) InRepo) Nothing]
259
+ -- >>> tryVs [v0, i1]
260
+ -- Is [POption (I (mkVersion [0]) InRepo) Nothing,POption (I (mkVersion [1]) (Inst (UnitId "foo-bar-1-inplace"))) Nothing]
261
+ -- >>> tryVs [i0]
262
+ -- Is [POption (I (mkVersion [0]) (Inst (UnitId "foo-bar-0-inplace"))) Nothing]
263
+ -- >>> tryVs []
264
+ -- Is []
265
+ tryVs :: [POption ] -> IsOrVs
266
+ tryVs xs@ [] = Is xs
267
+ tryVs xs@ [_] = Is xs
268
+ tryVs xs
269
+ | any (\ (POption (instI -> b0) (isJust -> b1)) -> b0 || b1) xs = Is xs
270
+ | otherwise =
271
+ let (vs, is) = L. partition ((== InRepo ) . snd ) [(v, l) | POption i _ <- xs, let I v l = i]
272
+ in if null is then Vs (fst `map` vs) else Is xs
273
+
274
+ -- | Shows a list of versions in a human-friendly way, abbreviated. Shows a list
275
+ -- of instances in full.
276
+ -- >>> showIsOrVs foobarQPN $ tryVs [v0, v1]
277
+ -- "foo-bar; 0, 1"
278
+ -- >>> showIsOrVs foobarQPN $ tryVs [v0]
279
+ -- "foo-bar-0"
280
+ -- >>> showIsOrVs foobarQPN $ tryVs [i0, i1]
281
+ -- "foo-bar-0/installed-inplace, foo-bar-1/installed-inplace"
282
+ -- >>> showIsOrVs foobarQPN $ tryVs [i0, v1]
283
+ -- "foo-bar-0/installed-inplace, foo-bar-1"
284
+ -- >>> showIsOrVs foobarQPN $ tryVs [v0, i1]
285
+ -- "foo-bar-0, foo-bar-1/installed-inplace"
286
+ -- >>> showIsOrVs foobarQPN $ tryVs []
287
+ -- "unexpected empty list of versions"
288
+ showIsOrVs :: QPN -> IsOrVs -> String
289
+ showIsOrVs _ (Is [] ) = " unexpected empty list of versions"
290
+ showIsOrVs q (Is xs) = L. intercalate " , " (showOption q `map` xs)
291
+ showIsOrVs q (Vs xs) = showQPN q ++ " ; " ++ L. intercalate " , " (showVer `map` xs)
292
+
215
293
showGR :: QGoalReason -> String
216
294
showGR UserGoal = " (user goal)"
217
295
showGR (DependencyGoal dr) = " (dependency of " ++ showDependencyReason dr ++ " )"
@@ -246,8 +324,8 @@ showFR _ (UnsupportedSpecVer ver) = " (unsupported spec-version " ++ pre
246
324
-- The following are internal failures. They should not occur. In the
247
325
-- interest of not crashing unnecessarily, we still just print an error
248
326
-- message though.
249
- showFR _ (MalformedFlagChoice qfn) = " (INTERNAL ERROR: MALFORMED FLAG CHOICE: " ++ showQFN qfn ++ " )"
250
- showFR _ (MalformedStanzaChoice qsn) = " (INTERNAL ERROR: MALFORMED STANZA CHOICE: " ++ showQSN qsn ++ " )"
327
+ showFR _ (MalformedFlagChoice qfn) = " (INTERNAL ERROR: MALFORMED FLAG CHOICE: " ++ Flag. showQFN qfn ++ " )"
328
+ showFR _ (MalformedStanzaChoice qsn) = " (INTERNAL ERROR: MALFORMED STANZA CHOICE: " ++ Flag. showQSN qsn ++ " )"
251
329
showFR _ EmptyGoalChoice = " (INTERNAL ERROR: EMPTY GOAL CHOICE)"
252
330
253
331
showExposedComponent :: ExposedComponent -> String
@@ -270,3 +348,13 @@ showConflictingDep (ConflictingDep dr (PkgComponent qpn comp) ci) =
270
348
showQPN qpn ++ componentStr ++ " ==" ++ showI i
271
349
Constrained vr -> showDependencyReason dr ++ " => " ++ showQPN qpn ++
272
350
componentStr ++ showVR vr
351
+
352
+ -- $setup
353
+ -- >>> import Distribution.Solver.Types.PackagePath
354
+ -- >>> import Distribution.Types.Version
355
+ -- >>> import Distribution.Types.UnitId
356
+ -- >>> let foobarQPN = Q (PackagePath DefaultNamespace QualToplevel) (mkPackageName "foo-bar")
357
+ -- >>> let v0 = POption (I (mkVersion [0]) InRepo) Nothing
358
+ -- >>> let v1 = POption (I (mkVersion [1]) InRepo) Nothing
359
+ -- >>> let i0 = POption (I (mkVersion [0]) (Inst $ mkUnitId "foo-bar-0-inplace")) Nothing
360
+ -- >>> let i1 = POption (I (mkVersion [1]) (Inst $ mkUnitId "foo-bar-1-inplace")) Nothing
0 commit comments