Refactor relationship resolver to capture full resolved tree #4232
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Problems
If you use
ckan install -c modpack.ckan
to install a modpack with incompatible dependencies, the message is something like:This does not explain the problem, can only report one problem with one mod, and almost all of the advice at the bottom is useless. A similar poor message can also appear in GUI if the user force-selects a mod with incompatible dependencies on the Versions tab.
Causes
When the relationship resolver checks dependencies recursively to make sure a mod can be installed, it loses the information from the "leaf nodes" and just reports the outermost mod that can't be resolved.
Changes
ckan compat
instead of--no-recommends
, better explains what "lucky" means forckan update
, and notes that--allow-incompatible
doesn't apply to dependencies:Fixes #4108.
Side fixes
While working on the above, I tossed in a few opportunistic fixes:
Registry
and related classes are refactored to useICollection
instead ofIEnumerable
or specific collection types, which allows us to eliminate repeated calls to.ToHashSet()
,.ToList()
, etc. to improve performance.ModSearch
object with no tag names rather than the empty string. Now it works.RelationshipResolverOptions
andSelectionReason
are moved to their own files.