Class: Chef::Knife::Help

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

Instance Attribute Summary

Attributes inherited from Chef::Knife

#name_args, #ui

Instance Method Summary collapse

Methods inherited from Chef::Knife

#api_key, category, common_name, #configure_chef, #create_object, #delete_object, deps, #format_rest_error, guess_category, #highlight_config_error, #humanize_exception, #humanize_http_exception, inherited, #initialize, list_commands, load_commands, load_deps, msg, #noauth_rest, #parse_options, #read_config_file, reset_subcommands!, #rest, run, #run_with_pretty_exceptions, #server_url, #show_usage, snake_case_name, subcommand_category, subcommand_class_from, subcommand_loader, subcommands, subcommands_by_category, ui, unnamed?, #username

Methods included from Mixin::ConvertToClassName

#convert_to_class_name, #convert_to_snake_case, #filename_to_qualified_string, #snake_case_basename

Methods included from Mixin::PathSanity

#enforce_path_sanity

Constructor Details

This class inherits a constructor from Chef::Knife

Instance Method Details

#find_manpage_path(topic) ⇒ Object



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

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
    return ::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



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

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



62
63
64
65
66
# File 'lib/chef/knife/help.rb', line 62

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


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

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
59
60
# 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