Skip to content

Commit ee65462

Browse files
authored
internal/flags: fix loading env vars for custom flags (#28117)
1 parent 8514d66 commit ee65462

File tree

1 file changed

+30
-0
lines changed

1 file changed

+30
-0
lines changed

internal/flags/flags.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ import (
2020
"encoding"
2121
"errors"
2222
"flag"
23+
"fmt"
2324
"math/big"
2425
"os"
2526
"os/user"
2627
"path/filepath"
2728
"strings"
29+
"syscall"
2830

2931
"github.com/ethereum/go-ethereum/common/math"
3032
"github.com/urfave/cli/v2"
@@ -80,6 +82,14 @@ func (f *DirectoryFlag) String() string { return cli.FlagStringer(f) }
8082
// Apply called by cli library, grabs variable from environment (if in env)
8183
// and adds variable to flag set for parsing.
8284
func (f *DirectoryFlag) Apply(set *flag.FlagSet) error {
85+
for _, envVar := range f.EnvVars {
86+
envVar = strings.TrimSpace(envVar)
87+
if value, found := syscall.Getenv(envVar); found {
88+
f.Value.Set(value)
89+
f.HasBeenSet = true
90+
break
91+
}
92+
}
8393
eachName(f, func(name string) {
8494
set.Var(&f.Value, f.Name, f.Usage)
8595
})
@@ -167,6 +177,16 @@ func (f *TextMarshalerFlag) IsSet() bool { return f.HasBeenSet }
167177
func (f *TextMarshalerFlag) String() string { return cli.FlagStringer(f) }
168178

169179
func (f *TextMarshalerFlag) Apply(set *flag.FlagSet) error {
180+
for _, envVar := range f.EnvVars {
181+
envVar = strings.TrimSpace(envVar)
182+
if value, found := syscall.Getenv(envVar); found {
183+
if err := f.Value.UnmarshalText([]byte(value)); err != nil {
184+
return fmt.Errorf("could not parse %q from environment variable %q for flag %s: %s", value, envVar, f.Name, err)
185+
}
186+
f.HasBeenSet = true
187+
break
188+
}
189+
}
170190
eachName(f, func(name string) {
171191
set.Var(textMarshalerVal{f.Value}, f.Name, f.Usage)
172192
})
@@ -249,6 +269,16 @@ func (f *BigFlag) IsSet() bool { return f.HasBeenSet }
249269
func (f *BigFlag) String() string { return cli.FlagStringer(f) }
250270

251271
func (f *BigFlag) Apply(set *flag.FlagSet) error {
272+
for _, envVar := range f.EnvVars {
273+
envVar = strings.TrimSpace(envVar)
274+
if value, found := syscall.Getenv(envVar); found {
275+
if _, ok := f.Value.SetString(value, 10); !ok {
276+
return fmt.Errorf("could not parse %q from environment variable %q for flag %s", value, envVar, f.Name)
277+
}
278+
f.HasBeenSet = true
279+
break
280+
}
281+
}
252282
eachName(f, func(name string) {
253283
f.Value = new(big.Int)
254284
set.Var((*bigValue)(f.Value), f.Name, f.Usage)

0 commit comments

Comments
 (0)