Class: Chef::Knife::SubcommandLoader

Inherits:
Object
  • Object
show all
Defined in:
lib/chef/knife/core/subcommand_loader.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(chef_config_dir, env = ENV) ⇒ SubcommandLoader

Returns a new instance of SubcommandLoader.



27
28
29
30
# File 'lib/chef/knife/core/subcommand_loader.rb', line 27

def initialize(chef_config_dir, env=ENV)
  @chef_config_dir, @env = chef_config_dir, env
  @forced_activate = {}
end

Instance Attribute Details

#chef_config_dirObject (readonly)

Returns the value of attribute chef_config_dir.



24
25
26
# File 'lib/chef/knife/core/subcommand_loader.rb', line 24

def chef_config_dir
  @chef_config_dir
end

#envObject (readonly)

Returns the value of attribute env.



25
26
27
# File 'lib/chef/knife/core/subcommand_loader.rb', line 25

def env
  @env
end

Instance Method Details

#find_subcommands_via_dirglobObject



74
75
76
77
78
79
80
81
82
83
# File 'lib/chef/knife/core/subcommand_loader.rb', line 74

def find_subcommands_via_dirglob
  # The "require paths" of the core knife subcommands bundled with chef
  files = Dir[File.expand_path('../../../knife/*.rb', __FILE__)]
  subcommand_files = {}
  files.each do |knife_file|
    rel_path = knife_file[/#{CHEF_ROOT}#{Regexp.escape(File::SEPARATOR)}(.*)\.rb/,1]
    subcommand_files[rel_path] = knife_file
  end
  subcommand_files
end

#find_subcommands_via_rubygemsObject



85
86
87
88
89
90
91
92
93
94
# File 'lib/chef/knife/core/subcommand_loader.rb', line 85

def find_subcommands_via_rubygems
  files = find_files_latest_gems 'chef/knife/*.rb'
  subcommand_files = {}
  files.each do |file|
    rel_path = file[/(#{Regexp.escape File.join('chef', 'knife', '')}.*)\.rb/, 1]
    subcommand_files[rel_path] = file
  end

  subcommand_files.merge(find_subcommands_via_dirglob)
end

#gem_and_builtin_subcommandsObject

Returns a Hash of paths to knife commands built-in to chef, or installed via gem. If rubygems is not installed, falls back to globbing the knife directory. The Hash is of the form => “/absolute/path” – Note: the “right” way to load the plugins is to require the relative path, i.e.,

require 'chef/knife/command'

but we’re getting frustrated by bugs at every turn, and it’s slow besides. So subcommand loader has been modified to load the plugins by using Kernel.load with the absolute path.



62
63
64
65
66
67
68
# File 'lib/chef/knife/core/subcommand_loader.rb', line 62

def gem_and_builtin_subcommands
  # search all gems for chef/knife/*.rb
  require 'rubygems'
  find_subcommands_via_rubygems
rescue LoadError
  find_subcommands_via_dirglob
end

#load_commandsObject

Load all the sub-commands



33
34
35
36
# File 'lib/chef/knife/core/subcommand_loader.rb', line 33

def load_commands
  subcommand_files.each { |subcommand| Kernel.load subcommand }
  true
end

#site_subcommandsObject

Returns an Array of paths to knife commands located in chef_config_dir/plugins/knife/ and ~/.chef/plugins/knife/



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/chef/knife/core/subcommand_loader.rb', line 40

def site_subcommands
  user_specific_files = []

  if chef_config_dir
    user_specific_files.concat Dir.glob(File.expand_path("plugins/knife/*.rb", chef_config_dir))
  end

  # finally search ~/.chef/plugins/knife/*.rb
  user_specific_files.concat Dir.glob(File.join(env['HOME'], '.chef', 'plugins', 'knife', '*.rb')) if env['HOME']

  user_specific_files
end

#subcommand_filesObject



70
71
72
# File 'lib/chef/knife/core/subcommand_loader.rb', line 70

def subcommand_files
  @subcommand_files ||= (gem_and_builtin_subcommands.values + site_subcommands).flatten.uniq
end