@@ -20,6 +20,7 @@ package main
20
20
21
21
import (
22
22
"io"
23
+ "sort"
23
24
24
25
"github.com/ethereum/go-ethereum/cmd/utils"
25
26
"github.com/ethereum/go-ethereum/internal/debug"
@@ -189,6 +190,39 @@ var AppHelpFlagGroups = []flagGroup{
189
190
},
190
191
}
191
192
193
+ // byCategory sorts an array of flagGroup by Name in the order
194
+ // defined in AppHelpFlagGroups.
195
+ type byCategory []flagGroup
196
+
197
+ func (a byCategory ) Len () int { return len (a ) }
198
+ func (a byCategory ) Swap (i , j int ) { a [i ], a [j ] = a [j ], a [i ] }
199
+ func (a byCategory ) Less (i , j int ) bool {
200
+ iCat , jCat := a [i ].Name , a [j ].Name
201
+ iIdx , jIdx := len (AppHelpFlagGroups ), len (AppHelpFlagGroups ) // ensure non categorized flags come last
202
+
203
+ for i , group := range AppHelpFlagGroups {
204
+ if iCat == group .Name {
205
+ iIdx = i
206
+ }
207
+ if jCat == group .Name {
208
+ jIdx = i
209
+ }
210
+ }
211
+
212
+ return iIdx < jIdx
213
+ }
214
+
215
+ func flagCategory (flag cli.Flag ) string {
216
+ for _ , category := range AppHelpFlagGroups {
217
+ for _ , flg := range category .Flags {
218
+ if flg .GetName () == flag .GetName () {
219
+ return category .Name
220
+ }
221
+ }
222
+ }
223
+ return "MISC"
224
+ }
225
+
192
226
func init () {
193
227
// Override the default app help template
194
228
cli .AppHelpTemplate = AppHelpTemplate
@@ -198,6 +232,7 @@ func init() {
198
232
App interface {}
199
233
FlagGroups []flagGroup
200
234
}
235
+
201
236
// Override the default app help printer, but only for the global app help
202
237
originalHelpPrinter := cli .HelpPrinter
203
238
cli .HelpPrinter = func (w io.Writer , tmpl string , data interface {}) {
@@ -227,6 +262,27 @@ func init() {
227
262
}
228
263
// Render out custom usage screen
229
264
originalHelpPrinter (w , tmpl , helpData {data , AppHelpFlagGroups })
265
+ } else if tmpl == utils .CommandHelpTemplate {
266
+ // Iterate over all command specific flags and categorize them
267
+ categorized := make (map [string ][]cli.Flag )
268
+ for _ , flag := range data .(cli.Command ).Flags {
269
+ if _ , ok := categorized [flag .String ()]; ! ok {
270
+ categorized [flagCategory (flag )] = append (categorized [flagCategory (flag )], flag )
271
+ }
272
+ }
273
+
274
+ // sort to get a stable ordering
275
+ sorted := make ([]flagGroup , 0 , len (categorized ))
276
+ for cat , flgs := range categorized {
277
+ sorted = append (sorted , flagGroup {cat , flgs })
278
+ }
279
+ sort .Sort (byCategory (sorted ))
280
+
281
+ // add sorted array to data and render with default printer
282
+ originalHelpPrinter (w , tmpl , map [string ]interface {}{
283
+ "cmd" : data ,
284
+ "categorizedFlags" : sorted ,
285
+ })
230
286
} else {
231
287
originalHelpPrinter (w , tmpl , data )
232
288
}
0 commit comments