class KnifeDwim::Dwim

Public Instance Methods

run() click to toggle source
# File lib/chef/knife/dwim.rb, line 16
def run
  if name_args.empty?
    ui.error('File name or names required')
  else
    name_args.each do |f|
      path = Pathname.
        new(f).
        expand_path

      unless path.exist?
        ui.error "Path #{path} does not exist."
        next
      end

      done = false

      Chef::Config[:cookbook_path].each do |cbp|
        rel_path = path.relative_path_from(Pathname.new(cbp).expand_path)

        if not rel_path.to_s[0..2] == '../'
          # path is within a cookbook dir
          run_knife(Chef::Knife::CookbookUpload, rel_path.to_s.sub(/\/.*/,''))
          done = true
          break
        end
      end

      next if done

      path = path.relative_path_from(Pathname.pwd)
      if path.to_s[0..2] == '../'
        ui.error "Path #{path.expand_path} is outside the repo."
        next
      end

      case path.to_s
      when /^roles\//
        run_knife(Chef::Knife::RoleFromFile, path.basename)
      when /^nodes\//
        run_knife(Chef::Knife::NodeFromFile, path.basename)
      when /^environments\//
        run_knife(Chef::Knife::EnvironmentFromFile, path.basename)
      when /^data.bags\/(\w+)\/.*\.ya?ml$/
        run_knife(Chef::Knife::DataBagFromYaml, $1, path.basename)
      when /^data.bags\/(\w+)\//
        run_knife(Chef::Knife::DataBagFromFile, $1, path.basename)
      else
        ui.error "Don't know what to do with #{path}."
      end
    end
  end
end
run_knife(cls, *args) click to toggle source
# File lib/chef/knife/dwim.rb, line 9
def run_knife(cls, *args)
  cls.load_deps
  i = cls.new(args)
  i.config = config
  i.run
end