95 lines
2.5 KiB
Go
95 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"log"
|
|
"sort"
|
|
"strings"
|
|
|
|
"github.com/mitchellh/cli"
|
|
)
|
|
|
|
// helpFunc is a cli.HelpFunc that can is used to output the help for Terraform.
|
|
func helpFunc(commands map[string]cli.CommandFactory) string {
|
|
// Determine the maximum key length, and classify based on type
|
|
var otherCommands []string
|
|
maxKeyLen := 0
|
|
|
|
for key := range commands {
|
|
if _, ok := HiddenCommands[key]; ok {
|
|
// We don't consider hidden commands when deciding the
|
|
// maximum command length.
|
|
continue
|
|
}
|
|
|
|
if len(key) > maxKeyLen {
|
|
maxKeyLen = len(key)
|
|
}
|
|
|
|
isOther := true
|
|
for _, candidate := range PrimaryCommands {
|
|
if candidate == key {
|
|
isOther = false
|
|
break
|
|
}
|
|
}
|
|
if isOther {
|
|
otherCommands = append(otherCommands, key)
|
|
}
|
|
}
|
|
sort.Strings(otherCommands)
|
|
|
|
// The output produced by this is included in the docs at
|
|
// website/source/docs/commands/index.html.markdown; if you
|
|
// change this then consider updating that to match.
|
|
helpText := fmt.Sprintf(`
|
|
Usage: terraform [global options] <subcommand> [args]
|
|
|
|
The available commands for execution are listed below.
|
|
The primary workflow commands are given first, followed by
|
|
less common or more advanced commands.
|
|
|
|
Main commands:
|
|
%s
|
|
All other commands:
|
|
%s
|
|
Global options (use these before the subcommand, if any):
|
|
-chdir=DIR Switch to a different working directory before executing the
|
|
given subcommand.
|
|
-help Show this help output, or the help for a specified subcommand.
|
|
-version An alias for the "version" subcommand.
|
|
`, listCommands(commands, PrimaryCommands, maxKeyLen), listCommands(commands, otherCommands, maxKeyLen))
|
|
|
|
return strings.TrimSpace(helpText)
|
|
}
|
|
|
|
// listCommands just lists the commands in the map with the
|
|
// given maximum key length.
|
|
func listCommands(allCommands map[string]cli.CommandFactory, order []string, maxKeyLen int) string {
|
|
var buf bytes.Buffer
|
|
|
|
for _, key := range order {
|
|
commandFunc, ok := allCommands[key]
|
|
if !ok {
|
|
// This suggests an inconsistency in the command table definitions
|
|
// in commands.go .
|
|
panic("command not found: " + key)
|
|
}
|
|
|
|
command, err := commandFunc()
|
|
if err != nil {
|
|
// This would be really weird since there's no good reason for
|
|
// any of our command factories to fail.
|
|
log.Printf("[ERR] cli: Command '%s' failed to load: %s",
|
|
key, err)
|
|
continue
|
|
}
|
|
|
|
key = fmt.Sprintf("%s%s", key, strings.Repeat(" ", maxKeyLen-len(key)))
|
|
buf.WriteString(fmt.Sprintf(" %s %s\n", key, command.Synopsis()))
|
|
}
|
|
|
|
return buf.String()
|
|
}
|