14
14
-- Portability : portable
15
15
--
16
16
-- Top level interface to dependency resolution.
17
+ {-# LANGUAGE InstanceSigs #-}
18
+ {-# OPTIONS_GHC -Wno-orphans #-}
19
+
17
20
module Distribution.Client.Dependency
18
21
( -- * The main package dependency resolver
19
22
DepResolverParams
@@ -59,6 +62,7 @@ module Distribution.Client.Dependency
59
62
, setSolveExecutables
60
63
, setGoalOrder
61
64
, setSolverVerbosity
65
+ , setSolverOutputJson
62
66
, removeLowerBounds
63
67
, removeUpperBounds
64
68
, addDefaultSetupDependencies
@@ -176,10 +180,11 @@ import Distribution.Solver.Types.PackagePreferences
176
180
)
177
181
import Distribution.Solver.Types.PkgConfigDb (PkgConfigDb )
178
182
import Distribution.Solver.Types.Progress
179
- ( Progress (.. )
180
- , SummarizedMessage
181
- , foldProgress
182
- )
183
+ ( SummarizedMessage (.. ),
184
+ Progress (.. ),
185
+ foldProgress ,
186
+ Entry (.. ),
187
+ EntryMessage (.. ) )
183
188
import Distribution.Solver.Types.ResolverPackage
184
189
( ResolverPackage (Configured )
185
190
)
@@ -226,6 +231,8 @@ import Distribution.Version
226
231
, transformCaretUpper
227
232
, withinRange
228
233
)
234
+ import Distribution.Client.Utils.Json
235
+ ( encodeToString , ToJSON (.. ), (.=) , object , Value (String ) )
229
236
230
237
-- ------------------------------------------------------------
231
238
@@ -266,6 +273,7 @@ data DepResolverParams = DepResolverParams
266
273
, depResolverGoalOrder :: Maybe (Variable QPN -> Variable QPN -> Ordering )
267
274
-- ^ Function to override the solver's goal-ordering heuristics.
268
275
, depResolverVerbosity :: Verbosity
276
+ , depResolverOutputJson :: Bool
269
277
}
270
278
271
279
showDepResolverParams :: DepResolverParams -> String
@@ -312,6 +320,8 @@ showDepResolverParams p =
312
320
showLabeledConstraint (LabeledPackageConstraint pc src) =
313
321
showPackageConstraint pc ++ " (" ++ showConstraintSource src ++ " )"
314
322
323
+
324
+
315
325
-- | A package selection preference for a particular package.
316
326
--
317
327
-- Preferences are soft constraints that the dependency resolver should try to
@@ -363,6 +373,7 @@ basicDepResolverParams installedPkgIndex sourcePkgIndex =
363
373
, depResolverSolveExecutables = SolveExecutables True
364
374
, depResolverGoalOrder = Nothing
365
375
, depResolverVerbosity = normal
376
+ , depResolverOutputJson = False
366
377
}
367
378
368
379
addTargets
@@ -498,6 +509,12 @@ setSolverVerbosity verbosity params =
498
509
{ depResolverVerbosity = verbosity
499
510
}
500
511
512
+ setSolverOutputJson :: Bool -> DepResolverParams -> DepResolverParams
513
+ setSolverOutputJson outputJson params =
514
+ params
515
+ { depResolverOutputJson = outputJson
516
+ }
517
+
501
518
-- | Some packages are specific to a given compiler version and should never be
502
519
-- reinstalled.
503
520
dontInstallNonReinstallablePackages :: DepResolverParams -> DepResolverParams
@@ -886,13 +903,16 @@ resolveDependencies platform comp pkgConfigDB params =
886
903
solveExes
887
904
order
888
905
verbosity
906
+ outputJson
889
907
) =
890
908
if asBool (depResolverAllowBootLibInstalls params)
891
909
then params
892
910
else dontInstallNonReinstallablePackages params
893
911
894
912
formatProgress :: Progress SummarizedMessage String a -> Progress String String a
895
- formatProgress p = foldProgress (\ x xs -> Step (renderSummarizedMessage x) xs) Fail Done p
913
+ formatProgress p = foldProgress (\ x xs -> Step (formatter x) xs) Fail Done p
914
+ where
915
+ formatter = if outputJson then encodeToString else renderSummarizedMessage
896
916
897
917
preferences :: PackageName -> PackagePreferences
898
918
preferences = interpretPackagesPreference targets defpref prefs
@@ -1210,6 +1230,7 @@ resolveWithoutDependencies
1210
1230
_onlyConstrained
1211
1231
_order
1212
1232
_verbosity
1233
+ _outputJson
1213
1234
) =
1214
1235
collectEithers $ map selectPackage (Set. toList targets)
1215
1236
where
@@ -1286,3 +1307,33 @@ instance Show ResolveNoDepsError where
1286
1307
++ prettyShow name
1287
1308
++ " that satisfies "
1288
1309
++ prettyShow (simplifyVersionRange ver)
1310
+
1311
+ -------------------------------------------------------------------------------
1312
+ -- Orphans
1313
+ -------------------------------------------------------------------------------
1314
+
1315
+ instance ToJSON SummarizedMessage where
1316
+ toJSON :: SummarizedMessage -> Value
1317
+ toJSON (SummarizedMessage x) = object [" status" .= String " success" , " message" .= toJSON x]
1318
+ toJSON (ErrorMessage x) = object [" status" .= String " failure" , " message" .= String x]
1319
+
1320
+ instance ToJSON EntryMessage where
1321
+ toJSON :: EntryMessage -> Value
1322
+ toJSON (AtLevel _ x) = toJSON x
1323
+
1324
+ instance ToJSON Entry where
1325
+ toJSON :: Entry -> Value
1326
+ toJSON (LogPackageGoal _ _) = error " To be implemented..."
1327
+ toJSON (LogRejectF _ _ _ _) = error " To be implemented..."
1328
+ toJSON (LogRejectS _ _ _ _) = error " TODO"
1329
+ toJSON (LogSkipping _) = error " To be implemented..."
1330
+ toJSON (LogTryingF _ _) = error " To be implemented..."
1331
+ toJSON (LogTryingP _ _ _) = error " To be implemented..."
1332
+ toJSON (LogTryingS _ _) = error " To be implemented..."
1333
+ toJSON (LogRejectMany _ _ _ _) = error " To be implemented..."
1334
+ toJSON (LogSkipMany _ _ _) = error " To be implemented..."
1335
+ toJSON (LogUnknownPackage _ _) = error " To be implemented..."
1336
+ toJSON (LogSuccessMsg ) = error " To be implemented..."
1337
+ toJSON (LogFailureMsg _ _) = error " To be implemented..."
1338
+
1339
+ -- TODO: write a test that assert that: toJSON fromJson == fromJSON toJson == id
0 commit comments