Skip to content

Commit

Permalink
Do not prevent ini defaults overriding builtin defaults
Browse files Browse the repository at this point in the history
Issue #326.
  • Loading branch information
jessevdk committed Mar 21, 2021
1 parent daf243b commit 77d7cb9
Show file tree
Hide file tree
Showing 4 changed files with 76 additions and 10 deletions.
18 changes: 14 additions & 4 deletions ini.go
Original file line number Diff line number Diff line change
Expand Up @@ -541,9 +541,8 @@ func (i *IniParser) parse(ini *ini) error {
continue
}

// ini value is ignored if override is set and
// value was previously set from non default
if i.ParseAsDefaults && !opt.isSetDefault {
// ini value is ignored if parsed as default but defaults are prevented
if i.ParseAsDefaults && opt.preventDefault {
continue
}

Expand Down Expand Up @@ -576,14 +575,25 @@ func (i *IniParser) parse(ini *ini) error {
}
}

if err := opt.set(pval); err != nil {
var err error

if i.ParseAsDefaults {
err = opt.setDefault(pval)
} else {
err = opt.set(pval)
}

if err != nil {
return &IniError{
Message: err.Error(),
File: ini.File,
LineNumber: inival.LineNumber,
}
}

// Defaults from ini files take precendence over defaults from parser
opt.preventDefault = true

// either all INI values are quoted or only values who need quoting
if _, ok := quotesLookup[opt]; !inival.Quoted || !ok {
quotesLookup[opt] = inival.Quoted
Expand Down
45 changes: 45 additions & 0 deletions ini_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -903,6 +903,51 @@ func TestIniOverrides(t *testing.T) {
assertString(t, opts.ValueWithDefaultOverrideCli, "cli-value")
}

func TestIniOverridesFromConfigFlag(t *testing.T) {
file, err := ioutil.TempFile("", "")

if err != nil {
t.Fatalf("Cannot create temporary file: %s", err)
}

defer os.Remove(file.Name())

_, err = file.WriteString("value-with-default = \"ini-value\"\n")
_, err = file.WriteString("value-with-default-override-cli = \"ini-value\"\n")

if err != nil {
t.Fatalf("Cannot write to temporary file: %s", err)
}

file.Close()

var opts struct {
Config func(filename string) `long:"config"`
ValueWithDefault string `long:"value-with-default" default:"value"`
ValueWithDefaultOverrideCli string `long:"value-with-default-override-cli" default:"value"`
}

p := NewParser(&opts, Default)

opt := p.FindOptionByLongName("config")
opt.Default = []string{file.Name()}

opts.Config = func(filename string) {
parser := NewIniParser(p)
parser.ParseAsDefaults = true
parser.ParseFile(filename)
}

_, err = p.ParseArgs([]string{"--value-with-default-override-cli", "cli-value"})

if err != nil {
t.Fatalf("Failed to parse arguments: %s", err)
}

assertString(t, opts.ValueWithDefault, "ini-value")
assertString(t, opts.ValueWithDefaultOverrideCli, "cli-value")
}

func TestIniRequired(t *testing.T) {
var opts struct {
Required string `short:"r" required:"yes" description:"required"`
Expand Down
19 changes: 17 additions & 2 deletions option.go
Original file line number Diff line number Diff line change
Expand Up @@ -280,6 +280,17 @@ func (option *Option) set(value *string) error {
return convert("", option.value, option.tag)
}

func (option *Option) setDefault(value *string) error {
if err := option.set(value); err != nil {
return err
}

option.isSetDefault = true
option.preventDefault = false

return nil
}

func (option *Option) showInHelp() bool {
return !option.Hidden && (option.ShortName != 0 || len(option.LongName) != 0)
}
Expand Down Expand Up @@ -309,6 +320,10 @@ func (option *Option) empty() {
}

func (option *Option) clearDefault() error {
if option.preventDefault {
return nil
}

usedDefault := option.Default

if envKey := option.EnvKeyWithNamespace(); envKey != "" {
Expand All @@ -327,11 +342,11 @@ func (option *Option) clearDefault() error {
option.empty()

for _, d := range usedDefault {
err := option.set(&d)
err := option.setDefault(&d)

if err != nil {
return err
}
option.isSetDefault = true
}
} else {
tp := option.value.Type()
Expand Down
4 changes: 0 additions & 4 deletions parser.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,10 +311,6 @@ func (p *Parser) ParseArgs(args []string) ([]string, error) {

if s.err == nil {
p.eachOption(func(c *Command, g *Group, option *Option) {
if option.preventDefault {
return
}

err := option.clearDefault()
if err != nil {
if _, ok := err.(*Error); !ok {
Expand Down

0 comments on commit 77d7cb9

Please sign in to comment.