You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							173 lines
						
					
					
						
							4.2 KiB
						
					
					
				
			
		
		
		
			
			
			
		
		
	
	
							173 lines
						
					
					
						
							4.2 KiB
						
					
					
				| package command | |
| 
 | |
| import ( | |
| 	"fmt" | |
| 	"os" | |
| 	"path/filepath" | |
| 	"github.com/posener/complete" | |
| 	completeinstall "github.com/posener/complete/cmd/install" | |
| 	flag "github.com/seaweedfs/seaweedfs/weed/util/fla9" | |
| 	"runtime" | |
| ) | |
| 
 | |
| func AutocompleteMain(commands []*Command) bool { | |
| 	subCommands := make(map[string]complete.Command) | |
| 	helpSubCommands := make(map[string]complete.Command) | |
| 	for _, cmd := range commands { | |
| 		flags := make(map[string]complete.Predictor) | |
| 		cmd.Flag.VisitAll(func(flag *flag.Flag) { | |
| 			flags["-"+flag.Name] = complete.PredictAnything | |
| 		}) | |
| 
 | |
| 		subCommands[cmd.Name()] = complete.Command{ | |
| 			Flags: flags, | |
| 		} | |
| 		helpSubCommands[cmd.Name()] = complete.Command{} | |
| 	} | |
| 	subCommands["help"] = complete.Command{Sub: helpSubCommands} | |
| 
 | |
| 	globalFlags := make(map[string]complete.Predictor) | |
| 	flag.VisitAll(func(flag *flag.Flag) { | |
| 		globalFlags["-"+flag.Name] = complete.PredictAnything | |
| 	}) | |
| 
 | |
| 	weedCmd := complete.Command{ | |
| 		Sub:         subCommands, | |
| 		Flags:       globalFlags, | |
| 		GlobalFlags: complete.Flags{"-h": complete.PredictNothing}, | |
| 	} | |
| 	cmp := complete.New("weed", weedCmd) | |
| 
 | |
| 	return cmp.Complete() | |
| } | |
| 
 | |
| func printAutocompleteScript(shell string) bool { | |
| 	bin, err := os.Executable() | |
| 	if err != nil { | |
| 		fmt.Fprintf(os.Stderr, "failed to get executable path: %s\n", err) | |
| 		return false | |
| 	} | |
| 	binPath, err := filepath.Abs(bin) | |
| 	if err != nil { | |
| 		fmt.Fprintf(os.Stderr, "failed to get absolute path: %s\n", err) | |
| 		return false | |
| 	} | |
| 
 | |
|  	switch shell { | |
|  	case "bash": | |
|  		fmt.Printf("complete -C %q weed\n", binPath) | |
|  	case "zsh": | |
|  		fmt.Printf("autoload -U +X bashcompinit && bashcompinit\n") | |
|  		fmt.Printf("complete -o nospace -C %q weed\n", binPath) | |
|  	case "fish": | |
|  		fmt.Printf(`function __complete_weed | |
|     set -lx COMP_LINE (commandline -cp) | |
|     test -z (commandline -ct) | |
|     and set COMP_LINE "$COMP_LINE " | |
|     %q | |
| end | |
| complete -f -c weed -a "(__complete_weed)" | |
| `, binPath) | |
|  	default: | |
|  		fmt.Fprintf(os.Stderr, "unsupported shell: %s. Supported shells: bash, zsh, fish\n", shell) | |
|  		return false | |
|  	} | |
| 	return true | |
| } | |
| 
 | |
| func installAutoCompletion() bool { | |
| 	if runtime.GOOS == "windows" { | |
| 		fmt.Println("Windows is not supported") | |
| 		return false | |
| 	} | |
| 
 | |
| 	err := completeinstall.Install("weed") | |
| 	if err != nil { | |
| 		fmt.Printf("install failed! %s\n", err) | |
| 		return false | |
| 	} | |
| 	fmt.Printf("autocompletion is enabled. Please restart your shell.\n") | |
| 	return true | |
| } | |
| 
 | |
| func uninstallAutoCompletion() bool { | |
| 	if runtime.GOOS == "windows" { | |
| 		fmt.Println("Windows is not supported") | |
| 		return false | |
| 	} | |
| 
 | |
| 	err := completeinstall.Uninstall("weed") | |
| 	if err != nil { | |
| 		fmt.Printf("uninstall failed! %s\n", err) | |
| 		return false | |
| 	} | |
| 	fmt.Printf("autocompletion is disabled. Please restart your shell.\n") | |
| 	return true | |
| } | |
| 
 | |
| var cmdAutocomplete = &Command{ | |
| 	Run:       runAutocomplete, | |
| 	UsageLine: "autocomplete [shell]", | |
| 	Short:     "generate or install shell autocomplete script", | |
| 	Long: `Generate shell autocomplete script or install it to your shell configuration. | |
|  | |
| Usage: | |
|     weed autocomplete [bash|zsh|fish]  # print autocomplete script to stdout | |
|     weed autocomplete install          # install to shell config files | |
|  | |
|     When a shell name is provided, the autocomplete script is printed to stdout. | |
|     You can then add it to your shell configuration manually, e.g.: | |
|  | |
|         # For bash: | |
|         weed autocomplete bash >> ~/.bashrc | |
|  | |
|         # Or use eval in your shell config: | |
|         eval "$(weed autocomplete bash)" | |
|  | |
|     When 'install' is provided (or no argument), the script is automatically | |
|     installed to your shell configuration files. | |
|  | |
|     Supported shells are bash, zsh, and fish. | |
|     Windows is not supported. | |
|  | |
| `, | |
| } | |
| 
 | |
| func runAutocomplete(cmd *Command, args []string) bool { | |
| 	if len(args) == 0 { | |
| 		// Default behavior: install | |
| 		return installAutoCompletion() | |
| 	} | |
| 
 | |
| 	if len(args) > 1 { | |
| 		cmd.Usage() | |
| 		return false | |
| 	} | |
| 
 | |
| 	shell := args[0] | |
| 	if shell == "install" { | |
| 		return installAutoCompletion() | |
| 	} | |
| 
 | |
| 	// Print the autocomplete script for the specified shell | |
| 	return printAutocompleteScript(shell) | |
| } | |
| 
 | |
| var cmdUnautocomplete = &Command{ | |
| 	Run:       runUnautocomplete, | |
| 	UsageLine: "autocomplete.uninstall", | |
| 	Short:     "uninstall autocomplete", | |
| 	Long: `weed autocomplete is uninstalled in the shell. | |
|  | |
|     Windows is not supported. | |
|  | |
| `, | |
| } | |
| 
 | |
| func runUnautocomplete(cmd *Command, args []string) bool { | |
| 	if len(args) != 0 { | |
| 		cmd.Usage() | |
| 	} | |
| 
 | |
| 	return uninstallAutoCompletion() | |
| }
 |