From 062ef52816b125e118e6806dc49d42e8415713ec Mon Sep 17 00:00:00 2001 From: Chris Roberts Date: Tue, 4 Jun 2019 21:30:05 -0700 Subject: [PATCH] Handle strict dependency enforcement when installed within system When installed outside of the official installer and not running within a bundler environment, properly activate core dependencies and properly enforce constraints. --- lib/vagrant/bundler.rb | 13 ++++++++++++- lib/vagrant/shared_helpers.rb | 8 ++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/lib/vagrant/bundler.rb b/lib/vagrant/bundler.rb index 6124eb181..b2980c839 100644 --- a/lib/vagrant/bundler.rb +++ b/lib/vagrant/bundler.rb @@ -313,6 +313,12 @@ module Vagrant @logger.debug("Enabling strict dependency enforcement") plugin_deps += vagrant_internal_specs.map do |spec| next if system_plugins.include?(spec.name) + # If we are not running within the installer and + # we are not within a bundler environment then we + # only want activated specs + if !Vagrant.in_installer? && !Vagrant.in_bundler? + next if !spec.activated? + end Gem::Dependency.new(spec.name, spec.version) end.compact else @@ -415,8 +421,13 @@ module Vagrant Gem::Resolver.compose_sets(*sets) end - # @return [Array<[Gem::Specification, String]>] spec and directory pairs + # @return [Array<[Gem::Specification]>] spec list def vagrant_internal_specs + # activate any dependencies up front so we can always + # pin them when resolving + Gem::Specification.find { |s| s.name == "vagrant" && s.activated? }. + runtime_dependencies.each { |d| gem d.name, *d.requirement.as_list } + # discover all the gems we have available list = {} directories = [Gem::Specification.default_specifications_dir] Gem::Specification.find_all{true}.each do |spec| diff --git a/lib/vagrant/shared_helpers.rb b/lib/vagrant/shared_helpers.rb index ada85f3ba..5cab18f39 100644 --- a/lib/vagrant/shared_helpers.rb +++ b/lib/vagrant/shared_helpers.rb @@ -35,6 +35,14 @@ module Vagrant !!ENV["VAGRANT_INSTALLER_ENV"] end + # This returns a true/false if we are running within a bundler environment + # + # @return [Boolean] + def self.in_bundler? + !!ENV["BUNDLE_GEMFILE"] && + !defined?(::Bundler).nil? + end + # Returns the path to the embedded directory of the Vagrant installer, # if there is one (if we're running in an installer). #