@@ -18,13 +18,20 @@ package flags
18
18
19
19
import (
20
20
"fmt"
21
+ "os"
22
+ "regexp"
21
23
"strings"
22
24
23
25
"github.com/ethereum/go-ethereum/internal/version"
24
26
"github.com/ethereum/go-ethereum/params"
27
+ "github.com/mattn/go-isatty"
25
28
"github.com/urfave/cli/v2"
26
29
)
27
30
31
+ // usecolor defines whether the CLI help should use colored output or normal dumb
32
+ // colorless terminal formatting.
33
+ var usecolor = (isatty .IsTerminal (os .Stdout .Fd ()) || isatty .IsCygwinTerminal (os .Stdout .Fd ())) && os .Getenv ("TERM" ) != "dumb"
34
+
28
35
// NewApp creates an app with sane defaults.
29
36
func NewApp (usage string ) * cli.App {
30
37
git , _ := version .VCS ()
@@ -129,6 +136,14 @@ func doMigrateFlags(ctx *cli.Context) {
129
136
}
130
137
131
138
func init () {
139
+ if usecolor {
140
+ // Annotate all help categories with colors
141
+ cli .AppHelpTemplate = regexp .MustCompile ("[A-Z ]+:" ).ReplaceAllString (cli .AppHelpTemplate , "\u001B [33m$0\u001B [0m" )
142
+
143
+ // Annotate flag categories with colors (private template, so need to
144
+ // copy-paste the entire thing here...)
145
+ cli .AppHelpTemplate = strings .ReplaceAll (cli .AppHelpTemplate , "{{template \" visibleFlagCategoryTemplate\" .}}" , "{{range .VisibleFlagCategories}}\n {{if .Name}}\u001B [33m{{.Name}}\u001B [0m\n \n {{end}}{{$flglen := len .Flags}}{{range $i, $e := .Flags}}{{if eq (subtract $flglen $i) 1}}{{$e}}\n {{else}}{{$e}}\n {{end}}{{end}}{{end}}" )
146
+ }
132
147
cli .FlagStringer = FlagString
133
148
}
134
149
@@ -138,30 +153,31 @@ func FlagString(f cli.Flag) string {
138
153
if ! ok {
139
154
return ""
140
155
}
141
-
142
156
needsPlaceholder := df .TakesValue ()
143
157
placeholder := ""
144
158
if needsPlaceholder {
145
159
placeholder = "value"
146
160
}
147
161
148
- namesText := pad ( cli .FlagNamePrefixer (df .Names (), placeholder ), 30 )
162
+ namesText := cli .FlagNamePrefixer (df .Names (), placeholder )
149
163
150
164
defaultValueString := ""
151
165
if s := df .GetDefaultText (); s != "" {
152
166
defaultValueString = " (default: " + s + ")"
153
167
}
154
-
155
- usage := strings .TrimSpace (df .GetUsage ())
156
168
envHint := strings .TrimSpace (cli .FlagEnvHinter (df .GetEnvVars (), "" ))
157
- if len ( envHint ) > 0 {
158
- usage + = " " + envHint
169
+ if envHint != "" {
170
+ envHint = " ( " + envHint [ 1 : len ( envHint ) - 1 ] + ")"
159
171
}
160
-
172
+ usage := strings . TrimSpace ( df . GetUsage ())
161
173
usage = wordWrap (usage , 80 )
162
174
usage = indent (usage , 10 )
163
175
164
- return fmt .Sprintf ("\n %s%s\n %s" , namesText , defaultValueString , usage )
176
+ if usecolor {
177
+ return fmt .Sprintf ("\n \u001B [32m%-35s%-35s\u001B [0m%s\n %s" , namesText , defaultValueString , envHint , usage )
178
+ } else {
179
+ return fmt .Sprintf ("\n %-35s%-35s%s\n %s" , namesText , defaultValueString , envHint , usage )
180
+ }
165
181
}
166
182
167
183
func pad (s string , length int ) string {
@@ -213,3 +229,44 @@ func wordWrap(s string, width int) string {
213
229
214
230
return output .String ()
215
231
}
232
+
233
+ // AutoEnvVars extens all the specific CLI flags with automatically generated
234
+ // env vars by capitalizing the flag, replacing . with _ and prefixing it with
235
+ // the specified string.
236
+ //
237
+ // Note, the prefix should *not* contain the separator underscore, that will be
238
+ // added automatically.
239
+ func AutoEnvVars (flags []cli.Flag , prefix string ) {
240
+ for _ , flag := range flags {
241
+ envvar := strings .ToUpper (prefix + "_" + strings .ReplaceAll (strings .ReplaceAll (flag .Names ()[0 ], "." , "_" ), "-" , "_" ))
242
+
243
+ switch flag := flag .(type ) {
244
+ case * cli.StringFlag :
245
+ flag .EnvVars = append (flag .EnvVars , envvar )
246
+
247
+ case * cli.BoolFlag :
248
+ flag .EnvVars = append (flag .EnvVars , envvar )
249
+
250
+ case * cli.IntFlag :
251
+ flag .EnvVars = append (flag .EnvVars , envvar )
252
+
253
+ case * cli.Uint64Flag :
254
+ flag .EnvVars = append (flag .EnvVars , envvar )
255
+
256
+ case * cli.DurationFlag :
257
+ flag .EnvVars = append (flag .EnvVars , envvar )
258
+
259
+ case * cli.PathFlag :
260
+ flag .EnvVars = append (flag .EnvVars , envvar )
261
+
262
+ case * BigFlag :
263
+ flag .EnvVars = append (flag .EnvVars , envvar )
264
+
265
+ case * TextMarshalerFlag :
266
+ flag .EnvVars = append (flag .EnvVars , envvar )
267
+
268
+ case * DirectoryFlag :
269
+ flag .EnvVars = append (flag .EnvVars , envvar )
270
+ }
271
+ }
272
+ }
0 commit comments