| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 | package baseimport (	"flag"	"fmt"	"os"	"sort"	"strings")// Copyright 2011 The Go Authors. All rights reserved.// Use of this source code is governed by a BSD-style// copied from "github.com/golang/go/main.go"// Execute excute the commandsfunc Execute() {	flag.Parse()	args := flag.Args()	if len(args) < 1 {		PrintUsage(os.Stderr, RootCommand)		return	}	cmdName := args[0] // for error messages	if args[0] == "help" {		Help(os.Stdout, args[1:])		return	}BigCmdLoop:	for bigCmd := RootCommand; ; {		for _, cmd := range bigCmd.Commands {			if cmd.Name() != args[0] {				continue			}			if len(cmd.Commands) > 0 {				// test sub commands				bigCmd = cmd				args = args[1:]				if len(args) == 0 {					PrintUsage(os.Stderr, bigCmd)					SetExitStatus(2)					Exit()				}				if args[0] == "help" {					// Accept 'go mod help' and 'go mod help foo' for 'go help mod' and 'go help mod foo'.					Help(os.Stdout, append(strings.Split(cmdName, " "), args[1:]...))					return				}				cmdName += " " + args[0]				continue BigCmdLoop			}			if !cmd.Runnable() {				continue			}			cmd.Flag.Usage = func() { cmd.Usage() }			if cmd.CustomFlags {				args = args[1:]			} else {				cmd.Flag.Parse(args[1:])				args = cmd.Flag.Args()			}			buildCommandText(cmd)			cmd.Run(cmd, args)			Exit()			return		}		helpArg := ""		if i := strings.LastIndex(cmdName, " "); i >= 0 {			helpArg = " " + cmdName[:i]		}		fmt.Fprintf(os.Stderr, "%s %s: unknown command\nRun '%s help%s' for usage.\n", CommandEnv.Exec, cmdName, CommandEnv.Exec, helpArg)		SetExitStatus(2)		Exit()	}}// Sort sorts the commandsfunc Sort() {	sort.Slice(RootCommand.Commands, func(i, j int) bool {		return SortLessFunc(RootCommand.Commands[i], RootCommand.Commands[j])	})}// SortLessFunc used for sort commands list, can be override from outsidevar SortLessFunc = func(i, j *Command) bool {	return i.Name() < j.Name()}
 |