mirror of
https://github.com/opentofu/opentofu.git
synced 2024-12-28 01:41:48 -06:00
248cf7f13a
This just reduces the amount of space between different elements on in the main help output from four columns to two. The main motivation here was to give some of the longer command descriptions a little more horizontal breathing room, but subjectively I also find the tighter column gutters easier to scan. Others may disagree, of course.
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()
|
|
}
|