Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
bdf6134
Replace Molinillo with PubGrub for dependency resolution
mlarraz Mar 16, 2026
e28aca1
Fix lockfile requirement preservation and orphaned deps test
mlarraz Mar 16, 2026
d2cdf61
Update vendoring tooling for PubGrub migration
mlarraz Mar 17, 2026
fbc4d2a
Extend catching Gem::DependencyResolutionError error to exec command
colby-swandale Apr 12, 2026
5d575d5
Simplify DependencyResolutionError by removing PubGrubFailure wrapper
colby-swandale Apr 12, 2026
e6d39a2
find_all_gems test coverage
colby-swandale Apr 12, 2026
38b0aa6
Remove dead Molinillo-era error classes and simplify DependencyResolu…
colby-swandale Apr 12, 2026
9e75c81
Rename orphaned deps test to reflect PubGrub backtracking behavior
colby-swandale Apr 12, 2026
5589ab6
Fix prerelease version inconsistency between all_versions_for and ver…
colby-swandale Apr 12, 2026
f0e6b25
Remove unreachable spec_for string fallback
colby-swandale Apr 12, 2026
17478ea
Remove dead resolver methods
colby-swandale Apr 12, 2026
f2d49fd
Define custom PubGrub Root Package to customise error
colby-swandale Apr 12, 2026
116f5c8
Add extended explanations for platform and Ruby version hints
colby-swandale Apr 12, 2026
b6f2b65
Add custom inline explanation when gems are filtered from resolution
colby-swandale Apr 12, 2026
9b6307e
Optimize PubGrub resolver performance
colby-swandale Apr 13, 2026
439891b
Skip self-dependencies in compute_dependencies
colby-swandale Apr 13, 2026
788a028
Use PubGrub's intended root dependency pattern
colby-swandale Apr 13, 2026
5805bbd
Fetch development dependencies for API-sourced specs
colby-swandale Apr 13, 2026
9bed47d
Align incompatibilities_for with BasicPackageSource design
colby-swandale Apr 13, 2026
9227b00
Distinguish unknown packages from filtered packages in error messages
colby-swandale Apr 13, 2026
a7cc0b4
Improve error messages for contradictory requirements and prereleases
colby-swandale Apr 13, 2026
118ce71
Fix --force to skip unsatisfiable version constraints
colby-swandale Apr 13, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 21 additions & 24 deletions Manifest.txt
Original file line number Diff line number Diff line change
Expand Up @@ -471,9 +471,9 @@ lib/rubygems/resolver/api_set/gem_parser.rb
lib/rubygems/resolver/api_specification.rb
lib/rubygems/resolver/best_set.rb
lib/rubygems/resolver/composed_set.rb
lib/rubygems/resolver/conflict.rb
lib/rubygems/resolver/current_set.rb
lib/rubygems/resolver/dependency_request.rb
lib/rubygems/resolver/incompatibility.rb
lib/rubygems/resolver/git_set.rb
lib/rubygems/resolver/git_specification.rb
lib/rubygems/resolver/index_set.rb
Expand All @@ -487,8 +487,8 @@ lib/rubygems/resolver/requirement_list.rb
lib/rubygems/resolver/set.rb
lib/rubygems/resolver/source_set.rb
lib/rubygems/resolver/spec_specification.rb
lib/rubygems/resolver/strategy.rb
lib/rubygems/resolver/specification.rb
lib/rubygems/resolver/stats.rb
lib/rubygems/resolver/vendor_set.rb
lib/rubygems/resolver/vendor_specification.rb
lib/rubygems/s3_uri_signer.rb
Expand Down Expand Up @@ -533,27 +533,6 @@ lib/rubygems/util/atomic_file_writer.rb
lib/rubygems/util/licenses.rb
lib/rubygems/validator.rb
lib/rubygems/vendor/.document
lib/rubygems/vendor/molinillo/LICENSE
lib/rubygems/vendor/molinillo/lib/molinillo.rb
lib/rubygems/vendor/molinillo/lib/molinillo/delegates/resolution_state.rb
lib/rubygems/vendor/molinillo/lib/molinillo/delegates/specification_provider.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/action.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_edge_no_circular.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/add_vertex.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/delete_edge.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/detach_vertex_named.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/log.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/set_payload.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/tag.rb
lib/rubygems/vendor/molinillo/lib/molinillo/dependency_graph/vertex.rb
lib/rubygems/vendor/molinillo/lib/molinillo/errors.rb
lib/rubygems/vendor/molinillo/lib/molinillo/gem_metadata.rb
lib/rubygems/vendor/molinillo/lib/molinillo/modules/specification_provider.rb
lib/rubygems/vendor/molinillo/lib/molinillo/modules/ui.rb
lib/rubygems/vendor/molinillo/lib/molinillo/resolution.rb
lib/rubygems/vendor/molinillo/lib/molinillo/resolver.rb
lib/rubygems/vendor/molinillo/lib/molinillo/state.rb
lib/rubygems/vendor/net-http/COPYING
lib/rubygems/vendor/net-http/lib/net/http.rb
lib/rubygems/vendor/net-http/lib/net/http/exceptions.rb
Expand All @@ -578,6 +557,24 @@ lib/rubygems/vendor/optparse/lib/optparse/shellwords.rb
lib/rubygems/vendor/optparse/lib/optparse/time.rb
lib/rubygems/vendor/optparse/lib/optparse/uri.rb
lib/rubygems/vendor/optparse/lib/optparse/version.rb
lib/rubygems/vendor/pub_grub/LICENSE.txt
lib/rubygems/vendor/pub_grub/lib/pub_grub.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/assignment.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/basic_package_source.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/failure_writer.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/incompatibility.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/package.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/partial_solution.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/rubygems.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/solve_failure.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/static_package_source.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/strategy.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/term.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/version.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/version_constraint.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/version_range.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/version_solver.rb
lib/rubygems/vendor/pub_grub/lib/pub_grub/version_union.rb
lib/rubygems/vendor/resolv/COPYING
lib/rubygems/vendor/resolv/lib/resolv.rb
lib/rubygems/vendor/securerandom/COPYING
Expand All @@ -602,9 +599,9 @@ lib/rubygems/vendor/uri/lib/uri/rfc3986_parser.rb
lib/rubygems/vendor/uri/lib/uri/version.rb
lib/rubygems/vendor/uri/lib/uri/ws.rb
lib/rubygems/vendor/uri/lib/uri/wss.rb
lib/rubygems/vendored_molinillo.rb
lib/rubygems/vendored_net_http.rb
lib/rubygems/vendored_optparse.rb
lib/rubygems/vendored_pub_grub.rb
lib/rubygems/vendored_securerandom.rb
lib/rubygems/vendored_timeout.rb
lib/rubygems/vendored_tsort.rb
Expand Down
3 changes: 3 additions & 0 deletions lib/rubygems/commands/exec_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,9 @@ def install
rescue Gem::InstallError => e
alert_error "Error installing #{gem_name}:\n\t#{e.message}"
terminate_interaction 1
rescue Gem::DependencyResolutionError => e
alert_error "Error installing #{gem_name}:\n\t#{e.message}"
terminate_interaction 2
rescue Gem::GemNotFoundException => e
show_lookup_failure e.name, e.version, e.errors, false

