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