|
@@ -20,6 +20,7 @@ package main
|
|
|
|
|
|
|
|
import (
|
|
import (
|
|
|
"io"
|
|
"io"
|
|
|
|
|
+ "sort"
|
|
|
|
|
|
|
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
|
"github.com/ethereum/go-ethereum/cmd/utils"
|
|
|
"github.com/ethereum/go-ethereum/internal/debug"
|
|
"github.com/ethereum/go-ethereum/internal/debug"
|
|
@@ -189,6 +190,39 @@ var AppHelpFlagGroups = []flagGroup{
|
|
|
},
|
|
},
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+// byCategory sorts an array of flagGroup by Name in the order
|
|
|
|
|
+// defined in AppHelpFlagGroups.
|
|
|
|
|
+type byCategory []flagGroup
|
|
|
|
|
+
|
|
|
|
|
+func (a byCategory) Len() int { return len(a) }
|
|
|
|
|
+func (a byCategory) Swap(i, j int) { a[i], a[j] = a[j], a[i] }
|
|
|
|
|
+func (a byCategory) Less(i, j int) bool {
|
|
|
|
|
+ iCat, jCat := a[i].Name, a[j].Name
|
|
|
|
|
+ iIdx, jIdx := len(AppHelpFlagGroups), len(AppHelpFlagGroups) // ensure non categorized flags come last
|
|
|
|
|
+
|
|
|
|
|
+ for i, group := range AppHelpFlagGroups {
|
|
|
|
|
+ if iCat == group.Name {
|
|
|
|
|
+ iIdx = i
|
|
|
|
|
+ }
|
|
|
|
|
+ if jCat == group.Name {
|
|
|
|
|
+ jIdx = i
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ return iIdx < jIdx
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+func flagCategory(flag cli.Flag) string {
|
|
|
|
|
+ for _, category := range AppHelpFlagGroups {
|
|
|
|
|
+ for _, flg := range category.Flags {
|
|
|
|
|
+ if flg.GetName() == flag.GetName() {
|
|
|
|
|
+ return category.Name
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ return "MISC"
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
func init() {
|
|
func init() {
|
|
|
// Override the default app help template
|
|
// Override the default app help template
|
|
|
cli.AppHelpTemplate = AppHelpTemplate
|
|
cli.AppHelpTemplate = AppHelpTemplate
|
|
@@ -198,6 +232,7 @@ func init() {
|
|
|
App interface{}
|
|
App interface{}
|
|
|
FlagGroups []flagGroup
|
|
FlagGroups []flagGroup
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
// Override the default app help printer, but only for the global app help
|
|
// Override the default app help printer, but only for the global app help
|
|
|
originalHelpPrinter := cli.HelpPrinter
|
|
originalHelpPrinter := cli.HelpPrinter
|
|
|
cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {
|
|
cli.HelpPrinter = func(w io.Writer, tmpl string, data interface{}) {
|
|
@@ -227,6 +262,27 @@ func init() {
|
|
|
}
|
|
}
|
|
|
// Render out custom usage screen
|
|
// Render out custom usage screen
|
|
|
originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups})
|
|
originalHelpPrinter(w, tmpl, helpData{data, AppHelpFlagGroups})
|
|
|
|
|
+ } else if tmpl == utils.CommandHelpTemplate {
|
|
|
|
|
+ // Iterate over all command specific flags and categorize them
|
|
|
|
|
+ categorized := make(map[string][]cli.Flag)
|
|
|
|
|
+ for _, flag := range data.(cli.Command).Flags {
|
|
|
|
|
+ if _, ok := categorized[flag.String()]; !ok {
|
|
|
|
|
+ categorized[flagCategory(flag)] = append(categorized[flagCategory(flag)], flag)
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // sort to get a stable ordering
|
|
|
|
|
+ sorted := make([]flagGroup, 0, len(categorized))
|
|
|
|
|
+ for cat, flgs := range categorized {
|
|
|
|
|
+ sorted = append(sorted, flagGroup{cat, flgs})
|
|
|
|
|
+ }
|
|
|
|
|
+ sort.Sort(byCategory(sorted))
|
|
|
|
|
+
|
|
|
|
|
+ // add sorted array to data and render with default printer
|
|
|
|
|
+ originalHelpPrinter(w, tmpl, map[string]interface{}{
|
|
|
|
|
+ "cmd": data,
|
|
|
|
|
+ "categorizedFlags": sorted,
|
|
|
|
|
+ })
|
|
|
} else {
|
|
} else {
|
|
|
originalHelpPrinter(w, tmpl, data)
|
|
originalHelpPrinter(w, tmpl, data)
|
|
|
}
|
|
}
|