Expand Down
3 changes: 3 additions & 0 deletions lib/rubygems/commands/install_command.rb
Original file line number Diff line number Diff line change
Expand Up @@ -224,6 +224,9 @@ def install_gems # :nodoc:
rescue Gem::InstallError => e
alert_error "Error installing #{gem_name}:\n\t#{e.message}"
exit_code |= 1
rescue Gem::DependencyResolutionError => e
alert_error "Error installing #{gem_name}:\n\t#{e.message}"
exit_code |= 2
rescue Gem::UnsatisfiableDependencyError => e
show_lookup_failure e.name, e.version, e.errors, suppress_suggestions,
"'#{gem_name}' (#{gem_version})"
Expand Down
54 changes: 11 additions & 43 deletions lib/rubygems/exceptions.rb
Original file line number Diff line number Diff line change
Expand Up @@ -33,22 +33,24 @@ class Gem::DependencyError < Gem::Exception; end
class Gem::DependencyRemovalException < Gem::Exception; end

##
# Raised by Gem::Resolver when a Gem::Dependency::Conflict reaches the
# toplevel. Indicates which dependencies were incompatible through #conflict
# and #conflicting_dependencies
# Raised by Gem::Resolver when dependency resolution fails.

class Gem::DependencyResolutionError < Gem::DependencyError
attr_reader :conflict

def initialize(conflict)
@conflict = conflict
a, b = conflicting_dependencies
@explanation = conflict.explanation
super @explanation
end

super "conflicting dependencies #{a} and #{b}\n#{@conflict.explanation}"
def explanation
@explanation
end

def conflict
nil
end

def conflicting_dependencies
@conflict.conflicting_dependencies
[]
end
end

Expand Down Expand Up @@ -126,40 +128,6 @@ def initialize(name, version, errors = nil)

Gem.deprecate_constant :SpecificGemNotFoundException

##
# Raised by Gem::Resolver when dependencies conflict and create the
# inability to find a valid possible spec for a request.

class Gem::ImpossibleDependenciesError < Gem::Exception
attr_reader :conflicts
attr_reader :request

def initialize(request, conflicts)
@request = request
@conflicts = conflicts

super build_message
end

def build_message # :nodoc:
requester = @request.requester
requester = requester ? requester.spec.full_name : "The user"
dependency = @request.dependency

message = "#{requester} requires #{dependency} but it conflicted:\n".dup

@conflicts.each do |_, conflict|
message << conflict.explanation
end

message
end

def dependency
@request.dependency
end
end

class Gem::InstallError < Gem::Exception; end

class Gem::RuntimeRequirementNotMetError < Gem::InstallError
Expand Down
Loading
Loading