Skip to content

Commit f6e7cdd

Browse files
authored
Merge pull request #5918 from grayjay/version-and-goal-conflicts
Solver: Pair conflict set variables with more information about conflicts (issue #4805).
2 parents 0d4ee7b + ac84fa2 commit f6e7cdd

File tree

29 files changed

+934
-173
lines changed

29 files changed

+934
-173
lines changed

Cabal/doc/nix-local-build.rst

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2115,6 +2115,23 @@ Most users generally won't need these.
21152115
The command line variant of this field is
21162116
``--(no-)count-conflicts``.
21172117

2118+
.. cfg-field:: fine-grained-conflicts: boolean
2119+
--fine-grained-conflicts
2120+
--no-fine-grained-conflicts
2121+
:synopsis: Skip a version of a package if it does not resolve any conflicts
2122+
encountered in the last version (solver optimization).
2123+
2124+
:default: True
2125+
2126+
When enabled, the solver will skip a version of a package if it does not
2127+
resolve any of the conflicts encountered in the last version of that
2128+
package. For example, if ``foo-1.2`` depended on ``bar``, and the solver
2129+
couldn't find consistent versions for ``bar``'s dependencies, then the
2130+
solver would skip ``foo-1.1`` if it also depended on ``bar``.
2131+
2132+
The command line variant of this field is
2133+
``--(no-)fine-grained-conflicts``.
2134+
21182135
.. cfg-field:: minimize-conflict-set: boolean
21192136
--minimize-conflict-set
21202137
--no-minimize-conflict-set

cabal-install/Distribution/Client/Config.hs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -312,6 +312,7 @@ instance Semigroup SavedConfig where
312312
installMaxBackjumps = combine installMaxBackjumps,
313313
installReorderGoals = combine installReorderGoals,
314314
installCountConflicts = combine installCountConflicts,
315+
installFineGrainedConflicts = combine installFineGrainedConflicts,
315316
installMinimizeConflictSet = combine installMinimizeConflictSet,
316317
installIndependentGoals = combine installIndependentGoals,
317318
installShadowPkgs = combine installShadowPkgs,

cabal-install/Distribution/Client/Dependency.hs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ module Distribution.Client.Dependency (
4747
setPreferenceDefault,
4848
setReorderGoals,
4949
setCountConflicts,
50+
setFineGrainedConflicts,
5051
setMinimizeConflictSet,
5152
setIndependentGoals,
5253
setAvoidReinstalls,
@@ -159,6 +160,7 @@ data DepResolverParams = DepResolverParams {
159160
depResolverSourcePkgIndex :: PackageIndex.PackageIndex UnresolvedSourcePackage,
160161
depResolverReorderGoals :: ReorderGoals,
161162
depResolverCountConflicts :: CountConflicts,
163+
depResolverFineGrainedConflicts :: FineGrainedConflicts,
162164
depResolverMinimizeConflictSet :: MinimizeConflictSet,
163165
depResolverIndependentGoals :: IndependentGoals,
164166
depResolverAvoidReinstalls :: AvoidReinstalls,
@@ -197,6 +199,7 @@ showDepResolverParams p =
197199
++ "\nstrategy: " ++ show (depResolverPreferenceDefault p)
198200
++ "\nreorder goals: " ++ show (asBool (depResolverReorderGoals p))
199201
++ "\ncount conflicts: " ++ show (asBool (depResolverCountConflicts p))
202+
++ "\nfine grained conflicts: " ++ show (asBool (depResolverFineGrainedConflicts p))
200203
++ "\nminimize conflict set: " ++ show (asBool (depResolverMinimizeConflictSet p))
201204
++ "\nindependent goals: " ++ show (asBool (depResolverIndependentGoals p))
202205
++ "\navoid reinstalls: " ++ show (asBool (depResolverAvoidReinstalls p))
@@ -254,6 +257,7 @@ basicDepResolverParams installedPkgIndex sourcePkgIndex =
254257
depResolverSourcePkgIndex = sourcePkgIndex,
255258
depResolverReorderGoals = ReorderGoals False,
256259
depResolverCountConflicts = CountConflicts True,
260+
depResolverFineGrainedConflicts = FineGrainedConflicts True,
257261
depResolverMinimizeConflictSet = MinimizeConflictSet False,
258262
depResolverIndependentGoals = IndependentGoals False,
259263
depResolverAvoidReinstalls = AvoidReinstalls False,
@@ -310,6 +314,12 @@ setCountConflicts count params =
310314
depResolverCountConflicts = count
311315
}
312316

317+
setFineGrainedConflicts :: FineGrainedConflicts -> DepResolverParams -> DepResolverParams
318+
setFineGrainedConflicts fineGrained params =
319+
params {
320+
depResolverFineGrainedConflicts = fineGrained
321+
}
322+
313323
setMinimizeConflictSet :: MinimizeConflictSet -> DepResolverParams -> DepResolverParams
314324
setMinimizeConflictSet minimize params =
315325
params {
@@ -755,7 +765,8 @@ resolveDependencies platform comp pkgConfigDB solver params =
755765

756766
Step (showDepResolverParams finalparams)
757767
$ fmap (validateSolverResult platform comp indGoals)
758-
$ runSolver solver (SolverConfig reordGoals cntConflicts minimize indGoals noReinstalls
768+
$ runSolver solver (SolverConfig reordGoals cntConflicts fineGrained minimize
769+
indGoals noReinstalls
759770
shadowing strFlags allowBootLibs onlyConstrained_ maxBkjumps enableBj
760771
solveExes order verbosity (PruneAfterFirstSuccess False))
761772
platform comp installedPkgIndex sourcePkgIndex
@@ -769,6 +780,7 @@ resolveDependencies platform comp pkgConfigDB solver params =
769780
sourcePkgIndex
770781
reordGoals
771782
cntConflicts
783+
fineGrained
772784
minimize
773785
indGoals
774786
noReinstalls
@@ -1015,9 +1027,9 @@ resolveWithoutDependencies :: DepResolverParams
10151027
-> Either [ResolveNoDepsError] [UnresolvedSourcePackage]
10161028
resolveWithoutDependencies (DepResolverParams targets constraints
10171029
prefs defpref installedPkgIndex sourcePkgIndex
1018-
_reorderGoals _countConflicts _minimizeConflictSet
1019-
_indGoals _avoidReinstalls _shadowing _strFlags
1020-
_maxBjumps _enableBj _solveExes
1030+
_reorderGoals _countConflicts _fineGrained
1031+
_minimizeConflictSet _indGoals _avoidReinstalls
1032+
_shadowing _strFlags _maxBjumps _enableBj _solveExes
10211033
_allowBootLibInstalls _onlyConstrained _order _verbosity) =
10221034
collectEithers $ map selectPackage (Set.toList targets)
10231035
where

cabal-install/Distribution/Client/Fetch.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,8 @@ planPackages verbosity comp platform fetchFlags
162162

163163
. setCountConflicts countConflicts
164164

165+
. setFineGrainedConflicts fineGrainedConflicts
166+
165167
. setMinimizeConflictSet minimizeConflictSet
166168

167169
. setShadowPkgs shadowPkgs
@@ -199,6 +201,7 @@ planPackages verbosity comp platform fetchFlags
199201

200202
reorderGoals = fromFlag (fetchReorderGoals fetchFlags)
201203
countConflicts = fromFlag (fetchCountConflicts fetchFlags)
204+
fineGrainedConflicts = fromFlag (fetchFineGrainedConflicts fetchFlags)
202205
minimizeConflictSet = fromFlag (fetchMinimizeConflictSet fetchFlags)
203206
independentGoals = fromFlag (fetchIndependentGoals fetchFlags)
204207
shadowPkgs = fromFlag (fetchShadowPkgs fetchFlags)

cabal-install/Distribution/Client/Freeze.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ planPackages verbosity comp platform mSandboxPkgInfo freezeFlags
175175

176176
. setCountConflicts countConflicts
177177

178+
. setFineGrainedConflicts fineGrainedConflicts
179+
178180
. setMinimizeConflictSet minimizeConflictSet
179181

180182
. setShadowPkgs shadowPkgs
@@ -207,6 +209,7 @@ planPackages verbosity comp platform mSandboxPkgInfo freezeFlags
207209

208210
reorderGoals = fromFlag (freezeReorderGoals freezeFlags)
209211
countConflicts = fromFlag (freezeCountConflicts freezeFlags)
212+
fineGrainedConflicts = fromFlag (freezeFineGrainedConflicts freezeFlags)
210213
minimizeConflictSet = fromFlag (freezeMinimizeConflictSet freezeFlags)
211214
independentGoals = fromFlag (freezeIndependentGoals freezeFlags)
212215
shadowPkgs = fromFlag (freezeShadowPkgs freezeFlags)

cabal-install/Distribution/Client/Install.hs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -395,6 +395,8 @@ planPackages verbosity comp platform mSandboxPkgInfo solver
395395

396396
. setCountConflicts countConflicts
397397

398+
. setFineGrainedConflicts fineGrainedConflicts
399+
398400
. setMinimizeConflictSet minimizeConflictSet
399401

400402
. setAvoidReinstalls avoidReinstalls
@@ -463,6 +465,7 @@ planPackages verbosity comp platform mSandboxPkgInfo solver
463465
fromFlag (installReinstall installFlags)
464466
reorderGoals = fromFlag (installReorderGoals installFlags)
465467
countConflicts = fromFlag (installCountConflicts installFlags)
468+
fineGrainedConflicts = fromFlag (installFineGrainedConflicts installFlags)
466469
minimizeConflictSet = fromFlag (installMinimizeConflictSet installFlags)
467470
independentGoals = fromFlag (installIndependentGoals installFlags)
468471
avoidReinstalls = fromFlag (installAvoidReinstalls installFlags)

cabal-install/Distribution/Client/ProjectConfig.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -250,6 +250,7 @@ resolveSolverSettings ProjectConfig{
250250
| otherwise -> Just n
251251
solverSettingReorderGoals = fromFlag projectConfigReorderGoals
252252
solverSettingCountConflicts = fromFlag projectConfigCountConflicts
253+
solverSettingFineGrainedConflicts = fromFlag projectConfigFineGrainedConflicts
253254
solverSettingMinimizeConflictSet = fromFlag projectConfigMinimizeConflictSet
254255
solverSettingStrongFlags = fromFlag projectConfigStrongFlags
255256
solverSettingAllowBootLibInstalls = fromFlag projectConfigAllowBootLibInstalls
@@ -271,6 +272,7 @@ resolveSolverSettings ProjectConfig{
271272
projectConfigMaxBackjumps = Flag defaultMaxBackjumps,
272273
projectConfigReorderGoals = Flag (ReorderGoals False),
273274
projectConfigCountConflicts = Flag (CountConflicts True),
275+
projectConfigFineGrainedConflicts = Flag (FineGrainedConflicts True),
274276
projectConfigMinimizeConflictSet = Flag (MinimizeConflictSet False),
275277
projectConfigStrongFlags = Flag (StrongFlags False),
276278
projectConfigAllowBootLibInstalls = Flag (AllowBootLibInstalls False),

cabal-install/Distribution/Client/ProjectConfig/Legacy.hs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -374,6 +374,7 @@ convertLegacyAllPackageFlags globalFlags configFlags
374374
--installUpgradeDeps = projectConfigUpgradeDeps,
375375
installReorderGoals = projectConfigReorderGoals,
376376
installCountConflicts = projectConfigCountConflicts,
377+
installFineGrainedConflicts = projectConfigFineGrainedConflicts,
377378
installMinimizeConflictSet = projectConfigMinimizeConflictSet,
378379
installPerComponent = projectConfigPerComponent,
379380
installIndependentGoals = projectConfigIndependentGoals,
@@ -611,6 +612,7 @@ convertToLegacySharedConfig
611612
installUpgradeDeps = mempty, --projectConfigUpgradeDeps,
612613
installReorderGoals = projectConfigReorderGoals,
613614
installCountConflicts = projectConfigCountConflicts,
615+
installFineGrainedConflicts = projectConfigFineGrainedConflicts,
614616
installMinimizeConflictSet = projectConfigMinimizeConflictSet,
615617
installIndependentGoals = projectConfigIndependentGoals,
616618
installShadowPkgs = mempty, --projectConfigShadowPkgs,
@@ -1004,8 +1006,9 @@ legacySharedConfigFieldDescrs =
10041006
, "one-shot", "jobs", "keep-going", "offline", "per-component"
10051007
-- solver flags:
10061008
, "max-backjumps", "reorder-goals", "count-conflicts"
1007-
, "minimize-conflict-set", "independent-goals"
1008-
, "strong-flags" , "allow-boot-library-installs", "reject-unconstrained-dependencies", "index-state"
1009+
, "fine-grained-conflicts" , "minimize-conflict-set", "independent-goals"
1010+
, "strong-flags" , "allow-boot-library-installs"
1011+
, "reject-unconstrained-dependencies", "index-state"
10091012
]
10101013
. commandOptionsToFields
10111014
) (installOptions ParseArgs)

cabal-install/Distribution/Client/ProjectConfig/Types.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ data ProjectConfigShared
195195
projectConfigMaxBackjumps :: Flag Int,
196196
projectConfigReorderGoals :: Flag ReorderGoals,
197197
projectConfigCountConflicts :: Flag CountConflicts,
198+
projectConfigFineGrainedConflicts :: Flag FineGrainedConflicts,
198199
projectConfigMinimizeConflictSet :: Flag MinimizeConflictSet,
199200
projectConfigStrongFlags :: Flag StrongFlags,
200201
projectConfigAllowBootLibInstalls :: Flag AllowBootLibInstalls,
@@ -400,6 +401,7 @@ data SolverSettings
400401
solverSettingMaxBackjumps :: Maybe Int,
401402
solverSettingReorderGoals :: ReorderGoals,
402403
solverSettingCountConflicts :: CountConflicts,
404+
solverSettingFineGrainedConflicts :: FineGrainedConflicts,
403405
solverSettingMinimizeConflictSet :: MinimizeConflictSet,
404406
solverSettingStrongFlags :: StrongFlags,
405407
solverSettingAllowBootLibInstalls :: AllowBootLibInstalls,

cabal-install/Distribution/Client/ProjectPlanning.hs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -958,6 +958,8 @@ planPackages verbosity comp platform solver SolverSettings{..}
958958

959959
. setCountConflicts solverSettingCountConflicts
960960

961+
. setFineGrainedConflicts solverSettingFineGrainedConflicts
962+
961963
. setMinimizeConflictSet solverSettingMinimizeConflictSet
962964

963965
--TODO: [required eventually] should only be configurable for

0 commit comments

Comments
 (0)