github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/cmd/geth/usage.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:30</date>
    10  //</624342602782609408>
    11  
    12  
    13  //包含geth命令用法模板和生成器。
    14  
    15  package main
    16  
    17  import (
    18  	"io"
    19  	"sort"
    20  
    21  	"strings"
    22  
    23  	"github.com/ethereum/go-ethereum/cmd/utils"
    24  	"github.com/ethereum/go-ethereum/internal/debug"
    25  	"gopkg.in/urfave/cli.v1"
    26  )
    27  
    28  //AppHelpTemplate是默认全局应用程序帮助主题的测试模板。
    29  var AppHelpTemplate = `NAME:
    30     {{.App.Name}} - {{.App.Usage}}
    31  
    32     Copyright 2013-2018 The go-ethereum Authors
    33  
    34  USAGE:
    35     {{.App.HelpName}} [options]{{if .App.Commands}} command [command options]{{end}} {{if .App.ArgsUsage}}{{.App.ArgsUsage}}{{else}}[arguments...]{{end}}
    36     {{if .App.Version}}
    37  VERSION:
    38     {{.App.Version}}
    39     {{end}}{{if len .App.Authors}}
    40  AUTHOR(S):
    41     {{range .App.Authors}}{{ . }}{{end}}
    42     {{end}}{{if .App.Commands}}
    43  COMMANDS:
    44     {{range .App.Commands}}{{join .Names ", "}}{{ "\t" }}{{.Usage}}
    45     {{end}}{{end}}{{if .FlagGroups}}
    46  {{range .FlagGroups}}{{.Name}} OPTIONS:
    47    {{range .Flags}}{{.}}
    48    {{end}}
    49  {{end}}{{end}}{{if .App.Copyright }}
    50  COPYRIGHT:
    51     {{.App.Copyright}}
    52     {{end}}
    53  `
    54  
    55  //FlagGroup是属于单个主题的标志集合。
    56  type flagGroup struct {
    57  	Name  string
    58  	Flags []cli.Flag
    59  }
    60  
    61  //
    62  var AppHelpFlagGroups = []flagGroup{
    63  	{
    64  		Name: "ETHEREUM",
    65  		Flags: []cli.Flag{
    66  			configFileFlag,
    67  			utils.DataDirFlag,
    68  			utils.KeyStoreDirFlag,
    69  			utils.NoUSBFlag,
    70  			utils.NetworkIdFlag,
    71  			utils.TestnetFlag,
    72  			utils.RinkebyFlag,
    73  			utils.SyncModeFlag,
    74  			utils.GCModeFlag,
    75  			utils.EthStatsURLFlag,
    76  			utils.IdentityFlag,
    77  			utils.LightServFlag,
    78  			utils.LightPeersFlag,
    79  			utils.LightKDFFlag,
    80  		},
    81  	},
    82  	{
    83  		Name: "DEVELOPER CHAIN",
    84  		Flags: []cli.Flag{
    85  			utils.DeveloperFlag,
    86  			utils.DeveloperPeriodFlag,
    87  		},
    88  	},
    89  	{
    90  		Name: "ETHASH",
    91  		Flags: []cli.Flag{
    92  			utils.EthashCacheDirFlag,
    93  			utils.EthashCachesInMemoryFlag,
    94  			utils.EthashCachesOnDiskFlag,
    95  			utils.EthashDatasetDirFlag,
    96  			utils.EthashDatasetsInMemoryFlag,
    97  			utils.EthashDatasetsOnDiskFlag,
    98  		},
    99  	},
   100  //{
   101  //名称:“仪表板”,
   102  //标志:[]cli.flag_
   103  //utils.dashboard启用的标志,
   104  //实用程序。仪表板添加标记,
   105  //utils.dashboardportflag,
   106  //utils.dashboard刷新标记,
   107  //utils.dashboardassetsflag,
   108  //}
   109  //}
   110  	{
   111  		Name: "TRANSACTION POOL",
   112  		Flags: []cli.Flag{
   113  			utils.TxPoolLocalsFlag,
   114  			utils.TxPoolNoLocalsFlag,
   115  			utils.TxPoolJournalFlag,
   116  			utils.TxPoolRejournalFlag,
   117  			utils.TxPoolPriceLimitFlag,
   118  			utils.TxPoolPriceBumpFlag,
   119  			utils.TxPoolAccountSlotsFlag,
   120  			utils.TxPoolGlobalSlotsFlag,
   121  			utils.TxPoolAccountQueueFlag,
   122  			utils.TxPoolGlobalQueueFlag,
   123  			utils.TxPoolLifetimeFlag,
   124  		},
   125  	},
   126  	{
   127  		Name: "PERFORMANCE TUNING",
   128  		Flags: []cli.Flag{
   129  			utils.CacheFlag,
   130  			utils.CacheDatabaseFlag,
   131  			utils.CacheGCFlag,
   132  			utils.TrieCacheGenFlag,
   133  		},
   134  	},
   135  	{
   136  		Name: "ACCOUNT",
   137  		Flags: []cli.Flag{
   138  			utils.UnlockedAccountFlag,
   139  			utils.PasswordFileFlag,
   140  		},
   141  	},
   142  	{
   143  		Name: "API AND CONSOLE",
   144  		Flags: []cli.Flag{
   145  			utils.RPCEnabledFlag,
   146  			utils.RPCListenAddrFlag,
   147  			utils.RPCPortFlag,
   148  			utils.RPCApiFlag,
   149  			utils.WSEnabledFlag,
   150  			utils.WSListenAddrFlag,
   151  			utils.WSPortFlag,
   152  			utils.WSApiFlag,
   153  			utils.WSAllowedOriginsFlag,
   154  			utils.IPCDisabledFlag,
   155  			utils.IPCPathFlag,
   156  			utils.RPCCORSDomainFlag,
   157  			utils.RPCVirtualHostsFlag,
   158  			utils.JSpathFlag,
   159  			utils.ExecFlag,
   160  			utils.PreloadJSFlag,
   161  		},
   162  	},
   163  	{
   164  		Name: "NETWORKING",
   165  		Flags: []cli.Flag{
   166  			utils.BootnodesFlag,
   167  			utils.BootnodesV4Flag,
   168  			utils.BootnodesV5Flag,
   169  			utils.ListenPortFlag,
   170  			utils.MaxPeersFlag,
   171  			utils.MaxPendingPeersFlag,
   172  			utils.NATFlag,
   173  			utils.NoDiscoverFlag,
   174  			utils.DiscoveryV5Flag,
   175  			utils.NetrestrictFlag,
   176  			utils.NodeKeyFileFlag,
   177  			utils.NodeKeyHexFlag,
   178  		},
   179  	},
   180  	{
   181  		Name: "MINER",
   182  		Flags: []cli.Flag{
   183  			utils.MiningEnabledFlag,
   184  			utils.MinerThreadsFlag,
   185  			utils.MinerNotifyFlag,
   186  			utils.MinerGasPriceFlag,
   187  			utils.MinerGasTargetFlag,
   188  //utils.mineretherbaseflag(实用程序.mineretherbaseflag)
   189  			utils.MinerExtraDataFlag,
   190  			utils.MinerRecommitIntervalFlag,
   191  		},
   192  	},
   193  	{
   194  		Name: "GAS PRICE ORACLE",
   195  		Flags: []cli.Flag{
   196  			utils.GpoBlocksFlag,
   197  			utils.GpoPercentileFlag,
   198  		},
   199  	},
   200  	{
   201  		Name: "VIRTUAL MACHINE",
   202  		Flags: []cli.Flag{
   203  			utils.VMEnableDebugFlag,
   204  		},
   205  	},
   206  	{
   207  		Name: "LOGGING AND DEBUGGING",
   208  		Flags: append([]cli.Flag{
   209  			utils.FakePoWFlag,
   210  			utils.NoCompactionFlag,
   211  		}, debug.Flags...),
   212  	},
   213  	{
   214  		Name: "METRICS AND STATS",
   215  		Flags: []cli.Flag{
   216  			utils.MetricsEnabledFlag,
   217  			utils.MetricsEnableInfluxDBFlag,
   218  			utils.MetricsInfluxDBEndpointFlag,
   219  			utils.MetricsInfluxDBDatabaseFlag,
   220  			utils.MetricsInfluxDBUsernameFlag,
   221  			utils.MetricsInfluxDBPasswordFlag,
   222  			utils.MetricsInfluxDBHostTagFlag,
   223  		},
   224  	},
   225  	{
   226  		Name:  "WHISPER (EXPERIMENTAL)",
   227  		Flags: whisperFlags,
   228  	},
   229  	{
   230  		Name: "DEPRECATED",
   231  		Flags: []cli.Flag{
   232  			utils.MinerLegacyThreadsFlag,
   233  			utils.MinerLegacyGasTargetFlag,
   234  			utils.MinerLegacyGasPriceFlag,
   235  			utils.MinerLegacyEtherbaseFlag,
   236  			utils.MinerLegacyExtraDataFlag,
   237  		},
   238  	},
   239  	{
   240  		Name: "MISC",
   241  	},
   242  }
   243  
   244  //ByCategory按顺序按名称对FlagGroup数组排序
   245  //在AppHelpFlagGroups中定义。
   246  type byCategory []flagGroup
   247  
   248  func (a byCategory) Len() int      { return len(a) }
   249  func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
   250  func (a byCategory) Less(i, j int) bool {
   251  	iCat, jCat := a[i].Name, a[j].Name
   252  iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) //确保非分类标志排在最后
   253  
   254  	for i, group := range AppHelpFlagGroups {
   255  		if iCat == group.Name {
   256  			iIdx = i
   257  		}
   258  		if jCat == group.Name {
   259  			jIdx = i
   260  		}
   261  	}
   262  
   263  	return iIdx < jIdx
   264  }
   265  
   266  func flagCategory(flag cli.Flag) string {
   267  	for _, category := range AppHelpFlagGroups {
   268  		for _, flg := range category.Flags {
   269  			if flg.GetName() == flag.GetName() {
   270  				return category.Name
   271  			}
   272  		}
   273  	}
   274  	return "MISC"
   275  }
   276  
   277  func init() {
   278  //覆盖默认的应用程序帮助模板
   279  	cli.AppHelpTemplate = AppHelpTemplate
   280  
   281  //定义一个要传递到使用模板的一次性结构
   282  	type helpData struct {
   283  		App        interface{}
   284  		FlagGroups []flagGroup
   285  	}
   286  
   287  //覆盖默认的应用程序帮助打印机,但仅用于全局应用程序帮助
   288  	originalHelpPrinter := cli.HelpPrinter
   289  	cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {
   290  		if tmpl == AppHelpTemplate {
   291  //遍历所有标志并添加任何未分类的标志
   292  			categorized := make(map[string]struct{})
   293  			for _, group := range AppHelpFlagGroups {
   294  				for _, flag := range group.Flags {
   295  					categorized[flag.String()] = struct{}{}
   296  				}
   297  			}
   298  			uncategorized := []cli.Flag{}
   299  			for _, flag := range data.(*cli.App).Flags {
   300  				if _, ok := categorized[flag.String()]; !ok {
   301  					if strings.HasPrefix(flag.GetName(), "dashboard") {
   302  						continue
   303  					}
   304  					uncategorized = append(uncategorized, flag)
   305  				}
   306  			}
   307  			if len(uncategorized) > 0 {
   308  //将所有未分类的选项附加到misc组
   309  				miscs := len(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags)
   310  				AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = append(AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags, uncategorized...)
   311  
   312  //确保之后将其拆下
   313  				defer func() {
   314  					AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags = AppHelpFlagGroups[len(AppHelpFlagGroups)-1].Flags[:miscs]
   315  				}()
   316  			}
   317  //呈现自定义使用屏幕
   318  			originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups})
   319  		} else if tmpl == utils.CommandHelpTemplate {
   320  //遍历所有特定于命令的标志并对其进行分类
   321  			categorized := make(map[string][]cli.Flag)
   322  			for _, flag := range data.(cli.Command).Flags {
   323  				if _, ok := categorized[flag.String()]; !ok {
   324  					categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag)
   325  				}
   326  			}
   327  
   328  //排序以获得稳定的排序
   329  			sorted := make([]flagGroup, 0, len(categorized))
   330  			for cat, flgs := range categorized {
   331  				sorted = append(sorted, flagGroup{cat, flgs})
   332  			}
   333  			sort.Sort(byCategory(sorted))
   334  
   335  //将排序数组添加到数据并使用默认打印机呈现
   336  			originalHelpPrinter(w, tmpl, map[string]interface{}{
   337  				"cmd":              data,
   338  				"categorizedFlags": sorted,
   339  			})
   340  		} else {
   341  			originalHelpPrinter(w, tmpl, data)
   342  		}
   343  	}
   344  }
   345