func saveConfig(w io.Writer, obsKeys map[string]string) { // find flags pointing to the same variable. We will only write the longest // named flag to the config file, the shorthand version is ignored. deduped := make(map[flag.Value]flag.Flag) flag.VisitAll(func(f *flag.Flag) { if cur, ok := deduped[f.Value]; !ok || utf8.RuneCountInString(f.Name) > utf8.RuneCountInString(cur.Name) { deduped[f.Value] = *f } }) flag.VisitAll(func(f *flag.Flag) { if cur, ok := deduped[f.Value]; ok && cur.Name == f.Name { _, usage := flag.UnquoteUsage(f) usage = strings.Replace(usage, "\n \t", "\n# ", -1) fmt.Fprintf(w, "\n# %s (default %v)\n", usage, f.DefValue) fmt.Fprintf(w, "%s=%v\n", f.Name, f.Value.String()) } }) // if we have obsolete keys left from the old config, preserve them in an // additional section at the end of the file if obsKeys != nil && len(obsKeys) > 0 { fmt.Fprintln(w, "\n\n# The following options are probably deprecated and not used currently!") for key, val := range obsKeys { fmt.Fprintf(w, "%v=%v\n", key, val) } } }
func getMethodUsage(m MethodCommand) string { s := "" for _, f := range m.Flags { s += fmt.Sprintf(" -%s", f.Name) name, usage := flag.UnquoteUsage(f) if len(name) > 0 { s += " " + name } if len(s) <= 4 { s += "\t" } else { s += "\n \t" } s += usage s += "\n" } return s }
func formatFlag(f *flag.Flag) string { // Two spaces before -; see next two comments. s := fmt.Sprintf(" -%s", f.Name) name, usage := flag.UnquoteUsage(f) if len(name) > 0 { s += " " + name } // Boolean flags of one ASCII letter are so common we // treat them specially, putting their usage on the same line. if len(s) <= 4 { // space, space, '-', 'x'. s += "\t" } else { // Four spaces before the tab triggers good alignment // for both 4- and 8-space tab stops. s += "\n \t" } s += usage switch f.DefValue { case "0", "false", "": default: s += fmt.Sprintf(" (default %#v)", f.DefValue) } return s }