github.com/cheng762/platon-go@v1.8.17-0.20190529111256-7deff2d7be26/cmd/platon/usage.go (about)

     1  // Copyright 2015 The go-ethereum Authors
     2  // This file is part of go-ethereum.
     3  //
     4  // go-ethereum is free software: you can redistribute it and/or modify
     5  // it under the terms of the GNU General Public License as published by
     6  // the Free Software Foundation, either version 3 of the License, or
     7  // (at your option) any later version.
     8  //
     9  // go-ethereum is distributed in the hope that it will be useful,
    10  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    11  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
    12  // GNU General Public License for more details.
    13  //
    14  // You should have received a copy of the GNU General Public License
    15  // along with go-ethereum. If not, see <http://www.gnu.org/licenses/>.
    16  
    17  // Contains the platon command usage template and generator.
    18  
    19  package main
    20  
    21  import (
    22  	"io"
    23  	"sort"
    24  
    25  	"strings"
    26  
    27  	"github.com/PlatONnetwork/PlatON-Go/cmd/utils"
    28  	"github.com/PlatONnetwork/PlatON-Go/internal/debug"
    29  	"gopkg.in/urfave/cli.v1"
    30  )
    31  
    32  // AppHelpTemplate is the test template for the default, global app help topic.
    33  var AppHelpTemplate = `NAME:
    34     {{.App.Name}} - {{.App.Usage}}
    35  
    36     Copyright 2019 The PlatON-Go Authors
    37  
    38  USAGE:
    39     {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}}
    40     {{if .App.Version}}
    41  VERSION:
    42     {{.App.Version}}
    43     {{end}}{{if len .App.Authors}}
    44  AUTHOR(S):
    45     {{range .App.Authors}}{{ . }}{{end}}
    46     {{end}}{{if .App.Commands}}
    47  COMMANDS:
    48     {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
    49     {{end}}{{end}}{{if .FlagGroups}}
    50  {{range .FlagGroups}}{{.Name}} OPTIONS:
    51    {{range .Flags}}{{.}}
    52    {{end}}
    53  {{end}}{{end}}{{if .App.Copyright }}
    54  COPYRIGHT:
    55     {{.App.Copyright}}
    56     {{end}}
    57  `
    58  
    59  // flagGroup is a collection of flags belonging to a single topic.
    60  type flagGroup struct {
    61  	Name  string
    62  	Flags []cli.Flag
    63  }
    64  
    65  // AppHelpFlagGroups is the application flags, grouped by functionality.
    66  var AppHelpFlagGroups = []flagGroup{
    67  	{
    68  		Name: "ETHEREUM",
    69  		Flags: []cli.Flag{
    70  			configFileFlag,
    71  			utils.DataDirFlag,
    72  			utils.KeyStoreDirFlag,
    73  			utils.NoUSBFlag,
    74  			utils.NetworkIdFlag,
    75  			utils.TestnetFlag,
    76  			utils.BetanetFlag,
    77  			utils.SyncModeFlag,
    78  			utils.GCModeFlag,
    79  			utils.EthStatsURLFlag,
    80  			utils.IdentityFlag,
    81  			utils.LightServFlag,
    82  			utils.LightPeersFlag,
    83  			utils.LightKDFFlag,
    84  		},
    85  	},
    86  	{
    87  		Name: "DEVELOPER CHAIN",
    88  		Flags: []cli.Flag{
    89  			utils.DeveloperFlag,
    90  			utils.DeveloperPeriodFlag,
    91  		},
    92  	},
    93  	//{
    94  	//	Name: "DASHBOARD",
    95  	//	Flags: []cli.Flag{
    96  	//		utils.DashboardEnabledFlag,
    97  	//		utils.DashboardAddrFlag,
    98  	//		utils.DashboardPortFlag,
    99  	//		utils.DashboardRefreshFlag,
   100  	//		utils.DashboardAssetsFlag,
   101  	//	},
   102  	//},
   103  	{
   104  		Name: "TRANSACTION POOL",
   105  		Flags: []cli.Flag{
   106  			utils.TxPoolLocalsFlag,
   107  			utils.TxPoolNoLocalsFlag,
   108  			utils.TxPoolJournalFlag,
   109  			utils.TxPoolRejournalFlag,
   110  			utils.TxPoolPriceLimitFlag,
   111  			utils.TxPoolPriceBumpFlag,
   112  			utils.TxPoolAccountSlotsFlag,
   113  			utils.TxPoolGlobalSlotsFlag,
   114  			utils.TxPoolAccountQueueFlag,
   115  			utils.TxPoolGlobalQueueFlag,
   116  			utils.TxPoolGlobalTxCountFlag,
   117  			utils.TxPoolLifetimeFlag,
   118  		},
   119  	},
   120  	{
   121  		Name: "PERFORMANCE TUNING",
   122  		Flags: []cli.Flag{
   123  			utils.CacheFlag,
   124  			utils.CacheDatabaseFlag,
   125  			utils.CacheGCFlag,
   126  			utils.TrieCacheGenFlag,
   127  		},
   128  	},
   129  	{
   130  		Name: "ACCOUNT",
   131  		Flags: []cli.Flag{
   132  			utils.UnlockedAccountFlag,
   133  			utils.PasswordFileFlag,
   134  		},
   135  	},
   136  	{
   137  		Name: "API AND CONSOLE",
   138  		Flags: []cli.Flag{
   139  			utils.RPCEnabledFlag,
   140  			utils.RPCListenAddrFlag,
   141  			utils.RPCPortFlag,
   142  			utils.RPCApiFlag,
   143  			utils.WSEnabledFlag,
   144  			utils.WSListenAddrFlag,
   145  			utils.WSPortFlag,
   146  			utils.WSApiFlag,
   147  			utils.WSAllowedOriginsFlag,
   148  			utils.IPCDisabledFlag,
   149  			utils.IPCPathFlag,
   150  			utils.RPCCORSDomainFlag,
   151  			utils.RPCVirtualHostsFlag,
   152  			utils.JSpathFlag,
   153  			utils.ExecFlag,
   154  			utils.PreloadJSFlag,
   155  		},
   156  	},
   157  	{
   158  		Name: "NETWORKING",
   159  		Flags: []cli.Flag{
   160  			utils.BootnodesFlag,
   161  			utils.BootnodesV4Flag,
   162  			utils.BootnodesV5Flag,
   163  			utils.ListenPortFlag,
   164  			utils.MaxPeersFlag,
   165  			utils.MaxPendingPeersFlag,
   166  			utils.NATFlag,
   167  			utils.NoDiscoverFlag,
   168  			utils.DiscoveryV5Flag,
   169  			utils.NetrestrictFlag,
   170  			utils.NodeKeyFileFlag,
   171  			utils.NodeKeyHexFlag,
   172  		},
   173  	},
   174  	{
   175  		Name: "MINER",
   176  		Flags: []cli.Flag{
   177  			utils.MiningEnabledFlag,
   178  			utils.MinerThreadsFlag,
   179  			utils.MinerNotifyFlag,
   180  			utils.MinerGasPriceFlag,
   181  			utils.MinerGasTargetFlag,
   182  			utils.MinerGasLimitFlag,
   183  			utils.MinerEtherbaseFlag,
   184  			utils.MinerExtraDataFlag,
   185  			utils.MinerRecommitIntervalFlag,
   186  			utils.MinerNoVerfiyFlag,
   187  		},
   188  	},
   189  	{
   190  		Name: "GAS PRICE ORACLE",
   191  		Flags: []cli.Flag{
   192  			utils.GpoBlocksFlag,
   193  			utils.GpoPercentileFlag,
   194  		},
   195  	},
   196  	{
   197  		Name: "VIRTUAL MACHINE",
   198  		Flags: []cli.Flag{
   199  			utils.VMEnableDebugFlag,
   200  			utils.EVMInterpreterFlag,
   201  			utils.EWASMInterpreterFlag,
   202  		},
   203  	},
   204  	{
   205  		Name: "LOGGING AND DEBUGGING",
   206  		Flags: append([]cli.Flag{
   207  			utils.FakePoWFlag,
   208  			utils.NoCompactionFlag,
   209  		}, debug.Flags...),
   210  	},
   211  	{
   212  		Name: "METRICS AND STATS",
   213  		Flags: []cli.Flag{
   214  			utils.MetricsEnabledFlag,
   215  			utils.MetricsEnableInfluxDBFlag,
   216  			utils.MetricsInfluxDBEndpointFlag,
   217  			utils.MetricsInfluxDBDatabaseFlag,
   218  			utils.MetricsInfluxDBUsernameFlag,
   219  			utils.MetricsInfluxDBPasswordFlag,
   220  			utils.MetricsInfluxDBHostTagFlag,
   221  		},
   222  	},
   223  	{
   224  		Name:  "WHISPER (EXPERIMENTAL)",
   225  		Flags: whisperFlags,
   226  	},
   227  	{
   228  		Name: "DEPRECATED",
   229  		Flags: []cli.Flag{
   230  			utils.MinerLegacyThreadsFlag,
   231  			utils.MinerLegacyGasTargetFlag,
   232  			utils.MinerLegacyGasPriceFlag,
   233  			utils.MinerLegacyEtherbaseFlag,
   234  			utils.MinerLegacyExtraDataFlag,
   235  		},
   236  	},
   237  	{
   238  		Name: "MPC COMPUTE",
   239  		Flags: []cli.Flag{
   240  			utils.MPCEnabledFlag,
   241  			utils.MPCActorFlag,
   242  			utils.MPCIceFileFlag,
   243  		},
   244  	},
   245  	{
   246  		Name: "VC COMPUTE",
   247  		Flags: []cli.Flag{
   248  			utils.VCEnabledFlag,
   249  			utils.VCActorFlag,
   250  			utils.VCPasswordFlag,
   251  		},
   252  	},
   253  	{
   254  		Name: "MISC",
   255  	},
   256  }
   257  
   258  // byCategory sorts an array of flagGroup by Name in the order
   259  // defined in AppHelpFlagGroups.
   260  type byCategory []flagGroup
   261  
   262  func (a byCategory) Len() int      { return len(a) }
   263  func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
   264  func (a byCategory) Less(i, j int) bool {
   265  	iCat, jCat := a[i].Name, a[j].Name
   266  	iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last
   267  
   268  	for i, group := range AppHelpFlagGroups {
   269  		if iCat == group.Name {
   270  			iIdx = i
   271  		}
   272  		if jCat == group.Name {
   273  			jIdx = i
   274  		}
   275  	}
   276  
   277  	return iIdx < jIdx
   278  }
   279  
   280  func flagCategory(flag cli.Flag) string {
   281  	for _, category := range AppHelpFlagGroups {
   282  		for _, flg := range category.Flags {
   283  			if flg.GetName() == flag.GetName() {
   284  				return category.Name
   285  			}
   286  		}
   287  	}
   288  	return "MISC"
   289  }
   290  
   291  func init() {
   292  	// Override the default app help template
   293  	cli.AppHelpTemplate = AppHelpTemplate
   294  
   295  	// Define a one shot struct to pass to the usage template
   296  	type helpData struct {
   297  		App        interface{}
   298  		FlagGroups []flagGroup
   299  	}
   300  
   301  	// Override the default app help printer, but only for the global app help
   302  	originalHelpPrinter := cli.HelpPrinter
   303  	cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {
   304  		if tmpl == AppHelpTemplate {
   305  			// Iterate over all the flags and add any uncategorized ones
   306  			categorized := make(map[string]struct{})
   307  			for _, group := range AppHelpFlagGroups {
   308  				for _, flag := range group.Flags {
   309  					categorized[flag.String()] = struct{}{}
   310  				}
   311  			}
   312  			uncategorized := []cli.Flag{}
   313  			for _, flag := range data.(*cli.App).Flags {
   314  				if _, ok := categorized[flag.String()]; !ok {
   315  					if strings.HasPrefix(flag.GetName(), "dashboard") {
   316  						continue
   317  					}
   318  					uncategorized = append(uncategorized, flag)
   319  				}
   320  			}
   321  			if len(uncategorized) > 0 {
   322  				// Append all ungategorized options to the misc group
   323  				miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags)
   324  				AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...)
   325  
   326  				// Make sure they are removed afterwards
   327  				defer func() {
   328  					AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs]
   329  				}()
   330  			}
   331  			// Render out custom usage screen
   332  			originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups})
   333  		} else if tmpl == utils.CommandHelpTemplate {
   334  			// Iterate over all command specific flags and categorize them
   335  			categorized := make(map[string][]cli.Flag)
   336  			for _, flag := range data.(cli.Command).Flags {
   337  				if _, ok := categorized[flag.String()]; !ok {
   338  					categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag)
   339  				}
   340  			}
   341  
   342  			// sort to get a stable ordering
   343  			sorted := make([]flagGroup, 0, len(categorized))
   344  			for cat, flgs := range categorized {
   345  				sorted = append(sorted, flagGroup{cat, flgs})
   346  			}
   347  			sort.Sort(byCategory(sorted))
   348  
   349  			// add sorted array to data and render with default printer
   350  			originalHelpPrinter(w, tmpl, map[string]interface{}{
   351  				"cmd":              data,
   352  				"categorizedFlags": sorted,
   353  			})
   354  		} else {
   355  			originalHelpPrinter(w, tmpl, data)
   356  		}
   357  	}
   358  }