class ChefDK::Command::Diff

Attributes

new_base[R]
old_base[R]
storage_config[R]
ui[RW]

Public Class Methods

new(*args) click to toggle source
Calls superclass method ChefDK::Command::Base::new
# File lib/chef-dk/command/diff.rb, line 107
def initialize(*args)
  super

  @ui = UI.new

  @old_base = nil
  @new_base = nil
  @policyfile_relative_path = nil
  @storage_config = nil
  @http_client = nil

  @old_lock = nil
  @new_lock = nil
end

Public Instance Methods

apply_params!(params) click to toggle source
# File lib/chef-dk/command/diff.rb, line 200
def apply_params!(params)
  remaining_args = parse_options(params)

  if no_comparison_specified?(remaining_args)
    ui.err("No comparison specified")
    ui.err("")
    ui.err(opt_parser)
    false
  elsif conflicting_args_and_opts_given?(remaining_args)
    ui.err("Conflicting arguments and options: git and Policy Group comparisons cannot be mixed")
    ui.err("")
    ui.err(opt_parser)
    false
  elsif conflicting_git_options_given?
    ui.err("Conflicting git options: --head and --git are exclusive")
    ui.err("")
    ui.err(opt_parser)

    false
  elsif config[:head]
    set_policyfile_path_from_args(remaining_args)
    @old_base = Policyfile::ComparisonBase::Git.new("HEAD", policyfile_lock_relpath)
    @new_base = Policyfile::ComparisonBase::Local.new(policyfile_lock_relpath)
    true
  elsif config[:git]
    set_policyfile_path_from_args(remaining_args)
    parse_git_comparison(config[:git])
  else
    set_policyfile_path_from_args(remaining_args)
    parse_server_comparison(remaining_args)
  end
end
comparing_policy_groups?() click to toggle source
# File lib/chef-dk/command/diff.rb, line 282
def comparing_policy_groups?
  !(config[:git] || config[:head])
end
conflicting_args_and_opts_given?(args) click to toggle source
# File lib/chef-dk/command/diff.rb, line 274
def conflicting_args_and_opts_given?(args)
  (config[:git] || config[:head]) && policy_group_comparison?(args)
end
conflicting_git_options_given?() click to toggle source
# File lib/chef-dk/command/diff.rb, line 278
def conflicting_git_options_given?
  config[:git] && config[:head]
end
debug?() click to toggle source
# File lib/chef-dk/command/diff.rb, line 122
def debug?
  !!config[:debug]
end
differ(ui = self.ui) click to toggle source
# File lib/chef-dk/command/diff.rb, line 157
def differ(ui = self.ui)
  Policyfile::Differ.new(old_name: old_base.name,
                         old_lock: old_lock,
                         new_name: new_base.name,
                         new_lock: new_lock,
                         ui: ui)
end
handle_error(error) click to toggle source
# File lib/chef-dk/command/diff.rb, line 136
def handle_error(error)
  ui.err("Error: #{error.message}")
  if error.respond_to?(:reason)
    ui.err("Reason: #{error.reason}")
    ui.err("")
    ui.err(error.extended_error_info) if debug?
    ui.err(error.cause.backtrace.join("\n")) if debug?
  end
end
http_client() click to toggle source
# File lib/chef-dk/command/diff.rb, line 165
def http_client
  @http_client ||= Chef::ServerAPI.new(chef_config.chef_server_url,
    signing_key_filename: chef_config.client_key,
    client_name: chef_config.node_name)
end
local_lock() click to toggle source
# File lib/chef-dk/command/diff.rb, line 185
def local_lock
  @local_lock ||= local_lock_comparison_base.lock
end
local_lock_comparison_base() click to toggle source

ComparisonBase for the local lockfile. This is used to get the policy_name which is needed to query the server for the lockfile of a particular policy_group.

# File lib/chef-dk/command/diff.rb, line 192
def local_lock_comparison_base
  Policyfile::ComparisonBase::Local.new(policyfile_lock_relpath)
