Class: Chef::Knife::Help

Inherits:
Chef::Knife show all
Defined in:
lib/chef/knife/help.rb

Constant Summary

Constants inherited from Chef::Knife

OFFICIAL_PLUGINS

Instance Attribute Summary

Attributes inherited from Chef::Knife

#name_args, #ui

Instance Method Summary collapse

Methods inherited from Chef::Knife

#api_key, #apply_computed_config, category, chef_config_dir, #cli_keys, common_name, #config_file_settings, config_loader, #configure_chef, #create_object, #delete_object, dependency_loaders, deps, #format_rest_error, guess_category, #humanize_exception, #humanize_http_exception, inherited, #initialize, list_commands, load_commands, load_config, load_deps, #maybe_setup_fips, #merge_configs, msg, #noauth_rest, #parse_options, reset_config_loader!, reset_subcommands!, #rest, run, #run_with_pretty_exceptions, #server_url, #show_usage, snake_case_name, subcommand_category, subcommand_class_from, subcommand_files, subcommand_loader, subcommands, subcommands_by_category, #test_mandatory_field, ui, unnamed?, use_separate_defaults?, #username

Methods included from Mixin::ConvertToClassName

#constantize, #convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #normalize_snake_case_name, #snake_case_basename

Methods included from Mixin::PathSanity

#enforce_path_sanity, #sanitized_path

Constructor Details

This class inherits a constructor from Chef::Knife

Instance Method Details

#find_manpage_path(topic) ⇒ Object


90
91
92
93
94
95
96
97
98
# File 'lib/chef/knife/help.rb', line 90

def find_manpage_path(topic)
  if ::File.exists?(::File.expand_path("../distro/common/man/man1/#{topic}.1", CHEF_ROOT))
    # If we've provided the man page in the gem, give that
    ::File.expand_path("../distro/common/man/man1/#{topic}.1", CHEF_ROOT)
  else
    # Otherwise, we'll just be using MANPATH
    topic
  end
end

#find_manpages_for_query(query) ⇒ Object


73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
# File 'lib/chef/knife/help.rb', line 73

def find_manpages_for_query(query)
  possibilities = help_topics.select do |manpage|
    ::File.fnmatch("knife-#{query}*", manpage) || ::File.fnmatch("#{query}*", manpage)
  end
  if possibilities.empty?
    ui.error "No help found for '#{query}'"
    ui.msg ""
    print_help_topics
    exit 1
  elsif possibilities.size == 1
    possibilities.first
  else
    ui.info "Multiple help topics match your query. Pick one:"
    ui.highline.choose(*possibilities)
  end
end

#help_topicsObject


60
61
62
63
64
# File 'lib/chef/knife/help.rb', line 60

def help_topics
  # The list of help topics is generated by a rake task from the available man pages
  # This constant is provided in help_topics.rb which is automatically required/loaded by the knife subcommand loader.
  HELP_TOPICS
end

66
67
68
69
70
71
# File 'lib/chef/knife/help.rb', line 66

def print_help_topics
  ui.info "Available help topics are: "
  help_topics.collect { |t| t.gsub(/knife-/, "") }.sort.each do |topic|
    ui.msg "  #{topic}"
  end
end

#runObject


25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/chef/knife/help.rb', line 25

def run
  if name_args.empty?
    ui.info "Usage: knife SUBCOMMAND (options)"
    ui.msg ""
    # This command is atypical, the user is likely not interested in usage of
    # this command, but knife in general. So hack the banner.
    opt_parser.banner = "General Knife Options:"
    ui.msg opt_parser.to_s
    ui.msg ""
    ui.info "For further help:"
    ui.info(<<-MOAR_HELP)
  knife help list             list help topics
  knife help knife            show general knife help
  knife help TOPIC            display the manual for TOPIC
  knife SUBCOMMAND --help     show the options for a command
MOAR_HELP
    exit 1
  else
    @query = name_args.join("-")
  end

  case @query
  when "topics", "list"
    print_help_topics
    exit 1
  when "intro", "knife"
    @topic = "knife"
  else
    @topic = find_manpages_for_query(@query)
  end

  manpage_path = find_manpage_path(@topic)
  exec "man #{manpage_path}"
end