class Chef::Knife::SupermarketInstall

Attributes

cookbook_name[R]
vendor_path[R]

Public Instance Methods

clear_existing_files(cookbook_path) click to toggle source
# File lib/chef/knife/supermarket_install.rb, line 152
def clear_existing_files(cookbook_path)
  ui.info("Removing pre-existing version.")
  FileUtils.rmtree(cookbook_path) if File.directory?(cookbook_path)
end
convert_path(upstream_file) click to toggle source
# File lib/chef/knife/supermarket_install.rb, line 157
def convert_path(upstream_file)
  # converts a Windows path (C:\foo) to a mingw path (/c/foo)
  if ENV["MSYSTEM"] == "MINGW32"
    upstream_file.sub(/^([[:alpha:]]):/, '/\1')
  else
    Shellwords.escape upstream_file
  end
end
download_cookbook_to(download_path) click to toggle source
# File lib/chef/knife/supermarket_install.rb, line 138
def download_cookbook_to(download_path)
  downloader = Chef::Knife::SupermarketDownload.new
  downloader.config[:file] = download_path
  downloader.config[:supermarket_site] = config[:supermarket_site]
  downloader.name_args = name_args
  downloader.run
  downloader
end
extract_cookbook(upstream_file, version) click to toggle source
# File lib/chef/knife/supermarket_install.rb, line 147
def extract_cookbook(upstream_file, version)
  ui.info("Uncompressing #{@cookbook_name} version #{version}.")
  Mixlib::Archive.new(convert_path(upstream_file)).extract(@install_path, perms: false)
end
parse_name_args!() click to toggle source
# File lib/chef/knife/supermarket_install.rb, line 125
def parse_name_args!
  if name_args.empty?
    ui.error("Please specify a cookbook to download and install.")
    exit 1
  elsif name_args.size >= 2
    unless name_args.last.match(/^(\d+)(\.\d+){1,2}$/) && name_args.size == 2
      ui.error("Installing multiple cookbooks at once is not supported.")
      exit 1
    end
  end
  name_args.first
end
preferred_metadata() click to toggle source

Get the preferred metadata path on disk. Chef prefers the metadata.rb over the metadata.json.

@raise if there is no metadata in the cookbook

@return [Chef::Cookbook::Metadata]

# File lib/chef/knife/supermarket_install.rb, line 172
def preferred_metadata
  md = Chef::Cookbook::Metadata.new

  rb = File.join(@install_path, @cookbook_name, "metadata.rb")
  if File.exist?(rb)
    md.from_file(rb)
    return md
  end

  json = File.join(@install_path, @cookbook_name, "metadata.json")
  if File.exist?(json)
    json = IO.read(json)
    md.from_json(json)
    return md
  end

  raise Chef::Exceptions::MetadataNotFound.new(@install_path, @cookbook_name)
end
run() click to toggle source
# File lib/chef/knife/supermarket_install.rb, line 71
def run
  if config[:cookbook_path]
    Chef::Config[:cookbook_path] = config[:cookbook_path]
  else
    config[:cookbook_path] = Chef::Config[:cookbook_path]
  end

  @cookbook_name = parse_name_args!
  # Check to ensure we have a valid source of cookbooks before continuing
  #
  @install_path = File.expand_path(Array(config[:cookbook_path]).first)
  ui.info "Installing #{@cookbook_name} to #{@install_path}"

  @repo = CookbookSCMRepo.new(@install_path, ui, config)
  # cookbook_path = File.join(vendor_path, name_args[0])
  upstream_file = File.join(@install_path, "#{@cookbook_name}.tar.gz")

  @repo.sanity_check
  unless config[:use_current_branch]
    @repo.reset_to_default_state
    @repo.prepare_to_import(@cookbook_name)
  end

  downloader = download_cookbook_to(upstream_file)
  clear_existing_files(File.join(@install_path, @cookbook_name))
  extract_cookbook(upstream_file, downloader.version)

  # TODO: it'd be better to store these outside the cookbook repo and
  # keep them around, e.g., in ~/Library/Caches on macOS.
  ui.info("Removing downloaded tarball")
  File.unlink(upstream_file)

  if @repo.finalize_updates_to(@cookbook_name, downloader.version)
    unless config[:use_current_branch]
      @repo.reset_to_default_state
    end
    @repo.merge_updates_from(@cookbook_name, downloader.version)
  else
    unless config[:use_current_branch]
      @repo.reset_to_default_state
    end
  end

  unless config[:no_deps]
    preferred_metadata.dependencies.each_key do |cookbook|
      # Doesn't do versions.. yet
      nv = self.class.new
      nv.config = config
      nv.name_args = [ cookbook ]
      nv.run
    end
  end
end