end
materialize_locks() click to toggle source
# File lib/chef-dk/command/diff.rb, line 310
def materialize_locks
  @old_lock = old_base.lock
  @new_lock = new_base.lock
end
new_lock() click to toggle source
# File lib/chef-dk/command/diff.rb, line 176
def new_lock
  materialize_locks unless @new_lock
  @new_lock
end
no_comparison_specified?(args) click to toggle source
# File lib/chef-dk/command/diff.rb, line 270
def no_comparison_specified?(args)
  !policy_group_comparison?(args) && !config[:head] && !config[:git]
end
old_lock() click to toggle source
# File lib/chef-dk/command/diff.rb, line 171
def old_lock
  materialize_locks unless @old_lock
  @old_lock
end
parse_git_comparison(git_ref) click to toggle source
# File lib/chef-dk/command/diff.rb, line 252
def parse_git_comparison(git_ref)
  if git_ref.include?("...")
    old_ref, new_ref, *extra = git_ref.split("...")
    @old_base, @new_base = [old_ref, new_ref].map do |r|
      Policyfile::ComparisonBase::Git.new(r, policyfile_lock_relpath)
    end

    unless extra.empty?
      ui.err("Unable to parse git comparison `#{git_ref}`. Only 2 references can be specified.")
      return false
    end
  else
    @old_base = Policyfile::ComparisonBase::Git.new(git_ref, policyfile_lock_relpath)
    @new_base = Policyfile::ComparisonBase::Local.new(policyfile_lock_relpath)
  end
  true
end
parse_server_comparison(args) click to toggle source
# File lib/chef-dk/command/diff.rb, line 233
def parse_server_comparison(args)
  comparison_string = args.last
  if comparison_string.include?("...")
    old_pgroup, new_pgroup, *extra = comparison_string.split("...")
    @old_base, @new_base = [old_pgroup, new_pgroup].map do |g|
      Policyfile::ComparisonBase::PolicyGroup.new(g, policy_name, http_client)
    end

    unless extra.empty?
      ui.err("Unable to parse policy group comparison `#{comparison_string}`. Only 2 references can be specified.")
      return false
    end
  else
    @old_base = Policyfile::ComparisonBase::PolicyGroup.new(comparison_string, policy_name, http_client)
    @new_base = Policyfile::ComparisonBase::Local.new(policyfile_lock_relpath)
  end
  true
end
policy_group_comparison?(args) click to toggle source

Try to detect if the only argument given is a policyfile path. This is necessary because we support an optional argument with the path to the ruby policyfile. It would be easier if we used an option like `-f`, but that would be inconsistent with other commands (`chef install`, `chef push`, etc.).

# File lib/chef-dk/command/diff.rb, line 291
def policy_group_comparison?(args)
  return false if args.empty?
  return true if args.size > 1

  !(args.first =~ /\.rb\Z/)
end
policy_name() click to toggle source
# File lib/chef-dk/command/diff.rb, line 181
def policy_name
  local_lock["name"]
end
policyfile_lock_relpath() click to toggle source
# File lib/chef-dk/command/diff.rb, line 196
def policyfile_lock_relpath
  storage_config.policyfile_lock_filename
end
print_diff() click to toggle source
run(params = []) click to toggle source
# File lib/chef-dk/command/diff.rb, line 126
def run(params = [])
  return 1 unless apply_params!(params)

  print_diff
  0
rescue PolicyfileServiceError => e
  handle_error(e)
  1
end
set_policyfile_path_from_args(args) click to toggle source
# File lib/chef-dk/command/diff.rb, line 298
def set_policyfile_path_from_args(args)
  policyfile_relative_path =
    if !comparing_policy_groups?
      args.first || "Policyfile.rb"
    elsif args.size == 1
      "Policyfile.rb"
    else
      args.first
    end
  @storage_config = Policyfile::StorageConfig.new.use_policyfile(policyfile_relative_path)
end