// Help renders i's content, along with documentation for any // flags defined in f. It calls f.SetOutput(ioutil.Discard). func (i *Info) Help(f *gnuflag.FlagSet) []byte { buf := &bytes.Buffer{} fmt.Fprintf(buf, "usage: %s", i.Name) hasOptions := false f.VisitAll(func(f *gnuflag.Flag) { hasOptions = true }) if hasOptions { fmt.Fprintf(buf, " [options]") } if i.Args != "" { fmt.Fprintf(buf, " %s", i.Args) } fmt.Fprintf(buf, "\n") if i.Purpose != "" { fmt.Fprintf(buf, "purpose: %s\n", i.Purpose) } if hasOptions { fmt.Fprintf(buf, "\noptions:\n") f.SetOutput(buf) f.PrintDefaults() } f.SetOutput(ioutil.Discard) if i.Doc != "" { fmt.Fprintf(buf, "\n%s\n", strings.TrimSpace(i.Doc)) } if len(i.Aliases) > 0 { fmt.Fprintf(buf, "\naliases: %s\n", strings.Join(i.Aliases, ", ")) } return buf.Bytes() }
// SetCommonFlags creates a new "commonflags" flagset, whose // flags are shared with the argument f; this enables us to // add non-global flags to f, which do not carry into subcommands. func (c *SuperCommand) SetCommonFlags(f *gnuflag.FlagSet) { if c.Log != nil { c.Log.AddFlags(f) } f.BoolVar(&c.showHelp, "h", false, helpPurpose) f.BoolVar(&c.showHelp, "help", false, "") // In the case where we are providing the basis for a plugin, // plugins are required to support the --description argument. // The Purpose attribute will be printed (if defined), allowing // plugins to provide a sensible line of text for 'juju help plugins'. f.BoolVar(&c.showDescription, "description", false, "") c.commonflags = gnuflag.NewFlagSet(c.Info().Name, gnuflag.ContinueOnError) c.commonflags.SetOutput(ioutil.Discard) f.VisitAll(func(flag *gnuflag.Flag) { c.commonflags.Var(flag.Value, flag.Name, flag.Usage) }) }
func MergeFlagSet(fs1, fs2 *gnuflag.FlagSet) *gnuflag.FlagSet { fs2.VisitAll(func(flag *gnuflag.Flag) { fs1.Var(flag.Value, flag.Name, flag.Usage) }) return fs1 }