help: global flags help command extended filtering

This commit is contained in:
albertony 2023-11-03 23:35:48 +01:00 committed by Nick Craig-Wood
parent c6352231e4
commit 1720d3e11c
2 changed files with 22 additions and 13 deletions

View File

@ -59,20 +59,25 @@ var helpCommand = &cobra.Command{
} }
// to filter the flags with // to filter the flags with
var flagsRe *regexp.Regexp var (
filterFlagsGroup string
filterFlagsRe *regexp.Regexp
filterFlagsNamesOnly bool
)
// Show the flags // Show the flags
var helpFlags = &cobra.Command{ var helpFlags = &cobra.Command{
Use: "flags [<filter>]", Use: "flags [<filter>]",
Short: "Show the global flags for rclone", Short: "Show the global flags for rclone",
Run: func(command *cobra.Command, args []string) { Run: func(command *cobra.Command, args []string) {
command.Flags()
if len(args) > 0 { if len(args) > 0 {
re, err := filter.GlobStringToRegexp(args[0], false) re, err := filter.GlobStringToRegexp(args[0], false)
if err != nil { if err != nil {
log.Fatalf("Failed to compile flags regexp: %v", err) log.Fatalf("Invalid flag filter: %v", err)
} }
fs.Debugf(nil, "Flags filter: %s", re.String()) fs.Debugf(nil, "Flag filter: %s", re.String())
flagsRe = re filterFlagsRe = re
} }
if GeneratingDocs { if GeneratingDocs {
Root.SetUsageTemplate(docFlagsTemplate) Root.SetUsageTemplate(docFlagsTemplate)
@ -159,7 +164,7 @@ func setupRootCommand(rootCmd *cobra.Command) {
fs.Errorf(nil, "Flag --%s is unknown", flag.Name) fs.Errorf(nil, "Flag --%s is unknown", flag.Name)
} }
}) })
groups := flags.All.Filter(flagsRe).Include(cmd.Annotations["groups"]) groups := flags.All.Filter(filterFlagsGroup, filterFlagsRe, filterFlagsNamesOnly).Include(cmd.Annotations["groups"])
return groups.Groups return groups.Groups
}) })
rootCmd.SetUsageTemplate(usageTemplate) rootCmd.SetUsageTemplate(usageTemplate)
@ -171,6 +176,9 @@ func setupRootCommand(rootCmd *cobra.Command) {
rootCmd.AddCommand(helpCommand) rootCmd.AddCommand(helpCommand)
helpCommand.AddCommand(helpFlags) helpCommand.AddCommand(helpFlags)
helpFlagsFlags := helpFlags.Flags()
flags.StringVarP(helpFlagsFlags, &filterFlagsGroup, "group", "", "", "Only include flags from specific group", "")
flags.BoolVarP(helpFlagsFlags, &filterFlagsNamesOnly, "name", "", false, "Apply filter only on flag names", "")
helpCommand.AddCommand(helpBackends) helpCommand.AddCommand(helpBackends)
helpCommand.AddCommand(helpBackend) helpCommand.AddCommand(helpBackend)

View File

@ -50,16 +50,17 @@ func (gs *Groups) NewGroup(name, help string) *Group {
} }
// Filter makes a copy of groups filtered by flagsRe // Filter makes a copy of groups filtered by flagsRe
func (gs *Groups) Filter(flagsRe *regexp.Regexp) *Groups { func (gs *Groups) Filter(group string, filterRe *regexp.Regexp, filterNamesOnly bool) *Groups {
newGs := NewGroups() newGs := NewGroups()
for _, g := range gs.Groups { for _, g := range gs.Groups {
newG := newGs.NewGroup(g.Name, g.Help) if group == "" || strings.EqualFold(g.Name, group) {
g.Flags.VisitAll(func(f *pflag.Flag) { newG := newGs.NewGroup(g.Name, g.Help)
matched := flagsRe == nil || flagsRe.MatchString(f.Name) || flagsRe.MatchString(f.Usage) g.Flags.VisitAll(func(f *pflag.Flag) {
if matched { if filterRe == nil || filterRe.MatchString(f.Name) || (!filterNamesOnly && filterRe.MatchString(f.Usage)) {
newG.Flags.AddFlag(f) newG.Flags.AddFlag(f)
} }
}) })
}
} }
return newGs return newGs
} }