2015-10-29 12:53:24 -05:00
|
|
|
// Copyright 2015 The go-ethereum Authors
|
|
|
|
// This file is part of go-ethereum.
|
|
|
|
//
|
|
|
|
// go-ethereum is free software: you can redistribute it and/or modify
|
|
|
|
// it under the terms of the GNU General Public License as published by
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
// (at your option) any later version.
|
|
|
|
//
|
|
|
|
// go-ethereum is distributed in the hope that it will be useful,
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
// GNU General Public License for more details.
|
|
|
|
//
|
|
|
|
// You should have received a copy of the GNU General Public License
|
|
|
|
// along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
|
|
|
|
// Contains the geth command usage template and generator.
|
|
|
|
|
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
|
|
|
"io"
|
2017-05-25 02:15:51 -05:00
|
|
|
"sort"
|
2015-10-29 12:53:24 -05:00
|
|
|
|
2018-02-05 10:40:32 -06:00
|
|
|
"strings"
|
|
|
|
|
2015-10-29 12:53:24 -05:00
|
|
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
2016-01-26 07:39:21 -06:00
|
|
|
"github.com/ethereum/go-ethereum/internal/debug"
|
2016-06-09 04:44:42 -05:00
|
|
|
"gopkg.in/urfave/cli.v1"
|
2015-10-29 12:53:24 -05:00
|
|
|
)
|
|
|
|
|
|
|
|
// AppHelpTemplate is the test template for the default, global app help topic.
|
|
|
|
var AppHelpTemplate = `NAME:
|
|
|
|
{{.App.Name}} - {{.App.Usage}}
|
|
|
|
|
2018-04-23 05:45:43 -05:00
|
|
|
Copyright 2013-2018 The go-ethereum Authors
|
2016-08-21 16:51:42 -05:00
|
|
|
|
2015-10-29 12:53:24 -05:00
|
|
|
USAGE:
|
|
|
|
{{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}}
|
|
|
|
{{if .App.Version}}
|
|
|
|
VERSION:
|
|
|
|
{{.App.Version}}
|
|
|
|
{{end}}{{if len .App.Authors}}
|
|
|
|
AUTHOR(S):
|
|
|
|
{{range .App.Authors}}{{ . }}{{end}}
|
|
|
|
{{end}}{{if .App.Commands}}
|
|
|
|
COMMANDS:
|
|
|
|
{{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
|
|
|
|
{{end}}{{end}}{{if .FlagGroups}}
|
|
|
|
{{range .FlagGroups}}{{.Name}} OPTIONS:
|
|
|
|
{{range .Flags}}{{.}}
|
|
|
|
{{end}}
|
|
|
|
{{end}}{{end}}{{if .App.Copyright }}
|
|
|
|
COPYRIGHT:
|
|
|
|
{{.App.Copyright}}
|
|
|
|
{{end}}
|
|
|
|
`
|
|
|
|
|
|
|
|
// flagGroup is a collection of flags belonging to a single topic.
|
|
|
|
type flagGroup struct {
|
|
|
|
Name string
|
|
|
|
Flags []cli.Flag
|
|
|
|
}
|
|
|
|
|
|
|
|
// AppHelpFlagGroups is the application flags, grouped by functionality.
|
|
|
|
var AppHelpFlagGroups = []flagGroup{
|
|
|
|
{
|
|
|
|
Name: "ETHEREUM",
|
|
|
|
Flags: []cli.Flag{
|
2017-04-13 09:12:37 -05:00
|
|
|
configFileFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.DataDirFlag,
|
2016-03-07 16:38:56 -06:00
|
|
|
utils.KeyStoreDirFlag,
|
2017-04-20 06:01:51 -05:00
|
|
|
utils.NoUSBFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.NetworkIdFlag,
|
2017-05-04 04:36:20 -05:00
|
|
|
utils.TestnetFlag,
|
|
|
|
utils.RinkebyFlag,
|
2018-11-16 09:58:24 -06:00
|
|
|
utils.GoerliFlag,
|
2017-04-13 09:12:37 -05:00
|
|
|
utils.SyncModeFlag,
|
2018-02-05 10:40:32 -06:00
|
|
|
utils.GCModeFlag,
|
2017-04-13 09:12:37 -05:00
|
|
|
utils.EthStatsURLFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.IdentityFlag,
|
2016-01-13 12:35:48 -06:00
|
|
|
utils.LightServFlag,
|
|
|
|
utils.LightPeersFlag,
|
2015-11-10 07:47:19 -06:00
|
|
|
utils.LightKDFFlag,
|
2018-11-02 15:26:45 -05:00
|
|
|
utils.WhitelistFlag,
|
2016-10-19 06:55:13 -05:00
|
|
|
},
|
|
|
|
},
|
2018-07-09 03:41:28 -05:00
|
|
|
{
|
|
|
|
Name: "DEVELOPER CHAIN",
|
2017-10-24 05:40:42 -05:00
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.DeveloperFlag,
|
|
|
|
utils.DeveloperPeriodFlag,
|
|
|
|
},
|
|
|
|
},
|
2017-03-06 03:37:32 -06:00
|
|
|
{
|
|
|
|
Name: "ETHASH",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.EthashCacheDirFlag,
|
|
|
|
utils.EthashCachesInMemoryFlag,
|
|
|
|
utils.EthashCachesOnDiskFlag,
|
|
|
|
utils.EthashDatasetDirFlag,
|
2017-03-06 09:20:25 -06:00
|
|
|
utils.EthashDatasetsInMemoryFlag,
|
2017-03-06 03:37:32 -06:00
|
|
|
utils.EthashDatasetsOnDiskFlag,
|
|
|
|
},
|
|
|
|
},
|
2017-11-14 11:34:00 -06:00
|
|
|
//{
|
|
|
|
// Name: "DASHBOARD",
|
|
|
|
// Flags: []cli.Flag{
|
|
|
|
// utils.DashboardEnabledFlag,
|
|
|
|
// utils.DashboardAddrFlag,
|
|
|
|
// utils.DashboardPortFlag,
|
|
|
|
// utils.DashboardRefreshFlag,
|
|
|
|
// utils.DashboardAssetsFlag,
|
|
|
|
// },
|
|
|
|
//},
|
2017-05-26 05:40:47 -05:00
|
|
|
{
|
|
|
|
Name: "TRANSACTION POOL",
|
|
|
|
Flags: []cli.Flag{
|
2018-08-21 12:30:06 -05:00
|
|
|
utils.TxPoolLocalsFlag,
|
2017-07-05 09:06:05 -05:00
|
|
|
utils.TxPoolNoLocalsFlag,
|
2017-07-28 08:09:39 -05:00
|
|
|
utils.TxPoolJournalFlag,
|
|
|
|
utils.TxPoolRejournalFlag,
|
2017-05-26 05:40:47 -05:00
|
|
|
utils.TxPoolPriceLimitFlag,
|
|
|
|
utils.TxPoolPriceBumpFlag,
|
|
|
|
utils.TxPoolAccountSlotsFlag,
|
|
|
|
utils.TxPoolGlobalSlotsFlag,
|
|
|
|
utils.TxPoolAccountQueueFlag,
|
|
|
|
utils.TxPoolGlobalQueueFlag,
|
|
|
|
utils.TxPoolLifetimeFlag,
|
|
|
|
},
|
|
|
|
},
|
2016-10-19 06:55:13 -05:00
|
|
|
{
|
|
|
|
Name: "PERFORMANCE TUNING",
|
|
|
|
Flags: []cli.Flag{
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.CacheFlag,
|
2018-02-05 10:40:32 -06:00
|
|
|
utils.CacheDatabaseFlag,
|
2018-11-12 10:47:34 -06:00
|
|
|
utils.CacheTrieFlag,
|
2018-02-05 10:40:32 -06:00
|
|
|
utils.CacheGCFlag,
|
2016-10-19 06:55:13 -05:00
|
|
|
utils.TrieCacheGenFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "ACCOUNT",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.UnlockedAccountFlag,
|
|
|
|
utils.PasswordFileFlag,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "API AND CONSOLE",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.RPCEnabledFlag,
|
|
|
|
utils.RPCListenAddrFlag,
|
|
|
|
utils.RPCPortFlag,
|
2015-12-16 03:58:01 -06:00
|
|
|
utils.RPCApiFlag,
|
|
|
|
utils.WSEnabledFlag,
|
|
|
|
utils.WSListenAddrFlag,
|
|
|
|
utils.WSPortFlag,
|
|
|
|
utils.WSApiFlag,
|
2016-03-14 03:38:54 -05:00
|
|
|
utils.WSAllowedOriginsFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.IPCDisabledFlag,
|
|
|
|
utils.IPCPathFlag,
|
|
|
|
utils.RPCCORSDomainFlag,
|
2018-02-12 06:52:07 -06:00
|
|
|
utils.RPCVirtualHostsFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.JSpathFlag,
|
|
|
|
utils.ExecFlag,
|
2016-05-06 04:40:23 -05:00
|
|
|
utils.PreloadJSFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "NETWORKING",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.BootnodesFlag,
|
2017-05-10 09:51:52 -05:00
|
|
|
utils.BootnodesV4Flag,
|
|
|
|
utils.BootnodesV5Flag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.ListenPortFlag,
|
|
|
|
utils.MaxPeersFlag,
|
|
|
|
utils.MaxPendingPeersFlag,
|
|
|
|
utils.NATFlag,
|
|
|
|
utils.NoDiscoverFlag,
|
2016-10-19 06:04:55 -05:00
|
|
|
utils.DiscoveryV5Flag,
|
2017-04-13 09:12:37 -05:00
|
|
|
utils.NetrestrictFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
utils.NodeKeyFileFlag,
|
|
|
|
utils.NodeKeyHexFlag,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "MINER",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.MiningEnabledFlag,
|
|
|
|
utils.MinerThreadsFlag,
|
2018-08-08 04:15:08 -05:00
|
|
|
utils.MinerNotifyFlag,
|
2018-08-15 03:01:49 -05:00
|
|
|
utils.MinerGasPriceFlag,
|
|
|
|
utils.MinerGasTargetFlag,
|
2018-08-29 04:21:12 -05:00
|
|
|
utils.MinerGasLimitFlag,
|
2018-08-15 03:01:49 -05:00
|
|
|
utils.MinerEtherbaseFlag,
|
|
|
|
utils.MinerExtraDataFlag,
|
2018-08-21 14:56:54 -05:00
|
|
|
utils.MinerRecommitIntervalFlag,
|
2018-08-28 08:59:05 -05:00
|
|
|
utils.MinerNoVerfiyFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "GAS PRICE ORACLE",
|
|
|
|
Flags: []cli.Flag{
|
2017-04-06 09:20:42 -05:00
|
|
|
utils.GpoBlocksFlag,
|
|
|
|
utils.GpoPercentileFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Name: "VIRTUAL MACHINE",
|
|
|
|
Flags: []cli.Flag{
|
2017-01-17 05:19:50 -06:00
|
|
|
utils.VMEnableDebugFlag,
|
2018-09-20 02:44:35 -05:00
|
|
|
utils.EVMInterpreterFlag,
|
|
|
|
utils.EWASMInterpreterFlag,
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
2016-04-21 04:14:57 -05:00
|
|
|
Name: "LOGGING AND DEBUGGING",
|
|
|
|
Flags: append([]cli.Flag{
|
|
|
|
utils.FakePoWFlag,
|
2017-04-13 09:12:37 -05:00
|
|
|
utils.NoCompactionFlag,
|
2016-04-21 04:14:57 -05:00
|
|
|
}, debug.Flags...),
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
2018-07-02 07:51:02 -05:00
|
|
|
{
|
|
|
|
Name: "METRICS AND STATS",
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
utils.MetricsEnabledFlag,
|
|
|
|
utils.MetricsEnableInfluxDBFlag,
|
|
|
|
utils.MetricsInfluxDBEndpointFlag,
|
|
|
|
utils.MetricsInfluxDBDatabaseFlag,
|
|
|
|
utils.MetricsInfluxDBUsernameFlag,
|
|
|
|
utils.MetricsInfluxDBPasswordFlag,
|
|
|
|
utils.MetricsInfluxDBHostTagFlag,
|
|
|
|
},
|
|
|
|
},
|
2017-06-13 04:49:07 -05:00
|
|
|
{
|
2017-06-26 05:40:43 -05:00
|
|
|
Name: "WHISPER (EXPERIMENTAL)",
|
2017-06-21 03:49:14 -05:00
|
|
|
Flags: whisperFlags,
|
2017-06-13 04:49:07 -05:00
|
|
|
},
|
2017-04-13 09:12:37 -05:00
|
|
|
{
|
|
|
|
Name: "DEPRECATED",
|
|
|
|
Flags: []cli.Flag{
|
2018-08-15 03:01:49 -05:00
|
|
|
utils.MinerLegacyThreadsFlag,
|
|
|
|
utils.MinerLegacyGasTargetFlag,
|
|
|
|
utils.MinerLegacyGasPriceFlag,
|
|
|
|
utils.MinerLegacyEtherbaseFlag,
|
|
|
|
utils.MinerLegacyExtraDataFlag,
|
2017-04-13 09:12:37 -05:00
|
|
|
},
|
|
|
|
},
|
2015-10-29 12:53:24 -05:00
|
|
|
{
|
2017-06-13 04:49:07 -05:00
|
|
|
Name: "MISC",
|
2015-10-29 12:53:24 -05:00
|
|
|
},
|
|
|
|
}
|
|
|
|
|
2017-05-25 02:15:51 -05:00
|
|
|
// byCategory sorts an array of flagGroup by Name in the order
|
|
|
|
// defined in AppHelpFlagGroups.
|
|
|
|
type byCategory []flagGroup
|
|
|
|
|
|
|
|
func (a byCategory) Len() int { return len(a) }
|
|
|
|
func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
|
|
func (a byCategory) Less(i, j int) bool {
|
|
|
|
iCat, jCat := a[i].Name, a[j].Name
|
|
|
|
iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last
|
|
|
|
|
|
|
|
for i, group := range AppHelpFlagGroups {
|
|
|
|
if iCat == group.Name {
|
|
|
|
iIdx = i
|
|
|
|
}
|
|
|
|
if jCat == group.Name {
|
|
|
|
jIdx = i
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return iIdx < jIdx
|
|
|
|
}
|
|
|
|
|
|
|
|
func flagCategory(flag cli.Flag) string {
|
|
|
|
for _, category := range AppHelpFlagGroups {
|
|
|
|
for _, flg := range category.Flags {
|
|
|
|
if flg.GetName() == flag.GetName() {
|
|
|
|
return category.Name
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return "MISC"
|
|
|
|
}
|
|
|
|
|
2015-10-29 12:53:24 -05:00
|
|
|
func init() {
|
|
|
|
// Override the default app help template
|
|
|
|
cli.AppHelpTemplate = AppHelpTemplate
|
|
|
|
|
|
|
|
// Define a one shot struct to pass to the usage template
|
|
|
|
type helpData struct {
|
|
|
|
App interface{}
|
|
|
|
FlagGroups []flagGroup
|
|
|
|
}
|
2017-05-25 02:15:51 -05:00
|
|
|
|
2015-10-29 12:53:24 -05:00
|
|
|
// Override the default app help printer, but only for the global app help
|
|
|
|
originalHelpPrinter := cli.HelpPrinter
|
|
|
|
cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {
|
|
|
|
if tmpl == AppHelpTemplate {
|
|
|
|
// Iterate over all the flags and add any uncategorized ones
|
|
|
|
categorized := make(map[string]struct{})
|
|
|
|
for _, group := range AppHelpFlagGroups {
|
|
|
|
for _, flag := range group.Flags {
|
|
|
|
categorized[flag.String()] = struct{}{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
uncategorized := []cli.Flag{}
|
|
|
|
for _, flag := range data.(*cli.App).Flags {
|
|
|
|
if _, ok := categorized[flag.String()]; !ok {
|
2017-11-14 11:34:00 -06:00
|
|
|
if strings.HasPrefix(flag.GetName(), "dashboard") {
|
|
|
|
continue
|
|
|
|
}
|
2015-10-29 12:53:24 -05:00
|
|
|
uncategorized = append(uncategorized, flag)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if len(uncategorized) > 0 {
|
|
|
|
// Append all ungategorized options to the misc group
|
|
|
|
miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags)
|
|
|
|
AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...)
|
|
|
|
|
|
|
|
// Make sure they are removed afterwards
|
|
|
|
defer func() {
|
|
|
|
AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs]
|
|
|
|
}()
|
|
|
|
}
|
|
|
|
// Render out custom usage screen
|
|
|
|
originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups})
|
2017-05-25 02:15:51 -05:00
|
|
|
} else if tmpl == utils.CommandHelpTemplate {
|
|
|
|
// Iterate over all command specific flags and categorize them
|
|
|
|
categorized := make(map[string][]cli.Flag)
|
|
|
|
for _, flag := range data.(cli.Command).Flags {
|
|
|
|
if _, ok := categorized[flag.String()]; !ok {
|
|
|
|
categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// sort to get a stable ordering
|
|
|
|
sorted := make([]flagGroup, 0, len(categorized))
|
|
|
|
for cat, flgs := range categorized {
|
|
|
|
sorted = append(sorted, flagGroup{cat, flgs})
|
|
|
|
}
|
|
|
|
sort.Sort(byCategory(sorted))
|
|
|
|
|
|
|
|
// add sorted array to data and render with default printer
|
|
|
|
originalHelpPrinter(w, tmpl, map[string]interface{}{
|
|
|
|
"cmd": data,
|
|
|
|
"categorizedFlags": sorted,
|
|
|
|
})
|
2015-10-29 12:53:24 -05:00
|
|
|
} else {
|
|
|
|
originalHelpPrinter(w, tmpl, data)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|