diff --git a/bin/vagrant b/bin/vagrant index efe5eab63..5436ad40b 100755 --- a/bin/vagrant +++ b/bin/vagrant @@ -172,6 +172,13 @@ begin logger.debug("Experimental flag is enabled") if Vagrant::Util::Experimental.global_enabled? ui.warn(I18n.t("vagrant.general.experimental.all"), bold: true, prefix: true, channel: :error) + else + ui.warn(I18n.t("vagrant.general.experimental.features", features: experimental.join(", ")), bold: true, prefix: true, channel: :error) + + diff = Vagrant::Util::Experimental.features_valid? + if !diff.empty? + ui.error(I18n.t("vagrant.general.experimental.unknown_features", unknown: diff.join(", ")), bold: true, prefix: true, channel: :error) + end end end diff --git a/lib/vagrant/util/experimental.rb b/lib/vagrant/util/experimental.rb index 9a2c6fb48..49490ec41 100644 --- a/lib/vagrant/util/experimental.rb +++ b/lib/vagrant/util/experimental.rb @@ -45,14 +45,19 @@ module Vagrant experimental = features_requested feature = feature.to_s - if experimental.size == 1 && experimental.first == "1" - return true - elsif VALID_FEATURES.include?(feature) && - experimental.include?(feature) - return true - else - return false + return global_enabled? || (VALID_FEATURES.include?(feature) && experimental.include?(feature)) + end + + # Determines if there are any unrecognized requested features + # + # @return [Array] + def features_valid? + if !defined?(@_features_diff) + @_features_diff = [] + features = features_requested + features.each { |f| @_features_diff << f if !VALID_FEATURES.include?(f) } end + @_features_diff end # Returns the features requested for the experimental flag diff --git a/templates/locales/en.yml b/templates/locales/en.yml index 3890182b6..9b2e8502d 100644 --- a/templates/locales/en.yml +++ b/templates/locales/en.yml @@ -405,6 +405,10 @@ en: Please use with caution, as some of the features may not be fully functional yet. + unknown_features: |- + Requested unknown feature flags will be ignored: + + Unknown: %{unknown} not_in_installer: |- You appear to be running Vagrant outside of the official installers. Note that the installers are what ensure that Vagrant has all required diff --git a/test/unit/vagrant/util/experimental_test.rb b/test/unit/vagrant/util/experimental_test.rb index 20b197b48..aa5e11978 100644 --- a/test/unit/vagrant/util/experimental_test.rb +++ b/test/unit/vagrant/util/experimental_test.rb @@ -98,6 +98,22 @@ describe Vagrant::Util::Experimental do end end + describe "#features_valid" do + before(:each) do + stub_const("Vagrant::Util::Experimental::VALID_FEATURES", ["cool_feature", "other_feature", "secret_feature"]) + end + + it "returns an empty array if no diffs found" do + allow(ENV).to receive(:[]).with("VAGRANT_EXPERIMENTAL").and_return("cool_feature,other_feature") + expect(subject.features_valid?).to eq([]) + end + + it "returns the invalid flag if found" do + allow(ENV).to receive(:[]).with("VAGRANT_EXPERIMENTAL").and_return("fake_feature") + expect(subject.features_valid?).to eq(["fake_feature"]) + end + end + describe "#features_requested" do it "returns an array of requested features" do allow(ENV).to receive(:[]).with("VAGRANT_EXPERIMENTAL").and_return("secret_feature,other_secret")