Implement *Context.GlobalSet + relevant CHANGELOG entry

This commit is contained in:
Dan Buch 2016-04-30 11:46:47 -04:00
parent 4edb5c9a6b
commit e059dc8188
No known key found for this signature in database
GPG Key ID: FAEF12936DD3E3EC
3 changed files with 41 additions and 0 deletions

View File

@ -8,6 +8,8 @@
- This file! - This file!
- Support for placeholders in flag usage strings - Support for placeholders in flag usage strings
- `App.Metadata` map for arbitrary data/state management - `App.Metadata` map for arbitrary data/state management
- `Set` and `GlobalSet` methods on `*cli.Context` for altering values after
parsing.
### Changed ### Changed
- The `App.Action` and `Command.Action` now prefer a return signature of - The `App.Action` and `Command.Action` now prefer a return signature of

View File

@ -146,6 +146,11 @@ func (c *Context) Set(name, value string) error {
return c.flagSet.Set(name, value) return c.flagSet.Set(name, value)
} }
// GlobalSet sets a context flag to a value on the global flagset
func (c *Context) GlobalSet(name, value string) error {
return globalContext(c).flagSet.Set(name, value)
}
// Determines if the flag was actually set // Determines if the flag was actually set
func (c *Context) IsSet(name string) bool { func (c *Context) IsSet(name string) bool {
if c.setFlags == nil { if c.setFlags == nil {
@ -252,6 +257,21 @@ func (a Args) Swap(from, to int) error {
return nil return nil
} }
func globalContext(ctx *Context) *Context {
if ctx == nil {
return nil
}
for {
if ctx.parentContext == nil {
return ctx
}
ctx = ctx.parentContext
}
return nil
}
func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet { func lookupGlobalFlagSet(name string, ctx *Context) *flag.FlagSet {
if ctx.parentContext != nil { if ctx.parentContext != nil {
ctx = ctx.parentContext ctx = ctx.parentContext

View File

@ -211,3 +211,22 @@ func TestContext_Set(t *testing.T) {
c.Set("int", "1") c.Set("int", "1")
expect(t, c.Int("int"), 1) expect(t, c.Int("int"), 1)
} }
func TestContext_GlobalSet(t *testing.T) {
gSet := flag.NewFlagSet("test", 0)
gSet.Int("int", 5, "an int")
set := flag.NewFlagSet("sub", 0)
set.Int("int", 3, "an int")
pc := NewContext(nil, gSet, nil)
c := NewContext(nil, set, pc)
c.Set("int", "1")
expect(t, c.Int("int"), 1)
expect(t, c.GlobalInt("int"), 5)
c.GlobalSet("int", "1")
expect(t, c.Int("int"), 1)
expect(t, c.GlobalInt("int"), 1)
}