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