summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/chef/knife.rb5
-rw-r--r--lib/chef/knife/core/hashed_command_loader.rb25
-rw-r--r--lib/chef/knife/core/subcommand_loader.rb6
-rw-r--r--lib/chef/knife/rehash.rb5
4 files changed, 37 insertions, 4 deletions
diff --git a/lib/chef/knife.rb b/lib/chef/knife.rb
index 657216bcf0..8f7232d927 100644
--- a/lib/chef/knife.rb
+++ b/lib/chef/knife.rb
@@ -145,6 +145,11 @@ class Chef
end
def self.subcommand_class_from(args)
+ if args.size == 1 and args[0].strip.downcase == "rehash"
+ # To prevent issues with the rehash file not pointing to the correct plugins,
+ # we always use the glob loader when regenerating the rehash file
+ @subcommand_loader = Chef::Knife::SubcommandLoader.gem_glob_loader(chef_config_dir)
+ end
subcommand_loader.command_class_from(args) || subcommand_not_found!(args)
end
diff --git a/lib/chef/knife/core/hashed_command_loader.rb b/lib/chef/knife/core/hashed_command_loader.rb
index 7b6c1c4c08..1165af6eb2 100644
--- a/lib/chef/knife/core/hashed_command_loader.rb
+++ b/lib/chef/knife/core/hashed_command_loader.rb
@@ -40,9 +40,29 @@ class Chef
def list_commands(pref_category = nil)
if pref_category || manifest[KEY]["plugins_by_category"].key?(pref_category)
- { pref_category => manifest[KEY]["plugins_by_category"][pref_category] }
+ commands = { pref_category => manifest[KEY]["plugins_by_category"][pref_category] }
else
- manifest[KEY]["plugins_by_category"]
+ commands = manifest[KEY]["plugins_by_category"]
+ end
+ # If any of the specified plugins in the manifest dont have a valid path we will
+ # eventually get an error and the user will need to rehash - instead, lets just
+ # print out 1 error here telling them to rehash
+ errors = {}
+ commands.collect { |k, v| v }.flatten.each do |command|
+ paths = manifest[KEY]["plugins_paths"][command]
+ if paths && paths.is_a?(Array)
+ # It is only an error if all the paths don't exist
+ if paths.all? { |sc| !File.exists?(sc) }
+ errors[command] = paths
+ end
+ end
+ end
+ if errors.empty?
+ commands
+ else
+ Chef::Log.error "There are files specified in the manifest that are missing. Please rehash to update the subcommands cache. If you see this error after rehashing delete the cache at #{Chef::Knife::SubcommandLoader.plugin_manifest_path}"
+ Chef::Log.error "Missing files:\n\t#{errors.values.flatten.join("\n\t")}"
+ {}
end
end
@@ -59,7 +79,6 @@ class Chef
if File.exists?(sc)
Kernel.load sc
else
- Chef::Log.error "The file #{sc} is missing for subcommand '#{subcommand_for_args(args)}'. Please rehash to update the subcommands cache."
return false
end
end
diff --git a/lib/chef/knife/core/subcommand_loader.rb b/lib/chef/knife/core/subcommand_loader.rb
index 95ab219c80..dc0b0cc39c 100644
--- a/lib/chef/knife/core/subcommand_loader.rb
+++ b/lib/chef/knife/core/subcommand_loader.rb
@@ -58,6 +58,12 @@ class Chef
end
end
+ # There are certain situations where we want to shortcut the loader selection
+ # in self.for_config and force using the GemGlobLoader
+ def self.gem_glob_loader(chef_config_dir)
+ Knife::SubcommandLoader::GemGlobLoader.new(chef_config_dir)
+ end
+
def self.plugin_manifest?
plugin_manifest_path && File.exist?(plugin_manifest_path)
end
diff --git a/lib/chef/knife/rehash.rb b/lib/chef/knife/rehash.rb
index 3e7bab7e0f..79286368f8 100644
--- a/lib/chef/knife/rehash.rb
+++ b/lib/chef/knife/rehash.rb
@@ -35,7 +35,10 @@ class Chef
end
def reload_plugins
- Chef::Knife::SubcommandLoader::GemGlobLoader.new(@@chef_config_dir).load_commands
+ # The subcommand_loader for this knife command should _always_ be the GemGlobLoader. The GemGlobLoader loads
+ # plugins from disc and ensures the hash we write is always correct. By this point it should also already have
+ # loaded plugins and `load_commands` shouldn't have an effect.
+ Chef::Knife.subcommand_loader.load_commands
end
def generate_hash